{
  "version": 3,
  "sources": ["/cdn/shop/t/27/assets/bg-designer-storefront-runtime.js?bg_ds_rev=20260919-channel-offers-v4"],
  "sourcesContent": ["(function () {\n  'use strict';\n\n  if (window.bgDesignerStorefront) return;\n  window.bgDesignerStorefront = true;\n\n  var core = window.BGDesignerStorefrontCore;\n  if (!core) return;\n  // PRICING-TIER-RENAME-A: the staff-assigned Partner tier. The core reads a\n  // record or tag under the tier's former name too (Release A) and the page\n  // writes only the new name. Guarded like the runtime's other exports newer\n  // than the live core: an older loaded core reads only the key it is given.\n  var PARTNER_TIER_PRICE_KEY = 'pricePartnerTier';\n  function readTierPrice(record, key) {\n    if (typeof core.readTierPrice === 'function') return core.readTierPrice(record, key);\n    return record && typeof record === 'object' ? record[key] : undefined;\n  }\n  function partnerTierTags() {\n    return [core.PARTNER_TIER_TAG || 'PartnerTier', core.LEGACY_PARTNER_TIER_TAG].filter(Boolean);\n  }\n  var PRODUCT_SECTION_RENDER_ID_FALLBACK = 'main-product-designer-storefront';\n  var PRODUCT_SECTION_REVISION = '20260925-3d-chrome-flat-proof-v1';\n  var PRODUCT_SECTION_STYLESHEET_FILE = 'bg-designer-storefront.css';\n  var QUANTITY_RULE_SELECTOR = '.optionHolder.quantityRadiosAndTable';\n  var sectionRefreshPromises = Object.create(null);\n  var coreRefreshPromises = {};\n  var HYBRID_PITCHPRINT_AUTH_RESUME_STORAGE_KEY = 'bg_hybrid_pitchprint_auth_resume_v1';\n  var HYBRID_PITCHPRINT_AUTH_RESUME_PARAM = 'bg_pp_auth_resume';\n  var HYBRID_PITCHPRINT_AUTH_RESUME_TTL_MS = 60 * 60 * 1000;\n  var URL_STATE_PARAM = 'bg_state';\n  var URL_FORCE_PARAMS_PARAM = 'bg_force_params';\n  var URL_INCLUDE_STATE_PARAM = 'bg_include_state';\n  var STYLE_ARRIVAL_PARAM = 'bg_style_from';\n  var STYLE_RETURN_PARAM = 'bg_return';\n  var APPAREL_SIZE_PARAM_PREFIX = 'asize_';\n  var APPAREL_SIZES_PARAM = 'asizes';\n  var TEMPLATE_COLLECTION_PRESETS = {\n    product_specific: true,\n    industry: true,\n    all_templates: true,\n    tag_based: true\n  };\n  var DEFAULT_TEMPLATE_MODAL_SORT_MODE = 'most_popular';\n  var EDDM_FULL_SERVICE_TARGETING_ID = 'service-eddm-full-service';\n  var EDDM_BULK_MAIL_TARGETING_ID = 'service-bulk-mail';\n  var EDDM_ELIGIBLE_SIZE_TARGETING_IDS = {\n    'size-9x6.5': true,\n    'size-6.5x9': true,\n    'size-11x8.5': true,\n    'size-8.5x11': true\n  };\n\n  var ARTWORK_MODE_META = {\n    designonline: {\n      label: 'Customize Online',\n      description: 'Launch the live designer and save a unique project for this cart item.'\n    },\n    editservice: {\n      label: 'Template Edit Service',\n      description: 'Pick a proven template and let our team personalize it for you.'\n    },\n    uploadfiles: {\n      label: 'Upload Artwork',\n      description: 'Upload your finished print-ready artwork.'\n    },\n    uploadcanva: {\n      label: 'Share Canva Link',\n      description: 'Paste a Canva share link so we can export the correct print-ready file.'\n    },\n    youhaveart: {\n      label: 'Send Artwork After Checkout',\n      description: 'We will collect your finished artwork after checkout.'\n    },\n    customdesign: {\n      label: 'Professional Custom Design',\n      description: 'Request a fresh design from our creative team.'\n    },\n    reorder: {\n      label: 'Reorder',\n      description: 'Use a previous order or saved design as the starting point.'\n    },\n    recreate: {\n      label: 'Recreate a Design',\n      description: 'Send a sample or notes and we will rebuild the design for proofing.'\n    },\n    freesetup: {\n      label: 'Free Setup',\n      description: 'We will set up a free proof after checkout.'\n    }\n  };\n\n  var FALLBACK_UPLOAD_FIELD = {\n    id: 'artwork_upload',\n    label: 'Artwork File',\n    kind: 'file',\n    required: true,\n    accept: 'image/*,.svg,.pdf,application/pdf',\n    multiple: true\n  };\n\n  var ACCOLADE_ICON_MAP = {\n    'Free Shipping': 'https://cdn.shopify.com/s/files/1/0867/0560/2872/files/icons-01.png?v=1747674819',\n    'Simple Choice Displays': 'https://cdn.shopify.com/s/files/1/0867/0560/2872/files/icons-02.png?v=1747674819',\n    '5 Stars': 'https://cdn.shopify.com/s/files/1/0867/0560/2872/files/icons-04.png?v=1747674819',\n    'Free Edit Service': 'https://cdn.shopify.com/s/files/1/0867/0560/2872/files/icons-03.png?v=1747674819',\n    'Free Setup': 'https://cdn.shopify.com/s/files/1/0748/0206/9822/files/accolade_icons-04.png?v=1748712143',\n    '2 Year Warranty': 'https://cdn.shopify.com/s/files/1/0748/0206/9822/files/2-years-warranty-icon.png?v=1773846293'\n  };\n\n  var SHOP_PAY_ICON_URL = 'https://cdn.shopify.com/s/files/1/0748/0206/9822/files/ShopPay_-_Color.png?v=1747512932';\n\n  var TEMPLATE_EXCLUDE_NAMES = {\n    '+': true,\n    '-': true,\n    'start from scratch': true,\n    'upload completed design': true,\n    'upload art later': true,\n    'you have my art': true,\n    'share a canva design': true,\n    'custom design': true,\n    'design online': true,\n    'browse designs': true\n  };\n\n  var TEMPLATE_FILTER_FIELDS = [\n    { field: 'product', label: 'Product' },\n    { field: 'category', label: 'Category' },\n    { field: 'industry', label: 'Industry' },\n    { field: 'shape', label: 'Shape' },\n    { field: 'size', label: 'Size' },\n    { field: 'direct_mail', label: 'Direct Mail' },\n    { field: 'occasion', label: 'Occasion' },\n    { field: 'use_case', label: 'Use Case' },\n    { field: 'printed_sides', label: 'Printed Sides' },\n    { field: 'fold', label: 'Fold' },\n    { field: 'type', label: 'Type' },\n    { field: 'print_colors', label: 'Print Colors' },\n    { field: 'equipment', label: 'Equipment' },\n    { field: 'material', label: 'Material' },\n    { field: 'editability', label: 'Editability' },\n    { field: 'orientation', label: 'Orientation' },\n    { field: 'color', label: 'Color' },\n    { field: 'corners', label: 'Corners' },\n    { field: 'style', label: 'Style' },\n    { field: 'perforation', label: 'Perforation' },\n    { field: 'styles_themes', label: 'Styles / Themes' }\n  ];\n\n  var TEMPLATE_SEARCH_EXTRA_FIELDS = ['template_name', 'tags', 'designnum'];\n\n  function getDesignerBridge() {\n    return window.BGDesignerBridge && typeof window.BGDesignerBridge === 'object'\n      ? window.BGDesignerBridge\n      : null;\n  }\n\n  function readStoredDesignerBootstrap() {\n    var bridge = getDesignerBridge();\n    if (bridge && typeof bridge.readStoredBootstrap === 'function') {\n      return bridge.readStoredBootstrap() || {};\n    }\n    return window.BG_DESIGNER_BOOTSTRAP && typeof window.BG_DESIGNER_BOOTSTRAP === 'object'\n      ? window.BG_DESIGNER_BOOTSTRAP\n      : {};\n  }\n\n  function hasDesignerBootstrapServiceData(bootstrap) {\n    var payload = bootstrap && typeof bootstrap === 'object' ? bootstrap : {};\n    var services = payload.services && typeof payload.services === 'object' ? payload.services : {};\n    return !!(text(payload.apiBaseUrl) || text(services.apiBaseUrl));\n  }\n\n  function ensureDesignerBootstrapLoaded(store) {\n    var existing = readStoredDesignerBootstrap();\n    if (hasDesignerBootstrapServiceData(existing)) return Promise.resolve(existing);\n    var bridge = getDesignerBridge();\n    var productHandle = getEditorProductHandle(store);\n    var request = {\n      productId: text(store && store.config && store.config.productId),\n      productHandle: productHandle,\n      handle: productHandle\n    };\n    if (bridge && typeof bridge.fetchBootstrap === 'function') {\n      return Promise.resolve(bridge.fetchBootstrap(request)).catch(function () {\n        return null;\n      }).then(function () {\n        return readStoredDesignerBootstrap();\n      });\n    }\n    var designerConfig = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    var proxyRoot = text(window.BG_DESIGNER_PROXY_ROOT || designerConfig.proxyRoot).replace(/\\/+$/, '');\n    var endpoint = text(window.BG_DESIGNER_BOOTSTRAP_ENDPOINT || designerConfig.bootstrapUrl || store && store.config && store.config.bootstrapUrl);\n    if (!endpoint && proxyRoot) endpoint = proxyRoot + '/session/bootstrap';\n    if (!endpoint || typeof window.fetch !== 'function') return Promise.resolve(existing);\n    var url = null;\n    try {\n      url = new URL(endpoint, window.location.origin);\n      Object.keys(request).forEach(function (key) {\n        if (text(request[key])) url.searchParams.set(key, text(request[key]));\n      });\n    } catch (_) {\n      url = null;\n    }\n    if (!url) return Promise.resolve(existing);\n    return window.fetch(url.toString(), {\n      credentials: 'same-origin',\n      cache: 'no-store',\n      headers: {\n        accept: 'application/json'\n      }\n    }).then(function (response) {\n      if (!response.ok) return existing;\n      return response.json().catch(function () { return null; });\n    }).then(function (payload) {\n      var bootstrap = payload && payload.bootstrap && typeof payload.bootstrap === 'object'\n        ? payload.bootstrap\n        : payload;\n      if (hasDesignerBootstrapServiceData(bootstrap)) {\n        window.BG_DESIGNER_BOOTSTRAP = bootstrap;\n        return bootstrap;\n      }\n      return existing;\n    }).catch(function () {\n      return existing;\n    });\n  }\n\n  function getDesignerApiBaseUrlFromBootstrap(bootstrap) {\n    var payload = bootstrap && typeof bootstrap === 'object' ? bootstrap : {};\n    var services = payload.services && typeof payload.services === 'object' ? payload.services : {};\n    return text(payload.apiBaseUrl || services.apiBaseUrl).replace(/\\/+$/, '');\n  }\n\n  function getDesignerSessionTokenFromBootstrap(bootstrap) {\n    var payload = bootstrap && typeof bootstrap === 'object' ? bootstrap : {};\n    return text(payload.sessionToken);\n  }\n\n  function buildDesignerApiEndpoint(apiBaseUrl, path) {\n    var base = text(apiBaseUrl).replace(/\\/+$/, '');\n    var suffix = '/' + text(path).replace(/^\\/+/, '');\n    if (!base) return suffix;\n    if (base.slice(-4) === '/api' && suffix.indexOf('/api/') === 0) {\n      return base + suffix.slice(4);\n    }\n    return base + suffix;\n  }\n  var TEMPLATE_SEARCH_SUGGESTION_EXTRA_FIELDS = ['template_name', 'tags'];\n\n  var DEFAULT_TEMPLATE_MODAL_CONFIG = {\n    filtersToInclude: ['industry', 'styles_themes'],\n    modalTitle: 'Choose a template',\n    modalDisclaimer: 'Click any template to preview it. After you select one, you\u2019ll return to the product page to choose how you want to finish it.'\n  };\n\n  var OPTION_TEMPLATE_MODAL_MODE = 'optiontemplate';\n\n  var DEFAULT_ARTWORK_SECTION_CONFIG = {\n    showArtworkSection: true,\n    showStandardArtworkSection: true,\n    showNeedDesign: true,\n    showHaveDesign: true,\n    showSendLater: true,\n    showUseTemplate: true,\n    showCustomDesign: true,\n    showReorder: false,\n    showRecreateDesign: false,\n    showFreeSetup: false,\n    showShareCanva: true,\n    showUploadFiles: true,\n    layoutMode: 'list',\n    sectionLayout: 'v1',\n    collapseArtworkChooser: true,\n    defaultArtworkMode: ''\n  };\n\n  var DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG = {\n    enabled: false,\n    hideTemplateHolder: true,\n    hideTriggerHolder: true,\n    suppressTemplateSelectionUnlessTriggerSelected: true,\n    modalTitle: 'Choose a template',\n    modalDisclaimer: 'Pick a design template to use as the starting point for this product.',\n    selectedLabel: 'Selected template'\n  };\n\n  function text(value) {\n    return core.text(value);\n  }\n\n  function storefrontTelemetry() {\n    return window.BGDesignerTelemetry && typeof window.BGDesignerTelemetry.emitEvent === 'function'\n      ? window.BGDesignerTelemetry\n      : null;\n  }\n\n  function telemetryProductContext(store) {\n    return {\n      productHandle: getEditorProductHandle(store),\n      productId: text(store && store.config && store.config.productId),\n      variantId: text(store && store.config && store.config.baseVariantId),\n      projectId: text(store && store.state && store.state.project && store.state.project.projectId),\n      templateId: text(store && store.state && store.state.template && (store.state.template.id || store.state.template.templateId || store.state.template.publicId)),\n      artworkMode: text(store && store.state && store.state.artworkMode),\n      quantity: text(store && store.state && store.state.quantity)\n    };\n  }\n\n  function emitStorefrontEvent(store, eventName, category, payload, priority) {\n    var telemetry = storefrontTelemetry();\n    if (!telemetry) return;\n    if (store && store.config && typeof telemetry.initFromStore === 'function') telemetry.initFromStore(store);\n    telemetry.emitEvent(eventName, category || 'storefront', Object.assign(\n      {},\n      telemetryProductContext(store),\n      payload || {}\n    ), priority || 'normal', store);\n  }\n\n  function emitStorefrontError(store, errorName, errorCode, error, payload) {\n    var telemetry = storefrontTelemetry();\n    if (!telemetry || typeof telemetry.emitError !== 'function') return;\n    if (store && store.config && typeof telemetry.initFromStore === 'function') telemetry.initFromStore(store);\n    telemetry.emitError(errorName, errorCode || '', error, Object.assign(\n      {},\n      telemetryProductContext(store),\n      payload || {}\n    ), store);\n  }\n\n  function summarizeUploadFiles(files) {\n    var telemetry = storefrontTelemetry();\n    if (telemetry && typeof telemetry.summarizeFiles === 'function') {\n      return telemetry.summarizeFiles(files);\n    }\n    return Array.prototype.slice.call(files || []).map(function (file) {\n      var name = text(file && file.name);\n      var dotIndex = name.lastIndexOf('.');\n      return {\n        extension: dotIndex > -1 ? name.slice(dotIndex + 1).toLowerCase().replace(/[^a-z0-9]/g, '').slice(0, 16) : '',\n        mimeFamily: text(file && file.type).split('/')[0] || '',\n        size: Number(file && file.size) || 0\n      };\n    }).slice(0, 12);\n  }\n\n  function numberValue(value, fallback) {\n    return core.numberValue(value, fallback);\n  }\n\n  // PDP-TOKENIZE-02: null-preserving integer readers for holder ui layout\n  // overrides. Unlike numberValue(value, 0) these keep \"unset\" (null) apart\n  // from a real 0 \u2014 labelMarginPx: 0 is a valid authored override.\n  function positiveIntegerOrNull(value) {\n    var parsed = Number(value);\n    return Number.isFinite(parsed) && parsed > 0 ? Math.round(parsed) : null;\n  }\n\n  function nonNegativeIntegerOrNull(value) {\n    if (value === null || value === undefined || value === '') return null;\n    var parsed = Number(value);\n    return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : null;\n  }\n\n  // Mirrors the contracts token-value guard: a per-holder font family is\n  // emitted into an element-scoped style attribute, so anything that could\n  // break out of a declaration (or smuggle a URL/script form) is dropped.\n  function sanitizeCssFontFamilyValue(value) {\n    var family = text(value).slice(0, 120);\n    if (!family) return '';\n    if (/[;{}<>]/.test(family) || /\\burl\\s*\\(/i.test(family) || /\\bexpression\\s*\\(/i.test(family) || /@import/i.test(family) || /javascript:/i.test(family)) return '';\n    return family;\n  }\n\n  function isSelfHostedProjectId(value) {\n    return /^(?:self-hosted-)?shp_[a-z0-9]/i.test(text(value));\n  }\n\n  function normalizeTemplateTags(value) {\n    if (Array.isArray(value)) return value.map(text).filter(Boolean);\n    if (typeof value === 'string') {\n      return value.split(',').map(function (entry) {\n        return text(entry);\n      }).filter(Boolean);\n    }\n    return [];\n  }\n\n  function normalizeTagToken(value) {\n    return text(value).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n  }\n\n  function normalizeTemplatePrintingMode(value) {\n    var normalized = text(value).toLowerCase()\n      .replace(/[_-]+/g, ' ')\n      .replace(/\\s+/g, ' ')\n      .trim();\n    if (!normalized) return '';\n    if (/^(?:print\\s+)?(?:1|one)\\s+colou?r(?:\\b|$)/.test(normalized)) return '1-color';\n    // Prefix matching intentionally accepts the current legacy import value\n    // \"Full ColorBack of the bus\" as well as the corrected \"Full Color\" tag.\n    if (/^(?:print\\s+)?full\\s+colou?r/.test(normalized)) return 'full-color';\n    return '';\n  }\n\n  function getTemplatePrintingModes(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : source;\n    var modes = normalizeTemplateTags(raw.tags)\n      .concat(raw === source ? [] : normalizeTemplateTags(source.tags))\n      .map(normalizeTemplatePrintingMode)\n      .filter(Boolean);\n    return modes.filter(function (mode, index) {\n      return modes.indexOf(mode) === index;\n    });\n  }\n\n  function getSelectedTemplatePrintingMode(store) {\n    var option = getSelectedOptionByHolderDisplayName(store, 'Printing');\n    if (!option) return '';\n    var candidates = [\n      getOptionLabel(option),\n      option.targetingID,\n      option.targetingId,\n      option.hvId,\n      option.id\n    ];\n    for (var index = 0; index < candidates.length; index += 1) {\n      var mode = normalizeTemplatePrintingMode(candidates[index]);\n      if (mode) return mode;\n    }\n    return '';\n  }\n\n  function getTemplatePrintingFilterMode(store) {\n    var selectedMode = getSelectedTemplatePrintingMode(store);\n    if (!selectedMode) return '';\n    var catalog = store && Array.isArray(store.templates) ? store.templates : [];\n    var hasPrintingTags = catalog.some(function (template) {\n      return templateMatchesStorePage(store, template, { includeExcluded: true })\n        && getTemplatePrintingModes(template).length > 0;\n    });\n    return hasPrintingTags ? selectedMode : '';\n  }\n\n  function templateMatchesPrintingMode(template, printingMode) {\n    if (!printingMode) return true;\n    return getTemplatePrintingModes(template).indexOf(printingMode) !== -1;\n  }\n\n  function templateHasTag(template, tagName) {\n    var source = template && typeof template === 'object' ? template : {};\n    var target = normalizeTagToken(tagName);\n    if (!target) return false;\n    return normalizeTemplateTags(source.tags).some(function (tag) {\n      return normalizeTagToken(tag) === target;\n    });\n  }\n\n  function getTemplateEditServicePriceMeta(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var hasNormalizedOriginalCost = source.editServiceOriginalCost !== undefined\n      && source.editServiceOriginalCost !== null\n      && source.editServiceOriginalCost !== '';\n    var rawCost = source.edit_service_cost !== undefined\n      ? source.edit_service_cost\n      : (hasNormalizedOriginalCost ? source.editServiceOriginalCost : source.editServiceCost);\n    var originalCost = numberValue(rawCost, NaN);\n    var effectiveCost = hasNormalizedOriginalCost\n      ? numberValue(source.editServiceCost, Number.isFinite(originalCost) ? originalCost : 0)\n      : (Number.isFinite(originalCost) ? originalCost : 0);\n    var rawSale = source.edit_service_sale !== undefined ? source.edit_service_sale : source.editServiceSale;\n    if (rawSale !== undefined && rawSale !== null && rawSale !== '') {\n      var saleCost = numberValue(rawSale, NaN);\n      if (Number.isFinite(saleCost) && saleCost >= 0) effectiveCost = saleCost;\n    }\n    if (templateHasTag(source, 'Free Edit Service')) effectiveCost = 0;\n    if (!Number.isFinite(originalCost)) originalCost = effectiveCost;\n    return {\n      originalCost: roundMoney(originalCost),\n      effectiveCost: roundMoney(effectiveCost),\n      isFree: Math.abs(effectiveCost) < 0.01,\n      hasDeal: originalCost > effectiveCost + 0.01\n    };\n  }\n\n  function getTemplateEditServiceCost(template) {\n    return getTemplateEditServicePriceMeta(template).effectiveCost;\n  }\n\n  function buildDealMoneyMarkup(currentAmount, compareAmount, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var current = roundMoney(numberValue(currentAmount, 0));\n    var compare = roundMoney(numberValue(compareAmount, NaN));\n    var currentMarkup = Math.abs(current) < 0.01 && settings.freeLabel\n      ? escapeHtml(settings.freeLabel)\n      : escapeHtml(core.formatMoney(current));\n    if (Number.isFinite(compare) && compare > current + 0.01) {\n      return '<s class=\"bg-designer-storefront__money-compare\">' + escapeHtml(core.formatMoney(compare)) + '</s> ' +\n        '<span class=\"bg-designer-storefront__money-current\">' + currentMarkup + '</span>';\n    }\n    return '<span class=\"bg-designer-storefront__money-current\">' + currentMarkup + '</span>';\n  }\n\n  function getTemplatePersonalizationBrandLabel(store) {\n    var configured = text(store && store.config && store.config.personalizationServiceLabel);\n    if (configured) return configured;\n    return text(window.__siteCfg && window.__siteCfg.personalization_service_label);\n  }\n\n  function getTemplatePersonalizationChoiceLabel(store) {\n    var brandLabel = getTemplatePersonalizationBrandLabel(store);\n    return brandLabel ? 'Have ' + brandLabel + ' personalize it' : 'Have us personalize it';\n  }\n\n  function getTemplatePersonalizationOutcomeLabel(store) {\n    var brandLabel = getTemplatePersonalizationBrandLabel(store);\n    return brandLabel ? brandLabel + ' personalizes it' : 'We personalize it';\n  }\n\n  function getTemplatePersonalizationSummaryCopy(store) {\n    var brandLabel = getTemplatePersonalizationBrandLabel(store);\n    return brandLabel\n      ? brandLabel + ' will personalize it and send a proof before printing.'\n      : 'Our team will personalize it and send a proof before printing.';\n  }\n\n  // Store-level guided copy registry (GUIDED-PDP-TOKENIZE-01 T4). This ONE\n  // defaults map owns every tokenized guided string; a store overrides a key\n  // via `guided_copy` in bg-brand-config.liquid, forwarded by the host shell\n  // as config.guidedCopy (window.__siteCfg.guided_copy is the fallback lane,\n  // mirroring personalizationServiceLabel). Ships with no keys set anywhere:\n  // these defaults render byte-identical to the previous hardcoded strings.\n  var GUIDED_COPY_DEFAULTS = {\n    intentHaveLabel: 'I have artwork',\n    intentHelpLabel: 'I need a design',\n    intentLaterLabel: 'Handle artwork after checkout',\n    stepOptionPrompt: 'Choose an option',\n    stepQuantityTitle: 'Quantity',\n    stepQuantityPrompt: 'Choose a quantity',\n    stepQuantityRoutesPrompt: 'Select EDDM routes',\n    mobilePriceRoutesPrompt: 'Select routes',\n    stepDetailsTitle: 'Order details',\n    stepDetailsDone: 'Details added',\n    stepDetailsPrompt: 'Add required details',\n    stepArtworkTitle: 'Artwork',\n    stepArtworkPrompt: 'Select an artwork option',\n    stepArtworkDetailsTitle: 'Artwork details',\n    stepArtworkDetailsDone: 'Details ready',\n    stepArtworkDetailsPrompt: 'Add required artwork details',\n    stepArtworkDetailsFileFailed: 'A file did not upload',\n    laterPanelNote: 'Place your order now. We\u2019ll email you after checkout to collect your artwork.',\n    laterModalTitle: 'Handle artwork later?',\n    laterModalBody: 'You haven\\'t completed the Artwork selection. Want to add to cart and handle that later?',\n    laterModalNote: 'We will follow up after checkout.',\n    laterModalConfirmLabel: 'Add to cart',\n    laterModalBackLabel: 'Go back',\n    recommendedBadgeLabel: 'Recommended'\n  };\n\n  function getGuidedCopy(store, key) {\n    var configured = text(plainObject(store && store.config && store.config.guidedCopy)[key]);\n    if (configured) return configured;\n    var siteConfigured = text(plainObject(window.__siteCfg && window.__siteCfg.guided_copy)[key]);\n    if (siteConfigured) return siteConfigured;\n    return text(GUIDED_COPY_DEFAULTS[key]);\n  }\n\n  function buildTemplatePersonalizationChoiceTitleMarkup(store, template, options) {\n    var cost = numberValue(template && template.editServiceCost, 0);\n    var originalCost = numberValue(template && template.editServiceOriginalCost, NaN);\n    var settings = options && typeof options === 'object' ? options : {};\n    if (resolveArtworkMethodOption(store, 'editservice').status === 'eligible') {\n      var meta = getTemplateEditServicePriceMeta(template);\n      var price = mappedArtworkPrice(store, 'editservice', template, meta.originalCost, meta.effectiveCost);\n      var label = settings.threeOutcomes === true ? getTemplatePersonalizationOutcomeLabel(store)\n        : (getProductFormPresentation(store) === 'guided' ? getTemplatePersonalizationChoiceLabel(store) : 'Have us personalize');\n      return escapeHtml(label) + buildMappedArtworkPriceMarkup(price);\n    }\n    if (settings.threeOutcomes === true) {\n      return escapeHtml(getTemplatePersonalizationOutcomeLabel(store)) + ' \u2014 ' +\n        buildDealMoneyMarkup(cost, originalCost, { freeLabel: 'Free' });\n    }\n    var isGuidedPresentation = getProductFormPresentation(store) === 'guided';\n    var prefix = isGuidedPresentation ? getTemplatePersonalizationChoiceLabel(store) : 'Have us personalize';\n    var freeLabel = 'FREE';\n    if (Number.isFinite(originalCost) && originalCost > cost + 0.01) {\n      // A template-authored deal (e.g. $20 -> FREE) already owns this price;\n      // stacking the sale strikethrough on top would double-mark it.\n      return escapeHtml(prefix) + ' ' + buildDealMoneyMarkup(cost, originalCost, { freeLabel: freeLabel });\n    }\n    if (cost > 0) return escapeHtml(prefix) + buildArtworkPriceSuffixMarkup(store, cost);\n    return escapeHtml(prefix + ' (FREE)');\n  }\n\n  function roundMoney(value) {\n    return core.roundMoney(value);\n  }\n\n  function deepClone(value, fallback) {\n    return core.deepClone(value, fallback);\n  }\n\n  function escapeHtml(value) {\n    return core.escapeHtml(value);\n  }\n\n  function parseJson(value, fallback) {\n    return core.parseJson(value, fallback);\n  }\n\n  function plainObject(value) {\n    return value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n  }\n\n  function booleanConfig(value, fallback) {\n    if (value === true) return true;\n    if (value === false) return false;\n    return !!fallback;\n  }\n\n  function normalizeStringList(value) {\n    if (Array.isArray(value)) {\n      return value.map(text).filter(Boolean);\n    }\n    var clean = text(value);\n    if (!clean) return [];\n    return clean.split(',').map(text).filter(Boolean);\n  }\n\n  function mergePlainObjects(objects) {\n    var out = {};\n    (Array.isArray(objects) ? objects : []).forEach(function (entry) {\n      if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return;\n      Object.keys(entry).forEach(function (key) {\n        out[key] = entry[key];\n      });\n    });\n    return out;\n  }\n\n  function delay(ms) {\n    return new Promise(function (resolve) {\n      window.setTimeout(resolve, Math.max(0, Number(ms) || 0));\n    });\n  }\n\n  function loadScript(src) {\n    var url = text(src);\n    if (!url) return Promise.resolve(null);\n    if (coreRefreshPromises[url]) return coreRefreshPromises[url];\n    coreRefreshPromises[url] = new Promise(function (resolve, reject) {\n      var existing = Array.prototype.slice.call(document.querySelectorAll('script[src]')).find(function (script) {\n        return text(script.getAttribute('src')) === url;\n      });\n      if (existing && typeof window.BGDesignerStorefrontCore === 'object') {\n        resolve(existing);\n        return;\n      }\n      var script = document.createElement('script');\n      script.src = url;\n      script.defer = true;\n      script.onload = function () {\n        resolve(script);\n      };\n      script.onerror = function () {\n        reject(new Error('Failed to load latest Designer Storefront core asset.'));\n      };\n      document.head.appendChild(script);\n    });\n    return coreRefreshPromises[url];\n  }\n\n  function loadStylesheet(src) {\n    var url = text(src);\n    if (!url) return Promise.resolve(null);\n    var resolvedUrl = '';\n    try {\n      resolvedUrl = new URL(url, window.location.origin).toString();\n    } catch (_) {\n      resolvedUrl = url;\n    }\n    var existing = Array.prototype.slice.call(document.querySelectorAll('link[rel=\"stylesheet\"][href]')).find(function (link) {\n      return text(link.href) === resolvedUrl || text(link.getAttribute('href')) === url;\n    });\n    if (existing) return Promise.resolve(existing);\n    return new Promise(function (resolve, reject) {\n      var link = document.createElement('link');\n      link.rel = 'stylesheet';\n      link.href = resolvedUrl;\n      link.setAttribute('data-bg-designer-storefront-live-stylesheet', 'true');\n      link.onload = function () {\n        resolve(link);\n      };\n      link.onerror = function () {\n        reject(new Error('Failed to load latest Designer Storefront stylesheet asset.'));\n      };\n      document.head.appendChild(link);\n    });\n  }\n\n  function getProductSectionHost(root) {\n    if (!root || !root.closest) return null;\n    return root.closest('product-info');\n  }\n\n  function updateProductSectionHost(currentHost, freshHost) {\n    if (!currentHost || !freshHost) return currentHost;\n    Array.prototype.slice.call(currentHost.attributes || []).forEach(function (attribute) {\n      if (!freshHost.hasAttribute(attribute.name)) {\n        currentHost.removeAttribute(attribute.name);\n      }\n    });\n    Array.prototype.slice.call(freshHost.attributes || []).forEach(function (attribute) {\n      currentHost.setAttribute(attribute.name, attribute.value);\n    });\n    currentHost.innerHTML = freshHost.innerHTML;\n    return currentHost;\n  }\n\n  function shouldRefreshProductSection(root) {\n    var host = getProductSectionHost(root);\n    if (!host) return false;\n    var pagePath = text(window.location && window.location.pathname);\n    var hostUrl = text(host.getAttribute('data-url'));\n    if (!pagePath || pagePath.indexOf('/products/') !== 0) return false;\n    if (hostUrl && hostUrl !== pagePath) return false;\n    if (text(host.getAttribute('data-bg-ds-section-revision')) !== PRODUCT_SECTION_REVISION) return true;\n    return typeof core.buildDesignerSplitPrice !== 'function';\n  }\n\n  function fetchFreshProductSectionDocument(sectionId) {\n    var renderId = text(sectionId) || PRODUCT_SECTION_RENDER_ID_FALLBACK;\n    if (sectionRefreshPromises[renderId]) return sectionRefreshPromises[renderId];\n    sectionRefreshPromises[renderId] = (function attemptFetch(attempt) {\n      var url = new URL(window.location.href);\n      url.searchParams.set('section_id', renderId);\n      url.searchParams.set('__bgSectionRefresh', String(Date.now()));\n      return fetch(url.toString(), {\n        credentials: 'same-origin',\n        cache: 'no-store',\n        headers: {\n          accept: 'text/html',\n          'cache-control': 'no-cache, no-store, max-age=0',\n          pragma: 'no-cache'\n        }\n      }).then(function (response) {\n        if (!response.ok) {\n          throw new Error('Failed to fetch the latest Designer Storefront section.');\n        }\n        return response.text();\n      }).then(function (html) {\n        var parser = new DOMParser();\n        return parser.parseFromString(String(html || ''), 'text/html');\n      }).catch(function (error) {\n        if (attempt >= 3) throw error;\n        return delay(700 * (attempt + 1)).then(function () {\n          return attemptFetch(attempt + 1);\n        });\n      });\n    })(0).catch(function (error) {\n      sectionRefreshPromises[renderId] = null;\n      throw error;\n    });\n    return sectionRefreshPromises[renderId];\n  }\n\n  function refreshProductSectionRoot(root) {\n    if (!shouldRefreshProductSection(root)) return Promise.resolve(root);\n    var currentHost = getProductSectionHost(root);\n    if (!currentHost) return Promise.resolve(root);\n    var renderId = text(currentHost.getAttribute('data-section')) || PRODUCT_SECTION_RENDER_ID_FALLBACK;\n    return fetchFreshProductSectionDocument(renderId).then(function (doc) {\n      var freshHost = doc.querySelector('product-info');\n      var freshRoot = doc.querySelector('[data-bg-designer-storefront-root]');\n      if (!freshHost || !freshRoot) return root;\n      var freshStylesheet = doc.querySelector('link[rel=\"stylesheet\"][href*=\"' + PRODUCT_SECTION_STYLESHEET_FILE + '\"]');\n      var freshCoreScript = doc.querySelector('script[src*=\"bg-designer-storefront-core.js\"]');\n      var freshSupportScripts = Array.prototype.slice.call(doc.querySelectorAll('script[src*=\"product-modal.js\"], script[src*=\"media-gallery.js\"]'));\n      var freshStylesheetHref = freshStylesheet ? text(freshStylesheet.getAttribute('href')) : '';\n      var freshCoreSrc = freshCoreScript ? text(freshCoreScript.getAttribute('src')) : '';\n      var freshSupportSrcs = freshSupportScripts.map(function (script) {\n        return text(script.getAttribute('src'));\n      }).filter(Boolean);\n      var loadFreshSupportScripts = function () {\n        return Promise.all(freshSupportSrcs.map(function (src) {\n          return loadScript(src).catch(function () {\n            return null;\n          });\n        }));\n      };\n      var replaceReservedHost = function () {\n        var owner = window.BGCartAddOnce;\n        var reservation = owner && owner.reserveReplacement();\n        if (!reservation) return root;\n        try {\n          core = window.BGDesignerStorefrontCore || core;\n          updateProductSectionHost(currentHost, freshHost);\n          return currentHost.querySelector('[data-bg-designer-storefront-root]') || root;\n        } finally { reservation.release(); }\n      };\n      if (!freshCoreSrc) {\n        return loadStylesheet(freshStylesheetHref).catch(function () {\n          return null;\n        }).then(loadFreshSupportScripts).then(replaceReservedHost);\n      }\n      var resolvedCoreUrl = '';\n      try {\n        resolvedCoreUrl = new URL(freshCoreSrc, window.location.origin).toString();\n      } catch (_) {\n        resolvedCoreUrl = freshCoreSrc;\n      }\n      return loadStylesheet(freshStylesheetHref).catch(function () {\n        return null;\n      }).then(function () {\n        return loadScript(resolvedCoreUrl).catch(function () {\n          return null;\n        });\n      }).then(function () {\n        return loadFreshSupportScripts();\n      }).then(function () {\n        return replaceReservedHost();\n      });\n    }).catch(function () {\n      return root;\n    });\n  }\n\n  function scheduleStampedReviewBridge(store) {\n    if (!store || store.reviewBridgeState === 'scheduled' || store.reviewBridgeState === 'applied') return;\n    var source = store.config && store.config.reviewSource ? store.config.reviewSource : null;\n    if (!source || !text(source.productId) || text(source.productId) === text(store.config.productId)) return;\n    store.reviewBridgeState = 'scheduled';\n    var attempts = 0;\n    var maxAttempts = 40;\n\n    function applyBridge() {\n      attempts += 1;\n      if (!window.StampedFn || typeof window.StampedFn.reloadUGC !== 'function') {\n        return false;\n      }\n\n      var badge = document.querySelector('.stamped-product-reviews-badge');\n      var widget = document.querySelector('#stamped-main-widget');\n      if (!badge && !widget) {\n        return false;\n      }\n\n      if (badge) {\n        badge.setAttribute('data-id', text(source.productId));\n        badge.setAttribute('data-product-sku', text(source.handle));\n        badge.setAttribute('data-product-title', text(source.title));\n        badge.setAttribute('data-product-type', text(source.type));\n      }\n\n      if (widget) {\n        widget.setAttribute('data-product-id', text(source.productId));\n        widget.setAttribute('data-name', text(source.title));\n        widget.setAttribute('data-url', text(source.url));\n        widget.setAttribute('data-image-url', text(source.imageUrl));\n        widget.setAttribute('data-product-sku', text(source.handle));\n        widget.setAttribute('data-product-title', text(source.title));\n        widget.setAttribute('data-product-type', text(source.type));\n      }\n\n      try {\n        if (badge && typeof window.StampedFn.loadBadges === 'function') {\n          window.StampedFn.loadBadges();\n        }\n        if (widget && typeof window.StampedFn.loadWidget === 'function') {\n          widget.innerHTML = '';\n          window.StampedFn.loadWidget(true);\n        } else {\n          window.StampedFn.reloadUGC();\n        }\n        store.reviewBridgeState = 'applied';\n        return true;\n      } catch (_) {\n        return false;\n      }\n    }\n\n    (function retry() {\n      if (applyBridge()) return;\n      if (attempts >= maxAttempts) {\n        store.reviewBridgeState = 'failed';\n        return;\n      }\n      window.setTimeout(retry, 250);\n    })();\n  }\n\n  function normalizeBoolFlag(value) {\n    if (value === true || value === false) return value;\n    if (typeof value === 'string') {\n      var normalized = text(value).toLowerCase();\n      if (normalized === 'true') return true;\n      if (normalized === 'false') return false;\n    }\n    return null;\n  }\n\n  function buildDisplayLabel(optionValue) {\n    return core.buildSelectionDisplayLabel(optionValue);\n  }\n\n  function getCustomerTagList(store) {\n    var tags = store && store.config && store.config.customer && store.config.customer.tags;\n    if (Array.isArray(tags)) return tags.map(text).filter(Boolean);\n    if (typeof tags === 'string') {\n      return tags.split(',').map(function (entry) {\n        return text(entry);\n      }).filter(Boolean);\n    }\n    return [];\n  }\n\n  function getCustomerPricingProfile(store) {\n    var result = {\n      mode: 'NONE',\n      label: '',\n      productDiscountPct: 0,\n      editServiceDiscountPct: 0,\n      customDesignDiscountPct: 0,\n      cashBackPct: 0\n    };\n    var tagList = getCustomerTagList(store);\n    // The signer's tag order (cart-signing-price-projection): member plans,\n    // then the staff-assigned price tiers.\n    var plan = [['print-pro-plan', 'PRO_PLAN'], ['print-ultimate-plan', 'ULTIMATE_PLAN'], ['BrokerPremium', 'BROKER_PREMIUM'],\n      ['BrokerBasic', 'BROKER_BASIC']].concat(partnerTierTags().map(function (tag) { return [tag, 'PARTNER_TIER']; }), [\n      ['FriendsFamily', 'FRIENDS_FAMILY']]).reduce(function (found, entry) {\n      return found || (tagList.indexOf(entry[0]) !== -1 ? entry[1] : '');\n    }, '') || 'NONE';\n    // The store's signer read the customer's current tier while this page\n    // stayed open (a membership started or ended, a staff tier was set):\n    // the page prices for it.\n    if (store && store.signerPricingPlan) plan = store.signerPricingPlan;\n    // A staff-assigned tier prices artwork services in full (no plan\n    // discount), as the store's price entry does.\n    if (plan !== 'PRO_PLAN' && plan !== 'ULTIMATE_PLAN' && plan !== 'NONE') {\n      result.mode = plan;\n      return result;\n    }\n    if (plan === 'PRO_PLAN') {\n      result.mode = 'PRO_PLAN';\n      result.label = 'Pro Plan';\n      result.editServiceDiscountPct = 0.5;\n      result.customDesignDiscountPct = 0.25;\n      result.cashBackPct = 0.03;\n      return result;\n    }\n    if (plan === 'ULTIMATE_PLAN') {\n      result.mode = 'ULTIMATE_PLAN';\n      result.label = 'Ultimate Plan';\n      result.productDiscountPct = 0.05;\n      result.editServiceDiscountPct = 1;\n      result.customDesignDiscountPct = 0.5;\n      result.cashBackPct = 0.05;\n      return result;\n    }\n    return result;\n  }\n\n  function buildMembershipUpsellBanner(store, subtotal) {\n    var profile = getCustomerPricingProfile(store);\n    if (profile.mode === 'PRO_PLAN' || profile.mode === 'ULTIMATE_PLAN') return '';\n    var numericSubtotal = roundMoney(numberValue(subtotal, 0));\n    if (!(numericSubtotal > 0)) return '';\n    var editServiceCost = roundMoney(numberValue(store && store.state && store.state.template && store.state.template.editServiceCost, 0));\n    var customDesignCost = roundMoney(numberValue(store && store.productData && store.productData.customDesignCost, 0));\n    var proSavings = (editServiceCost * 0.5) + (customDesignCost * 0.25) + (numericSubtotal * 0.03);\n    var ultimateSavings = editServiceCost + (customDesignCost * 0.5) + (numericSubtotal * 0.05);\n    var maxSavings = Math.max(proSavings, ultimateSavings);\n    var cashBackVal = numericSubtotal * 0.05;\n    return '' +\n      '<div class=\"membership-upsell-banner\">' +\n        '<div class=\"upsell-inner\">Become a Marketing <em>Ultimate</em> member and save an additional <strong>' + escapeHtml(core.formatMoney(maxSavings)) + '</strong> on this order, get <strong>FREE shipping</strong>, and also earn an additional <strong>' + escapeHtml(core.formatMoney(cashBackVal)) + ' (5%) cash back</strong> in store credit!</div>' +\n        '<button type=\"button\" class=\"upsell-btn\" data-bg-membership-upsell>View Plans</button>' +\n      '</div>';\n  }\n\n  function normalizeSearchValue(value) {\n    return String(value || '')\n      .toLowerCase()\n      .replace(/[\u201C\u201D]/g, '\"')\n      .replace(/[\u2019]/g, \"'\")\n      .replace(/(\\d+(?:\\.\\d+)?)(\\\"|')?\\s*[\\u00D7x]\\s*(\\d+(?:\\.\\d+)?)(\\\"|')?/g, '$1$2 x $3$4')\n      .replace(/\\s+/g, ' ')\n      .trim();\n  }\n\n  function canonicalFilterKey(value) {\n    return normalizeSearchValue(value)\n      .replace(/[^a-z0-9_]+/g, '_')\n      .replace(/_+/g, '_')\n      .replace(/^_+|_+$/g, '');\n  }\n\n  function canonicalTokenList(value) {\n    var normalized = normalizeSearchValue(value)\n      .replace(/[^a-z0-9]+/g, ' ')\n      .trim();\n    if (!normalized) return [];\n    return Array.from(new Set(normalized.split(/\\s+/).filter(Boolean))).sort();\n  }\n\n  function sameCanonicalTokenSet(left, right) {\n    var leftTokens = canonicalTokenList(left);\n    var rightTokens = canonicalTokenList(right);\n    if (!leftTokens.length || !rightTokens.length) return false;\n    return leftTokens.join('|') === rightTokens.join('|');\n  }\n\n  function looksLikeBrokenPreviewUrl(value) {\n    var url = text(value);\n    if (!url) return true;\n    return /\\/_1\\.jpg(?:[?#].*)?$/i.test(url);\n  }\n\n  function getPreferredTemplatePreview(rawTemplate) {\n    var source = rawTemplate && typeof rawTemplate === 'object' ? rawTemplate : {};\n    var previewList = Array.isArray(source.previews)\n      ? source.previews.map(text).filter(Boolean)\n      : [];\n    var primaryPreview = text(source.design_preview_url || source.preview || source.image);\n    if (looksLikeBrokenPreviewUrl(primaryPreview) && previewList.length) {\n      return previewList[0];\n    }\n    return primaryPreview || previewList[0] || '';\n  }\n\n  // BD-B66: the feed's `id` is the old editor's design id. A legacy row whose\n  // design id is empty carries its Foundation row id there instead (or\n  // nothing), and a template without one gets a made-up `designnum:` /\n  // `legacy:` selection id. None of those can open in the old editor.\n  function isLegacyEditorDesignId(value, foundationTemplateId) {\n    var designId = text(value);\n    if (!designId || designId === text(foundationTemplateId)) return false;\n    return !/^(?:designnum:|legacy:|legacy_design_template_)/.test(designId);\n  }\n\n  // A row opens online only through a Studio template lookup or an old-editor\n  // design id; with neither, it offers the edit service alone.\n  function templateRowHasEditorSource(rawTemplate) {\n    var source = rawTemplate && typeof rawTemplate === 'object' ? rawTemplate : {};\n    if (text(source.template_lookup || source.templateLookup || source.template_public_id\n      || source.templatePublicId || source.public_id || source.publicId)) return true;\n    return isLegacyEditorDesignId(source.id, source.__foundationTemplateId);\n  }\n\n  function getTemplateAvailability(rawTemplate) {\n    var source = rawTemplate && typeof rawTemplate === 'object' ? rawTemplate : {};\n    var onlineFlag = normalizeBoolFlag(source.design_online_available);\n    var legacyFlag = normalizeBoolFlag(source.legacy_template) === true;\n    var editFlag = normalizeBoolFlag(source.edit_service_available);\n    var editability = text(source.editability).toLowerCase().replace(/[_-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n    var editServiceOnly = editability === 'edit service only';\n    var downloadFlag = normalizeBoolFlag(source.digital_download_available) === true;\n    var hasEditCost = source.edit_service_cost !== undefined && source.edit_service_cost !== null;\n    var canEdit = editServiceOnly || editFlag === true || (editFlag !== false && hasEditCost);\n    var isOnline = onlineFlag === true;\n    if (onlineFlag === null) {\n      isOnline = !!text(source.id);\n    }\n    if (editServiceOnly || !templateRowHasEditorSource(source)) {\n      isOnline = false;\n    }\n    var isLegacy = legacyFlag || !isOnline;\n    return {\n      isOnline: isOnline,\n      isLegacy: isLegacy,\n      canEdit: canEdit,\n      canDownload: downloadFlag\n    };\n  }\n\n  function templateRequiresAiGeneratedDisclaimer(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : source;\n    return normalizeBoolFlag(raw.include_ai_gen_disclaimer) === true\n      || normalizeBoolFlag(source.includeAiGeneratedDisclaimer) === true;\n  }\n\n  // Resolves true when the customer may proceed. Async because the disclaimer\n  // now rides the shared in-page confirmation dialog (BUG-04) instead of the\n  // banned native window.confirm.\n  function confirmAiGeneratedEditServiceTemplate(template) {\n    if (!templateRequiresAiGeneratedDisclaimer(template)) return Promise.resolve(true);\n    return openStorefrontConfirmDialog({\n      title: 'This design template mockup was generated with AI.',\n      body: [\n        'AI-generated images are not editable, high resolution, or print ready, and would print poorly as-is.',\n        'If you proceed with this template, our professional designers will recreate the design as a real layered, high-resolution, print-ready file using this mockup as inspiration. The final design may not be a 1:1 exact match.',\n        'We can customize the inspiration to match your branding and services.'\n      ],\n      confirmLabel: 'Continue with this template',\n      cancelLabel: 'Go back'\n    });\n  }\n\n  function buildStableTemplateDesignId(rawTemplate) {\n    var source = rawTemplate && typeof rawTemplate === 'object' ? rawTemplate : {};\n    var sourceId = text(source.id);\n    if (sourceId) return sourceId;\n    var designNumber = text(source.designnum);\n    if (designNumber) return 'designnum:' + designNumber;\n    var title = text(source.template_name || source.title || source.name);\n    var previewUrl = getPreferredTemplatePreview(source);\n    if (title || previewUrl) return 'legacy:' + (title || 'template') + '::' + previewUrl;\n    return '';\n  }\n\n  function getTemplateSelectionKey(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var explicitKey = text(source.selectionKey);\n    if (explicitKey) return explicitKey;\n    var designNumber = text(source.designNumber || source.designnum);\n    if (designNumber) return 'designnum:' + designNumber;\n    var lookup = text(source.templateLookup || source.templatePublicId || source.template_lookup || source.template_public_id || source.publicId || source.public_id);\n    if (lookup) return 'lookup:' + lookup;\n    var designId = text(source.designId || source.id || source.sourceId);\n    if (designId) return 'design:' + designId;\n    var title = text(source.title || source.template_name || source.name);\n    if (title) return 'title:' + title;\n    return '';\n  }\n\n  function parseSizeInInches(value) {\n    var input = String(value || '').trim();\n    if (!input) return null;\n    var match = input.match(/([\\d.]+)\\s*(?:in|\")?\\s*x\\s*([\\d.]+)\\s*(?:in|\")?/i);\n    if (match) {\n      var directWidth = Number(match[1]);\n      var directHeight = Number(match[2]);\n      if (Number.isFinite(directWidth) && Number.isFinite(directHeight) && directWidth > 0 && directHeight > 0) {\n        return [directWidth, directHeight];\n      }\n    }\n    match = input.match(/([\\d.]+)\\s*'\\s*x\\s*([\\d.]+)\\s*'/i);\n    if (match) {\n      var feetWidth = Number(match[1]) * 12;\n      var feetHeight = Number(match[2]) * 12;\n      if (Number.isFinite(feetWidth) && Number.isFinite(feetHeight) && feetWidth > 0 && feetHeight > 0) {\n        return [feetWidth, feetHeight];\n      }\n    }\n    return null;\n  }\n\n  function makeSizeKey(pair) {\n    if (!Array.isArray(pair) || pair.length !== 2) return '';\n    var width = Math.round(Number(pair[0]) * 1000) / 1000;\n    var height = Math.round(Number(pair[1]) * 1000) / 1000;\n    if (!Number.isFinite(width) || !Number.isFinite(height)) return '';\n    var ordered = [width, height].sort(function (a, b) { return a - b; });\n    return String(ordered[0]) + 'x' + String(ordered[1]);\n  }\n\n  function getTemplateModalPageConfig(store) {\n    var productBinding = getTemplateBinding(store)\n      ? getTemplateBinding(store)\n      : {};\n    var templateModalConfig = productBinding && productBinding.templateModalConfig && typeof productBinding.templateModalConfig === 'object'\n      ? productBinding.templateModalConfig\n      : {};\n    if (isOptionTemplateModalMode(store)) {\n      var optionTemplateConfig = getOptionTemplateModalConfig(store);\n      var optionTemplateModalConfig = optionTemplateConfig.templateModalConfig && typeof optionTemplateConfig.templateModalConfig === 'object'\n        ? optionTemplateConfig.templateModalConfig\n        : {};\n      return Object.assign({}, DEFAULT_TEMPLATE_MODAL_CONFIG, {\n        filtersToInclude: [],\n        filtersToExclude: TEMPLATE_FILTER_FIELDS.map(function (entry) { return entry.field; }),\n        modalTitle: text(optionTemplateConfig.modalTitle) || DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG.modalTitle,\n        modalDisclaimer: text(optionTemplateConfig.modalDisclaimer) || DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG.modalDisclaimer\n      }, optionTemplateModalConfig);\n    }\n    return Object.assign({}, DEFAULT_TEMPLATE_MODAL_CONFIG, templateModalConfig);\n  }\n\n  // Finish-in-modal flow (per-product artworkSection.templateFinishInModal):\n  // the customize-online vs edit-service decision renders inside the template\n  // preview overlay instead of as a second on-page fork after selection.\n  function isTemplateFinishInModalFlow(store) {\n    if (getProductFormPresentation(store) !== 'guided' && !getArtworkSectionConfig(store).templateFinishInModal) return false;\n    if (isOptionTemplateModalMode(store)) return false;\n    var mode = text(store && store.templateModalMode).toLowerCase();\n    return !mode || mode === 'templatebrowse';\n  }\n\n  function getConfigSourceHandle(store) {\n    return text(store && store.config && (store.config.configSourceHandle || store.config.handle));\n  }\n\n  function getAliasSourceHandle(store) {\n    var config = store && store.config && typeof store.config === 'object' ? store.config : {};\n    var mapping = config.editorMapping && typeof config.editorMapping === 'object' ? config.editorMapping : {};\n    return text(mapping.aliasSourceHandle || config.aliasSourceHandle);\n  }\n\n  // Alias products keep their own Shopify identity and return handle, but all\n  // legacy JSON product behavior must resolve as the root PitchPrint Hybrid\n  // product. Product Commerce remains independent and never enters this lane.\n  function getLegacyProductSourceHandle(store) {\n    return getAliasSourceHandle(store)\n      || getConfigSourceHandle(store);\n  }\n\n  function getTemplateSourceHandle(store) {\n    return text(store && store.config && store.config.templateSourceHandle);\n  }\n\n  function getEditorProductHandle(store) {\n    return text(store && store.config && (store.config.returnProductHandle || store.config.handle));\n  }\n\n  // The quote grosses the submitted line price up for the live sale only when the\n  // product's commerce bundle carries a rate. Credits may be held out of the\n  // discount exactly then, and never on baked-pricing products, which never reach\n  // that lane. Read from the bundle the theme already has; no extra request.\n  function getSaleGrossUpBps(store) {\n    var bps = numberValue(store\n      && store.productCommerceRuntimeBundle\n      && store.productCommerceRuntimeBundle.target\n      && store.productCommerceRuntimeBundle.target.saleDiscountBps, 0);\n    return Number.isFinite(bps) && bps > 0 && bps < 10000 ? bps : 0;\n  }\n\n  function shouldHoldCreditsFromSale(store) {\n    return getSaleGrossUpBps(store) > 0;\n  }\n\n  function getProductCommerceSourceHandle(store) {\n    var bundleSourceHandle = text(store\n      && store.productCommerceRuntimeBundle\n      && store.productCommerceRuntimeBundle.target\n      && store.productCommerceRuntimeBundle.target.sourceHandle);\n    if (bundleSourceHandle) return bundleSourceHandle;\n    return text(store && store.productData && store.productData.productCommerceSourceHandle);\n  }\n\n  function readLaunchProviderCandidate(value) {\n    var normalized = core.normalizeLaunchProvider ? core.normalizeLaunchProvider(value) : text(value).toLowerCase();\n    return normalized === 'pitchprint' || normalized === 'self-hosted' ? normalized : '';\n  }\n\n  function readLaunchProviderFromUrl() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      if (text(params.get('from')).toLowerCase() === 'templates') return '';\n      return readLaunchProviderCandidate(\n        params.get('launchProvider')\n        || params.get('designerProvider')\n        || params.get('_bg_designer_provider')\n      );\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function hasSelfHostedProjectUrlParam() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      if (text(params.get('from')).toLowerCase() === 'templates') return false;\n      return isSelfHostedProjectId(\n        params.get('projectId')\n        || params.get('projectID')\n        || params.get('project_id')\n        || params.get('bg_project_id')\n        || params.get('bg_saved_project_id')\n      );\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function getLaunchProvider(store) {\n    if (store && store.config && store.config.editorFlowDisabled === true) return '';\n    return readLaunchProviderFromUrl()\n      || (hasSelfHostedProjectUrlParam() ? 'self-hosted' : '')\n      || readLaunchProviderCandidate(store && store.config && store.config.launchProvider)\n      || readLaunchProviderCandidate(store && store.config && store.config.designer && store.config.designer.launchProvider)\n      || readLaunchProviderCandidate(store && store.binding && store.binding.launchProvider)\n      || readLaunchProviderCandidate(window.BG_DESIGNER_LAUNCH_PROVIDER)\n      || readLaunchProviderCandidate(window.BG_DESIGNER_DEFAULT_PROVIDER)\n      || '';\n  }\n\n  function isPitchPrintLaunchProvider(store) {\n    return getLaunchProvider(store) === 'pitchprint';\n  }\n\n  function normalizeCartDesignEditor(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s_]+/g, '-');\n    return normalized === 'pitchprint-mini' ? normalized : '';\n  }\n\n  function getCartDesignEditor(store) {\n    return normalizeCartDesignEditor(\n      store && store.config && store.config.cartDesignEditor\n      || store && store.config && store.config.designer && store.config.designer.cartDesignEditor\n    );\n  }\n\n  function getTemplateSourceTitle(store) {\n    return text(\n      store && store.config && store.config.reviewSource && store.config.reviewSource.title\n      || store && store.config && store.config.productTitle\n    );\n  }\n\n  function getTemplateModalFilterProductName(store) {\n    var config = getTemplateModalPageConfig(store) || {};\n    return text(config.filterProductName || getTemplateSourceTitle(store));\n  }\n\n  function getProductCatalogEntry(store, handle) {\n    var catalog = store && store.productCatalog && typeof store.productCatalog === 'object'\n      ? store.productCatalog\n      : null;\n    var key = text(handle);\n    if (!catalog || !key || !catalog[key] || typeof catalog[key] !== 'object') return null;\n    return catalog[key];\n  }\n\n  function getOptionLayoutProductEntry(store, handle) {\n    var productLayouts = store && store.optionLayout && store.optionLayout.products && typeof store.optionLayout.products === 'object'\n      ? store.optionLayout.products\n      : null;\n    var key = text(handle);\n    if (!productLayouts || !key || !productLayouts[key] || typeof productLayouts[key] !== 'object') return null;\n    return productLayouts[key];\n  }\n\n  function getMappedProductSourceHandles(store) {\n    var config = store && store.config && typeof store.config === 'object' ? store.config : {};\n    var mapping = config.editorMapping && typeof config.editorMapping === 'object' ? config.editorMapping : {};\n    var handles = [\n      mapping.aliasSourceHandle,\n      config.aliasSourceHandle,\n      mapping.configSourceHandle,\n      mapping.productDataSourceHandle,\n      mapping.optionSourceHandle,\n      config.configSourceHandle,\n      config.handle,\n      mapping.returnProductHandle,\n      config.returnProductHandle,\n      mapping.templateSourceHandle,\n      config.templateSourceHandle\n    ].map(text).filter(Boolean);\n    return handles.filter(function (handle, index) {\n      return handles.indexOf(handle) === index;\n    });\n  }\n\n  function resolveProductDataSourceHandle(store) {\n    var handles = getMappedProductSourceHandles(store);\n    for (var i = 0; i < handles.length; i += 1) {\n      if (getProductCatalogEntry(store, handles[i])) return handles[i];\n    }\n    return getConfigSourceHandle(store);\n  }\n\n  function resolveOptionLayoutSourceHandle(store) {\n    var handles = getMappedProductSourceHandles(store);\n    for (var i = 0; i < handles.length; i += 1) {\n      if (getOptionLayoutProductEntry(store, handles[i])) return handles[i];\n    }\n    return getConfigSourceHandle(store);\n  }\n\n  function getTemplateProductData(store) {\n    if (store && store.productEditorConfigProductData && typeof store.productEditorConfigProductData === 'object') {\n      return store.productEditorConfigProductData;\n    }\n    var sourceHandle = getTemplateSourceHandle(store);\n    return getProductCatalogEntry(store, sourceHandle) || (store && store.productData && typeof store.productData === 'object' ? store.productData : {});\n  }\n\n  function getTemplateProductLayout(store) {\n    var sourceHandle = getTemplateSourceHandle(store);\n    return getOptionLayoutProductEntry(store, sourceHandle) || {};\n  }\n\n  function getTemplateBinding(store) {\n    var templateProductData = getTemplateProductData(store);\n    if (templateProductData && typeof templateProductData.designerProductBinding === 'object') {\n      return templateProductData.designerProductBinding;\n    }\n    var templateProductLayout = getTemplateProductLayout(store);\n    if (templateProductLayout && typeof templateProductLayout.designerProductBinding === 'object') {\n      return templateProductLayout.designerProductBinding;\n    }\n    return store && store.binding && typeof store.binding === 'object' ? store.binding : {};\n  }\n\n  function getArtworkSectionConfig(store) {\n    var productData = plainObject(store && store.productData);\n    var binding = plainObject(store && store.binding);\n    var raw = mergePlainObjects([\n      productData.artworkSection,\n      productData.artworkSectionConfig,\n      binding.artworkSection,\n      binding.artworkSectionConfig\n    ]);\n    var optionTemplateRaw = mergePlainObjects([\n      raw.optionTemplateModal,\n      raw.templateOptionModal,\n      raw.optionTemplatePicker\n    ]);\n    var hasConfiguredShowUseTemplate = Object.prototype.hasOwnProperty.call(raw, 'showUseTemplate');\n    var hasConfiguredShowCustomDesign = Object.prototype.hasOwnProperty.call(raw, 'showCustomDesign');\n    var hasConfiguredShowReorder = Object.prototype.hasOwnProperty.call(raw, 'showReorder');\n    var hasConfiguredShowRecreateDesign = Object.prototype.hasOwnProperty.call(raw, 'showRecreateDesign');\n    var hasConfiguredShowFreeSetup = Object.prototype.hasOwnProperty.call(raw, 'showFreeSetup');\n    var hasConfiguredShowShareCanva = Object.prototype.hasOwnProperty.call(raw, 'showShareCanva');\n    var hasConfiguredShowUploadFiles = Object.prototype.hasOwnProperty.call(raw, 'showUploadFiles');\n    var hasConfiguredShowSendLater = Object.prototype.hasOwnProperty.call(raw, 'showSendLater');\n    var optionTemplateModal = Object.assign({}, DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG, optionTemplateRaw);\n    optionTemplateModal.enabled = booleanConfig(optionTemplateModal.enabled, false);\n    optionTemplateModal.hideTemplateHolder = booleanConfig(optionTemplateModal.hideTemplateHolder, optionTemplateModal.enabled);\n    optionTemplateModal.hideTriggerHolder = booleanConfig(optionTemplateModal.hideTriggerHolder, optionTemplateModal.enabled);\n    optionTemplateModal.suppressTemplateSelectionUnlessTriggerSelected = booleanConfig(\n      optionTemplateModal.suppressTemplateSelectionUnlessTriggerSelected,\n      true\n    );\n    optionTemplateModal.triggerValueIds = normalizeStringList(optionTemplateModal.triggerValueIds || optionTemplateModal.triggerHvIds || optionTemplateModal.triggerHvids);\n    optionTemplateModal.triggerValueTargetingIds = normalizeStringList(optionTemplateModal.triggerValueTargetingIds || optionTemplateModal.triggerTargetingIds);\n    optionTemplateModal.triggerValueLabels = normalizeStringList(optionTemplateModal.triggerValueLabels || optionTemplateModal.triggerLabels);\n\n    var config = Object.assign({}, DEFAULT_ARTWORK_SECTION_CONFIG, raw);\n    // `enabled` is the canonical Admin product-page field. Keep the older\n    // showArtworkSection alias as a fallback so existing products remain\n    // byte-for-byte compatible until they are explicitly edited.\n    config.showArtworkSection = Object.prototype.hasOwnProperty.call(raw, 'enabled')\n      ? booleanConfig(raw.enabled, true)\n      : booleanConfig(config.showArtworkSection, true);\n    config.showStandardArtworkSection = booleanConfig(config.showStandardArtworkSection, true);\n    config.showNeedDesign = booleanConfig(config.showNeedDesign, true);\n    config.showHaveDesign = booleanConfig(config.showHaveDesign, true);\n    config.showSendLater = booleanConfig(config.showSendLater, true);\n    config.showUseTemplate = booleanConfig(config.showUseTemplate, true);\n    config.showCustomDesign = booleanConfig(config.showCustomDesign, true);\n    config.showReorder = booleanConfig(config.showReorder, false);\n    config.showRecreateDesign = booleanConfig(config.showRecreateDesign, false);\n    config.showFreeSetup = booleanConfig(config.showFreeSetup, false);\n    config.showShareCanva = booleanConfig(config.showShareCanva, true);\n    config.showUploadFiles = booleanConfig(config.showUploadFiles, true);\n    config.layoutMode = normalizeArtworkSectionLayoutMode(config.layoutMode || config.sectionMode || config.mode);\n    config.sectionLayout = normalizeArtworkSectionLayoutVersion(config.sectionLayout || config.artworkSectionLayout);\n    config.hideArtworkMethodHolder = booleanConfig(config.hideArtworkMethodHolder, optionTemplateModal.enabled && optionTemplateModal.hideTriggerHolder);\n    config.collapseArtworkChooser = booleanConfig(config.collapseArtworkChooser, true);\n    // Opt-in compact chooser presentation (per-product pilot flags; default off\n    // so existing products render byte-identical sections).\n    config.restQuickLinks = booleanConfig(config.restQuickLinks, false);\n    config.groupedChooser = booleanConfig(config.groupedChooser, false);\n    config.templateFinishInModal = booleanConfig(config.templateFinishInModal, false);\n    config.defaultArtworkMode = text(config.defaultArtworkMode || config.defaultMethod || config.defaultArtworkMethod);\n    config.artworkMethodOrder = normalizeStringList(config.artworkMethodOrder || config.methodOrder || config.actionOrder);\n    config.recommendedArtworkMethod = text(config.recommendedArtworkMethod || config.recommendedMethod);\n    config._methodAvailabilityConfigured = {\n      useTemplate: hasConfiguredShowUseTemplate,\n      customDesign: hasConfiguredShowCustomDesign,\n      reorder: hasConfiguredShowReorder,\n      recreate: hasConfiguredShowRecreateDesign,\n      freeSetup: hasConfiguredShowFreeSetup,\n      shareCanva: hasConfiguredShowShareCanva,\n      uploadFiles: hasConfiguredShowUploadFiles,\n      sendLater: hasConfiguredShowSendLater\n    };\n    config.optionTemplateModal = optionTemplateModal;\n    return config;\n  }\n\n  function getCustomerInputConfig(store) {\n    var productData = plainObject(store && store.productData);\n    var productPageConfig = plainObject(productData.productPageConfig);\n    var raw = plainObject(productPageConfig.customerInputs);\n    var allowedTypes = {\n      short_text: true,\n      long_text: true,\n      number: true,\n      phone: true,\n      email: true,\n      url: true,\n      date: true,\n      checkbox: true\n    };\n    var seenIds = Object.create(null);\n    var seenLabels = Object.create(null);\n    var fields = (Array.isArray(raw.fields) ? raw.fields : []).slice(0, 20).map(function (entry) {\n      var field = plainObject(entry);\n      var id = text(field.id).toLowerCase();\n      var label = text(field.label).slice(0, 80);\n      var type = text(field.type).toLowerCase();\n      var labelKey = label.toLowerCase();\n      if (\n        !/^[a-z][a-z0-9_]{0,47}$/.test(id)\n        || !label\n        || !allowedTypes[type]\n        || seenIds[id]\n        || seenLabels[labelKey]\n      ) return null;\n      seenIds[id] = true;\n      seenLabels[labelKey] = true;\n      var minLength = Number(field.minLength);\n      var maxLength = Number(field.maxLength);\n      var min = Number(field.min);\n      var max = Number(field.max);\n      var step = Number(field.step);\n      return {\n        id: id,\n        label: label,\n        type: type,\n        required: field.required === true,\n        placeholder: text(field.placeholder).slice(0, 160),\n        helpText: text(field.helpText).slice(0, 300),\n        minLength: Number.isInteger(minLength) && minLength >= 0 ? Math.min(minLength, 1000) : null,\n        maxLength: Number.isInteger(maxLength) && maxLength > 0 ? Math.min(maxLength, 1000) : null,\n        min: Number.isFinite(min) ? min : null,\n        max: Number.isFinite(max) ? max : null,\n        step: Number.isFinite(step) && step > 0 ? step : null,\n        minDate: /^\\d{4}-\\d{2}-\\d{2}$/.test(text(field.minDate)) ? text(field.minDate) : '',\n        maxDate: /^\\d{4}-\\d{2}-\\d{2}$/.test(text(field.maxDate)) ? text(field.maxDate) : ''\n      };\n    }).filter(Boolean);\n    return {\n      enabled: raw.enabled === true && fields.length > 0,\n      title: text(raw.title).slice(0, 120) || 'Personalization',\n      description: text(raw.description).slice(0, 500),\n      fields: fields\n    };\n  }\n\n  function normalizeArtworkSectionLayoutMode(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s_]+/g, '-');\n    return normalized === 'cards' || normalized === 'card' ? 'cards' : 'list';\n  }\n\n  // Versioned artwork-section layouts (Admin \"Artwork section layout\"):\n  // v2 Three outcomes, v3 Template-forward, v4 One question at a time.\n  // Anything else \u2014 absent, junk, or explicit v1 \u2014 keeps the current chooser\n  // so every existing product renders byte-identical markup.\n  function normalizeArtworkSectionLayoutVersion(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s_]+/g, '-');\n    return normalized === 'v2' || normalized === 'v3' || normalized === 'v4' ? normalized : 'v1';\n  }\n\n  function getOptionTemplateModalConfig(store) {\n    return getArtworkSectionConfig(store).optionTemplateModal || DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG;\n  }\n\n  function isOptionTemplateArtworkFlow(store) {\n    var config = getOptionTemplateModalConfig(store);\n    return !!(config && config.enabled && getOptionTemplateHolder(store));\n  }\n\n  // The Admin \"Show artwork section\" product toggle (artwork.enabled). This is\n  // the operator's explicit page-composition choice \u2014 the prototype heroes drop\n  // their artwork regions entirely when it is off (OP-02/OP-03). It is\n  // deliberately narrower than shouldRenderArtworkSection(), which also\n  // collapses for availability/editor reasons; those stay genuine fail-open\n  // conditions for the intent-first adapter.\n  function isArtworkSectionAdminDisabled(store) {\n    return !getArtworkSectionConfig(store).showArtworkSection && !(artworkOwners.has(store) && artworkOwners.get(store).recovery);\n  }\n\n  // CARTLINE-RESTORE-ARTWORK-OFF-01: with the artwork section off nothing on\n  // the page can show, edit, remove or approve a saved design. The one\n  // exception is configuration too: a page whose cart design editor is the\n  // PitchPrint Mini editor shows and edits its own design with the section\n  // off, so a design on its cart line is never unseen there.\n  function isPageWithoutSavedDesignSurface(store) {\n    return isArtworkSectionAdminDisabled(store) && getCartDesignEditor(store) !== 'pitchprint-mini';\n  }\n\n  // URL-PROJECT-PARAM-ARTWORK-OFF-01: the one check an arrival lane makes at\n  // the point where it would place a customer design in page state: the\n  // address lane (every project parameter and the encoded state land in one\n  // place), the PitchPrint session pointer, a switch-account pass, a sign-in\n  // resume, and the form's own serialized state. On a page that cannot show\n  // a saved design the lane places nothing: no project, no mode taken from\n  // it, no pointer or form input written, so the page is a fresh visit and\n  // its Add to cart adds a plain line. The saved-design resume\n  // (RESUME-ARTWORK-OFF-01) and the cart line (CARTLINE-RESTORE-ARTWORK-OFF-01)\n  // keep their own refusals. The sentence is the saved-design resume's, on\n  // its carrier, so it survives the boot render. options.silent: the lane was\n  // not the customer's request to open a design (a pointer the browser kept,\n  // a render re-reading the form), or another lane owns the sentence (a cart\n  // line key is in the address, so restoreFromCartLine answers).\n  function refuseSavedDesignLanding(store, options) {\n    if (!isPageWithoutSavedDesignSurface(store)) return false;\n    if (!(options && options.silent)) rejectSavedProjectResume(store);\n    return true;\n  }\n\n  function shouldRenderArtworkSection(store, config) {\n    var settings = config || getArtworkSectionConfig(store);\n    if (!settings.showArtworkSection && !(artworkOwners.has(store) && artworkOwners.get(store).recovery)) return false;\n    if (isBogunaArtworkPage(store) || isEditorlessArtworkPage(store)) {\n      var availability = getStoreArtworkAvailability(store);\n      return !!(availability && (availability.designonline || availability.editservice || availability.uploadfiles\n        || availability.uploadcanva || availability.youhaveart || availability.customdesign\n        || availability.reorder || availability.recreate || availability.freesetup));\n    }\n    return !!(settings.showStandardArtworkSection || isOptionTemplateArtworkFlow(store));\n  }\n\n  function isOptionTemplateModalMode(store) {\n    return text(store && store.templateModalMode).toLowerCase() === OPTION_TEMPLATE_MODAL_MODE;\n  }\n\n  function getTemplateModalFieldDefs(store) {\n    var config = getTemplateModalPageConfig(store) || {};\n    var includeRaw = Array.isArray(config.filtersToInclude) ? config.filtersToInclude : [];\n    var excludeRaw = Array.isArray(config.filtersToExclude) ? config.filtersToExclude : [];\n    if (!includeRaw.length && !excludeRaw.length) return TEMPLATE_FILTER_FIELDS.slice();\n    var allByKey = new Map();\n    TEMPLATE_FILTER_FIELDS.forEach(function (entry) {\n      var fieldKey = canonicalFilterKey(entry.field);\n      if (fieldKey) allByKey.set(fieldKey, entry);\n      var labelKey = canonicalFilterKey(entry.label);\n      if (labelKey) allByKey.set(labelKey, entry);\n    });\n    var include = includeRaw.length ? includeRaw : TEMPLATE_FILTER_FIELDS.map(function (entry) {\n      return entry.field;\n    });\n    var exclude = new Set(excludeRaw.map(canonicalFilterKey).filter(Boolean));\n    var out = [];\n    var seen = new Set();\n    include.forEach(function (rawValue) {\n      var key = canonicalFilterKey(rawValue);\n      if (!key || seen.has(key) || exclude.has(key)) return;\n      var match = allByKey.get(key);\n      if (!match) return;\n      var matchKey = canonicalFilterKey(match.field);\n      if (!matchKey || seen.has(matchKey) || exclude.has(matchKey)) return;\n      seen.add(matchKey);\n      out.push(match);\n    });\n    return out;\n  }\n\n  function getTemplateSearchFields(store) {\n    return Array.from(new Set(getTemplateModalFieldDefs(store).map(function (entry) {\n      return entry.field;\n    }).concat(TEMPLATE_SEARCH_EXTRA_FIELDS)));\n  }\n\n  function getTemplateSearchSuggestionFields(store) {\n    return Array.from(new Set(getTemplateModalFieldDefs(store).map(function (entry) {\n      return entry.field;\n    }).concat(TEMPLATE_SEARCH_SUGGESTION_EXTRA_FIELDS)));\n  }\n\n  function getTemplateDisplaySize(rawTemplate) {\n    if (!rawTemplate || typeof rawTemplate !== 'object') return '';\n    return text(rawTemplate.size_display_as || rawTemplate.size);\n  }\n\n  function getTemplateFieldValues(rawTemplate, field) {\n    if (!rawTemplate || typeof rawTemplate !== 'object' || !field) return [];\n    var value = field === 'size'\n      ? (getTemplateDisplaySize(rawTemplate) || rawTemplate.size)\n      : rawTemplate[field];\n    if (Array.isArray(value)) {\n      return value.map(text).filter(Boolean);\n    }\n    if (value === null || value === undefined) return [];\n    var cleanValue = text(value);\n    return cleanValue ? [cleanValue] : [];\n  }\n\n  function templateFieldHasValue(rawTemplate, field, expected) {\n    var target = normalizeSearchValue(expected);\n    if (!target) return false;\n    return getTemplateFieldValues(rawTemplate, field).some(function (value) {\n      return normalizeSearchValue(value) === target;\n    });\n  }\n\n  function getTemplateSearchableValues(store, rawTemplate) {\n    var values = [];\n    getTemplateSearchFields(store).forEach(function (field) {\n      getTemplateFieldValues(rawTemplate, field).forEach(function (entry) {\n        var normalized = normalizeSearchValue(entry);\n        if (normalized) values.push(normalized);\n      });\n    });\n    return values;\n  }\n\n  function getTemplateFieldLabel(field) {\n    var match = TEMPLATE_FILTER_FIELDS.find(function (entry) {\n      return entry.field === field;\n    });\n    return text(match && match.label) || String(field || '').replace(/_/g, ' ').replace(/\\b\\w/g, function (token) {\n      return token.toUpperCase();\n    });\n  }\n\n  function sortTemplateItems(items, sortMode) {\n    var list = Array.isArray(items) ? items.slice() : [];\n    var mode = text(sortMode).toLowerCase() || 'default';\n    if (mode === 'random') {\n      for (var index = list.length - 1; index > 0; index -= 1) {\n        var swapIndex = Math.floor(Math.random() * (index + 1));\n        var next = list[index];\n        list[index] = list[swapIndex];\n        list[swapIndex] = next;\n      }\n      return list;\n    }\n    if (mode === 'newest') {\n      return list.sort(function (left, right) {\n        var leftTime = Date.parse(text(left && left.createdAt)) || 0;\n        var rightTime = Date.parse(text(right && right.createdAt)) || 0;\n        return rightTime - leftTime;\n      });\n    }\n    if (mode === 'most_popular') {\n      return list.sort(function (left, right) {\n        return (Number(right && right.popularity) || 0) - (Number(left && left.popularity) || 0);\n      });\n    }\n    function getDefaultPriority(entry) {\n      var hasBackers = Array.isArray(entry && entry.backers) && entry.backers.length > 0;\n      var canCustomizeOnline = !!(entry && entry.designOnlineAvailable);\n      var canUseEditService = !!(entry && entry.editServiceAvailable);\n      var isLegacy = !!(entry && entry.legacyTemplate);\n      if (canCustomizeOnline && hasBackers) return 0;\n      if (canCustomizeOnline) return 1;\n      if (canUseEditService && !isLegacy) return 2;\n      if (canUseEditService) return 3;\n      return 4;\n    }\n    return list.sort(function (left, right) {\n      var priorityDelta = getDefaultPriority(left) - getDefaultPriority(right);\n      if (priorityDelta !== 0) return priorityDelta;\n      return text(left && left.title).localeCompare(text(right && right.title), undefined, {\n        numeric: true,\n        sensitivity: 'base'\n      });\n    });\n  }\n\n  function isStartBlankTemplate(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    return normalizeSearchValue(template && (template.title || raw.template_name)) === 'start from scratch';\n  }\n\n  function parseTemplateDimensionPair(value) {\n    var source = text(value).toLowerCase();\n    if (!source) return null;\n    var match = source.match(/([0-9]+(?:[.-][0-9]+)?)\\s*(?:in|\")?\\s*x\\s*([0-9]+(?:[.-][0-9]+)?)\\s*(?:in|\")?/i);\n    if (!match) return null;\n    var width = Number(String(match[1]).replace(/-/g, '.'));\n    var height = Number(String(match[2]).replace(/-/g, '.'));\n    if (!(width > 0) || !(height > 0)) return null;\n    return { width: width, height: height };\n  }\n\n  function makeTemplateDimensionKey(pair) {\n    if (!pair) return '';\n    var width = Math.round(Number(pair.width) * 1000) / 1000;\n    var height = Math.round(Number(pair.height) * 1000) / 1000;\n    if (!Number.isFinite(width) || !Number.isFinite(height)) return '';\n    var sorted = [width, height].sort(function (left, right) { return left - right; });\n    return sorted[0] + 'x' + sorted[1];\n  }\n\n  function getTemplateDimensionKeys(values) {\n    var keys = Object.create(null);\n    normalizeStringList(values).forEach(function (value) {\n      var parsed = parseTemplateDimensionPair(value);\n      var key = makeTemplateDimensionKey(parsed);\n      if (key) keys[key] = true;\n    });\n    return keys;\n  }\n\n  function getTemplateRawTargetingValues(template, field) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    return normalizeStringList(raw[field]).map(normalizeTargetingIdKey).filter(Boolean);\n  }\n\n  function templateHasSelectedTargeting(template, fields, selectedTargetingIds) {\n    var selected = selectedTargetingIds && typeof selectedTargetingIds === 'object' ? selectedTargetingIds : {};\n    return (Array.isArray(fields) ? fields : []).some(function (field) {\n      return getTemplateRawTargetingValues(template, field).some(function (value) {\n        return !!selected[value];\n      });\n    });\n  }\n\n  function normalizeTemplateOrientation(value) {\n    var normalized = text(value).toLowerCase();\n    if (!normalized) return '';\n    if (normalized === 'vertical' || normalized === 'portrait' || normalized.indexOf('vertical') !== -1 || normalized.indexOf('portrait') !== -1) return 'vertical';\n    if (normalized === 'horizontal' || normalized === 'landscape' || normalized.indexOf('horizontal') !== -1 || normalized.indexOf('landscape') !== -1) return 'horizontal';\n    if (normalized === 'square' || normalized.indexOf('square') !== -1) return 'square';\n    return '';\n  }\n\n  function getTemplateOrientation(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var values = normalizeStringList(raw.orientation).concat(normalizeStringList(raw.orientation_targetingID));\n    for (var index = 0; index < values.length; index += 1) {\n      var normalized = normalizeTemplateOrientation(values[index]);\n      if (normalized) return normalized;\n    }\n    return '';\n  }\n\n  function getTemplateSizeKeys(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var values = normalizeStringList(raw.size)\n      .concat(normalizeStringList(raw.size_display_as))\n      .concat(normalizeStringList(raw.label_from_size))\n      .concat(normalizeStringList(raw.sizes_available))\n      .concat(normalizeStringList(raw.size_targetingID));\n    return getTemplateDimensionKeys(values);\n  }\n\n  function getStartBlankSelectionContext(store) {\n    var selectedTargetingIds = getSelectedOptionTargetingIds(store);\n    var sizePayload = buildSelectedSizePayload(store);\n    var sizeValues = [sizePayload.selectedSizeId, sizePayload.selectedSizeLabel];\n    if (sizePayload.selectedWidth && sizePayload.selectedHeight) {\n      sizeValues.push(sizePayload.selectedWidth + 'x' + sizePayload.selectedHeight);\n    }\n    Object.keys(selectedTargetingIds || {}).forEach(function (key) {\n      if (key.indexOf('size-') !== -1 || /\\d/.test(key)) sizeValues.push(key);\n    });\n    return {\n      selectedTargetingIds: selectedTargetingIds,\n      sizeKeys: getTemplateDimensionKeys(sizeValues),\n      orientation: normalizeTemplateOrientation(sizePayload.selectedOrientation),\n      printingMode: getTemplatePrintingFilterMode(store)\n    };\n  }\n\n  function scoreStartBlankTemplate(store, template, context) {\n    var score = 0;\n    if (templateHasSelectedTargeting(template, ['size_targetingID'], context.selectedTargetingIds)) score += 1000;\n    var templateSizeKeys = getTemplateSizeKeys(template);\n    var selectedSizeKeys = context.sizeKeys || {};\n    if (Object.keys(selectedSizeKeys).some(function (key) { return !!templateSizeKeys[key]; })) score += 500;\n    if (templateHasSelectedTargeting(template, ['shape_targetingID'], context.selectedTargetingIds)) score += 120;\n    if (templateHasSelectedTargeting(template, ['orientation_targetingID'], context.selectedTargetingIds)) score += 80;\n    if (context.orientation && context.orientation === getTemplateOrientation(template)) score += 60;\n    if (context.printingMode && getTemplatePrintingModes(template).indexOf(context.printingMode) !== -1) score += 10; // a blank made for the chosen printing wins a tie\n    if (text(template && template.designNumber) && text(template.designNumber) === text(template.raw && template.raw['linked design default'])) score += 5;\n    return score;\n  }\n\n  function getStartBlankTemplateSizeLabel(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    return text(raw.size_display_as || raw.label_from_size || raw.size);\n  }\n\n  function getStartBlankTemplatesForModal(store) {\n    var printingMode = getTemplatePrintingFilterMode(store);\n    return (store && Array.isArray(store.templates) ? store.templates : []).filter(function (template) {\n      if (!isStartBlankTemplate(template)) return false;\n      if (!templateMatchesStorePage(store, template, { includeExcluded: true })) return false;\n      if (store.templateModalMode === 'designonline' && !template.designOnlineAvailable) return false;\n      if (store.templateModalMode === 'editservice' && !template.editServiceAvailable) return false;\n      if (getTemplatePrintingModes(template).length && !templateMatchesPrintingMode(template, printingMode)) return false; // OD-255: an untagged blank fits every Printing choice\n      return true;\n    });\n  }\n\n  function getStartBlankTemplateForModal(store) {\n    var templates = getStartBlankTemplatesForModal(store);\n    if (!templates.length) return null;\n    var sizeHolder = findSyncedOptionHolder(store, getProductCommerceEditorSync(store).sizeHolderId, 'size', 'size');\n    if (sizeHolder) {\n      templates = templates.filter(function (template) {\n        var configuration = getTemplateModalConfiguration(store, template);\n        return configuration.mappable && configuration.matchesCurrent;\n      });\n      if (!templates.length) return null;\n    }\n    if (templates.length === 1) return templates[0];\n    var context = getStartBlankSelectionContext(store);\n    var best = null;\n    var bestScore = -1;\n    templates.forEach(function (template) {\n      var score = scoreStartBlankTemplate(store, template, context);\n      if (score > bestScore) {\n        best = template;\n        bestScore = score;\n      }\n    });\n    return best || templates[0];\n  }\n\n  function generateNGrams(value, size) {\n    var source = String(value || '');\n    var grams = new Set();\n    var width = Math.min(Number(size) || 3, source.length);\n    if (!source.length || !width) return grams;\n    for (var index = 0; index <= source.length - width; index += 1) {\n      grams.add(source.slice(index, index + width));\n    }\n    return grams;\n  }\n\n  function levenshteinDistance(left, right) {\n    var a = String(left || '');\n    var b = String(right || '');\n    var matrix = [];\n    var row;\n    for (row = 0; row <= b.length; row += 1) matrix[row] = [row];\n    var column;\n    for (column = 0; column <= a.length; column += 1) matrix[0][column] = column;\n    for (row = 1; row <= b.length; row += 1) {\n      for (column = 1; column <= a.length; column += 1) {\n        if (b.charAt(row - 1) === a.charAt(column - 1)) {\n          matrix[row][column] = matrix[row - 1][column - 1];\n        } else {\n          matrix[row][column] = Math.min(\n            matrix[row - 1][column - 1] + 1,\n            matrix[row][column - 1] + 1,\n            matrix[row - 1][column] + 1\n          );\n        }\n      }\n    }\n    return matrix[b.length][a.length];\n  }\n\n  function advancedTemplateSearchMatch(query, keyword) {\n    var normalizedQuery = normalizeSearchValue(query);\n    var normalizedKeyword = normalizeSearchValue(keyword);\n    if (!normalizedQuery || !normalizedKeyword) return false;\n    if (normalizedKeyword.indexOf(normalizedQuery) !== -1) return true;\n    if (normalizedKeyword.indexOf(normalizedQuery) === 0) return true;\n    if (levenshteinDistance(normalizedQuery, normalizedKeyword) <= Math.ceil(normalizedQuery.length / 2)) return true;\n    var queryNgrams = generateNGrams(normalizedQuery);\n    var keywordNgrams = generateNGrams(normalizedKeyword);\n    var overlap = 0;\n    queryNgrams.forEach(function (gram) {\n      if (keywordNgrams.has(gram)) overlap += 1;\n    });\n    return overlap / Math.max(queryNgrams.size || 1, keywordNgrams.size || 1) > 0.4;\n  }\n\n  function buildTemplateSearchSuggestionIndex(store, templates) {\n    var nGramMap = new Map();\n    var displayMap = new Map();\n    var fields = getTemplateSearchSuggestionFields(store);\n    (Array.isArray(templates) ? templates : []).forEach(function (template) {\n      var raw = template && template.raw ? template.raw : null;\n      if (!raw) return;\n      fields.forEach(function (field) {\n        getTemplateFieldValues(raw, field).forEach(function (value) {\n          var display = text(value);\n          var normalized = normalizeSearchValue(display);\n          if (!display || !normalized) return;\n          if (!displayMap.has(normalized)) displayMap.set(normalized, display);\n          generateNGrams(normalized).forEach(function (gram) {\n            if (!nGramMap.has(gram)) nGramMap.set(gram, new Set());\n            nGramMap.get(gram).add(normalized);\n          });\n        });\n      });\n    });\n    store.templateSearchSuggestionIndex = {\n      nGramMap: nGramMap,\n      displayMap: displayMap\n    };\n  }\n\n  function hideTemplateSearchSuggestions(modal, store) {\n    var suggestions = modal && modal.querySelector('[data-bg-designer-template-search-suggestions]');\n    if (!suggestions) return;\n    suggestions.innerHTML = '';\n    suggestions.hidden = true;\n    suggestions.style.display = 'none';\n    store.templateSearchSuggestions = [];\n    store.templateSearchActiveIndex = -1;\n    var search = modal.querySelector('[data-bg-designer-template-search]');\n    if (search) search.setAttribute('aria-expanded', 'false');\n  }\n\n  function setActiveTemplateSearchSuggestion(modal, store, index) {\n    var suggestions = modal && modal.querySelector('[data-bg-designer-template-search-suggestions]');\n    if (!suggestions) return;\n    var items = Array.prototype.slice.call(suggestions.querySelectorAll('[data-bg-template-suggestion-index]'));\n    store.templateSearchActiveIndex = index;\n    items.forEach(function (item, itemIndex) {\n      var active = itemIndex === index;\n      item.classList.toggle('is-active', active);\n      item.setAttribute('aria-selected', active ? 'true' : 'false');\n      if (active && item.scrollIntoView) item.scrollIntoView({ block: 'nearest' });\n    });\n  }\n\n  function showTemplateSearchSuggestions(modal, store, values) {\n    var suggestions = modal && modal.querySelector('[data-bg-designer-template-search-suggestions]');\n    if (!suggestions) return;\n    var search = modal.querySelector('[data-bg-designer-template-search]');\n    var list = (Array.isArray(values) ? values : []).slice(0, 10);\n    if (!list.length) {\n      hideTemplateSearchSuggestions(modal, store);\n      return;\n    }\n    store.templateSearchSuggestions = list.slice();\n    store.templateSearchActiveIndex = -1;\n    suggestions.innerHTML = '';\n    list.forEach(function (value, index) {\n      var option = document.createElement('div');\n      option.textContent = value;\n      option.title = value;\n      option.setAttribute('role', 'option');\n      option.setAttribute('aria-selected', 'false');\n      option.setAttribute('data-bg-template-suggestion-index', String(index));\n      option.addEventListener('mousedown', function (event) {\n        event.preventDefault();\n        applyTemplateSearchSuggestion(modal, store, value);\n      });\n      suggestions.appendChild(option);\n    });\n    suggestions.hidden = false;\n    suggestions.style.display = 'block';\n    if (search) search.setAttribute('aria-expanded', 'true');\n  }\n\n  function applyTemplateSearchSuggestion(modal, store, value) {\n    var search = modal && modal.querySelector('[data-bg-designer-template-search]');\n    if (search) search.value = value;\n    var state = getTemplateModalState(store);\n    state.query = value;\n    resetTemplateModalResults(state, modal);\n    renderTemplateModal(store);\n    hideTemplateSearchSuggestions(modal, store);\n    if (search) search.focus();\n  }\n\n  function updateTemplateSearchSuggestions(modal, store) {\n    var search = modal && modal.querySelector('[data-bg-designer-template-search]');\n    if (!search || !store.templateSearchSuggestionIndex) return;\n    var query = normalizeSearchValue(search.value);\n    if (!query) {\n      hideTemplateSearchSuggestions(modal, store);\n      return;\n    }\n    var nGramMap = store.templateSearchSuggestionIndex.nGramMap;\n    var displayMap = store.templateSearchSuggestionIndex.displayMap;\n    var potential = new Set();\n    generateNGrams(query).forEach(function (gram) {\n      if (!nGramMap.has(gram)) return;\n      nGramMap.get(gram).forEach(function (match) {\n        potential.add(match);\n      });\n    });\n    var displayValues = Array.from(new Set(Array.from(potential).filter(function (keyword) {\n      return advancedTemplateSearchMatch(query, keyword);\n    }).map(function (keyword) {\n      return displayMap.get(keyword) || keyword;\n    })));\n    displayValues.sort(function (left, right) {\n      var a = normalizeSearchValue(left);\n      var b = normalizeSearchValue(right);\n      var aStarts = a.indexOf(query) === 0;\n      var bStarts = b.indexOf(query) === 0;\n      if (aStarts !== bStarts) return aStarts ? -1 : 1;\n      return a.localeCompare(b);\n    });\n    showTemplateSearchSuggestions(modal, store, displayValues);\n  }\n\n  function debounce(fn, waitMs) {\n    var timeoutId = 0;\n    return function () {\n      var args = arguments;\n      clearTimeout(timeoutId);\n      timeoutId = window.setTimeout(function () {\n        fn.apply(null, args);\n      }, waitMs);\n    };\n  }\n\n  function normalizeTemplate(row) {\n    var template = row && typeof row === 'object' ? row : {};\n    var legacyDesignId = buildStableTemplateDesignId(template);\n    var sourceDesignId = text(template.id);\n    var availability = getTemplateAvailability(template);\n    var templateLookup = text(\n      template.template_lookup\n      || template.templateLookup\n      || template.template_public_id\n      || template.templatePublicId\n      || template.public_id\n      || template.publicId\n    );\n    var backers = Array.isArray(template.backers) ? template.backers.map(function (entry) {\n      return {\n        id: text(entry && entry.id),\n        label: text(entry && entry.label),\n        thumb: text(entry && entry.thumb),\n        previews: Array.isArray(entry && entry.previews) ? entry.previews.map(text).filter(Boolean) : []\n      };\n    }).filter(function (entry) {\n      return entry.id;\n    }) : [];\n    var defaultBackerId = text(template.default_backer_id || (backers[0] && backers[0].id));\n    var editServicePrice = getTemplateEditServicePriceMeta(template);\n    return {\n      raw: deepClone(template, {}),\n      sourceDesignId: sourceDesignId,\n      sourceId: legacyDesignId,\n      designId: legacyDesignId,\n      selectionKey: getTemplateSelectionKey({\n        designNumber: text(template.designnum),\n        templateLookup: templateLookup,\n        designId: legacyDesignId,\n        title: text(template.template_name || template.title || template.name)\n      }),\n      designNumber: text(template.designnum),\n      templateLookup: templateLookup,\n      templatePublicId: templateLookup,\n      // Product-bound native templates carry the exact immutable revision\n      // used by the API quote resolver. Keep it on the normalized selection so\n      // edit-service quote requests cannot silently drop the stale-config pin.\n      revision: text(\n        template.__foundationTemplateCurrentRevisionId\n        || template.templateRevision\n        || template.template_revision\n        || template.revision\n      ),\n      foundationProductUrl: text(template.__foundationProductUrl),\n      foundationReturnProductHandle: text(template.__foundationReturnProductHandle),\n      foundationTargetProductHandle: text(template.__foundationTargetProductHandle),\n      foundationTemplateSourceHandle: text(template.__foundationTemplateSourceHandle),\n      // Legacy rows have no native public id; the DB row id is the exact\n      // lookup the server-side edit-service quote resolves them by.\n      foundationTemplateId: text(template.__foundationTemplateId),\n      title: text(template.template_name || template.title || template.name),\n      description: text(template.description),\n      previewUrl: getPreferredTemplatePreview(template),\n      previews: Array.isArray(template.previews) ? template.previews.map(text).filter(Boolean) : [],\n      backers: backers,\n      defaultBackerId: defaultBackerId,\n      orientation: text(template.orientation).toLowerCase(),\n      designOnlineAvailable: availability.isOnline,\n      editServiceAvailable: availability.canEdit,\n      legacyTemplate: availability.isLegacy,\n      downloadAvailable: availability.canDownload,\n      includeAiGeneratedDisclaimer: normalizeBoolFlag(template.include_ai_gen_disclaimer) === true,\n      editServiceCost: editServicePrice.effectiveCost,\n      editServiceOriginalCost: editServicePrice.originalCost,\n      editServiceIsFree: editServicePrice.isFree,\n      pricingDisclaimer: text(template.pricing_disclaimer),\n      categoryTitle: text(template.category_title || template.category),\n      previewCount: Array.isArray(template.previews) ? template.previews.length : 0,\n      createdAt: text(template['date-created'] || template.created_at || template.createdAt),\n      // PP-1: the Foundation feed carries a `popularity` count per template.\n      popularity: Number(template.popularity || template['# Times Project Saved'] || template.times_project_saved || 0) || 0\n    };\n  }\n\n  function normalizeTemplateLookupMap(payload) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    return {\n      byLegacyDesignId: source.byLegacyDesignId && typeof source.byLegacyDesignId === 'object'\n        ? source.byLegacyDesignId\n        : {},\n      byDesignNumber: source.byDesignNumber && typeof source.byDesignNumber === 'object'\n        ? source.byDesignNumber\n        : {}\n    };\n  }\n\n  function getTemplateLookupFromMap(lookupMap, template) {\n    var map = lookupMap && typeof lookupMap === 'object' ? lookupMap : {};\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : source;\n    var legacyDesignId = text(source.designId || raw.id);\n    var designNumber = text(source.designNumber || raw.designnum);\n    return text(\n      (map.byLegacyDesignId && map.byLegacyDesignId[legacyDesignId])\n      || (map.byDesignNumber && map.byDesignNumber[designNumber])\n    );\n  }\n\n  function enrichTemplateWithLookupMap(template, lookupMap) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source) return null;\n    if (text(source.templateLookup || source.templatePublicId)) return source;\n    var lookup = getTemplateLookupFromMap(lookupMap, source);\n    if (!lookup) return source;\n    var raw = source.raw && typeof source.raw === 'object' ? Object.assign({}, source.raw) : {};\n    raw.template_lookup = lookup;\n    raw.templateLookup = lookup;\n    raw.template_public_id = lookup;\n    raw.templatePublicId = lookup;\n    if (!text(raw.public_id)) raw.public_id = lookup;\n    if (!text(raw.publicId)) raw.publicId = lookup;\n    return Object.assign({}, source, {\n      raw: raw,\n      templateLookup: lookup,\n      templatePublicId: lookup\n    });\n  }\n\n  function enrichTemplatesWithLookupMap(templates, lookupMap) {\n    var list = Array.isArray(templates) ? templates : [];\n    return list.map(function (template) {\n      return enrichTemplateWithLookupMap(template, lookupMap);\n    }).filter(Boolean);\n  }\n\n  function getBindingTemplateRefs(binding, options) {\n    var refs = [];\n    var source = binding && typeof binding === 'object' ? binding : {};\n    var settings = options && typeof options === 'object' ? options : {};\n    var includeLegacyAllowlist = !!settings.includeLegacyAllowlist;\n    if (Array.isArray(source.matchedTemplates)) {\n      source.matchedTemplates.forEach(function (entry) {\n        var row = entry && typeof entry === 'object' ? entry : {};\n        var publicId = text(row.publicId || row.templatePublicId || row.lookup);\n        var legacyDesignId = text(row.legacyDesignId || row.designId || row.id);\n        if (publicId || legacyDesignId) {\n          refs.push({\n            lookup: publicId,\n            legacyDesignId: legacyDesignId\n          });\n        }\n      });\n    }\n    var templatePolicy = source.templatePolicy && typeof source.templatePolicy === 'object' ? source.templatePolicy : {};\n    var rawTemplateIds = []\n      .concat(Array.isArray(source.templatePublicIds) ? source.templatePublicIds : [])\n      .concat(Array.isArray(templatePolicy.templatePublicIds) ? templatePolicy.templatePublicIds : []);\n    var rawAllowedDesignIds = []\n      .concat(Array.isArray(source.allowedDesignIds) ? source.allowedDesignIds : [])\n      .concat(Array.isArray(templatePolicy.allowedDesignIds) ? templatePolicy.allowedDesignIds : [])\n      .concat(Array.isArray(source.allowedTemplateIds) ? source.allowedTemplateIds : [])\n      .concat(Array.isArray(templatePolicy.allowedTemplateIds) ? templatePolicy.allowedTemplateIds : []);\n    rawTemplateIds.map(text).filter(Boolean).forEach(function (value) {\n      refs.push(value.indexOf('pp-') === 0\n        ? { lookup: value, legacyDesignId: '' }\n        : { lookup: '', legacyDesignId: value });\n    });\n    if (includeLegacyAllowlist) {\n      rawAllowedDesignIds.map(text).filter(Boolean).forEach(function (value) {\n        refs.push({\n          lookup: '',\n          legacyDesignId: value\n        });\n      });\n    }\n    return refs.filter(function (entry, index, sourceArray) {\n      var cacheKey = text(entry.lookup) + '|' + text(entry.legacyDesignId);\n      if (!cacheKey) return false;\n      return sourceArray.findIndex(function (candidate) {\n        return text(candidate.lookup) + '|' + text(candidate.legacyDesignId) === cacheKey;\n      }) === index;\n    });\n  }\n\n  function getManagedCatalogHydrationRefs(store) {\n    var currentBinding = store && store.binding && typeof store.binding === 'object'\n      ? store.binding\n      : {};\n    return getBindingTemplateRefs(currentBinding, { includeLegacyAllowlist: false });\n  }\n\n  function mergeTemplateRows(catalogRow, summary) {\n    var base = catalogRow && typeof catalogRow === 'object' ? deepClone(catalogRow, {}) : {};\n    var detail = summary && typeof summary === 'object' ? summary : {};\n    var boardPreviews = Array.isArray(detail.boardPreviews)\n      ? detail.boardPreviews.map(function (entry) { return text(entry && entry.url); }).filter(Boolean)\n      : [];\n    var previews = Array.isArray(base.previews) ? base.previews.slice() : [];\n    boardPreviews.forEach(function (url) {\n      if (previews.indexOf(url) === -1) previews.push(url);\n    });\n    if (text(detail.previewUrl) && previews.indexOf(text(detail.previewUrl)) === -1) {\n      previews.unshift(text(detail.previewUrl));\n    }\n    var next = Object.assign({}, base, {\n      designId: text(base.designId || detail.sourceDesignId),\n      templateLookup: text(detail.publicId || base.templateLookup),\n      templatePublicId: text(detail.publicId || base.templatePublicId || base.templateLookup),\n      previewUrl: text(detail.previewUrl || base.previewUrl),\n      previews: previews\n    }, Array.isArray(detail.dimensions) && detail.dimensions.length\n      // Native template summaries carry structured dimensions instead of the\n      // legacy catalog's size strings \u2014 the size mapper needs them to commit\n      // catalog-less native templates (guided slot fill templates included).\n      ? { dimensions: detail.dimensions }\n      : {});\n    if (!text(next.title)) next.title = text(detail.title);\n    if (!text(next.categoryTitle)) next.categoryTitle = text(detail.categoryTitle);\n    if (!text(next.designId)) next.designId = text(detail.sourceDesignId);\n    return next;\n  }\n\n  function ensureTemplateHasLaunchLookup(store, template) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source) return Promise.resolve(null);\n    var enriched = enrichTemplateWithLookupMap(deepClone(source, {}), store.templateLookupMap);\n    if (text(enriched && (enriched.templateLookup || enriched.templatePublicId))) {\n      return Promise.resolve(enriched);\n    }\n    var legacyId = text(\n      enriched && (\n        enriched.sourceDesignId\n        || enriched.designId\n        || enriched.raw && enriched.raw.id\n      )\n    );\n    if (!legacyId) {\n      return Promise.resolve(enriched);\n    }\n    return core.fetchTemplateSummary(store.config, {\n      legacyId: legacyId\n    }).then(function (summary) {\n      if (!summary || typeof summary !== 'object') return enriched;\n      return enrichTemplateWithLookupMap(mergeTemplateRows(enriched, summary), store.templateLookupMap);\n    }).catch(function () {\n      return enriched;\n    });\n  }\n\n  function getTemplateDedupeKey(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : {};\n    return text(\n      source.designNumber\n      || raw.designnum\n      || source.designId\n      || source.sourceDesignId\n      || raw.id\n      || source.templateLookup\n      || source.templatePublicId\n    );\n  }\n\n  function hydrateTemplatesFromManagedCatalog(store) {\n    var refs = getManagedCatalogHydrationRefs(store);\n    if (!refs.length) return Promise.resolve(store.templates);\n    return Promise.all(refs.map(function (entry) {\n      return core.fetchTemplateSummary(store.config, entry).then(function (summary) {\n        return {\n          summary: summary,\n          ref: entry\n        };\n      });\n    })).then(function (results) {\n      var merged = [];\n      var seenKeys = Object.create(null);\n      (results || []).forEach(function (entry) {\n        var summary = entry && entry.summary && typeof entry.summary === 'object' ? entry.summary : null;\n        var ref = entry && entry.ref && typeof entry.ref === 'object' ? entry.ref : {};\n        var lookup = text(summary && summary.publicId || ref.lookup);\n        var legacyDesignId = text(summary && summary.sourceDesignId || ref.legacyDesignId);\n        var catalogRow = legacyDesignId ? getTemplateByDesignId(store, legacyDesignId) : null;\n        var next = mergeTemplateRows(catalogRow, summary || ref);\n        var dedupeKey = getTemplateDedupeKey(next);\n        if (!dedupeKey || seenKeys[dedupeKey]) return;\n        seenKeys[dedupeKey] = true;\n        merged.push(next);\n      });\n      store.templates.forEach(function (template) {\n        var dedupeKey = getTemplateDedupeKey(template);\n        if (!dedupeKey || seenKeys[dedupeKey]) return;\n        seenKeys[dedupeKey] = true;\n        merged.push(template);\n      });\n      if (merged.length) {\n        store.templates = merged;\n      }\n      return store.templates;\n    }).catch(function () {\n      return store.templates;\n    });\n  }\n\n  function findValueByMatchers(holder, selection, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var values = holder && Array.isArray(holder.values) ? holder.values : [];\n    var payload = selection && typeof selection === 'object' ? selection : {};\n    var hvid = text(payload.hvid || payload.valueId);\n    var targetingId = text(payload.targetingId);\n    var friendlySku = text(payload.friendlySku);\n    var numericSku = text(payload.numericSku);\n    var label = text(payload.valueLabel);\n    if (settings.strictIdentity === true) {\n      var suppliedMatchers = [\n        hvid ? function (option) { return text(option.hvId) === hvid; } : null,\n        targetingId ? function (option) { return text(option.targetingID) === targetingId; } : null,\n        friendlySku ? function (option) { return text(option.friendlySku) === friendlySku; } : null,\n        numericSku ? function (option) { return text(option.numericSku) === numericSku; } : null,\n        label ? function (option) { return text(option.label) === label; } : null\n      ].filter(Boolean);\n      if (!suppliedMatchers.length) return null;\n      var strictMatches = values.filter(function (option) {\n        return suppliedMatchers.every(function (matcher) { return matcher(option); });\n      });\n      return strictMatches.length === 1 ? strictMatches[0] : null;\n    }\n    for (var index = 0; index < values.length; index += 1) {\n      var option = values[index];\n      if (hvid && text(option.hvId) === hvid) return option;\n    }\n    for (var index2 = 0; index2 < values.length; index2 += 1) {\n      var option2 = values[index2];\n      if (targetingId && text(option2.targetingID) === targetingId) return option2;\n    }\n    for (var index3 = 0; index3 < values.length; index3 += 1) {\n      var option3 = values[index3];\n      if (friendlySku && text(option3.friendlySku) === friendlySku) return option3;\n      if (numericSku && text(option3.numericSku) === numericSku) return option3;\n    }\n    for (var index4 = 0; index4 < values.length; index4 += 1) {\n      var option4 = values[index4];\n      if (label && text(option4.label) === label) return option4;\n    }\n    return values[0] || null;\n  }\n\n  function normalizeUrlKey(value) {\n    return text(value).toLowerCase().replace(/[^a-z0-9]+/g, '');\n  }\n\n  function sanitizeUrlParamKey(value) {\n    return text(value).replace(/\\s+/g, '-');\n  }\n\n  function normalizeUrlValue(value) {\n    return text(value).toLowerCase().replace(/[\"']/g, '').replace(/[^a-z0-9]+/g, '');\n  }\n\n  function parseUrlFlag(value) {\n    var normalized = text(value).toLowerCase();\n    return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';\n  }\n\n  function getUrlSearchParamKeys(params) {\n    var keys = [];\n    if (!params || typeof params.forEach !== 'function') return keys;\n    params.forEach(function (_value, key) {\n      if (keys.indexOf(key) === -1) keys.push(key);\n    });\n    return keys;\n  }\n\n  function encodeUrlStatePayload(payload) {\n    var json = '';\n    try {\n      json = JSON.stringify(payload && typeof payload === 'object' ? payload : {});\n    } catch (_) {\n      json = '{}';\n    }\n    try {\n      return btoa(encodeURIComponent(json).replace(/%([0-9A-F]{2})/g, function (_match, hex) {\n        return String.fromCharCode(parseInt(hex, 16));\n      })).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n    } catch (_) {\n      return encodeURIComponent(json);\n    }\n  }\n\n  function decodeUrlStatePayload(rawValue) {\n    var raw = text(rawValue);\n    if (!raw) return null;\n    var decoded = '';\n    try {\n      if (raw.charAt(0) === '{') {\n        decoded = raw;\n      } else {\n        var padded = raw.replace(/-/g, '+').replace(/_/g, '/');\n        while (padded.length % 4) padded += '=';\n        decoded = decodeURIComponent(Array.prototype.map.call(atob(padded), function (char) {\n          return '%' + ('00' + char.charCodeAt(0).toString(16)).slice(-2);\n        }).join(''));\n      }\n      var parsed = JSON.parse(decoded);\n      return parsed && typeof parsed === 'object' ? parsed : null;\n    } catch (_) {\n      try {\n        var fallback = JSON.parse(decodeURIComponent(raw));\n        return fallback && typeof fallback === 'object' ? fallback : null;\n      } catch (_err) {\n        return null;\n      }\n    }\n  }\n\n  function addUniqueValue(list, value) {\n    var clean = text(value);\n    if (!clean) return;\n    if (list.indexOf(clean) === -1) list.push(clean);\n  }\n\n  function getHolderReferenceTokens(holder) {\n    return [\n      getHolderId(holder),\n      holder && holder.id,\n      holder && holder.htmlID,\n      holder && holder.displayName,\n      holder && holder.backendName,\n      holder && holder.targetingID\n    ].map(text).filter(Boolean);\n  }\n\n  function holderMatchesUrlMapSide(holder, value) {\n    var normalized = normalizeUrlKey(value);\n    if (!normalized) return false;\n    return getHolderReferenceTokens(holder).some(function (token) {\n      return normalizeUrlKey(token) === normalized;\n    });\n  }\n\n  function addUrlParamKey(index, holderId, key) {\n    var clean = sanitizeUrlParamKey(key);\n    var normalized = normalizeUrlKey(clean);\n    if (!clean || !normalized) return;\n    if (!index.byKey[normalized]) index.byKey[normalized] = holderId;\n    if (!index.ownedKeys[normalized]) index.ownedKeys[normalized] = true;\n  }\n\n  function getMappedUrlParamKeysForHolder(store, holder) {\n    var map = store && store.binding && store.binding.urlParamKeyMap && typeof store.binding.urlParamKeyMap === 'object'\n      ? store.binding.urlParamKeyMap\n      : {};\n    var keys = [];\n    Object.keys(map).forEach(function (rawKey) {\n      var rawValue = map[rawKey];\n      var values = Array.isArray(rawValue) ? rawValue : [rawValue];\n      if (holderMatchesUrlMapSide(holder, rawKey)) {\n        values.forEach(function (entry) { addUniqueValue(keys, entry); });\n      }\n      values.forEach(function (entry) {\n        if (holderMatchesUrlMapSide(holder, entry)) addUniqueValue(keys, rawKey);\n      });\n    });\n    return keys;\n  }\n\n  function buildDesignerUrlParamIndex(store) {\n    var index = {\n      byKey: Object.create(null),\n      ownedKeys: Object.create(null),\n      writeKeyByHolderId: Object.create(null)\n    };\n    (store && Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      var holderId = getHolderId(holder);\n      if (!holderId) return;\n      var mappedKeys = getMappedUrlParamKeysForHolder(store, holder);\n      var candidateKeys = []\n        .concat(mappedKeys)\n        .concat([\n          holder && holder.backendName,\n          holder && holder.htmlID,\n          holder && holder.displayName,\n          holderId,\n          holder && holder.targetingID\n        ]);\n      candidateKeys.forEach(function (key) {\n        addUrlParamKey(index, holderId, key);\n      });\n      // Legacy template-collection links use fields such as\n      // `size_targetingID`. Treat those as readable aliases for the owning\n      // product option while keeping the normal holder key as the writeback.\n      mappedKeys.concat([\n        holder && holder.backendName,\n        holder && holder.htmlID,\n        holder && holder.displayName\n      ]).map(text).filter(Boolean).forEach(function (key) {\n        addUrlParamKey(index, holderId, sanitizeUrlParamKey(key) + '_targetingID');\n      });\n      index.writeKeyByHolderId[holderId] = sanitizeUrlParamKey(\n        mappedKeys[0]\n        || holder && holder.backendName\n        || holder && holder.htmlID\n        || holder && holder.displayName\n        || holderId\n      );\n    });\n    return index;\n  }\n\n  function collectOptionUrlTokens(option) {\n    var tokens = [\n      option && option.hvId,\n      option && option.hvid,\n      option && option.targetingID,\n      option && option.targetingId,\n      option && option.linkedProductHandle,\n      option && option.friendlySku,\n      option && option.numericSku,\n      option && option.label,\n      option && option.valueLabel,\n      option && option.flavorText,\n      option && option.paramValue\n    ];\n    return tokens.map(text).filter(Boolean);\n  }\n\n  function optionMatchesUrlValue(option, rawValue) {\n    var desired = text(rawValue);\n    var desiredLower = desired.toLowerCase();\n    var desiredNormalized = normalizeUrlValue(desired);\n    if (!desiredNormalized && !desiredLower) return false;\n    return collectOptionUrlTokens(option).some(function (token) {\n      return token.toLowerCase() === desiredLower || normalizeUrlValue(token) === desiredNormalized;\n    });\n  }\n\n  function isSizeUrlHolder(holder) {\n    if (text(holder && holder.role).toLowerCase() === 'size') return true;\n    return getHolderReferenceTokens(holder).some(function (token) {\n      var normalized = normalizeUrlKey(token);\n      return normalized === 'size' || normalized === 'sizes';\n    });\n  }\n\n  function optionMatchesUrlDimension(option, rawValue) {\n    var desiredKey = makeTemplateDimensionKey(parseTemplateDimensionPair(rawValue));\n    if (!desiredKey) return false;\n    return collectOptionUrlTokens(option).some(function (token) {\n      return makeTemplateDimensionKey(parseTemplateDimensionPair(token)) === desiredKey;\n    });\n  }\n\n  function findOptionByUrlValues(store, holder, rawValues) {\n    var values = (Array.isArray(rawValues) ? rawValues : [rawValues]).map(text).filter(Boolean);\n    if (!values.length) return null;\n    var visibleOptions = getVisibleOptions(store, holder);\n    var allOptions = holder && Array.isArray(holder.values) ? holder.values : [];\n    var buckets = [visibleOptions, allOptions];\n    for (var bucketIndex = 0; bucketIndex < buckets.length; bucketIndex += 1) {\n      var options = buckets[bucketIndex];\n      for (var valueIndex = 0; valueIndex < values.length; valueIndex += 1) {\n        for (var optionIndex = 0; optionIndex < options.length; optionIndex += 1) {\n          if (optionMatchesUrlValue(options[optionIndex], values[valueIndex])) return options[optionIndex];\n        }\n      }\n      if (isSizeUrlHolder(holder)) {\n        for (var dimensionValueIndex = 0; dimensionValueIndex < values.length; dimensionValueIndex += 1) {\n          for (var dimensionOptionIndex = 0; dimensionOptionIndex < options.length; dimensionOptionIndex += 1) {\n            if (optionMatchesUrlDimension(options[dimensionOptionIndex], values[dimensionValueIndex])) {\n              return options[dimensionOptionIndex];\n            }\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  function normalizeApparelSizeUrlKey(value) {\n    return text(value).toLowerCase().replace(/[^a-z0-9]+/g, '');\n  }\n\n  function matchApparelSizeKey(rawSize, apparelConfig) {\n    var desired = normalizeApparelSizeUrlKey(rawSize);\n    if (!desired) return '';\n    var sizes = Array.isArray(apparelConfig && apparelConfig.availableSizes) ? apparelConfig.availableSizes.map(text).filter(Boolean) : [];\n    return sizes.find(function (size) {\n      return normalizeApparelSizeUrlKey(size) === desired;\n    }) || text(rawSize);\n  }\n\n  function getUrlApparelConfig(store) {\n    return typeof getApparelConfig === 'function' ? getApparelConfig(store) : null;\n  }\n\n  function normalizeUrlApparelSizesState(value, apparelConfig) {\n    if (typeof normalizeApparelSizesState === 'function') {\n      return normalizeApparelSizesState(value, apparelConfig);\n    }\n    return core.normalizeApparelSizes ? core.normalizeApparelSizes(value) : {};\n  }\n\n  function sumUrlApparelSizes(value) {\n    if (typeof sumApparelSizes === 'function') return sumApparelSizes(value);\n    return Object.keys(value && typeof value === 'object' ? value : {}).reduce(function (sum, key) {\n      var qty = parseInt(value[key], 10);\n      return sum + (Number.isFinite(qty) && qty > 0 ? qty : 0);\n    }, 0);\n  }\n\n  function addApparelSizeCount(target, size, quantity, apparelConfig) {\n    var matchedSize = matchApparelSizeKey(size, apparelConfig);\n    var parsed = parseInt(String(quantity || '').replace(/[^0-9]/g, ''), 10);\n    if (!matchedSize || !Number.isFinite(parsed) || parsed < 0) return;\n    target[matchedSize] = parsed;\n  }\n\n  function parseApparelSizesFromParams(params, apparelConfig) {\n    var sizes = {};\n    if (!params) return sizes;\n    getUrlSearchParamKeys(params).forEach(function (rawKey) {\n      var lowerKey = text(rawKey).toLowerCase();\n      if (lowerKey.indexOf(APPAREL_SIZE_PARAM_PREFIX) !== 0) return;\n      addApparelSizeCount(sizes, lowerKey.slice(APPAREL_SIZE_PARAM_PREFIX.length), params.get(rawKey), apparelConfig);\n    });\n    var combined = params.get(APPAREL_SIZES_PARAM);\n    if (combined) {\n      text(combined).split(/[|,]/).forEach(function (pair) {\n        var parts = pair.split(':');\n        if (parts.length < 2) return;\n        addApparelSizeCount(sizes, parts[0], parts.slice(1).join(':'), apparelConfig);\n      });\n    }\n    return sizes;\n  }\n\n  function setUrlStateOptionValue(state, holderId, value) {\n    var clean = text(value);\n    if (!holderId || !clean) return;\n    if (!state.optionValuesByHolderId[holderId]) state.optionValuesByHolderId[holderId] = [];\n    addUniqueValue(state.optionValuesByHolderId[holderId], clean);\n  }\n\n  function absorbDesignerStatePayloadIntoUrlState(store, state, payload) {\n    var source = payload && typeof payload === 'object' ? payload : null;\n    if (!source) return;\n    var selections = Array.isArray(source.optionSelections) ? source.optionSelections : [];\n    if (selections.length) {\n      state.optionSelections = selections;\n      state.hasAny = true;\n    }\n    var quantity = text(source.printQuantity || source.quantity || source.qty || source.typedQuantity || source.typedQty || source.paidPrintQty || source.paidPrintQuantity);\n    if (quantity) {\n      state.quantity = quantity;\n      state.hasAny = true;\n    }\n    var apparelSizes = core.normalizeApparelSizes ? core.normalizeApparelSizes(source.apparelSizes) : {};\n    if (Object.keys(apparelSizes).length) {\n      var apparelConfig = getUrlApparelConfig(store);\n      Object.keys(apparelSizes).forEach(function (size) {\n        addApparelSizeCount(state.apparelSizes, size, apparelSizes[size], apparelConfig);\n      });\n      state.hasAny = true;\n    }\n    var artworkMode = normalizeDefaultArtworkMode(source.artworkMode || source.artwork);\n    if (artworkMode) {\n      state.artworkMode = artworkMode;\n      state.hasAny = true;\n    }\n    var canvaUrl = text(source.canvaUrl || source.canvaLink || source['Canva Link']);\n    if (canvaUrl) {\n      state.canvaUrl = canvaUrl;\n      state.hasAny = true;\n    }\n    if (source.template && typeof source.template === 'object') {\n      state.template = Object.assign({}, state.template, source.template);\n      state.hasAny = true;\n    }\n    if (source.project && typeof source.project === 'object') {\n      state.project = Object.assign({}, state.project, source.project);\n      if (text(state.project.projectId || state.project.projectID || state.project.project_id || state.project.publicId || state.project.id)) {\n        state.hasAny = true;\n      }\n    }\n  }\n\n  function normalizeArtworkModeFromUrl(value) {\n    return normalizeDefaultArtworkMode(value);\n  }\n\n  function readArtworkModeFromParams(params) {\n    var explicit = normalizeArtworkModeFromUrl(params.get('artwork') || params.get('artworkMode') || params.get('artwork_mode'));\n    if (explicit) return explicit;\n    var flagMap = {\n      designonline: 'designonline',\n      editservice: 'editservice',\n      uploadfiles: 'uploadfiles',\n      uploadcanva: 'uploadcanva',\n      youhaveart: 'youhaveart',\n      customdesign: 'customdesign',\n      reorder: 'reorder',\n      recreate: 'recreate',\n      freesetup: 'freesetup'\n    };\n    var matched = '';\n    Object.keys(flagMap).some(function (key) {\n      if (params.has(key) && parseUrlFlag(params.get(key))) {\n        matched = flagMap[key];\n        return true;\n      }\n      return false;\n    });\n    return matched;\n  }\n\n  function normalizeTemplateUrlAction(value) {\n    var normalized = text(value).toLowerCase().replace(/[_\\s]+/g, '-');\n    if (!normalized) return '';\n    if (\n      normalized === 'customize-online' ||\n      normalized === 'customizeonline' ||\n      normalized === 'designonline' ||\n      normalized === 'design-online' ||\n      normalized === 'customize'\n    ) {\n      return 'customize_online';\n    }\n    if (\n      normalized === 'edit-service' ||\n      normalized === 'editservice' ||\n      normalized === 'template-edit-service' ||\n      normalized === 'template-personalize' ||\n      normalized === 'personalize'\n    ) {\n      return 'edit_service';\n    }\n    return '';\n  }\n\n  function readTemplateUrlActionFromParams(params) {\n    if (!params) return '';\n    return normalizeTemplateUrlAction(\n      params.get('bg_template_action') ||\n      params.get('template_action') ||\n      params.get('templateAction') ||\n      params.get('bgTemplateAction') ||\n      ''\n    );\n  }\n\n  function hasExplicitPitchPrintProjectRestoreParams(params) {\n    if (!params) return false;\n    return !!text(\n      params.get('bg_saved_project_id')\n      || params.get('bg_cart_line_key')\n      || params.get('bg_project_id')\n      || params.get('bg_design_id')\n      || params.get(HYBRID_PITCHPRINT_AUTH_RESUME_PARAM)\n      || params.get('projectId')\n      || params.get('projectID')\n      || params.get('project_id')\n      || params.get('pp_project_id')\n      || params.get('ppProjectId')\n      || params.get('_pitchprint')\n    );\n  }\n\n  function hasTemplateUrlHandoffParams(params) {\n    if (!params) return false;\n    var artworkMode = normalizeDefaultArtworkMode(params.get('artwork') || params.get('artworkMode') || '');\n    var templateAction = readTemplateUrlActionFromParams(params);\n    var templateIdentity = text(\n      params.get('templateLookup')\n      || params.get('templatePublicId')\n      || params.get('templateId')\n      || params.get('designId')\n      || params.get('designnum')\n      || params.get('designNumber')\n    );\n    var legacyTemplateId = text(params.get('id'));\n    var fromTemplates = text(params.get('from')).toLowerCase() === 'templates';\n    return !!(\n      templateAction\n      || templateIdentity\n      || (legacyTemplateId && (fromTemplates || parseUrlFlag(params.get('designonline')) || artworkMode === 'designonline' || artworkMode === 'editservice'))\n    );\n  }\n\n  function hasFreshTemplateUrlHandoffRequest() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      return hasTemplateUrlHandoffParams(params) && !hasExplicitPitchPrintProjectRestoreParams(params);\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function boundedTemplateHandoffIdentity(value) {\n    return text(value).replace(/[\\u0000-\\u001f\\u007f]/g, '').slice(0, 200);\n  }\n\n  function readTemplateStateFromParams(params) {\n    return {\n      designId: boundedTemplateHandoffIdentity(params.get('templateId') || params.get('designId') || params.get('id')),\n      designNumber: boundedTemplateHandoffIdentity(params.get('designnum') || params.get('designNum') || params.get('designNumber')),\n      templateLookup: boundedTemplateHandoffIdentity(params.get('templateLookup') || params.get('templatePublicId') || params.get('publicId')),\n      backer: boundedTemplateHandoffIdentity(params.get('backer') || params.get('backerId'))\n    };\n  }\n\n  function readProjectStateFromParams(params) {\n    var projectId = text(\n      params.get('projectId')\n      || params.get('projectID')\n      || params.get('project_id')\n      || params.get('pp_project_id')\n      || params.get('ppProjectId')\n      || params.get('bg_project_id')\n      || params.get('_pitchprint')\n    );\n    if (!projectId) return {};\n    return {\n      projectId: projectId,\n      designId: text(params.get('bg_design_id') || params.get('designId') || params.get('id')),\n      designNumber: text(params.get('designnum') || params.get('designNum') || params.get('designNumber')),\n      previewUrl: text(params.get('previewUrl') || params.get('preview')),\n      numPages: Number(params.get('numPages') || params.get('pages') || 0) || 0,\n      backer: text(params.get('backer') || params.get('backerId'))\n    };\n  }\n\n  function normalizeTemplateCollectionReturnPath(value) {\n    var raw = text(value).replace(/[\\u0000-\\u001f\\u007f]/g, '').slice(0, 500);\n    if (!raw || raw.charAt(0) !== '/' || raw.slice(0, 2) === '//' || raw.indexOf('\\\\') !== -1) return '';\n    try {\n      var parsed = new URL(raw, window.location.origin);\n      if (parsed.origin !== window.location.origin || !parsed.pathname || parsed.pathname.charAt(0) !== '/') return '';\n      return parsed.pathname.replace(/\\/{2,}/g, '/');\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function readTemplateCollectionContextFromParams(params) {\n    if (!isTemplateCollectionHandoffParams(params)) return null;\n    var returnPath = normalizeTemplateCollectionReturnPath(params.get('bg_tc_return'));\n    if (!returnPath) return null;\n    var preset = text(params.get('bg_tc_preset')).toLowerCase();\n    if (!TEMPLATE_COLLECTION_PRESETS[preset]) return null;\n    return {\n      returnPath: returnPath,\n      preset: preset,\n      sourceTitle: text(params.get('bg_tc_source')).replace(/[\\u0000-\\u001f\\u007f]/g, '').slice(0, 160)\n    };\n  }\n\n  function isTemplateCollectionHandoffParams(params) {\n    return !!(\n      params\n      && text(params.get('from')).toLowerCase() === 'templates'\n      && (params.has('bg_tc_return') || params.has('bg_tc_preset') || params.has('bg_tc_source'))\n    );\n  }\n\n  function readDesignerUrlState(store) {\n    var params = new URLSearchParams(window.location.search || '');\n    var index = buildDesignerUrlParamIndex(store);\n    var apparelConfig = getUrlApparelConfig(store);\n    var templateLandingAttempt = text(params.get('from')).toLowerCase() === 'templates';\n    var templateCollectionAttempt = isTemplateCollectionHandoffParams(params);\n    var templateCollectionContext = readTemplateCollectionContextFromParams(params);\n    var styleArrivalFrom = text(params.get(STYLE_ARRIVAL_PARAM));\n    // OBS-33: a marker this page view already spent (consumeStyleArrival)\n    // reads as no marker, however the address was reached again.\n    var styleArrivalConsumed = isConsumedStyleArrival(store, styleArrivalFrom);\n    var state = {\n      optionValuesByHolderId: Object.create(null),\n      optionSelections: [],\n      quantity: '',\n      apparelSizes: {},\n      artworkMode: '',\n      templateAction: '',\n      launchProvider: '',\n      canvaUrl: '',\n      template: {},\n      project: {},\n      templateCollectionContext: templateCollectionContext,\n      templateLandingAttempt: templateLandingAttempt,\n      invalidTemplateCollectionContext: templateCollectionAttempt && !templateCollectionContext,\n      force: parseUrlFlag(params.get(URL_FORCE_PARAMS_PARAM)),\n      styleArrivalFrom: styleArrivalConsumed ? '' : styleArrivalFrom,\n      styleArrivalPending: false,\n      styleSwitchReturnPath: '',\n      hasAny: false\n    };\n    // A collection-origin URL has a deliberately narrow ingress contract.\n    // Quantity, product options, projects, pricing and encoded state are not\n    // accepted from that navigation; the PDP resolves them from its current\n    // authoritative product and template data.\n    if (templateLandingAttempt) {\n      if (templateCollectionAttempt && !templateCollectionContext) {\n        state.hasAny = true;\n        return state;\n      }\n      var collectionTemplateAction = readTemplateUrlActionFromParams(params);\n      var collectionArtworkMode = readArtworkModeFromParams(params);\n      if (collectionTemplateAction) {\n        state.templateAction = collectionTemplateAction;\n        state.artworkMode = collectionTemplateAction === 'edit_service' ? 'editservice' : 'designonline';\n      } else if (collectionArtworkMode === 'designonline' || collectionArtworkMode === 'editservice') {\n        state.artworkMode = collectionArtworkMode;\n      }\n      state.template = readTemplateStateFromParams(params);\n      state.hasAny = !!text(\n        state.template.designId\n        || state.template.designNumber\n        || state.template.templateLookup\n        || state.template.backer\n      );\n      return state;\n    }\n    // OBS-36: the return path a Style switch carried from a collection-origin\n    // page. It renders the way back and nothing else (see buildStyleSwitchUrl).\n    state.styleSwitchReturnPath = normalizeTemplateCollectionReturnPath(params.get(STYLE_RETURN_PARAM));\n    var encoded = decodeUrlStatePayload(params.get(URL_STATE_PARAM));\n    if (encoded) {\n      state.encodedPayload = encoded;\n      absorbDesignerStatePayloadIntoUrlState(store, state, encoded);\n    }\n    getUrlSearchParamKeys(params).forEach(function (rawKey) {\n      var normalized = normalizeUrlKey(rawKey);\n      var holderId = index.byKey[normalized];\n      if (!holderId) return;\n      params.getAll(rawKey).forEach(function (rawValue) {\n        text(rawValue).split(/[|,]/).forEach(function (part) {\n          setUrlStateOptionValue(state, holderId, part);\n        });\n      });\n    });\n    if (styleArrivalConsumed) dropConsumedStyleArrivalValues(store, state);\n    var quantity = text(params.get('qty') || params.get('quantity'));\n    if (quantity) {\n      state.quantity = quantity;\n      state.hasAny = true;\n    }\n    var apparelSizes = parseApparelSizesFromParams(params, apparelConfig);\n    if (Object.keys(apparelSizes).length) {\n      state.apparelSizes = Object.assign(state.apparelSizes, apparelSizes);\n      state.hasAny = true;\n    }\n    var artworkMode = readArtworkModeFromParams(params);\n    if (artworkMode) {\n      state.artworkMode = artworkMode;\n      state.hasAny = true;\n    }\n    var templateAction = readTemplateUrlActionFromParams(params);\n    if (templateAction) {\n      state.templateAction = templateAction;\n      if (!state.artworkMode) {\n        state.artworkMode = templateAction === 'edit_service' ? 'editservice' : 'designonline';\n      }\n      state.hasAny = true;\n    }\n    var launchProvider = readLaunchProviderCandidate(\n      params.get('launchProvider')\n      || params.get('designerProvider')\n      || params.get('_bg_designer_provider')\n    );\n    if (launchProvider) {\n      state.launchProvider = launchProvider;\n      state.hasAny = true;\n    }\n    var canvaUrl = text(params.get('canvaUrl') || params.get('canva') || params.get('canvaLink'));\n    if (canvaUrl) {\n      state.canvaUrl = canvaUrl;\n      state.hasAny = true;\n    }\n    var template = readTemplateStateFromParams(params);\n    if (template.designId || template.designNumber || template.templateLookup || template.backer) {\n      state.template = Object.assign(state.template, template);\n      state.hasAny = true;\n    }\n    var project = readProjectStateFromParams(params);\n    // CARTLINE-RESTORE-ARTWORK-OFF-01: bg_project_id is how the cart's edit\n    // link names the design on its line. On a page that cannot show a saved\n    // design this lane never places it in page state; restoreFromCartLine\n    // refuses that line and says so.\n    if (project.projectId && project.projectId === text(params.get('bg_project_id')) && isPageWithoutSavedDesignSurface(store)) {\n      project = {};\n    }\n    if (project.projectId) {\n      state.project = Object.assign(state.project, project);\n      if (!state.artworkMode) {\n        state.artworkMode = 'designonline';\n        // URL-PROJECT-PARAM-ARTWORK-OFF-01: a mode the address never named.\n        // It stands only while its project lands (applyDesignerUrlState).\n        state.artworkModeFromProject = true;\n      }\n      state.hasAny = true;\n    }\n    // A cart edit link: restoreFromCartLine owns the sentence for this visit.\n    state.cartLineArrival = !!text(params.get('bg_cart_line_key'));\n    if (Object.keys(state.optionValuesByHolderId).length) state.hasAny = true;\n    // OBS-34: hasAny counts carried state only. A marker-only landing still\n    // runs the arrival rules through styleArrivalPending.\n    if (isStyleArrivalUrlState(store, state) && Object.keys(readStyleArrivalRules(store)).length) state.styleArrivalPending = true;\n    return state;\n  }\n\n  function applyTemplateCollectionConfiguration(store, template) {\n    var configuration = getTemplateModalConfiguration(store, template);\n    if (!configuration || !configuration.mappable) return false;\n    var selections = Object.assign({}, store.state.selections);\n    (configuration.changes || []).forEach(function (change) { selections[getHolderId(change.holder)] = text(change.option && change.option.hvId); });\n    return commitArtworkConfiguration(store, { selections: selections, template: template }, {\n      source: 'url', validate: function (draft) { return templateConfigurationAppliedSuccessfully(draft, configuration); }\n    }).status !== 'refused';\n  }\n\n  function resolveTemplateFromUrlState(store, templateState) {\n    var source = templateState && typeof templateState === 'object' ? templateState : {};\n    var lookup = text(source.templateLookup || source.templatePublicId || source.publicId);\n    var designId = text(source.designId || source.templateId || source.id);\n    var designNumber = text(source.designNumber || source.designnum || source.designNum);\n    var backer = text(source.backer || source.backerId);\n    // designNumber/designId identify one template. templateLookup does not: legacy rows\n    // inherit their product's native template public id, so every template on a product can\n    // share one lookup and getTemplateByLookup would return whichever comes first.\n    if (designNumber || designId) {\n      var exact = findTemplateSelection(store, designId, designNumber, backer);\n      if (exact) return exact;\n    }\n    var template = lookup ? getTemplateByLookup(store, lookup) : null;\n    if (!template && lookup && typeof getTemplateBySelectionKey === 'function') {\n      template = getTemplateBySelectionKey(store, lookup);\n    }\n    if (!template) {\n      template = findTemplateSelection(store, designId || lookup, designNumber, backer);\n    } else {\n      template = findTemplateSelection(store, text(template.designId), text(template.designNumber), backer) || enrichTemplateWithLookupMap(deepClone(template, {}), store.templateLookupMap);\n    }\n    return template;\n  }\n\n  function resolveStrictTemplateCollectionSelection(store, templateState) {\n    var source = templateState && typeof templateState === 'object' ? templateState : {};\n    var lookup = text(source.templateLookup || source.templatePublicId || source.publicId);\n    var designId = text(source.designId || source.templateId || source.id);\n    var designNumber = text(source.designNumber || source.designnum || source.designNum);\n    var backer = text(source.backer || source.backerId);\n    if (!lookup && !designId && !designNumber) return null;\n\n    var suppliedMatchers = [\n      designId ? function (template) { return text(template.designId) === designId; } : null,\n      designNumber ? function (template) { return text(template.designNumber) === designNumber; } : null,\n      lookup ? function (template) {\n        return text(template.templateLookup || template.templatePublicId) === lookup\n          || getTemplateSelectionKey(template) === lookup;\n      } : null\n    ].filter(Boolean);\n    var candidates = store.templates.filter(function (template) {\n      return templateMatchesStorePage(store, template);\n    });\n    suppliedMatchers.forEach(function (matcher) {\n      candidates = candidates.filter(matcher);\n    });\n    if (candidates.length !== 1) return null;\n    var candidate = candidates[0];\n\n    var next = enrichTemplateWithLookupMap(deepClone(candidate, {}), store.templateLookupMap);\n    var backers = Array.isArray(next.backers) ? next.backers : [];\n    if (backer) {\n      var matchedBacker = backers.find(function (entry) {\n        return text(entry.id) === backer;\n      });\n      if (!matchedBacker) return null;\n      next.backer = backer;\n      next.backerLabel = text(matchedBacker.label);\n    } else {\n      next.backer = text(next.defaultBackerId);\n      var defaultBacker = backers.find(function (entry) {\n        return text(entry.id) === next.backer;\n      });\n      next.backerLabel = defaultBacker ? text(defaultBacker.label) : '';\n    }\n    return next;\n  }\n\n  function applyQuantityFromUrlState(store, urlState) {\n    var apparelConfig = getUrlApparelConfig(store);\n    var apparelSizes = urlState && urlState.apparelSizes && typeof urlState.apparelSizes === 'object' ? urlState.apparelSizes : {};\n    if (apparelConfig && Object.keys(apparelSizes).length) {\n      store.state.apparelSizes = normalizeUrlApparelSizesState(apparelSizes, apparelConfig);\n      store.state.apparelSizesInitialized = true;\n      store.state.quantity = sumUrlApparelSizes(store.state.apparelSizes);\n      return true;\n    }\n    var parsed = parseInt(String(urlState && urlState.quantity || '').replace(/[^0-9]/g, ''), 10);\n    if (Number.isFinite(parsed) && parsed > 0) {\n      store.state.quantity = parsed;\n      store.state.typedQuantity = parsed;\n      store.state.paidPrintQuantity = parsed;\n      return true;\n    }\n    return false;\n  }\n\n  function prepareStoreForUrlArtworkMode(store, mode) {\n    var normalized = normalizeDefaultArtworkMode(mode);\n    if (!normalized) return;\n    if (normalized === 'designonline' || normalized === 'editservice') {\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      return;\n    }\n    writeArtworkTemplate(store, null);\n    clearProjectState(store);\n    clearArtworkAuxiliaryState(store);\n    if (normalized !== 'uploadfiles') clearUploadState(store);\n    if (normalized !== 'uploadcanva') clearCanvaState(store);\n  }\n\n  function removeLinkedProductUrlStateParams(store, params) {\n    if (!store || !params) return;\n    var index = buildDesignerUrlParamIndex(store);\n    var linkedHolderIds = Object.create(null);\n    (Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      if (!isProductLinkHolder(holder)) return;\n      var holderId = getHolderId(holder);\n      if (holderId) linkedHolderIds[holderId] = true;\n    });\n    getUrlSearchParamKeys(params).forEach(function (rawKey) {\n      var holderId = index.byKey[normalizeUrlKey(rawKey)];\n      if (holderId && linkedHolderIds[holderId]) params.delete(rawKey);\n    });\n    params.delete(URL_STATE_PARAM);\n    // A previous hop's style marker never rides along by itself; only the\n    // customer's own Style click stamps a fresh one (buildStyleSwitchUrl).\n    params.delete(STYLE_ARRIVAL_PARAM);\n  }\n\n  function buildLinkedProductUrl(store, linkedHandle) {\n    var url = new URL(window.location.href);\n    url.pathname = '/products/' + encodeURIComponent(linkedHandle);\n    removeLinkedProductUrlStateParams(store, url.searchParams);\n    var index = buildDesignerUrlParamIndex(store);\n    getUrlSearchParamKeys(url.searchParams).forEach(function (key) {\n      var holderId = index.byKey[normalizeUrlKey(key)];\n      var holder = store.holders.find(function (entry) { return getHolderId(entry) === holderId; });\n      if (!holder) return;\n      var value = (holder.values || []).find(function (entry) {\n        return text(entry.hvId || entry.hvid) === url.searchParams.get(key);\n      });\n      // Canonical ids preserve this page; manufacturing aliases carry choices to another product.\n      if (value) url.searchParams.set(key, getOptionUrlParamValue(holder, value, true));\n    });\n    return url.pathname + url.search + url.hash;\n  }\n\n  // Styles program S1 (2026-09-14): a Style switch is a full navigation to\n  // the linked product with every other holder's choice carried in the URL.\n  // The customer's Style click (navigateToLinkedProductIfNeeded) stamps\n  // STYLE_ARRIVAL_PARAM with the leaving handle; the plain-link URL-state\n  // redirect never does, so a shared cross-product deep link arrives unmarked\n  // and its parameters stand. The arriving page reads\n  // presentation.styleArrival to decide, per holder, what to do with each\n  // carried choice: carry it (today's path), keep this product's own default,\n  // or select a configured value. A plain shared link (no marker), a\n  // product-link holder, and an absent rule all keep today's behavior byte\n  // for byte.\n  function buildStyleSwitchUrl(store, linkedHandle) {\n    var url = new URL(buildLinkedProductUrl(store, linkedHandle), window.location.href);\n    // The arriving product page is a fresh page. The collection-origin\n    // marker and its return context describe the page being left, and with\n    // the marker the arrival reader would skip every carried holder choice\n    // (its narrow ingress contract). Template identity still travels as\n    // plain template params.\n    if (text(url.searchParams.get('from')).toLowerCase() === 'templates') {\n      // OBS-36: the collection's return path alone travels on, as the plain\n      // STYLE_RETURN_PARAM, so the arriving page can still offer the way\n      // back without re-entering the collection lane.\n      var collectionReturnPath = normalizeTemplateCollectionReturnPath(url.searchParams.get('bg_tc_return'));\n      ['from', 'bg_tc_return', 'bg_tc_preset', 'bg_tc_source', STYLE_RETURN_PARAM].forEach(function (key) {\n        url.searchParams.delete(key);\n      });\n      if (collectionReturnPath) url.searchParams.set(STYLE_RETURN_PARAM, collectionReturnPath);\n    }\n    var leavingHandle = getCurrentProductHandle(store);\n    if (leavingHandle) url.searchParams.set(STYLE_ARRIVAL_PARAM, leavingHandle);\n    return url.pathname + url.search + url.hash;\n  }\n\n  function readStyleArrivalRules(store) {\n    var presentation = readProductPresentationConfig(store);\n    var config = plainObject(presentation && presentation.styleArrival);\n    var rules = Object.create(null);\n    (Array.isArray(config.holders) ? config.holders : []).forEach(function (entry) {\n      var rule = plainObject(entry);\n      var holderId = text(rule.holderId);\n      var mode = text(rule.mode).toLowerCase();\n      if (!holderId || (mode !== 'product_default' && mode !== 'value')) return;\n      rules[holderId] = { mode: mode, valueId: text(rule.valueId) };\n    });\n    return rules;\n  }\n\n  function isStyleArrivalUrlState(store, urlState) {\n    var fromHandle = text(urlState && urlState.styleArrivalFrom);\n    return !!fromHandle && fromHandle !== getCurrentProductHandle(store);\n  }\n\n  function hasDesignerUrlStateToApply(urlState) {\n    return !!(urlState && (urlState.hasAny || urlState.styleArrivalPending));\n  }\n\n  // OBS-33: the marker is spent by its first apply. The in-memory URL state\n  // (the bg_force_params re-apply reuses that object), the address and its\n  // history entry drop it, and the store remembers the spent marker with the\n  // holders its rules decided, so a popstate or restore that reads an older\n  // copy of the address neither re-runs a rule nor re-applies the carried\n  // choice a rule replaced. Unruled carried choices still read as today.\n  function consumeStyleArrival(store, urlState, ruledHolderIds) {\n    store.styleArrivalConsumed = { from: text(urlState.styleArrivalFrom), holderIds: ruledHolderIds.slice() };\n    urlState.styleArrivalFrom = '';\n    urlState.styleArrivalPending = false;\n    dropConsumedStyleArrivalValues(store, urlState);\n    stripStyleArrivalMarkerFromAddress();\n  }\n\n  function isConsumedStyleArrival(store, fromHandle) {\n    var consumed = store && store.styleArrivalConsumed;\n    return !!(consumed && text(fromHandle) && consumed.from === text(fromHandle));\n  }\n\n  function dropConsumedStyleArrivalValues(store, urlState) {\n    var consumed = store && store.styleArrivalConsumed;\n    var values = urlState && urlState.optionValuesByHolderId;\n    if (!consumed || !values) return;\n    consumed.holderIds.forEach(function (holderId) { delete values[holderId]; });\n  }\n\n  function stripStyleArrivalMarkerFromAddress() {\n    try {\n      var url = new URL(window.location.href);\n      if (!url.searchParams.has(STYLE_ARRIVAL_PARAM)) return;\n      url.searchParams.delete(STYLE_ARRIVAL_PARAM);\n      window.history.replaceState(window.history.state, '', url.pathname + url.search + url.hash);\n    } catch (_) {}\n  }\n\n  function findStyleArrivalRuleOption(store, holder, valueId) {\n    var wanted = text(valueId);\n    if (!wanted) return null;\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    for (var index = 0; index < options.length; index += 1) {\n      if (text(options[index] && options[index].hvId) === wanted) return options[index];\n    }\n    return findOptionByUrlValues(store, holder, [wanted]);\n  }\n\n  // 'value' selects the configured option when this holder has it; a missing\n  // value behaves like 'product_default', where the applyDefaultSelections\n  // pick stands. Returns the option the rule itself landed on and whether it\n  // wrote a selection.\n  function applyStyleArrivalRule(store, holder, rule) {\n    var holderId = getHolderId(holder);\n    var target = rule && rule.mode === 'value' ? findStyleArrivalRuleOption(store, holder, rule.valueId) : null;\n    if (target) {\n      writeArtworkSelection(store, holderId, text(target.hvId), 'reconcile');\n      recalculate(store);\n      return { option: target, applied: true };\n    }\n    return { option: getSelectedOptionFromAllOptions(store, holder), applied: false };\n  }\n\n  function getStyleArrivalContextLabel(store, fromHandle) {\n    var linkHolders = (Array.isArray(store && store.holders) ? store.holders : []).filter(isProductLinkHolder);\n    var owning = linkHolders.find(function (holder) {\n      return (Array.isArray(holder.values) ? holder.values : []).some(function (option) {\n        return getLinkedProductHandle(option) === text(fromHandle);\n      });\n    }) || linkHolders[0] || null;\n    var option = owning ? getSelectedOption(store, owning) : null;\n    return option ? getOptionDisplayLabel(store, owning, option) : '';\n  }\n\n  // One adjustment per ruled holder whose landing differs from the carried\n  // choice, judged against the holder's FINAL selection: a landing that a\n  // later lane moved (the compatibility repair, the template option-source\n  // rules) is dropped, because that lane explains its own change.\n  function buildStyleRuleAdjustments(store, landings, reasonText) {\n    var adjustments = [];\n    (Array.isArray(landings) ? landings : []).forEach(function (landing) {\n      var holder = landing.holder;\n      var carried = landing.carried;\n      if (!holder || !carried) return;\n      var landed = getSelectedOptionFromAllOptions(store, holder);\n      if (!landed || text(landed.hvId) === text(carried.hvId)) return;\n      if (landing.target && text(landed.hvId) !== text(landing.target.hvId)) return;\n      adjustments.push({\n        holderLabel: text(holder.displayName || holder.label || holder.name) || 'Option',\n        toLabel: getOptionDisplayLabel(store, holder, landed) || 'the compatible choice',\n        reasonText: reasonText\n      });\n    });\n    return adjustments;\n  }\n\n  function buildStyleArrivalAdjustments(store, landings, fromHandle) {\n    var styleLabel = getStyleArrivalContextLabel(store, fromHandle);\n    return buildStyleRuleAdjustments(store, landings, styleLabel ? 'for ' + styleLabel : 'for this product');\n  }\n\n  // Joins rule sentences after the closing recalculate of their lane, so\n  // they reflect the final selections and follow that recalculate's\n  // compatibility repairs instead of being overwritten by them. A repeated\n  // apply never doubles a sentence.\n  function appendStyleRuleNotice(store, adjustments) {\n    var ruleNotice = buildCompatibilityAdjustmentNotice(adjustments);\n    if (!ruleNotice) return;\n    var pendingNotice = text(store.pendingCompatibilityNotice);\n    if (pendingNotice.indexOf(ruleNotice) !== -1) return;\n    var joined = [pendingNotice, ruleNotice].filter(Boolean).join(' ');\n    store.pendingCompatibilityNotice = joined;\n    if (store.uiState) store.uiState.compatibilityNotice = joined;\n  }\n\n  // Runs after the template lane and the closing recalculate of\n  // applyDesignerUrlState (bg_force_params repeats never double it).\n  function finalizeStyleArrivalNotice(store, landings, fromHandle) {\n    if (!Array.isArray(landings) || !landings.length) return;\n    appendStyleRuleNotice(store, buildStyleArrivalAdjustments(store, landings, fromHandle));\n  }\n\n  // Styles program S1b (2026-09-14): the IN-PRODUCT Style switch. When the\n  // Style choices live inside one product (the featured image-cards holder,\n  // getStyleLockHolder), presentation.styleSwitch decides per Style value\n  // what each other holder does when the customer picks that Style: carry\n  // the current choice (today's path and the default), take this product's\n  // default, or select a configured value. Rules run ONLY from a\n  // customer-initiated in-page change of the Style holder (the native\n  // holder handlers and the style-lock paths they reach); first load,\n  // URL-state apply, popstate, bg_state restore and a product-link\n  // navigation never call them. A restored per-style stash (the customer's\n  // own earlier configuration of that Style) wins over the rules. A missing\n  // setting, another holder's id, an unknown mode, a missing id, or a value\n  // the holder does not offer all keep today's carry-over byte for byte.\n  function readStyleSwitchRules(store, holderId, hvid) {\n    var holder = getStyleLockHolder(store);\n    if (!holder || getHolderId(holder) !== text(holderId)) return null;\n    var presentation = readProductPresentationConfig(store);\n    var config = plainObject(presentation && presentation.styleSwitch);\n    if (text(config.holderId) !== getHolderId(holder)) return null;\n    var entry = (Array.isArray(config.values) ? config.values : []).map(plainObject).find(function (value) {\n      return text(value.valueId) === text(hvid);\n    });\n    if (!entry) return null;\n    var rules = Object.create(null);\n    (Array.isArray(entry.holders) ? entry.holders : []).forEach(function (item) {\n      var rule = plainObject(item);\n      var ruledId = text(rule.holderId);\n      var mode = text(rule.mode).toLowerCase();\n      if (!ruledId || ruledId === getHolderId(holder)) return;\n      if (mode !== 'product_default' && mode !== 'value') return;\n      rules[ruledId] = { mode: mode, valueId: text(rule.valueId) };\n    });\n    return Object.keys(rules).length ? { holder: holder, rules: rules } : null;\n  }\n\n  // The pick applyDefaultSelections makes, on the rule state of the\n  // incoming Style.\n  function pickStyleSwitchDefaultOption(store, holder) {\n    var options = getVisibleOptions(store, holder);\n    return options.find(function (entry) { return entry && entry.defaultValue; }) || options[0] || null;\n  }\n\n  // Writes each ruled holder's landing right after the Style selection and\n  // before the normal recalculate, so the compatibility repair still sees\n  // the landing and may move it (and then explains itself). The landings\n  // wait on the store for the closing notice of the owning path.\n  function applyStyleSwitchRules(store, holderId, hvid) {\n    var staged = store.artworkStagedStyleSwitch;\n    if (staged && staged.holderId === holderId && text(staged.hvid) === text(hvid)) {\n      store.artworkStagedStyleSwitch = null;\n      return true;\n    }\n    store.pendingStyleSwitch = null;\n    var config = readStyleSwitchRules(store, holderId, hvid);\n    if (!config) return false;\n    // Rule-driven visibility is cached per recalculate; refresh it for the\n    // Style just written (recalculate rebuilds it again right after).\n    if (typeof buildUiStateFromRules === 'function' && store.uiState) {\n      var keptChooserExpanded = store.uiState.artworkChooserExpanded;\n      var keptGuidedIntent = store.uiState.guidedArtworkIntent;\n      store.uiState = buildUiStateFromRules(store);\n      store.uiState.artworkChooserExpanded = keptChooserExpanded;\n      if (keptGuidedIntent === 'have' || keptGuidedIntent === 'help') store.uiState.guidedArtworkIntent = keptGuidedIntent;\n    }\n    var landings = [];\n    var selections = Object.assign({}, store.state.selections);\n    store.holders.forEach(function (holder) {\n      var rule = config.rules[getHolderId(holder)];\n      if (!rule || isProductLinkHolder(holder)) return;\n      var target = rule.mode === 'value'\n        ? findStyleArrivalRuleOption(store, holder, rule.valueId)\n        : pickStyleSwitchDefaultOption(store, holder);\n      if (!target) return;\n      var before = getSelectedOptionFromAllOptions(store, holder);\n      selections[getHolderId(holder)] = text(target.hvId);\n      landings.push({ holder: holder, carried: before, target: target });\n    });\n    if (!landings.length) return false;\n    if (replaceArtworkSelections(store, selections, 'reconcile').status === 'refused') return false;\n    var styleOption = (Array.isArray(config.holder.values) ? config.holder.values : []).find(function (option) {\n      return text(option && option.hvId) === text(hvid);\n    });\n    store.pendingStyleSwitch = {\n      landings: landings,\n      styleLabel: styleOption ? getOptionDisplayLabel(store, config.holder, styleOption) : ''\n    };\n    return true;\n  }\n\n  // One sentence per ruled holder whose FINAL selection differs from the\n  // choice before the switch and still equals the rule's landing:\n  // \"<Holder> set to <value> for <Style value>.\" A landing that a later\n  // repair moved says nothing here (the repair explains itself).\n  function finalizeStyleSwitchNotice(store) {\n    var pending = store.pendingStyleSwitch;\n    store.pendingStyleSwitch = null;\n    if (!pending || !Array.isArray(pending.landings) || !pending.landings.length) return;\n    var reasonText = pending.styleLabel ? 'for ' + pending.styleLabel : 'for this style';\n    appendStyleRuleNotice(store, buildStyleRuleAdjustments(store, pending.landings, reasonText));\n  }\n\n  function applyDesignerUrlState(store, urlState, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (!store || !urlState) return false;\n    if (urlState.invalidTemplateCollectionContext) {\n      store.pendingUrlStateErrorMessage = 'We could not reload that selected template. Choose a template to customize online.';\n      setMessage(store, store.pendingUrlStateErrorMessage, 'error');\n      return false;\n    }\n    if (!hasDesignerUrlStateToApply(urlState)) return false;\n    if (text(urlState.styleSwitchReturnPath)) store.styleSwitchReturnPath = text(urlState.styleSwitchReturnPath);\n    store.urlStateApplying = true;\n    store.urlStateForceParams = !!urlState.force;\n    store.urlStateTemplateAction = normalizeTemplateUrlAction(urlState.templateAction);\n    var incomingLaunchProvider = readLaunchProviderCandidate(urlState.launchProvider);\n    if (incomingLaunchProvider) {\n      store.config.launchProvider = incomingLaunchProvider;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = incomingLaunchProvider;\n      window.BG_DESIGNER_DEFAULT_PROVIDER = incomingLaunchProvider;\n      if (incomingLaunchProvider === 'self-hosted' && !store.editorShell) {\n        bindEditorShell(store);\n      }\n    }\n    var incomingTemplate = urlState.template && typeof urlState.template === 'object' ? urlState.template : {};\n    if (text(incomingTemplate.designId || incomingTemplate.designNumber || incomingTemplate.templateLookup || incomingTemplate.backer)) {\n      store.urlStateTemplateHandoff = {\n        designId: text(incomingTemplate.designId || incomingTemplate.templateId || incomingTemplate.id),\n        designNumber: text(incomingTemplate.designNumber || incomingTemplate.designnum || incomingTemplate.designNum),\n        templateLookup: text(incomingTemplate.templateLookup || incomingTemplate.templatePublicId || incomingTemplate.publicId),\n        backer: text(incomingTemplate.backer || incomingTemplate.backerId)\n      };\n    }\n    var liveStore = store;\n    store = artworkConfigurationDraft(store, {});\n    var changed = false;\n    var redirected = false;\n    if (Array.isArray(urlState.optionSelections) && urlState.optionSelections.length) {\n      applyStoredOptionSelections(store, urlState.optionSelections);\n      changed = true;\n      recalculate(store);\n    }\n    var styleArrival = isStyleArrivalUrlState(store, urlState);\n    var styleArrivalFrom = text(urlState.styleArrivalFrom);\n    var styleArrivalRules = styleArrival ? readStyleArrivalRules(store) : Object.create(null);\n    var styleArrivalLandings = [];\n    var styleArrivalRuledHolderIds = [];\n    store.holders.forEach(function (holder) {\n      if (redirected) return;\n      var holderId = getHolderId(holder);\n      var values = urlState.optionValuesByHolderId && urlState.optionValuesByHolderId[holderId];\n      var arrivalRule = styleArrival && !isProductLinkHolder(holder) ? styleArrivalRules[holderId] : null;\n      if (arrivalRule) {\n        var carried = values && values.length ? findOptionByUrlValues(store, holder, values) : null;\n        var landing = applyStyleArrivalRule(store, holder, arrivalRule);\n        if (landing.applied) changed = true;\n        styleArrivalLandings.push({ holder: holder, carried: carried, target: landing.option });\n        styleArrivalRuledHolderIds.push(holderId);\n        return;\n      }\n      if (!values || !values.length) return;\n      var matched = findOptionByUrlValues(store, holder, values);\n      if (!matched) return;\n      var linkedHandle = isProductLinkHolder(holder) ? getLinkedProductHandle(matched) : '';\n      if (linkedHandle && !isLinkedProductHandleCurrent(store, linkedHandle)) {\n        redirected = true;\n        window.location.assign(buildLinkedProductUrl(store, linkedHandle));\n        return;\n      }\n      writeArtworkSelection(store, holderId, text(matched.hvId), 'reconcile');\n      changed = true;\n      recalculate(store);\n    });\n    if (styleArrival) {\n      consumeStyleArrival(store, urlState, styleArrivalRuledHolderIds);\n    } else if (store.styleArrivalConsumed) {\n      // A replayed older address still shows the spent marker; the URL sync\n      // would keep it (its next URL is unchanged), so it leaves here.\n      stripStyleArrivalMarkerFromAddress();\n    }\n    if (redirected) return true;\n    var collectionContext = urlState.templateCollectionContext && typeof urlState.templateCollectionContext === 'object'\n      ? urlState.templateCollectionContext\n      : null;\n    var templateOrigin = !!(collectionContext || urlState.templateLandingAttempt);\n    var template = templateOrigin\n      ? resolveStrictTemplateCollectionSelection(store, urlState.template)\n      : resolveTemplateFromUrlState(store, urlState.template);\n    if (template && !templateOrigin) {\n      // Slice 2: a PLAIN template-param arrival resolves its compatible\n      // style through the same admin-authored optionSourceRules the\n      // collection handoff lane applies \u2014 the arriving family selects its\n      // style BEFORE the template commits, so the lock and rule-driven\n      // visibility see the right style. A template no rule family covers is\n      // refused (the strict picker gate would hide it too).\n      applyTemplateOptionSourceRuleSelections(store, template);\n      if (!templateMatchesOptionSourceRules(store, template)) {\n        template = null;\n        setMessage(store, 'We could not reload that selected template. Choose a template to customize online.', 'error');\n      }\n    }\n    if (templateOrigin && template) {\n      var collectionAvailability = getTemplateModeAvailability(getStoreArtworkAvailability(store), template);\n      var requestedCollectionFinish = normalizeDefaultArtworkMode(urlState.artworkMode);\n      var finishAllowed = !requestedCollectionFinish\n        || requestedCollectionFinish === 'designonline' && collectionAvailability.designonline\n        || requestedCollectionFinish === 'editservice' && collectionAvailability.editservice;\n      var productCompatible = templateMatchesStorePage(store, template);\n      // STYLE-06: select the arriving template's compatible family values\n      // (e.g. its style) BEFORE the size/orientation apply so rule-driven\n      // option visibility reflects the arriving family. A failed handoff\n      // restores the customer's prior selections \u2014 never a silent mutation.\n      var sourceRuleSnapshot = finishAllowed && productCompatible\n        ? applyTemplateOptionSourceRuleSelections(store, template)\n        : null;\n      if (!finishAllowed || !productCompatible || !applyTemplateCollectionConfiguration(store, template)) {\n        if (sourceRuleSnapshot) {\n          replaceArtworkSelections(store, sourceRuleSnapshot, 'reconcile');\n          recalculate(store);\n        }\n        template = null;\n      }\n    }\n    var proposedUrl = { selections: store.state.selections, template: template || liveStore.state.template };\n    var draftNotice = store.pendingCompatibilityNotice;\n    liveStore.styleArrivalConsumed = store.styleArrivalConsumed;\n    store = liveStore;\n    var publishedUrl = commitArtworkConfiguration(store, proposedUrl, { source: 'url' });\n    if (publishedUrl.status === 'refused') { store.urlStateApplying = false; return false; }\n    if (draftNotice) store.pendingCompatibilityNotice = draftNotice;\n    if (template) changed = true;\n    if (collectionContext) {\n      if (template) {\n        store.collectionTemplateHandoff = {\n          valid: true,\n          returnPath: collectionContext.returnPath,\n          preset: collectionContext.preset,\n          sourceTitle: collectionContext.sourceTitle,\n          intendedFinish: normalizeDefaultArtworkMode(urlState.artworkMode)\n        };\n        store.intentFirstActiveIntent = 'template';\n      } else {\n        store.collectionTemplateHandoff = {\n          valid: false,\n          returnPath: collectionContext.returnPath,\n          preset: collectionContext.preset,\n          sourceTitle: collectionContext.sourceTitle,\n          intendedFinish: ''\n        };\n        store.pendingUrlStateErrorMessage = 'We could not reload that selected template. Choose a template to customize online.';\n        setMessage(store, store.pendingUrlStateErrorMessage, 'error');\n      }\n    } else if (urlState.templateLandingAttempt && !template) {\n      store.urlStateTemplateAction = '';\n      store.pendingUrlStateErrorMessage = 'We could not reload that selected template. Choose a template to customize online.';\n      setMessage(store, store.pendingUrlStateErrorMessage, 'error');\n    }\n    if (applyQuantityFromUrlState(store, urlState)) {\n      changed = true;\n    }\n    if (text(urlState.canvaUrl)) {\n      store.state.canvaUrl = text(urlState.canvaUrl);\n      changed = true;\n    }\n    var urlProject = urlState.project && typeof urlState.project === 'object' ? urlState.project : {};\n    var restoredProjectFromUrl = false;\n    var urlProjectId = text(urlProject.projectId || urlProject.projectID || urlProject.project_id || urlProject.publicId || urlProject.id);\n    // URL-PROJECT-PARAM-ARTWORK-OFF-01: every project parameter and the\n    // encoded state reach page state here and nowhere else, so this is where\n    // the address lane asks. A refused project leaves the rest of the address\n    // to apply as it would without it.\n    // The editor's own add-to-cart return (MOBILE-DTC-PARITY-01) is the\n    // customer's request of a moment ago: the design was seen in the editor\n    // and the return lane adds it at once, so it never waits unseen.\n    var editorAddReturnProjectId = text(store.directToCartReturnMarker && store.directToCartReturnMarker.projectId);\n    var isEditorAddReturn = !!editorAddReturnProjectId && !urlState.cartLineArrival && isProductCommerceDirectToCart(store)\n      && normalizeSelfHostedProjectIdAlias(editorAddReturnProjectId) === normalizeSelfHostedProjectIdAlias(urlProjectId);\n    var refusedProjectFromUrl = !!urlProjectId && !isEditorAddReturn && refuseSavedDesignLanding(store, { silent: !!urlState.cartLineArrival });\n    if (refusedProjectFromUrl) urlProjectId = '';\n    if (urlProjectId && isPitchPrintLaunchProvider(store)) {\n      var projectPayload = Object.assign({}, urlProject);\n      if (template && !text(projectPayload.designId || projectPayload.designID || projectPayload.pitchPrintDesignId)) {\n        projectPayload.designId = text(template.designId);\n      }\n      if (template && !text(projectPayload.designNumber || projectPayload.designnum || projectPayload.designNum)) {\n        projectPayload.designNumber = text(template.designNumber);\n      }\n      restoredProjectFromUrl = applyPitchPrintProjectState(store, projectPayload, { reuseMode: 'url' });\n      if (restoredProjectFromUrl) changed = true;\n    } else if (urlProjectId) {\n      var nextProjectState = Object.assign({}, store.state.project || {});\n      nextProjectState.projectId = urlProjectId;\n      nextProjectState.designId = text(urlProject.designId || urlProject.designID || urlProject.pitchPrintDesignId || nextProjectState.designId || (template && template.designId));\n      nextProjectState.designNumber = text(urlProject.designNumber || urlProject.designnum || urlProject.designNum || nextProjectState.designNumber || (template && template.designNumber));\n      nextProjectState.previewUrl = text(urlProject.previewUrl || urlProject.preview || nextProjectState.previewUrl);\n      nextProjectState.previews = Array.isArray(nextProjectState.previews) ? nextProjectState.previews : [];\n      nextProjectState.numPages = Number(urlProject.numPages || urlProject.pages || nextProjectState.numPages || 0) || 0;\n      nextProjectState.refreshToken = text(urlProject.refreshToken || nextProjectState.refreshToken) || String(Date.now());\n      store.state.project = nextProjectState;\n      restoredProjectFromUrl = true;\n      changed = true;\n    }\n    var designOnlineModeRefused = !restoredProjectFromUrl && normalizeDefaultArtworkMode(urlState.artworkMode) === 'designonline' && isPageWithoutSavedDesignSurface(store);\n    if (text(urlState.artworkMode) && !designOnlineModeRefused && !(refusedProjectFromUrl && urlState.artworkModeFromProject)) {\n      var nextArtworkMode = restoredProjectFromUrl ? 'designonline' : urlState.artworkMode;\n      var templateFinishRequested = nextArtworkMode === 'editservice' || nextArtworkMode === 'designonline';\n      if (templateFinishRequested && store.urlStateTemplateHandoff && !template && !restoredProjectFromUrl) {\n        // SF-3 (2026-09-13): a template handoff whose template did not\n        // resolve keeps the customer's INTENT (start with a template) and\n        // lands on template selection with the reload message. It never\n        // applies a finish that has no template behind it, and never falls\n        // through to a configured upload / Canva / after-checkout default.\n        store.urlStateTemplateHandoffFailed = true;\n        prepareStoreForUrlArtworkMode(store, nextArtworkMode);\n        setArtworkChoice(store, 'need-design', 'use-template', '');\n        var handoffOutcomes = getThreeOutcomesState(store);\n        handoffOutcomes.engaged = true;\n        handoffOutcomes.outcomeGroup = 'template';\n        handoffOutcomes.laterExpanded = false;\n        store.intentFirstActiveIntent = 'template';\n        if (!store.pendingUrlStateErrorMessage) {\n          store.pendingUrlStateErrorMessage = 'We could not reload that selected template. Choose a template to customize online.';\n          setMessage(store, store.pendingUrlStateErrorMessage, 'error');\n        }\n        changed = true;\n      } else {\n        prepareStoreForUrlArtworkMode(store, nextArtworkMode);\n        if (applyArtworkModeChoice(store, nextArtworkMode, 'url')) changed = true;\n      }\n    }\n    recalculate(store);\n    finalizeStyleArrivalNotice(store, styleArrivalLandings, styleArrivalFrom);\n    syncFormState(store);\n    if (!settings.keepApplying) {\n      window.setTimeout(function () {\n        store.urlStateApplying = false;\n        scheduleDesignerUrlStateSync(store, true);\n      }, 0);\n    }\n    return changed;\n  }\n\n  function getOptionUrlParamValue(holder, option, portable) {\n    if (!option) return '';\n    if (isProductLinkHolder(holder) && text(option.linkedProductHandle)) return text(option.linkedProductHandle);\n    var preferred = text(option.targetingID || option.targetingId || option.paramValue || option.hvId || option.friendlySku || option.numericSku || option.label);\n    if (portable) return preferred;\n    var canonicalId = text(option.hvId || option.hvid);\n    var aliasesAnotherValue = (holder && Array.isArray(holder.values) ? holder.values : []).some(function (value) {\n      return text(value.hvId || value.hvid) !== canonicalId && optionMatchesUrlValue(value, preferred);\n    });\n    return aliasesAnotherValue && canonicalId ? canonicalId : preferred;\n  }\n\n  function removeOwnedUrlStateParams(params, index) {\n    var ownedArtworkKeys = [\n      'artwork',\n      'artworkMode',\n      'artwork_mode',\n      'bg_template_action',\n      'template_action',\n      'templateAction',\n      'bgTemplateAction',\n      'designonline',\n      'editservice',\n      'uploadfiles',\n      'uploadcanva',\n      'youhaveart',\n      'customdesign',\n      'reorder',\n      'recreate',\n      'freesetup',\n      'canva',\n      'canvaUrl',\n      'canvaLink',\n      'templateLookup',\n      'templatePublicId',\n      'templateId',\n      'publicId',\n      'designId',\n      'designnum',\n      'designNum',\n      'designNumber',\n      'id',\n      'backer',\n      'backerId',\n      'projectId',\n      'projectID',\n      'project_id',\n      'pp_project_id',\n      'ppProjectId',\n      'bg_saved_project_id',\n      'bg_cart_line_key',\n      'bg_project_id',\n      'bg_design_id',\n      'bg_cart_action',\n      '_pitchprint',\n      'previewUrl',\n      'preview',\n      'qty',\n      'quantity',\n      APPAREL_SIZES_PARAM,\n      URL_STATE_PARAM,\n      STYLE_ARRIVAL_PARAM\n    ].map(normalizeUrlKey);\n    getUrlSearchParamKeys(params).forEach(function (rawKey) {\n      var normalized = normalizeUrlKey(rawKey);\n      var lowerKey = text(rawKey).toLowerCase();\n      if (index.ownedKeys[normalized] || ownedArtworkKeys.indexOf(normalized) !== -1 || lowerKey.indexOf(APPAREL_SIZE_PARAM_PREFIX) === 0) {\n        params.delete(rawKey);\n      }\n    });\n  }\n\n  function buildDesignerUrlStatePayload(store) {\n    return {\n      runtimeVersion: 'designer-storefront-url-state-v1',\n      handle: text(store && store.config && store.config.handle),\n      sourceHandle: text(getLegacyProductSourceHandle(store)),\n      quantityMode: text(store && store.state && store.state.quantityMode),\n      optionSelections: buildCurrentOptionSelections(store),\n      artworkMode: text(store && store.state && store.state.artworkMode),\n      canvaUrl: text(store && store.state && store.state.canvaUrl),\n      template: store && store.state && store.state.template ? {\n        designId: text(store.state.template.designId),\n        designNumber: text(store.state.template.designNumber),\n        templateLookup: text(store.state.template.templateLookup || store.state.template.templatePublicId),\n        backer: text(store.state.template.backer)\n      } : null,\n      project: store && store.state && store.state.project && text(store.state.project.projectId) ? {\n        projectId: text(store.state.project.projectId),\n        designId: text(store.state.project.designId),\n        designNumber: text(store.state.project.designNumber),\n        previewUrl: text(store.state.project.previewUrl),\n        previews: Array.isArray(store.state.project.previews) ? store.state.project.previews.map(text).filter(Boolean) : [],\n        numPages: Number(store.state.project.numPages || 0) || 0\n      } : null,\n      printQuantity: Number(store && store.state && store.state.quantity || 0) || 0,\n      typedQuantity: Number(store && store.state && store.state.typedQuantity || 0) || 0,\n      paidPrintQty: Number(store && store.state && store.state.paidPrintQuantity || 0) || 0,\n      apparelSizes: store && store.state && store.state.apparelSizes ? store.state.apparelSizes : {}\n    };\n  }\n\n  function buildReadableParamsFromDesignerState(payload) {\n    var params = new URLSearchParams();\n    var source = payload && typeof payload === 'object' ? payload : {};\n    (Array.isArray(source.optionSelections) ? source.optionSelections : []).forEach(function (selection) {\n      var key = sanitizeUrlParamKey(selection && (selection.holderHtmlId || selection.holderLabel || selection.holderId));\n      // Saved links return to this product, so keep their exact choice even when legacy aliases overlap.\n      var value = text(selection && (selection.hvid || selection.targetingId || selection.paramValue || selection.valueLabel));\n      if (key && value) params.set(key, value);\n    });\n    var qty = text(source.printQuantity || source.quantity || source.qty || source.typedQuantity || source.paidPrintQty);\n    if (qty) params.set('qty', qty);\n    var apparelSizes = source.apparelSizes && typeof source.apparelSizes === 'object' ? source.apparelSizes : {};\n    Object.keys(apparelSizes).forEach(function (size) {\n      var qtyValue = parseInt(apparelSizes[size], 10);\n      if (Number.isFinite(qtyValue) && qtyValue > 0) {\n        params.set(APPAREL_SIZE_PARAM_PREFIX + normalizeApparelSizeUrlKey(size), String(qtyValue));\n      }\n    });\n    var artworkMode = normalizeDefaultArtworkMode(source.artworkMode || source.artwork);\n    if (artworkMode) {\n      params.set('artwork', artworkMode);\n      params.set(artworkMode, 'true');\n    }\n    var canvaUrl = text(source.canvaUrl || source.canvaLink);\n    if (canvaUrl) params.set('canvaUrl', canvaUrl);\n    var template = source.template && typeof source.template === 'object' ? source.template : {};\n    if (text(template.designNumber)) params.set('designnum', text(template.designNumber));\n    if (text(template.designId)) params.set('id', text(template.designId));\n    if (text(template.templateLookup || template.templatePublicId)) params.set('templateLookup', text(template.templateLookup || template.templatePublicId));\n    if (text(template.backer)) params.set('backer', text(template.backer));\n    var project = source.project && typeof source.project === 'object' ? source.project : {};\n    if (text(project.projectId)) params.set('projectId', text(project.projectId));\n    if (text(project.designId) && !params.get('id')) params.set('id', text(project.designId));\n    if (text(project.designNumber) && !params.get('designnum')) params.set('designnum', text(project.designNumber));\n    if (Number(project.numPages || 0) > 0) params.set('numPages', String(Number(project.numPages || 0)));\n    return params;\n  }\n\n  function buildUrlFromDesignerState(baseUrl, payload, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var url = new URL(text(baseUrl) || window.location.href, window.location.origin);\n    var nextParams = buildReadableParamsFromDesignerState(payload);\n    getUrlSearchParamKeys(nextParams).forEach(function (key) {\n      url.searchParams.set(key, nextParams.get(key));\n    });\n    if (settings.includeEncodedState !== false) {\n      url.searchParams.set(URL_STATE_PARAM, encodeUrlStatePayload(payload));\n    }\n    return url.pathname + url.search + url.hash;\n  }\n\n  function syncDesignerUrlStateNow(store) {\n    if (!store || store.urlStateApplying) return;\n    // THEME-SETUP-READ-RECOVER: a page on the setup-data message has not read\n    // its address yet (the heal does); defaults never overwrite it first.\n    if (store.setupDataLoadFailed && !store.bootUrlStateRead) return;\n    var url = new URL(window.location.href);\n    var params = new URLSearchParams(url.search);\n    var index = buildDesignerUrlParamIndex(store);\n    removeOwnedUrlStateParams(params, index);\n    store.holders.forEach(function (holder) {\n      if (isHolderUnavailableByRules(store, holder)) return;\n      if (shouldSuppressOptionTemplateSelection(store, holder)) return;\n      var holderId = getHolderId(holder);\n      var option = getSelectedOption(store, holder);\n      var key = index.writeKeyByHolderId[holderId];\n      var value = getOptionUrlParamValue(holder, option);\n      if (key && value) params.set(key, value);\n    });\n    if (Number(store.state.quantity || 0) > 0) params.set('qty', String(store.state.quantity));\n    if (text(store.state.quantityMode) === 'apparelMatrix') {\n      Object.keys(store.state.apparelSizes || {}).forEach(function (size) {\n        var qty = parseInt(store.state.apparelSizes[size], 10);\n        if (Number.isFinite(qty) && qty > 0) {\n          params.set(APPAREL_SIZE_PARAM_PREFIX + normalizeApparelSizeUrlKey(size), String(qty));\n        }\n      });\n    }\n    var mode = normalizeDefaultArtworkMode(store.state.artworkMode);\n    if (mode) {\n      params.set('artwork', mode);\n      params.set(mode, 'true');\n    }\n    if (text(store.state.canvaUrl)) params.set('canvaUrl', text(store.state.canvaUrl));\n    if (store.state.template) {\n      if (text(store.state.template.designNumber)) params.set('designnum', text(store.state.template.designNumber));\n      if (text(store.state.template.designId)) params.set('id', text(store.state.template.designId));\n      if (text(store.state.template.templateLookup || store.state.template.templatePublicId)) {\n        params.set('templateLookup', text(store.state.template.templateLookup || store.state.template.templatePublicId));\n      }\n      if (text(store.state.template.backer)) params.set('backer', text(store.state.template.backer));\n    } else if ((mode === 'designonline' || mode === 'editservice') && store.urlStateTemplateHandoff) {\n      var handoffTemplate = store.urlStateTemplateHandoff;\n      if (text(handoffTemplate.designNumber)) params.set('designnum', text(handoffTemplate.designNumber));\n      if (text(handoffTemplate.designId)) params.set('id', text(handoffTemplate.designId));\n      if (text(handoffTemplate.templateLookup)) params.set('templateLookup', text(handoffTemplate.templateLookup));\n      if (text(handoffTemplate.backer)) params.set('backer', text(handoffTemplate.backer));\n    }\n    var syncedProject = store.state && store.state.project ? store.state.project : {};\n    if (text(syncedProject.projectId)) {\n      params.set('projectId', text(syncedProject.projectId));\n      if (text(syncedProject.designId) && !params.get('id')) params.set('id', text(syncedProject.designId));\n      if (text(syncedProject.designNumber) && !params.get('designnum')) params.set('designnum', text(syncedProject.designNumber));\n      if (Number(syncedProject.numPages || 0) > 0) params.set('numPages', String(Number(syncedProject.numPages || 0)));\n    }\n    if (parseUrlFlag(url.searchParams.get(URL_INCLUDE_STATE_PARAM))) {\n      params.set(URL_INCLUDE_STATE_PARAM, 'true');\n      params.set(URL_STATE_PARAM, encodeUrlStatePayload(buildDesignerUrlStatePayload(store)));\n    }\n    if (store.channelCatalog) {\n      var purchase = getChannelPurchase(store);\n      var origin = core.normalizeChannelOfferOrigin(store.state.channelOffer);\n      params.delete('bg_offer_variant'); params.delete('bg_offer_revision'); params.delete('bg_offer_id');\n      if (origin) {\n        params.set('variant', purchase.variantId || store.config.baseVariantId);\n        if (purchase.pricingMode === 'custom') {\n          params.set('bg_offer_variant', origin.variantId);\n          params.set('bg_offer_revision', origin.revisionId);\n          params.set('bg_offer_id', origin.offerId);\n        }\n      } else if (params.has('variant')) params.set('variant', store.config.baseVariantId);\n    }\n    var nextSearch = params.toString();\n    var nextUrl = url.pathname + (nextSearch ? '?' + nextSearch : '') + url.hash;\n    var currentUrl = window.location.pathname + window.location.search + window.location.hash;\n    if (nextUrl === currentUrl || nextUrl === store.urlStateLastSyncedUrl) return;\n    history.replaceState({}, '', nextUrl);\n    store.urlStateLastSyncedUrl = nextUrl;\n  }\n\n  function scheduleDesignerUrlStateSync(store, immediate) {\n    if (!store || store.urlStateApplying) return;\n    if (store.urlStateSyncTimer) {\n      window.clearTimeout(store.urlStateSyncTimer);\n      store.urlStateSyncTimer = null;\n    }\n    if (immediate) {\n      syncDesignerUrlStateNow(store);\n      return;\n    }\n    store.urlStateSyncTimer = window.setTimeout(function () {\n      store.urlStateSyncTimer = null;\n      syncDesignerUrlStateNow(store);\n    }, 250);\n  }\n\n  function installDesignerUrlStateHelper(store) {\n    window.BGDesignerStorefrontUrlState = {\n      encodeState: encodeUrlStatePayload,\n      decodeState: decodeUrlStatePayload,\n      buildParamsFromDesignerState: buildReadableParamsFromDesignerState,\n      buildUrl: buildUrlFromDesignerState,\n      getCurrentState: function () {\n        return buildDesignerUrlStatePayload(store);\n      },\n      syncUrl: function () {\n        scheduleDesignerUrlStateSync(store, true);\n      }\n    };\n  }\n\n  function bindDesignerUrlStateRuntime(store) {\n    if (!store || store.urlStateRuntimeBound) return;\n    store.urlStateRuntimeBound = true;\n    installDesignerUrlStateHelper(store);\n    window.addEventListener('popstate', function (event) {\n      handleProductPreview3dHistoryTraversal(store, event);\n    });\n  }\n\n  function normalizeArtworkModes(binding, templates, productData) {\n    var bindingModes = Array.isArray(binding && binding.allowedArtworkModes)\n      ? binding.allowedArtworkModes.map(text).filter(Boolean)\n      : [];\n    var modes = bindingModes.slice();\n    if ((templates || []).some(function (entry) { return entry.designOnlineAvailable; })) {\n      modes.push('designonline');\n    }\n    if ((templates || []).some(function (entry) { return entry.editServiceAvailable; })) {\n      modes.push('editservice');\n    }\n    modes.push('uploadfiles', 'uploadcanva', 'youhaveart');\n    if (numberValue(productData && productData.customDesignCost, 0) > 0) {\n      modes.push('customdesign');\n    }\n    return modes.filter(function (entry, index, source) {\n      return source.indexOf(entry) === index;\n    });\n  }\n\n  function normalizeUploadFields(binding) {\n    var fields = Array.isArray(binding && binding.uploadFields) ? binding.uploadFields.map(function (field) {\n      return {\n        id: text(field && field.id),\n        label: text(field && field.label),\n        kind: text(field && field.kind) || 'file',\n        required: !!(field && field.required),\n        accept: text(field && field.accept),\n        multiple: !!(field && field.multiple),\n        maxFiles: Math.max(0, Number(field && field.maxFiles || 0) || 0)\n      };\n    }).filter(function (field) {\n      return field.id && field.kind === 'file';\n    }) : [];\n    return fields.length ? fields : [deepClone(FALLBACK_UPLOAD_FIELD, FALLBACK_UPLOAD_FIELD)];\n  }\n\n  function getModeLabel(mode) {\n    var key = text(mode).toLowerCase();\n    return ARTWORK_MODE_META[key] ? ARTWORK_MODE_META[key].label : key;\n  }\n\n  function isMobileProductOptionsViewport() {\n    return !!(window.matchMedia && window.matchMedia('(max-width: 749px)').matches);\n  }\n\n  function getHolderType(holder) {\n    var mobile = holder && holder.ui && holder.ui.mobile;\n    var mobileType = isMobileProductOptionsViewport() && mobile && mobile.fieldType;\n    var normalized = text(mobileType || (holder && holder.optionType)).toLowerCase();\n    normalized = normalized.replace(/[\\s_-]+/g, '');\n    if (normalized === 'dropdown' || normalized === 'select') return 'dropdown';\n    if (normalized === 'buttons' || normalized === 'button') return 'buttons';\n    if (normalized === 'colorswatch') return 'colorSwatch';\n    if (normalized === 'productlinkswatch') return 'swatch';\n    return 'swatch';\n  }\n\n  function isProductLinkHolder(holder) {\n    var normalized = text(holder && holder.optionType).toLowerCase();\n    normalized = normalized.replace(/[\\s_-]+/g, '');\n    return normalized === 'productlinkswatch';\n  }\n\n  function getCurrentProductHandle(store) {\n    return text(store && store.config && store.config.handle).trim();\n  }\n\n  function getLinkedProductHandle(option) {\n    return text(option && option.linkedProductHandle).trim();\n  }\n\n  function isLinkedProductHandleCurrent(store, linkedHandle) {\n    var handle = text(linkedHandle).trim();\n    var currentHandle = getCurrentProductHandle(store);\n    var sourceHandle = getLegacyProductSourceHandle(store);\n    var productCommerceSourceHandle = getProductCommerceSourceHandle(store);\n    return !!(handle && (\n      handle === currentHandle\n      || handle === sourceHandle\n      || handle === productCommerceSourceHandle\n    ));\n  }\n\n  function isCurrentLinkedProductOption(store, option) {\n    var linkedHandle = getLinkedProductHandle(option);\n    return isLinkedProductHandleCurrent(store, linkedHandle);\n  }\n\n  function buildLinkedProductAttributes(store, option) {\n    var linkedHandle = getLinkedProductHandle(option);\n    if (!linkedHandle) return '';\n    return ' data-bg-linked-product-handle=\"' + escapeHtml(linkedHandle) + '\"' +\n      ' data-bg-linked-product-current=\"' + (isCurrentLinkedProductOption(store, option) ? '1' : '0') + '\"';\n  }\n\n  function findOptionByHolderAndValue(store, holderId, hvid) {\n    var holders = Array.isArray(store && store.holders) ? store.holders : [];\n    for (var holderIndex = 0; holderIndex < holders.length; holderIndex += 1) {\n      var holder = holders[holderIndex];\n      if (getHolderId(holder) !== holderId) continue;\n      var options = Array.isArray(holder && holder.values) ? holder.values : [];\n      for (var optionIndex = 0; optionIndex < options.length; optionIndex += 1) {\n        if (text(options[optionIndex] && options[optionIndex].hvId) === hvid) return options[optionIndex];\n      }\n    }\n    return null;\n  }\n\n  function navigateToLinkedProductIfNeeded(store, holderId, hvid) {\n    var option = findOptionByHolderAndValue(store, holderId, hvid);\n    var linkedHandle = getLinkedProductHandle(option);\n    if (!linkedHandle || isLinkedProductHandleCurrent(store, linkedHandle)) return false;\n    window.location.assign(buildStyleSwitchUrl(store, linkedHandle));\n    return true;\n  }\n\n  function isSwatchHolderType(holderType) {\n    return holderType === 'swatch' || holderType === 'colorSwatch';\n  }\n\n  function shouldPreferHolderHexColor(holder) {\n    return getHolderType(holder) === 'colorSwatch';\n  }\n\n  function getHolderClassNames(holder) {\n    return (Array.isArray(holder && holder.classes) ? holder.classes : []).map(text).filter(Boolean);\n  }\n\n  function holderHasClass(holder, className) {\n    return getHolderClassNames(holder).indexOf(className) !== -1;\n  }\n\n  function getLegacySwatchSizePx(holder, prefix) {\n    var expression = new RegExp('^' + prefix + '(\\\\d+)x(\\\\d+)$', 'i');\n    var classes = getHolderClassNames(holder);\n    for (var index = 0; index < classes.length; index += 1) {\n      var match = classes[index].match(expression);\n      if (match) return Math.max(numberValue(match[1], 0), numberValue(match[2], 0));\n    }\n    return 0;\n  }\n\n  function normalizeSwatchFillMode(value) {\n    return text(value).trim().toLowerCase() === 'cover' ? 'cover' : 'contain';\n  }\n\n  function getSafeHolderClassNames(holder) {\n    var classes = getHolderClassNames(holder);\n    var allowedExact = {\n      mouseOverLightBox: true,\n      largeLabel: true,\n      productAddon: true,\n      required: true\n    };\n    return classes.map(text).filter(function (className, index, source) {\n      if (!/^[A-Za-z0-9_-]+$/.test(className)) return false;\n      if (allowedExact[className]) return source.indexOf(className) === index;\n      if (/^swatch-size-\\d+x\\d+$/i.test(className)) return source.indexOf(className) === index;\n      if (/^mobile-swatch-size-\\d+x\\d+$/i.test(className)) return source.indexOf(className) === index;\n      return false;\n    });\n  }\n\n  function buildHolderSectionClasses(holder, holderType, semantics, showLabel, holderDisabled) {\n    var classes = [\n      'bg-designer-storefront__section',\n      'bg-designer-storefront__option-section',\n      'bg-designer-storefront__option-section--' + core.slugify(holderType || 'swatch')\n    ];\n    if (semantics.usesLargeLabel) classes.push('bg-designer-storefront__option-section--large-label');\n    if (semantics.usesInlineLabel) classes.push('bg-designer-storefront__option-section--inline-label');\n    if (semantics.isAddon) classes.push('bg-designer-storefront__option-section--addon');\n    if (!showLabel) classes.push('bg-designer-storefront__option-section--label-hidden');\n    if (holderDisabled) classes.push('is-disabled');\n    return classes.concat(getSafeHolderClassNames(holder)).join(' ');\n  }\n\n  function normalizeTargetingIdKey(value) {\n    return text(value).trim().toLowerCase();\n  }\n\n  function normalizeRuleSelectorKey(value) {\n    return text(value).trim().toLowerCase();\n  }\n\n  function normalizeRuleClassKey(value) {\n    return text(value).trim().toLowerCase();\n  }\n\n  function buildRuleSurfaceClassKey(selector, className) {\n    var selectorKey = normalizeRuleSelectorKey(selector);\n    var classKey = normalizeRuleClassKey(className);\n    if (!selectorKey || !classKey) return '';\n    return selectorKey + '|' + classKey;\n  }\n\n  function buildRuleSurfaceAttributeKey(selector, attributeName) {\n    var selectorKey = normalizeRuleSelectorKey(selector);\n    var attributeKey = text(attributeName).trim().toLowerCase();\n    if (!selectorKey || !attributeKey) return '';\n    return selectorKey + '|' + attributeKey;\n  }\n\n  function createEmptyUiState(store) {\n    return {\n      rootFlags: {\n        descriptionPane: false,\n        tightenOptions: false,\n        artworkDescriptionPane: false\n      },\n      hiddenTargetingIds: Object.create(null),\n      disabledTargetingIds: Object.create(null),\n      disabledReasons: Object.create(null),\n      requiredTargetingIds: Object.create(null),\n      checkoutBlockers: [],\n      quantityModel: {},\n      surfaceVisibility: Object.create(null),\n      surfaceDisabled: Object.create(null),\n      surfaceClasses: Object.create(null),\n      surfaceAttributes: Object.create(null)\n    };\n  }\n\n  function hasUiSurfaceVisibility(store, selector) {\n    var selectorKey = normalizeRuleSelectorKey(selector);\n    var visibility = store && store.uiState && store.uiState.surfaceVisibility;\n    return !!(selectorKey && visibility && Object.prototype.hasOwnProperty.call(visibility, selectorKey));\n  }\n\n  function getUiSurfaceVisibility(store, selector, fallback) {\n    var selectorKey = normalizeRuleSelectorKey(selector);\n    var visibility = store && store.uiState && store.uiState.surfaceVisibility;\n    if (selectorKey && visibility && Object.prototype.hasOwnProperty.call(visibility, selectorKey)) {\n      return !!visibility[selectorKey];\n    }\n    return !!fallback;\n  }\n\n  function getUiSurfaceClassFlag(store, selector, className, fallback) {\n    var quantityModel = store && store.uiState && store.uiState.quantityModel && typeof store.uiState.quantityModel === 'object'\n      ? store.uiState.quantityModel\n      : null;\n    if (quantityModel && normalizeRuleSelectorKey(selector) === normalizeRuleSelectorKey(QUANTITY_RULE_SELECTOR)) {\n      var classKey = text(className).toLowerCase().replace(/[\\s_-]+/g, '');\n      var propertyName = classKey === 'rangebased'\n        ? 'rangeBased'\n        : classKey === 'calculateontypedqty'\n          ? 'calculateOnTypedQty'\n          : classKey === 'roundup'\n            ? 'roundUp'\n            : '';\n      if (propertyName && Object.prototype.hasOwnProperty.call(quantityModel, propertyName)) {\n        return !!quantityModel[propertyName];\n      }\n    }\n    var productConfig = getQuantityProductConfig(store);\n    if (quantityModel || productConfig) {\n      var productClassKey = text(className).toLowerCase().replace(/[\\s_-]+/g, '');\n      var productPropertyName = productClassKey === 'rangebased'\n        ? 'rangeBased'\n        : productClassKey === 'calculateontypedqty'\n          ? 'calculateOnTypedQty'\n          : productClassKey === 'roundup'\n            ? 'roundUp'\n            : '';\n      if (productPropertyName && productConfig && Object.prototype.hasOwnProperty.call(productConfig, productPropertyName)) {\n        return !!productConfig[productPropertyName];\n      }\n    }\n    var key = buildRuleSurfaceClassKey(selector, className);\n    var surfaceClasses = store && store.uiState && store.uiState.surfaceClasses;\n    if (key && surfaceClasses && Object.prototype.hasOwnProperty.call(surfaceClasses, key)) {\n      return !!surfaceClasses[key];\n    }\n    return !!fallback;\n  }\n\n  function getUiSurfaceDisabled(store, selector, fallback) {\n    var selectorKey = normalizeRuleSelectorKey(selector);\n    var surfaceDisabled = store && store.uiState && store.uiState.surfaceDisabled;\n    if (selectorKey && surfaceDisabled && Object.prototype.hasOwnProperty.call(surfaceDisabled, selectorKey)) {\n      return !!surfaceDisabled[selectorKey];\n    }\n    return !!fallback;\n  }\n\n  function getHolderUiConfig(holder) {\n    var ui = holder && holder.ui && typeof holder.ui === 'object' ? holder.ui : {};\n    var behavior = ui.behavior && typeof ui.behavior === 'object' ? ui.behavior : {};\n    var layout = ui.layout && typeof ui.layout === 'object' ? ui.layout : {};\n    var mobileLayout = isMobileProductOptionsViewport() && plainObject(ui.mobile);\n    if (mobileLayout) layout = Object.assign({}, layout, mobileLayout);\n    var pricing = ui.pricing && typeof ui.pricing === 'object' ? ui.pricing : {};\n    var swatch = ui.swatch && typeof ui.swatch === 'object' ? ui.swatch : {};\n    var hoverPreview = swatch.hoverPreview && typeof swatch.hoverPreview === 'object' ? swatch.hoverPreview : {};\n    var legacyDesktopSwatchPx = getLegacySwatchSizePx(holder, 'swatch-size-');\n    var legacyMobileSwatchPx = getLegacySwatchSizePx(holder, 'mobile-swatch-size-');\n    return {\n      isAddon: !!behavior.isAddon || holderHasClass(holder, 'productAddon'),\n      // The per-holder \"description layout\" setting was retired in Admin\n      // (Wave 4B, 2026-08); imported ui.descriptionPane is no longer honored\n      // so no product carries a switch staff cannot reach.\n      usesLargeLabel: text(layout.labelStyle).toLowerCase() === 'large'\n        || (!(mobileLayout && mobileLayout.labelStyle) && holderHasClass(holder, 'largeLabel')),\n      // Inline labels are an Admin opt-in (operator ruling 2026-08-27): only a\n      // commerce-authored labelPosition of 'inline' inlines a label. Imported\n      // legacy label data \u2014 labelStyle 'Inline' and the labelPosition baked\n      // into legacy option-layout JSON \u2014 no longer flips a product; every\n      // holder without the authored value keeps its label above. Commerce\n      // holders are the ones carrying productCommerceRole.\n      usesInlineLabel: text(layout.labelPosition).toLowerCase() === 'inline'\n        && typeof (holder && holder.productCommerceRole) === 'string',\n      hoverPreviewEnabled: !!hoverPreview.enabled || holderHasClass(holder, 'mouseOverLightBox'),\n      isRequired: !!behavior.required || !!(holder && holder.isRequired) || holderHasClass(holder, 'required'),\n      pitchDisabled: !!behavior.designerDisabled || holderHasClass(holder, 'pitchDisable'),\n      hidePrice: !!pricing.hideOptionPrice || !!(holder && holder.hidePrice),\n      displayAsAccordion: !!layout.accordion || !!(holder && holder.displayAsAccordion),\n      forceInteractiveWhenSingle: !!behavior.forceInteractiveWhenSingle || !!layout.forceInteractiveWhenSingle || !!(holder && holder.forceInteractiveWhenSingle) || holderHasClass(holder, 'forceInteractiveWhenSingle') || holderHasClass(holder, 'interactiveWhenSingle'),\n      singleOptionDisplay: text(layout.singleOptionDisplay || layout.singleOptionMode || behavior.singleOptionDisplay || behavior.singleOptionMode || (holder && holder.singleOptionDisplay)),\n      helpText: text(layout.helpText || (holder && holder.helpText)),\n      labelPosition: text(layout.labelPosition || (holder && holder.labelPosition)),\n      swatchDesktopPx: numberValue(swatch.desktopSizePx, 0) || legacyDesktopSwatchPx,\n      swatchMobilePx: numberValue(swatch.mobileSizePx, 0) || legacyMobileSwatchPx,\n      swatchFillMode: normalizeSwatchFillMode(swatch.fillMode || swatch.swatchFillMode || (holder && holder.swatchFillMode)),\n      hoverPreviewPx: numberValue(hoverPreview.sizePx, 0),\n      // PDP-TOKENIZE-02 Stage B/C per-holder overrides (null/'' = inherit).\n      optionPaddingPx: positiveIntegerOrNull(layout.optionPaddingPx),\n      labelMarginPx: nonNegativeIntegerOrNull(layout.labelMarginPx),\n      buttonMinWidthPx: positiveIntegerOrNull(layout.buttonMinWidthPx),\n      titleFontFamily: sanitizeCssFontFamilyValue(layout.titleFontFamily),\n      titleFontWeight: positiveIntegerOrNull(layout.titleFontWeight),\n      presentation: text(layout.presentation).toLowerCase()\n    };\n  }\n\n  function getHolderSwatchVisualConfig(holder) {\n    var ui = getHolderUiConfig(holder);\n    var desktopPx = ui.swatchDesktopPx;\n    var mobilePx = ui.swatchMobilePx;\n    var effectivePx = desktopPx || mobilePx || 82;\n    var hoverPreviewPx = ui.hoverPreviewPx || 220;\n    if (!ui.hoverPreviewPx) {\n      if (effectivePx >= 100) {\n        hoverPreviewPx = 420;\n      } else if (effectivePx >= 80) {\n        hoverPreviewPx = 320;\n      } else if (effectivePx >= 60) {\n        hoverPreviewPx = 260;\n      }\n    }\n    // PDP-TOKENIZE-02 Stage B coupling fix: the historic +26 bakes in the\n    // baseline .75rem (12px) holder padding plus 1px borders (2*(12+1)).\n    // When a per-holder optionPaddingPx override is set, derive the holder\n    // width from it instead; the +26 stays as the untouched fallback path.\n    var holderChrome = ui.optionPaddingPx > 0 ? (2 * (ui.optionPaddingPx + 1)) : 26;\n    return {\n      desktopPx: desktopPx,\n      mobilePx: mobilePx,\n      desktopHolderPx: desktopPx > 0 ? (desktopPx + holderChrome) : 0,\n      mobileHolderPx: mobilePx > 0 ? (mobilePx + holderChrome) : 0,\n      fillMode: ui.swatchFillMode,\n      hoverPreviewPx: hoverPreviewPx,\n      hoverPreviewEnabled: ui.hoverPreviewEnabled\n    };\n  }\n\n  function buildSwatchVisualStyle(holder) {\n    var config = getHolderSwatchVisualConfig(holder);\n    var declarations = [];\n    if (config.desktopPx > 0) {\n      declarations.push('--bg-swatch-preview-size:' + config.desktopPx + 'px');\n    }\n    if (config.mobilePx > 0) {\n      declarations.push('--bg-swatch-preview-mobile-size:' + config.mobilePx + 'px');\n    }\n    if (config.desktopHolderPx > 0) {\n      declarations.push('--bg-swatch-holder-width:' + config.desktopHolderPx + 'px');\n    }\n    if (config.mobileHolderPx > 0) {\n      declarations.push('--bg-swatch-holder-mobile-width:' + config.mobileHolderPx + 'px');\n    }\n    if (config.hoverPreviewPx > 0) {\n      declarations.push('--bg-swatch-hover-size:' + config.hoverPreviewPx + 'px');\n    }\n    return declarations.length\n      ? ' style=\"' + escapeHtml(declarations.join(';')) + '\"'\n      : '';\n  }\n\n  // PDP-TOKENIZE-02 Stage B: per-holder layout overrides delivered exactly\n  // like buildSwatchVisualStyle \u2014 element-scoped CSS vars, here on the option\n  // <section>, so they cascade into that holder's labels, buttons, and grids.\n  // The stylesheet resolves a three-level chain (per-holder --bg-option-*\n  // inline var \u2192 store-wide --storefront-* token \u2192 checked-in literal), so no\n  // emission (all defaults) is byte-identical to today.\n  function buildHolderLayoutStyle(holder) {\n    var ui = getHolderUiConfig(holder);\n    var declarations = [];\n    if (ui.optionPaddingPx > 0) {\n      declarations.push('--bg-option-padding:' + ui.optionPaddingPx + 'px');\n    }\n    if (ui.labelMarginPx !== null && ui.labelMarginPx >= 0) {\n      declarations.push('--bg-option-label-margin:' + ui.labelMarginPx + 'px');\n    }\n    if (ui.buttonMinWidthPx > 0) {\n      declarations.push('--bg-option-button-min-width:' + ui.buttonMinWidthPx + 'px');\n    }\n    if (ui.titleFontFamily) {\n      declarations.push('--bg-option-font:' + ui.titleFontFamily);\n    }\n    if (ui.titleFontWeight >= 100 && ui.titleFontWeight <= 900) {\n      declarations.push('--bg-option-title-weight:' + ui.titleFontWeight);\n    }\n    return declarations.length\n      ? ' style=\"' + escapeHtml(declarations.join(';')) + '\"'\n      : '';\n  }\n\n  function getOptionLabel(option) {\n    return text(option && (option.label || option.valueLabel));\n  }\n\n  function getMaybeFirstValue(value) {\n    if (Array.isArray(value)) {\n      return value.length ? value[0] : '';\n    }\n    return value;\n  }\n\n  function getOptionFlavorText(option) {\n    var flavorText = text(option && option.flavorText);\n    var normalized = flavorText.toLowerCase();\n    if (normalized === 'popular' || normalized === 'most popular' || normalized === 'recommended') {\n      return '';\n    }\n    return flavorText;\n  }\n\n  function getOptionBadges(option) {\n    var badges = (Array.isArray(option && option.swatchBadges) ? option.swatchBadges : []).map(text).filter(Boolean);\n    var flavorText = text(option && option.flavorText).toLowerCase();\n    if ((flavorText === 'popular' || flavorText === 'most popular') && badges.indexOf('Popular') === -1) {\n      badges.push('Popular');\n    }\n    if (flavorText === 'recommended' && badges.indexOf('Recommended') === -1) {\n      badges.push('Recommended');\n    }\n    return badges.filter(function (badge, index, source) {\n      return source.indexOf(badge) === index;\n    });\n  }\n\n  function getOptionPreviewUrl(option) {\n    return text(option && option.imageUrl);\n  }\n\n  // Context swatches: an option value may carry admin-authored picture\n  // overrides (contextImages), each keyed to ANOTHER holder's selected value\n  // with the same matching grammar as templatePickerUi.optionSourceRules.\n  // The first override whose optionValues hit a selected value wins; with no\n  // match the value keeps its default pictures. The value's own holder is\n  // excluded so an override can never match the choice it decorates.\n  function resolveOptionContextImageUrl(store, holder, option) {\n    var overrides = option && Array.isArray(option.contextImages) ? option.contextImages : [];\n    if (!overrides.length || !store || !Array.isArray(store.holders)) return '';\n    var ownHolderId = getHolderId(holder);\n    var selectedKeys = [];\n    store.holders.forEach(function (otherHolder) {\n      if (ownHolderId && getHolderId(otherHolder) === ownHolderId) return;\n      var selected = getSelectedOptionFromAllOptions(store, otherHolder);\n      if (!selected) return;\n      [selected.label, selected.valueLabel, selected.value, buildDisplayLabel(selected)].forEach(function (entry) {\n        var key = normalizeSearchValue(entry);\n        if (key && selectedKeys.indexOf(key) === -1) selectedKeys.push(key);\n      });\n    });\n    if (!selectedKeys.length) return '';\n    for (var index = 0; index < overrides.length; index += 1) {\n      var override = plainObject(overrides[index]) || {};\n      var imageUrl = text(override.imageUrl);\n      if (!imageUrl) continue;\n      var optionValues = normalizeStringList(override.optionValues).map(normalizeSearchValue).filter(Boolean);\n      if (!optionValues.length) continue;\n      var matched = optionValues.some(function (value) { return selectedKeys.indexOf(value) !== -1; });\n      if (matched) return imageUrl;\n    }\n    return '';\n  }\n\n  function getOptionPreviewUrlInContext(store, holder, option) {\n    return resolveOptionContextImageUrl(store, holder, option) || getOptionPreviewUrl(option);\n  }\n\n  function getOptionHexColor(option) {\n    return text(option && option.hexColor);\n  }\n\n  function getOptionPreviewStyle(option, preferHexColor, fillMode, contextImageUrl) {\n    var imageUrl = text(contextImageUrl) || getOptionPreviewUrl(option);\n    var hexColor = getOptionHexColor(option);\n    var backgroundSize = normalizeSwatchFillMode(fillMode);\n    if (hexColor && preferHexColor) {\n      return ' style=\"background-color:' + escapeHtml(hexColor) + ';background-image:none\"';\n    }\n    if (imageUrl) {\n      return ' style=\"background-image:url(' + escapeHtml(imageUrl) + ');background-size:' + escapeHtml(backgroundSize) + '\"';\n    }\n    if (hexColor) {\n      return ' style=\"background-color:' + escapeHtml(hexColor) + ';background-image:none\"';\n    }\n    return '';\n  }\n\n  function getOptionTooltip(option) {\n    return text(getMaybeFirstValue(option && option.tooltip));\n  }\n\n  function normalizeAddonKey(value) {\n    return text(value).toLowerCase();\n  }\n\n  function normalizeAddonType(value) {\n    var normalized = text(value).toLowerCase().replace(/[^a-z]/g, '');\n    if (normalized === 'flat') return 'flat';\n    if (normalized === 'quantitybased') return 'quantityBased';\n    return '';\n  }\n\n  function getPricingAddonConfig(store, addonKey) {\n    var cleanKey = normalizeAddonKey(addonKey);\n    if (!cleanKey) return null;\n    var addons = store && store.pricingData && store.pricingData.addons && typeof store.pricingData.addons === 'object'\n      ? store.pricingData.addons\n      : {};\n    var keys = Object.keys(addons);\n    for (var index = 0; index < keys.length; index += 1) {\n      if (normalizeAddonKey(keys[index]) === cleanKey) {\n        return addons[keys[index]] || null;\n      }\n    }\n    return null;\n  }\n\n  function getAddonKeyForOption(option) {\n    var targetingId = text(option && (option.targetingID || option.targetingId));\n    if (targetingId) return normalizeAddonKey(targetingId);\n    return '';\n  }\n\n  function buildAddonMetadataForOption(store, option, holder) {\n    var addonKey = getAddonKeyForOption(option);\n    var optionConfig = option && option.addonConfig && typeof option.addonConfig === 'object' ? option.addonConfig : null;\n    // Product Commerce options carry their own authored addonConfig; it\n    // outranks the baked master-pricing addons map so Admin edits control the\n    // page display. Legacy options (no addonConfig) keep the baked lookup.\n    var config = optionConfig || getPricingAddonConfig(store, addonKey);\n    var configType = config && typeof config.addonType === 'object'\n      ? config.addonType.name\n      : config && config.addonType;\n    var addonPrice = numberValue(config && config.pricing, NaN);\n    if (!Number.isFinite(addonPrice)) addonPrice = numberValue(option && option.addonPrice, NaN);\n    var includedOffer = getConfirmedChannelOffer(store);\n    if (holder && includedOffer && includedOffer.designIncluded && includedOffer.designServiceChoices.some(function (choice) {\n      return choice.holderId === getHolderId(holder) && choice.valueId === text(option && (option.hvId || option.hvid));\n    })) addonPrice = 0;\n    var addonType = normalizeAddonType(configType);\n    if (!addonType && (addonKey || Number.isFinite(addonPrice))) addonType = 'quantityBased';\n    if (!addonKey && !addonType && !Number.isFinite(addonPrice)) return null;\n    return {\n      addonKey: addonKey,\n      addonLabel: text(config && config.addonLabel),\n      addonName: text(config && config.addonName),\n      addonType: addonType,\n      addonBasePrice: Number.isFinite(addonPrice) ? addonPrice : null,\n      discountEligible: !!(config && config.discountEligible),\n      excludeFromCart: !!(config && config.excludeFromCart),\n      useTypedQuantity: !!(config && config.useTypedQuantity),\n      isPostage: !!(config && config.isPostage),\n      dontSayFree: !!(config && config.dontSayFree),\n      displayPriceInLabel: !!(config && config.displayPriceInLabel)\n    };\n  }\n\n  function stripAddonPriceSuffix(label) {\n    return text(label).replace(/\\s*\\(\\s*[+-]?\\s*\\$?\\d+(?:\\.\\d{1,2})?\\s*(?:each|ea)?\\s*\\)\\s*$/i, '').trim();\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE: the amount of one add-on, in the shopper's\n  // currency (presentmentFigure; the shop amount when the page does not convert).\n  function formatAddonLabelAmount(amount) {\n    var value = Math.abs(numberValue(presentmentFigure(numberValue(amount, 0)), 0));\n    if (Math.abs(value - Math.round(value)) < 0.005) return String(Math.round(value));\n    return value.toFixed(2);\n  }\n\n  function buildAddonPriceLabelMarkup(store, holder, option) {\n    if (!holder || !getHolderUiConfig(holder).isAddon) return '';\n    var addonMeta = buildAddonMetadataForOption(store, option, holder);\n    if (!addonMeta || addonMeta.displayPriceInLabel !== true) return '';\n    var addonPrice = numberValue(addonMeta.addonBasePrice, NaN);\n    if (!Number.isFinite(addonPrice) || Math.abs(addonPrice) < 0.01) return '';\n    var sign = addonPrice < 0 ? '-' : '+';\n    var original = sign + formatAddonLabelAmount(addonPrice);\n    if (addonMeta.discountEligible && addonPrice > 0) {\n      var discountedPrice = applyDisplayDiscount(addonPrice, getShownSalePercentage(store));\n      if (discountedPrice < addonPrice - 0.01) {\n        return ' <span class=\"bg-designer-storefront__addon-label-price\">' +\n          '<span class=\"bg-designer-storefront__addon-label-price-mark\">(</span>' +\n          '<s class=\"calc-qty-original-price\">' + escapeHtml(original) + '</s>' +\n          '<span class=\"calc-qty-sale-price\">' + escapeHtml(sign + formatAddonLabelAmount(discountedPrice)) + '</span>' +\n          '<span class=\"bg-designer-storefront__addon-label-price-mark\">)</span>' +\n        '</span>';\n      }\n    }\n    return ' <span class=\"bg-designer-storefront__addon-label-price\">' +\n      '<span class=\"bg-designer-storefront__addon-label-price-mark\">(</span>' +\n      '<span class=\"calc-qty-sale-price\">' + escapeHtml(original) + '</span>' +\n      '<span class=\"bg-designer-storefront__addon-label-price-mark\">)</span>' +\n    '</span>';\n  }\n\n  function getOptionDisplayLabel(store, holder, option) {\n    var label = getOptionLabel(option);\n    if (!holder || !getHolderUiConfig(holder).isAddon) return label;\n    var addonMeta = buildAddonMetadataForOption(store, option, holder);\n    return addonMeta && addonMeta.displayPriceInLabel === true ? stripAddonPriceSuffix(label) : label;\n  }\n\n  function getOptionEquivalenceLabel(store, holder, option) {\n    return getOptionDisplayLabel(store, holder, option).toLowerCase().replace(/\\s+/g, ' ').trim();\n  }\n\n  function findEquivalentVisibleOption(store, holder, previouslySelected, options) {\n    var previousLabel = getOptionEquivalenceLabel(store, holder, previouslySelected);\n    if (!previousLabel) return null;\n    var matches = (Array.isArray(options) ? options : []).filter(function (option) {\n      return getOptionEquivalenceLabel(store, holder, option) === previousLabel;\n    });\n    // A unique customer-facing match is a record migration, not a compatibility\n    // reset. Ambiguous labels retain the existing safe fallback and notice.\n    return matches.length === 1 ? matches[0] : null;\n  }\n\n  function getMobileOptionDisplayLabel(holder, valueLabel) {\n    var holderLabel = text(holder && holder.displayName).toLowerCase();\n    if (holderLabel !== 'sides' && holderLabel !== 'printed sides' && holderLabel !== 'printing') return valueLabel;\n    var normalized = text(valueLabel).toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n    if (normalized.indexOf('single') !== -1 && normalized.indexOf('side') !== -1) return 'Single-sided';\n    if (normalized.indexOf('double') !== -1 && normalized.indexOf('side') !== -1) {\n      if (normalized.indexOf('different') !== -1) return 'Double-sided \u2014 different designs';\n      if (normalized.indexOf('same') !== -1) return 'Double-sided \u2014 same design';\n    }\n    return valueLabel;\n  }\n\n  function buildResponsiveOptionLabelMarkup(holder, valueLabel) {\n    var mobileLabel = getMobileOptionDisplayLabel(holder, valueLabel);\n    if (mobileLabel === valueLabel) return escapeHtml(valueLabel);\n    return '<span class=\"bg-designer-storefront__option-label-desktop\">' + escapeHtml(valueLabel) + '</span>' +\n      '<span class=\"bg-designer-storefront__option-label-mobile\">' + escapeHtml(mobileLabel) + '</span>';\n  }\n\n  // Price chip for a non-add-on option tile. A charge the sale applies to shows\n  // its list price struck through so the tile itself tells the customer they are\n  // getting the discount; a credit keeps its face value, because declining\n  // hardware is not something that goes on sale.\n  function buildOptionPriceChipMarkup(store, holder, option) {\n    if (holder && (holder.hidePrice || getHolderUiConfig(holder).isAddon)) return '';\n    var addonMeta = buildAddonMetadataForOption(store, option, holder);\n    var addonPrice = numberValue(addonMeta && addonMeta.addonBasePrice, NaN);\n    if (!Number.isFinite(addonPrice) || Math.abs(addonPrice) < 0.01) return '';\n    var sign = addonPrice > 0 ? '+' : '-';\n    var suffix = addonMeta && addonMeta.addonType === 'flat' ? '' : ' each';\n    var listLabel = sign + core.formatMoney(Math.abs(addonPrice));\n    if (addonMeta && addonMeta.discountEligible && addonPrice > 0) {\n      var salePrice = applyDisplayDiscount(addonPrice, getShownSalePercentage(store));\n      if (salePrice < addonPrice - 0.005) {\n        return '<s class=\"calc-qty-original-price\">' + escapeHtml(listLabel) + '</s>' +\n          '<span class=\"calc-qty-sale-price\">' + escapeHtml(sign + core.formatMoney(salePrice)) + '</span>' +\n          escapeHtml(suffix);\n      }\n    }\n    return escapeHtml(listLabel + suffix);\n  }\n\n  function buildOptionPricePreviewStore(store, holder, option) {\n    if (!store || !holder || !option || isProductLinkHolder(holder)) return null;\n    var holderId = getHolderId(holder);\n    var optionId = text(option && option.hvId);\n    if (!holderId || !optionId) return null;\n    var previewStore = Object.assign({}, store);\n    previewStore.state = Object.assign({}, store.state || {}, {\n      selections: Object.assign({}, store && store.state && store.state.selections || {}),\n      apparelSizes: Object.assign({}, store && store.state && store.state.apparelSizes || {})\n    });\n    // EDDM-ROUTE-DELTAS-REFRESH: the preview gets its own route state, so\n    // pricing a non-route choice no longer clears the live route tool's\n    // origin, status or error (the artwork price projection does the same).\n    var liveEddm = store.state && store.state.eddm;\n    if (liveEddm && typeof liveEddm === 'object') previewStore.state.eddm = Object.assign({}, liveEddm);\n    previewStore.uiState = Object.assign({}, store.uiState || {});\n    previewStore.state.selections[holderId] = optionId;\n    recalculate(previewStore);\n    if (!text(previewStore.state && previewStore.state.finalSku)) return null;\n    return previewStore;\n  }\n\n  function getOptionPriceDifference(store, holder, option, isSelected) {\n    if (isSelected || !store || !holder || !option || holder.hidePrice || isProductLinkHolder(holder)) return null;\n    var currentPrice = getPricePresentation(store);\n    var previewStore = buildOptionPricePreviewStore(store, holder, option);\n    if (!previewStore) return null;\n    // EDDM-ROUTE-PENDING-HINTS: while the quantity waits for routes the\n    // current total prices the default quantity, so a difference against it\n    // is not shown (the reserved price line keeps its height).\n    // EDDM-ROUTE-OPTION-DELTA: the same holds for a choice that would take the\n    // quantity from routes before any are chosen: it is priced by routes.\n    if (isEddmRouteQuantityPending(store) || isEddmRouteQuantityPending(previewStore)) return { amount: 0, compareAmount: 0 };\n    // BD-NO-ROW-ZERO-PRICE: a difference compares two priced choices only.\n    if (showsNoPriceRow(store) || showsNoPriceRow(previewStore)) return null;\n    // FUNCTIONS-CURRENCY-AWARE: the difference of the two shown totals.\n    currentPrice = shownPrice(currentPrice);\n    var previewPrice = shownPrice(getPricePresentation(previewStore));\n    var currentTotal = numberValue(currentPrice && currentPrice.total, NaN);\n    var previewTotal = numberValue(previewPrice && previewPrice.total, NaN);\n    if (!Number.isFinite(currentTotal) || !Number.isFinite(previewTotal)) return null;\n    var amount = roundMoney(previewTotal - currentTotal);\n    if (Math.abs(amount) < 0.005) return { amount: 0, compareAmount: 0 };\n    var currentCompareTotal = numberValue(currentPrice && currentPrice.compareTotal, currentTotal);\n    var previewCompareTotal = numberValue(previewPrice && previewPrice.compareTotal, previewTotal);\n    return {\n      amount: amount,\n      compareAmount: roundMoney(previewCompareTotal - currentCompareTotal)\n    };\n  }\n\n  function formatOptionPriceDifference(amount) {\n    var value = roundMoney(numberValue(amount, 0));\n    if (Math.abs(value) < 0.005) return '';\n    return (value > 0 ? '+' : '\u2212') + formatShownMoney(Math.abs(value));\n  }\n\n  function buildOptionPriceDifferenceMarkup(store, holder, option, isSelected, difference) {\n    if (isSelected) return '';\n    var holderUi = getHolderUiConfig(holder);\n    var addonMeta = buildAddonMetadataForOption(store, option, holder);\n    if (holderUi.isAddon && addonMeta && addonMeta.displayPriceInLabel === true) return '';\n    if (!difference) return buildOptionPriceChipMarkup(store, holder, option);\n    if (Math.abs(numberValue(difference.amount, 0)) < 0.005) return '';\n    var displayLabel = formatOptionPriceDifference(difference.amount);\n    var directionClass = difference.amount > 0\n      ? ' bg-designer-storefront__option-price-delta--increase'\n      : ' bg-designer-storefront__option-price-delta--reduction';\n    return '<span class=\"bg-designer-storefront__option-price-delta' + directionClass + '\">' + escapeHtml(displayLabel) + '</span>';\n  }\n\n  function getOptionPriceDifferenceAriaSuffix(difference) {\n    if (!difference || Math.abs(numberValue(difference.amount, 0)) < 0.005) return '';\n    return ', ' + formatShownMoney(Math.abs(difference.amount)) + (difference.amount > 0 ? ' more' : ' less');\n  }\n\n  function getOptionDescription(option) {\n    var rawValue = getMaybeFirstValue(option && option.htmlDescription);\n    return typeof rawValue === 'string' ? rawValue.trim() : text(rawValue);\n  }\n\n  function getOptionDescriptionMeta(option) {\n    var brandLogoUrl = text(getMaybeFirstValue(option && option.brandLogoURL));\n    var labelInsideDescription = text(getMaybeFirstValue(option && option.labelInsideDescription));\n    var htmlDescription = getOptionDescription(option);\n    return {\n      htmlDescription: htmlDescription,\n      displayLogo: !!(option && option.displayLogo && brandLogoUrl),\n      brandLogoUrl: brandLogoUrl,\n      labelInsideDescription: labelInsideDescription,\n      hasContent: !!(htmlDescription || labelInsideDescription || (option && option.displayLogo && brandLogoUrl))\n    };\n  }\n\n  function renderOptionDescription(option, holderId, hidden) {\n    var meta = getOptionDescriptionMeta(option);\n    if (!meta.hasContent) return '';\n    var pieces = [];\n    if (meta.displayLogo) {\n      pieces.push(\n        '<div class=\"bg-designer-storefront__option-description-logo\">' +\n          '<img src=\"' + escapeHtml(meta.brandLogoUrl) + '\" alt=\"Brand logo\" loading=\"lazy\">' +\n        '</div>'\n      );\n    }\n    if (meta.labelInsideDescription) {\n      pieces.push(\n        '<div class=\"bg-designer-storefront__option-description-label\">' +\n          '<span>' + escapeHtml(meta.labelInsideDescription) + '</span>' +\n        '</div>'\n      );\n    }\n    if (meta.htmlDescription) {\n      pieces.push('<div class=\"bg-designer-storefront__option-description-content\">' + meta.htmlDescription + '</div>');\n    }\n    return '<div class=\"bg-designer-storefront__option-description\"' +\n      ' data-bg-option-description-holder=\"' + escapeHtml(text(holderId)) + '\"' +\n      ' data-bg-option-description-hvid=\"' + escapeHtml(text(option && option.hvId)) + '\"' +\n      (hidden ? ' aria-hidden=\"true\"' : '') + '>' + pieces.join('') + '</div>';\n  }\n\n  // BD-STYLE-DESCRIPTION-JUMP: the descriptions of every offered choice share\n  // one grid cell, so the box always takes the tallest one and a pick swaps\n  // the visible text without moving anything under it. Only the selected\n  // choice's description shows; the others hold the height, hidden from\n  // sight and from assistive technology. A selected choice without a\n  // description leaves the space empty. Nothing renders when no offered\n  // choice has a description.\n  function renderOptionDescriptions(holder, values, selected) {\n    var holderId = getHolderId(holder);\n    var selectedHvid = text(selected && selected.hvId);\n    var offered = Array.isArray(values) ? values.slice() : [];\n    if (selected && !offered.some(function (value) { return text(value && value.hvId) === selectedHvid; })) offered.push(selected);\n    var cards = offered.map(function (value) {\n      return renderOptionDescription(value, holderId, text(value && value.hvId) !== selectedHvid);\n    }).filter(Boolean);\n    if (!cards.length) return '';\n    return '<div class=\"bg-designer-storefront__option-descriptions\" data-bg-option-descriptions>' + cards.join('') + '</div>';\n  }\n\n  // A linked product's fixed choice (holder.fixedChoice) is one read-only line whatever its label position or template trigger.\n  function shouldRenderStaticOptionValue(store, holder, visibleValues, selected, semantics, showLabel, holderDisabled) {\n    if ((!showLabel && !(holder && holder.fixedChoice)) || holderDisabled || (semantics && semantics.forceInteractiveWhenSingle)) return false;\n    if (!selected || !Array.isArray(visibleValues) || visibleValues.length !== 1) return false;\n    var singleOptionDisplay = text(semantics && semantics.singleOptionDisplay).toLowerCase();\n    if (singleOptionDisplay === 'interactive' || singleOptionDisplay === 'button' || singleOptionDisplay === 'buttons' || singleOptionDisplay === 'swatch' || singleOptionDisplay === 'dropdown') return false;\n    if (!(holder && holder.fixedChoice) && isOptionTemplateTriggerValue(store, holder, selected)) return false;\n    if (!!(selected && selected.outOfStock) || isTargetingDisabled(store, selected && selected.targetingID)) return false;\n    return true;\n  }\n\n  function renderStaticOptionValue(store, holder, holderId, labelText, selected, priceChip) {\n    var valueLabel = selected ? getOptionDisplayLabel(store, holder, selected) : '';\n    var flavorText = selected ? getOptionFlavorText(selected) : '';\n    var labelSuffix = getProductFormPresentation(store) === 'guided' ? '' : ':';\n    return '' +\n      '<div class=\"bg-designer-storefront__static-option\" data-bg-holder-static-value=\"' + escapeHtml(holderId) + '\" data-bg-hvid=\"' + escapeHtml(text(selected && selected.hvId)) + '\">' +\n        '<span class=\"bg-designer-storefront__static-option-label\">' + escapeHtml(labelText + labelSuffix) + '</span>' +\n        '<span class=\"bg-designer-storefront__static-option-value\" data-full-label=\"' + escapeHtml(valueLabel) + '\">' +\n          escapeHtml(valueLabel) +\n          (flavorText ? '<span class=\"flavorText bg-designer-storefront__flavor-text\"> (' + escapeHtml(flavorText) + ')</span>' : '') +\n          buildAddonPriceLabelMarkup(store, holder, selected) +\n        '</span>' +\n        (priceChip ? '<span class=\"bg-designer-storefront__option-price bg-designer-storefront__static-option-price\">' + priceChip + '</span>' : '') +\n      '</div>';\n  }\n\n  function setDesignerOptionDropdownOpen(dropdown, open) {\n    if (!dropdown) return;\n    var panel = dropdown.querySelector('[data-bg-holder-dropdown-options]');\n    var toggle = dropdown.querySelector('[data-bg-holder-dropdown-toggle]');\n    dropdown.classList.toggle('is-open', !!open);\n    if (panel) panel.hidden = !open;\n    if (toggle) toggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n  }\n\n  function closeDesignerOptionDropdowns(scope, exceptDropdown) {\n    var root = scope || document;\n    Array.prototype.slice.call(root.querySelectorAll('[data-bg-holder-dropdown]')).forEach(function (dropdown) {\n      if (exceptDropdown && dropdown === exceptDropdown) return;\n      setDesignerOptionDropdownOpen(dropdown, false);\n    });\n  }\n\n  function ensureDesignerOptionDropdownDocumentListener() {\n    if (document.documentElement.dataset.bgDesignerOptionDropdownBound === '1') return;\n    document.documentElement.dataset.bgDesignerOptionDropdownBound = '1';\n    document.addEventListener('click', function () {\n      closeDesignerOptionDropdowns(document, null);\n    });\n    document.addEventListener('keydown', function (event) {\n      if (event && event.key === 'Escape') {\n        closeDesignerOptionDropdowns(document, null);\n      }\n    });\n  }\n\n  // The sale percent configured for this product (custom.product_discount\n  // through the host shell, or a discountNN tag). What the page may SHOW is\n  // getShownSalePercentage.\n  function readConfiguredSalePercentage(store) {\n    var directValue = numberValue(store && store.config && store.config.discountPercentage, NaN);\n    if (Number.isFinite(directValue) && directValue > 0) {\n      return Math.min(100, directValue);\n    }\n    var tags = Array.isArray(store && store.config && store.config.productTags)\n      ? store.config.productTags\n      : [];\n    for (var index = 0; index < tags.length; index += 1) {\n      var normalized = text(tags[index]).toLowerCase();\n      var match = normalized.match(/^discount(\\d{1,3})$/);\n      if (!match) continue;\n      return Math.min(100, Number(match[1]) || 0);\n    }\n    return 0;\n  }\n\n  // OD-122 (2026-10-05, owner answer \"a\"; BD-SALE-DISCOUNT-ROUNDING): the page\n  // shows a sale price only when it is certain of what checkout charges, and it\n  // never shows one below the charge. From the page it cannot be certain today:\n  // Shopify's own tier sale truncates its percentage (156.46 at 15 percent is\n  // charged 133.00, not 132.99), the store's credit sale Function and the tier\n  // sale compete for the whole cart, so another cart item can decide which one\n  // applies to this item, a discount code entered later can replace the sale,\n  // and paid extras the page keeps at full price are discounted at checkout.\n  // So wherever a sale applies the page shows the price before discounts with\n  // SALE_PENDING_NOTE, and no sale badge, crossed-out price or savings. The\n  // verified case is the store-owned designer sale (OD-113, its own slice): its\n  // host shell will set config.verifiedSaleOwner for a product whose sale the\n  // store's own Function prices on the page's base. Nothing sets it today.\n  // That slice also owns the Studio: its prices stay before discounts and its\n  // sentence follows this page's (buildEditorContext salePending).\n  function canShowExactSalePrice(store) {\n    return !!(store && store.config && store.config.verifiedSaleOwner === true);\n  }\n\n  function getShownSalePercentage(store) {\n    return canShowExactSalePrice(store) ? readConfiguredSalePercentage(store) : 0;\n  }\n\n  // SALE-DISPLAY-STRIKETHROUGH (owner, 2026-10-08: the sale badge, the\n  // crossed-out price and the price after discount come back; never below\n  // what checkout charges). The store's tier sale is a Shopify percentage\n  // discount on the collection whose rule is this product's own\n  // custom.product_discount, without the lead-product tag; the host shell\n  // passes that number as config.tierSalePercentage (never from a tag or from\n  // the config source product, which no tier sale reads). Shopify takes the\n  // percent off each unit of the whole cart line and drops the part cent:\n  // per unit, discount = floor(unit cents x N / 100) (THEME-REL-7 R5, 156.46 at\n  // 15 percent charged 133.00 / 133.00 / 132.99 / 133.00 / 132.96 at Shopify\n  // quantity 1 / 2 / 3 / 4 / 12). So the page shows that figure on the whole\n  // line it builds (add-ons, size surcharges, artwork fees and credits are on\n  // the line), crossed out against the line before discounts, at the Shopify\n  // quantity the page submits (PAGE_TIER_SALE_SHOPIFY_QUANTITY). A line the store\n  // credit sale wins instead is charged less; another cart line or a code can\n  // change which discount wins the cart, and the cart page shows Shopify's own\n  // amounts (hand-off SALE-DISPLAY-STRIKETHROUGH, cases C2 to C4). The verified\n  // sale owner (OD-113) keeps its own arithmetic.\n  function readTierSalePercentage(store) {\n    var pct = Number(store && store.config && store.config.tierSalePercentage);\n    return Number.isInteger(pct) && pct > 0 && pct < 100 ? pct : 0;\n  }\n\n  function getTierSalePercentage(store) {\n    return canShowExactSalePrice(store) ? 0 : readTierSalePercentage(store);\n  }\n\n  // The percent a sale badge and its price pair may claim: the verified owner's\n  // or the tier sale's.\n  function getClaimedSalePercentage(store) {\n    return getShownSalePercentage(store) || getTierSalePercentage(store);\n  }\n\n  // Shopify's tier sale on a line of lineCents at Shopify quantity q: the unit\n  // is the line split down over its quantity (the Cart Transform's unit), each\n  // unit loses floor(unit x N / 100) cents. Integer cents only.\n  //\n  // SALE-DISPLAY-PER-UNIT-ROUNDING (incident SALE-DISPLAY-ACTIVATE-B, WCR\n  // 2026-10-09): every figure prices its line at the Shopify quantity it is\n  // charged at. A print quantity line is one Cart Transform unit as the page\n  // submits it: the product form posts no quantity field\n  // (sections/main-product-designer-storefront.liquid, snippets/buy-buttons.liquid),\n  // and Update cart item resubmits a print line at 1. A channel package is one\n  // Cart Transform unit at any set count, and an edit keeps the sets the line\n  // holds (core.resolveDesignerLineSubmitQuantity, the rule\n  // core.updateDesignerCartLine submits): the page's line totals are those sets\n  // times one package (getRetainedSetCount); its quantity rows stay per package.\n  // A line held in the cart at another Shopify quantity is quoted there by the\n  // cart (bg-designer-storefront-cart.js readPreviewSplitQuantity): the 1000 row\n  // (591.75) is 502.99 at 1, the page's line, and 503.01 at 3.\n  var PAGE_TIER_SALE_SHOPIFY_QUANTITY = 1;\n\n  // Fix round 1 (Astra 1, review of #690): the sets an edit of a channel package\n  // keeps, by the updater's own rule; 1 for a new add and every other line.\n  // Fix round 2 (Fable B, review of #690): guarded like the runtime's other\n  // exports newer than the live core; an older loaded core (before revision\n  // 20261009-1, when this fallback goes dead) gets the same decision in place.\n  function getRetainedSetCount(store) {\n    if (!store || !store.editingLineKey) return 1;\n    var state = { channelOffer: store.state && store.state.channelOffer };\n    var line = { quantity: store.editingLineQuantity, sku: store.editingLineSku };\n    if (typeof core.resolveDesignerLineSubmitQuantity === 'function') return core.resolveDesignerLineSubmitQuantity(state, line);\n    return core.normalizeChannelOfferOrigin(state.channelOffer) || /^BGCO_[a-f0-9]{32}$/.test(text(line.sku))\n      ? Math.max(1, Number(line.quantity) || 1)\n      : 1;\n  }\n\n  function tierSaleLineCents(lineCents, pct, quantity) {\n    var cents = Math.round(Number(lineCents));\n    var rate = Math.round(Number(pct));\n    var count = Math.max(1, Math.floor(Number(quantity) || 1));\n    if (!Number.isSafeInteger(cents) || cents <= 0 || !(rate > 0) || rate >= 100) return cents;\n    var unit = Math.floor(cents / count);\n    var cut = unit * rate;\n    return count * (unit - ((cut - (cut % 100)) / 100));\n  }\n\n  function tierSaleAmount(amount, pct, quantity) {\n    var cents = Math.round(numberValue(amount, 0) * 100);\n    return tierSaleLineCents(cents, pct, quantity) / 100;\n  }\n\n  // A per-piece share of a total after the tier sale, rounded UP to the cent,\n  // so it never understates the charged total (85.00 for 14 pieces is 6.08 a\n  // piece, never 6.07).\n  function tierSalePerPiece(saleTotal, pieces) {\n    var cents = Math.round(numberValue(saleTotal, 0) * 100);\n    var count = Math.max(1, Math.floor(numberValue(pieces, 1)) || 1);\n    return Math.ceil(cents / count - 1e-7) / 100;\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE (2026-10-12): the page's figures in the shopper's\n  // currency. Every price the page computes is a shop amount. The Cart\n  // Transform charges a line in the shopper's currency by converting the\n  // line's whole shop cents (core.presentmentCentsOf, the Functions' rule) and\n  // only then splitting it down over the line's Shopify quantity, and Shopify's\n  // tier sale floors each converted unit. So a figure the page derives from a\n  // line (the line after the tier sale, a set-count package line, the savings,\n  // a per piece) is derived again from the converted line, never converted from\n  // the shop figure: the 15 percent sale of 474.25 is 403.12, which converts to\n  // CA$584.37, but the sale of the converted CA$687.48 is CA$584.36. A\n  // presentation keeps its shop figures (the cart state, the signed quote and\n  // every check read them); shownPrice(presentation) is the copy the page\n  // shows, formatted with formatShownMoney. When the page does not convert\n  // (the shop currency, no Shopify.currency, an older core) the copy is the\n  // presentation itself and every text is today's.\n  var SHOWN_PRICE_FIGURES = ['total', 'compareTotal', 'savings', 'quantityTotal', 'quantityCompareTotal', 'currentPerPiece',\n    'comparePerPiece', 'productTotal', 'designFeeTotal', 'grandTotal', 'productPerPiece', 'printMailingTotal',\n    'printMailingCompareTotal', 'postageTotal', 'postagePerPiece'];\n\n  function isPageConvertingCurrency() {\n    return typeof core.isPresentmentConverting === 'function' && core.isPresentmentConverting();\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE: the Intent First total is right-aligned, so a\n  // figure with other digits moved its box (CA$192.80 -> CA$91.33 moved it\n  // 25 px at 402x874). On a page that converts, the total and its crossed-out\n  // price keep the width of the longest figure they may show: the largest\n  // offered quantity's and every figure shown so far, kept in\n  // data-bg-price-reserve, which the stylesheet draws as a hidden line under\n  // the figure. Its digits are zeros, the widest digit of the price font\n  // (Montserrat's digits are proportional, 1 is half the width of 0), so no\n  // figure of that length is wider than the reserve.\n  // A page in the shop currency never gets the attribute: today's page.\n  function reserveShownPriceWidth(node, figures) {\n    if (!node) return;\n    var reserve = text(node.getAttribute('data-bg-price-reserve'));\n    figures.forEach(function (figure) {\n      var candidate = text(figure).replace(/[0-9]/g, '0');\n      if (candidate.length > reserve.length) reserve = candidate;\n    });\n    if (reserve && node.getAttribute('data-bg-price-reserve') !== reserve) node.setAttribute('data-bg-price-reserve', reserve);\n  }\n\n  // The shown figures of the largest quantity the page offers (its quantity\n  // options), the longest total the price box may show; null without options.\n  function getLargestOfferedShownPrice(store) {\n    var context = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    var largest = (Array.isArray(context && context.quantityOptions) ? context.quantityOptions : []).reduce(function (max, value) {\n      var quantity = Number(value);\n      return Number.isFinite(quantity) && quantity > max ? quantity : max;\n    }, 0);\n    return largest > 0 ? shownPrice(getPricePresentationForQuantity(store, largest)) : null;\n  }\n\n  // A page line in the shopper's cents. unitShopCents is what the Cart\n  // Transform charges as one unit at the Shopify quantity the page submits: the\n  // whole print line (at Shopify quantity 1) or one package of a set-count line.\n  // That unit is converted whole (the Transform's unit, P(unit)), the tier sale\n  // takes its floor off it (pct 0: no sale), and a set-count line is its sets x\n  // that unit, as Shopify charges any product line.\n  function shownSaleLine(unitShopCents, pct, sets) {\n    var count = Math.max(1, Math.floor(Number(sets) || 1));\n    var unitCents = core.presentmentCentsOf(unitShopCents);\n    var afterCents = tierSaleLineCents(unitCents, pct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n    return { unitCents: unitCents, afterCents: afterCents, compareCents: count * unitCents, totalCents: count * afterCents };\n  }\n\n  // Attaches the shown copy: every figure converted as the amount of one thing,\n  // then the line figures the builder derives again from its converted line\n  // (deriveLineFigures(shown)).\n  function attachShownPrice(presentation, deriveLineFigures) {\n    if (!presentation || !isPageConvertingCurrency()) return presentation;\n    var shown = {};\n    Object.keys(presentation).forEach(function (key) { shown[key] = presentation[key]; });\n    SHOWN_PRICE_FIGURES.forEach(function (key) {\n      if (typeof presentation[key] === 'number' && Number.isFinite(presentation[key])) shown[key] = core.presentmentAmount(presentation[key]);\n    });\n    if (typeof deriveLineFigures === 'function') deriveLineFigures(shown);\n    shown.shownInPresentment = true;\n    presentation.shown = shown;\n    return presentation;\n  }\n\n  // The shown copy of a presentation (itself when it is one already, or when\n  // the page does not convert).\n  function shownPrice(presentation) {\n    if (!presentation || presentation.shownInPresentment || !isPageConvertingCurrency()) return presentation;\n    return presentation.shown || attachShownPrice(presentation).shown;\n  }\n\n  // A shop amount of one thing (postage, a fee) beside shownPrice figures.\n  function presentmentFigure(amount) {\n    return isPageConvertingCurrency() ? core.presentmentAmount(amount) : amount;\n  }\n\n  // A figure of shownPrice: already in the shopper's currency.\n  function formatShownMoney(amount) {\n    return typeof core.formatPresentmentMoney === 'function' ? core.formatPresentmentMoney(amount) : core.formatMoney(amount);\n  }\n\n  var SALE_PENDING_NOTE = 'Price before discounts. Final discounts are calculated at checkout.';\n\n  // The page's sentence rule: a sale is configured (a tag or another product's\n  // number counts) but neither the tier sale nor a verified owner prices this\n  // product. The Studio launch flag (buildEditorContext, STUDIO-SALE-SENTENCE)\n  // reads this rule itself, so they can never disagree.\n  function getSalePendingNote(store) {\n    return readConfiguredSalePercentage(store) > 0 && !canShowExactSalePrice(store) && !getTierSalePercentage(store) ? SALE_PENDING_NOTE : '';\n  }\n\n  // One qualifier per layout, beside its primary price: the guided price box\n  // (and its phone line), the Version 2 hero or the intent-first hero carry it;\n  // the summary card says it only on the standard layout, which has none of\n  // those. Decided by the layout (the summary renders before the heroes).\n  function getSummarySalePendingNote(store) {\n    return getProductFormPresentation(store) === 'legacy' ? getSalePendingNote(store) : '';\n  }\n\n  // The qualifier is a status message for assistive technology (role status),\n  // set only while it shows, so a savings line keeps its plain semantics.\n  function syncSalePendingRole(node, pending) {\n    if (!node) return;\n    if (pending) node.setAttribute('role', 'status');\n    else if (node.getAttribute('role') === 'status') node.removeAttribute('role');\n  }\n\n  function applyDisplayDiscount(amount, discountPct) {\n    var raw = roundMoney(numberValue(amount, 0));\n    var pct = Math.min(100, Math.max(0, numberValue(discountPct, 0)));\n    if (pct <= 0 || raw <= 0) return raw;\n    if (pct >= 100) return 0;\n    return roundMoney(raw * (1 - (pct / 100)));\n  }\n\n  function getDiscountBadgeText(store) {\n    // The tier sale's badge names the tier's own percent: a configured text\n    // may come from a tag or the config source product (a number checkout\n    // does not apply here).\n    var tierPct = getTierSalePercentage(store);\n    if (tierPct > 0) return String(tierPct) + '% Off Sale';\n    var configured = text(store && store.config && store.config.discountBadgeText);\n    if (configured) return configured;\n    var discountPct = getShownSalePercentage(store);\n    if (discountPct > 0) return String(discountPct) + '% Off Sale';\n    if (!!(store && store.config && store.config.hasUnbeatablePrice) || hasConfiguredProductTag(store, 'unbeatable-price')) {\n      return 'Unbeatable Price';\n    }\n    return '';\n  }\n\n  // SB-18 (2026-09-25): the sale badge a page shows beside a price must agree\n  // with the two prices shown. Rule, defined once and used by the page badge,\n  // the phone footer and the Version 2 savings line: both shown prices become\n  // whole cents; a crossed-out price shows only when its cents exceed the\n  // sale price's cents (hasShownComparePrice, used by the badge, the phone\n  // footer, the guided mobile and guided overviews, the Version 2 and Intent\n  // First heroes, buildSummaryMoneyMarkup and the EDDM route overlay; the\n  // other price labels (deal, artwork, option and add-on labels, add-on rows,\n  // the quantity table) keep their own thresholds);\n  // the shown ratio is Math.round(100 x savedCents / crossedOutCents) and a\n  // percent claim shows only when it equals the configured percent rounded\n  // the same way. $100.00 to $85.50 is exactly 14.5%, which rounds to 15%. A\n  // non-discountable part (a flat size surcharge, a held-out credit) that\n  // moves the shown ratio off the sale percent hides the claim (\"if the\n  // numbers do not match, show no badge\"), and so does a page with no shown\n  // price pair yet (no price, or nothing crossed out). A badge with no\n  // percent (\"Unbeatable Price\") has no number to agree with and shows as\n  // configured.\n  function toMoneyCents(value) {\n    var amount = numberValue(value, NaN);\n    return Number.isFinite(amount) ? Math.round(amount * 100) : NaN;\n  }\n\n  function hasShownComparePrice(compareAmount, currentAmount) {\n    return toMoneyCents(compareAmount) > toMoneyCents(currentAmount);\n  }\n\n  function shownPricesMatchDiscountPercent(presentation, discountPct) {\n    if (!(discountPct > 0)) return false;\n    var totalCents = toMoneyCents(presentation && presentation.total);\n    var compareCents = toMoneyCents(presentation && presentation.compareTotal);\n    if (!(totalCents > 0) || !(compareCents > totalCents)) return false;\n    return Math.round((100 * (compareCents - totalCents)) / compareCents) === Math.round(discountPct);\n  }\n\n  function getShownDiscountBadgeText(store, presentation) {\n    // OD-122: no sale claim while the checkout sale is not certain; the\n    // Unbeatable Price label is not a discount and stays.\n    if (getSalePendingNote(store)) {\n      return !!(store && store.config && store.config.hasUnbeatablePrice) || hasConfiguredProductTag(store, 'unbeatable-price') ? 'Unbeatable Price' : '';\n    }\n    var label = getDiscountBadgeText(store);\n    if (!label) return '';\n    var discountPct = getClaimedSalePercentage(store);\n    if (!(discountPct > 0)) return label;\n    // SALE-DISPLAY-STRIKETHROUGH: the tier sale's badge is in the first paint\n    // (main-product-designer-storefront.liquid); until the page has a price it\n    // stays, so it never blinks out and back while the page boots.\n    if (getTierSalePercentage(store) > 0 && !(toMoneyCents(presentation && presentation.total) > 0)) return label;\n    return shownPricesMatchDiscountPercent(presentation, discountPct) ? label : '';\n  }\n\n  function renderDiscountBadge(store) {\n    var productInfo = store && store.root ? store.root.closest('product-info') : null;\n    var badge = productInfo ? productInfo.querySelector('[data-bg-designer-discount-badge]') : null;\n    if (!badge) return;\n    var label = getShownDiscountBadgeText(store, shownPrice(getPricePresentation(store)));\n    if (!label) {\n      badge.hidden = true;\n      badge.textContent = '';\n      badge.style.display = 'none';\n      badge.classList.remove('productDiscountBadge--unbeatable');\n      return;\n    }\n    badge.textContent = label;\n    badge.style.display = '';\n    badge.hidden = false;\n    badge.classList.toggle('productDiscountBadge--unbeatable', label === 'Unbeatable Price');\n  }\n\n  function hasConfiguredProductTag(store, targetTag) {\n    var normalizedTarget = text(targetTag).toLowerCase();\n    if (!normalizedTarget) return false;\n    var tags = Array.isArray(store && store.config && store.config.productTags)\n      ? store.config.productTags\n      : [];\n    return tags.some(function (tag) {\n      return text(tag).toLowerCase() === normalizedTarget;\n    });\n  }\n\n  function getPricePresentation(store) {\n    var channelPrice = buildChannelPricePresentation(store, undefined, getRetainedSetCount(store));\n    if (channelPrice) return channelPrice;\n    var quantityContext = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    var quantity = Math.max(1, Number(quantityContext.displayQuantity || 0));\n    var splitPrice = getSplitPriceForContext(store, quantityContext);\n    var discountPct = getShownSalePercentage(store);\n    var optionAddOns = splitPrice.optionAddOns || {};\n    var sizeSurchargeTotal = getSizeSurchargeSummaryAmount(store);\n    var discountableProductTotal = roundMoney(splitPrice.productBaseTotal + numberValue(optionAddOns.cartIncludedDiscountEligibleTotal, 0));\n    // The size surcharge rides OUTSIDE the discountable bucket by policy: the\n    // signed lane (cart-transform-signing) adds sizeSurchargeTotal FLAT after the\n    // product discount, so the displayed subtotal must add it flat too or a\n    // sale-priced apparel page would show a total checkout never charges.\n    var nonDiscountableProductTotal = roundMoney(numberValue(optionAddOns.cartIncludedNonDiscountEligibleTotal, 0) + sizeSurchargeTotal);\n    var displayProductTotal = roundMoney(applyDisplayDiscount(discountableProductTotal, discountPct) + nonDiscountableProductTotal);\n    // The Quantity block price is the whole configured piece \u2014 base and add-ons\n    // with the sale applied, plus the flat size surcharge \u2014 and matches the\n    // signed retail composed by cart-transform-signing.\n    var productOnlyPreDiscountTotal = roundMoney(discountableProductTotal + nonDiscountableProductTotal);\n    var productOnlyDisplayTotal = displayProductTotal;\n    var displayDesignFeeTotal = applyDisplayDiscount(splitPrice.designFeeTotal, discountPct);\n    var total = roundMoney(displayProductTotal + displayDesignFeeTotal);\n    var rawProductTotal = roundMoney(splitPrice.productTotal + sizeSurchargeTotal);\n    var rawGrandTotal = roundMoney(splitPrice.grandTotal + sizeSurchargeTotal);\n    // SB-18 (2026-09-25): the crossed-out price is the product sale's own\n    // pre-discount total. A free add-on (the edit service's struck \"$60.00\n    // Free\" row) keeps that deal on its own row and never lifts the\n    // crossed-out price, so the crossed-out price, the sale price and the\n    // sale badge (getShownDiscountBadgeText) always agree. Display only: the\n    // signed lane, the cart transform and the order-time price check never\n    // read compareTotal.\n    var compareTotal = discountPct > 0 ? rawGrandTotal : total;\n    // SALE-DISPLAY-STRIKETHROUGH: the tier sale is taken off the whole line\n    // the page builds (total here, with no other sale applied, is that line in\n    // cents) at the Shopify quantity the page submits\n    // (PAGE_TIER_SALE_SHOPIFY_QUANTITY), as checkout takes it; the parts stay\n    // before discounts. The quantity block's own figure (the piece without\n    // the artwork fee) is its own amount under the same rule.\n    var tierPct = getTierSalePercentage(store);\n    if (tierPct > 0) {\n      compareTotal = total;\n      total = tierSaleAmount(total, tierPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n      productOnlyPreDiscountTotal = productOnlyDisplayTotal;\n      productOnlyDisplayTotal = tierSaleAmount(productOnlyDisplayTotal, tierPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n    }\n    var hasSale = discountPct > 0 || tierPct > 0;\n    var savings = roundMoney(compareTotal - total);\n    return attachShownPrice({\n      quantity: quantity,\n      total: total,\n      compareTotal: compareTotal,\n      quantityTotal: productOnlyDisplayTotal,\n      quantityCompareTotal: hasSale ? productOnlyPreDiscountTotal : productOnlyDisplayTotal,\n      savings: savings,\n      discountPct: discountPct,\n      currentPerPiece: quantity > 0 ? (tierPct > 0 ? tierSalePerPiece(productOnlyDisplayTotal, quantity) : roundMoney(productOnlyDisplayTotal / quantity)) : productOnlyDisplayTotal,\n      comparePerPiece: quantity > 0 ? roundMoney((hasSale ? productOnlyPreDiscountTotal : productOnlyDisplayTotal) / quantity) : (hasSale ? productOnlyPreDiscountTotal : productOnlyDisplayTotal),\n      productTotal: displayProductTotal,\n      designFeeTotal: displayDesignFeeTotal,\n      grandTotal: total,\n      rawProductTotal: rawProductTotal,\n      rawDesignFeeTotal: splitPrice.designFeeTotal,\n      rawGrandTotal: rawGrandTotal,\n      productPerPiece: quantity > 0 ? roundMoney(displayProductTotal / quantity) : displayProductTotal,\n      rawProductPerPiece: quantity > 0 ? roundMoney(rawProductTotal / quantity) : rawProductTotal,\n      finalSku: splitPrice.finalSku,\n      hasUnbeatablePrice: !!(store && store.config && store.config.hasUnbeatablePrice) || hasConfiguredProductTag(store, 'unbeatable-price'),\n      hasFreeShipping: !!(store && store.config && store.config.hasFreeShipping) || hasConfiguredProductTag(store, 'free-shipping')\n    }, function (shown) {\n      // FUNCTIONS-CURRENCY-AWARE: the page's line is charged at Shopify\n      // quantity 1; under the tier sale the line and the quantity block's own\n      // amount are converted before the sale takes its floor.\n      if (tierPct > 0) {\n        var line = shownSaleLine(toMoneyCents(compareTotal), tierPct, 1);\n        var piece = shownSaleLine(toMoneyCents(productOnlyPreDiscountTotal), tierPct, 1);\n        shown.total = shown.grandTotal = line.totalCents / 100;\n        shown.compareTotal = line.compareCents / 100;\n        shown.quantityTotal = piece.totalCents / 100;\n        shown.quantityCompareTotal = piece.compareCents / 100;\n      }\n      shown.savings = roundMoney(shown.compareTotal - shown.total);\n      shown.currentPerPiece = quantity > 0 ? (tierPct > 0 ? tierSalePerPiece(shown.quantityTotal, quantity) : roundMoney(shown.quantityTotal / quantity)) : shown.quantityTotal;\n      shown.comparePerPiece = quantity > 0 ? roundMoney(shown.quantityCompareTotal / quantity) : shown.quantityCompareTotal;\n    });\n  }\n\n  function normalizeProductFormPresentation(value) {\n    var normalized = text(value).toLowerCase();\n    if (normalized === 'guided') return 'guided';\n    // \"Guided. No accordions\" is a guided VARIANT, not a sixth mode: it\n    // resolves to the guided presentation (same attribute, CSS, and tests)\n    // and isGuidedNoAccordionsLayout() carries the always-expanded flag.\n    if (normalized === 'guided_no_accordions' || normalized === 'guided_desktop_open_mobile_closed') return 'guided';\n    if (normalized === 'version_2') return 'version_2';\n    if (normalized === 'intent_first') return 'intent_first';\n    return 'legacy';\n  }\n\n  // OD-097 (2026-09-16): Intent First is the only alternative presentation;\n  // the live_sign and design_first prototypes are retired (their stored\n  // values read as guided in @qps/designer-settings).\n  function isPrototypeProductFormPresentation(value) {\n    var normalized = text(value).toLowerCase();\n    return normalized === 'intent_first';\n  }\n\n  function isKnownProductFormPresentation(value) {\n    var normalized = text(value).toLowerCase();\n    return normalized === 'legacy' || normalized === 'guided' || normalized === 'guided_no_accordions' || normalized === 'guided_desktop_open_mobile_closed' ||\n      normalized === 'version_2' || isPrototypeProductFormPresentation(normalized);\n  }\n\n  function readProductPresentationConfig(store) {\n    var configured = store && store.config && plainObject(store.config.productPresentationConfig);\n    if (configured && Object.keys(configured).length) return configured;\n    var productData = plainObject(store && store.productEditorConfigProductData);\n    var pageConfig = plainObject(productData && productData.productPageConfig);\n    return plainObject(pageConfig && pageConfig.presentation) || {};\n  }\n\n  // WO-05 server carrier seed: the section config JSON mirrors the\n  // Admin-authored presentation layout (product metafield\n  // qps_internal.storefront_presentation_layout) so the pre-fetch sync\n  // phase resolves the same mode the server stamped instead of reverting to\n  // the inherited default until the config payload lands. The seed applies\n  // ONLY while the product-editor-config product data has not loaded; after\n  // the fetch the payload is the sole layout truth (a cleared Admin layout\n  // must clear the mode even while the metafield mirror is still\n  // propagating).\n  function readServerPresentationLayoutSeed(store) {\n    if (store && store.productEditorConfigProductData) return '';\n    return text(store && store.config && store.config.productPresentationLayout).toLowerCase();\n  }\n\n  // Product page shell (desktop width preset / full width): the Admin-authored\n  // presentation.desktop.* controls land as attributes on <product-info> so\n  // the owning stylesheet (bg-designer-storefront-page-shell.css) lays the\n  // section out. Every page layout type consumes them. Before the\n  // product-editor-config fetch the section's server seed (config JSON\n  // productPageShell, mirrored from the qps_internal.storefront_page_shell\n  // metafield) applies; after it the payload is the sole truth, so a cleared\n  // Admin setting clears the attribute even while the mirror still propagates.\n  var PRODUCT_PAGE_DESKTOP_MEDIA_SPLITS = ['50_50', '60_40', '70_30', '30_70', '40_60'];\n\n  function readServerPageShellSeed(store) {\n    if (store && store.productEditorConfigProductData) return {};\n    return plainObject(store && store.config && store.config.productPageShell) || {};\n  }\n\n  function normalizeDesktopMediaSplit(value) {\n    var key = text(value).toLowerCase().replace(/[-\\/]/g, '_');\n    return PRODUCT_PAGE_DESKTOP_MEDIA_SPLITS.indexOf(key) === -1 ? '' : key.replace('_', '-');\n  }\n\n  // SF-1 / SF-13 (2026-09-13): two bounded pixel widths ride the shell \u2014\n  // presentation.desktop.formMaxWidth (240-2400) and\n  // presentation.desktop.thumbnailMaxWidth (40-600); null / absent / out of\n  // range means \"no cap\" and stamps nothing.\n  function normalizePageShellPixels(value, min, max) {\n    if (value === null || value === undefined || value === '') return 0;\n    var pixels = Math.round(numberValue(value, 0));\n    return Number.isFinite(pixels) && pixels >= min && pixels <= max ? pixels : 0;\n  }\n\n  function resolveProductPageShell(store) {\n    var presentation = readProductPresentationConfig(store);\n    var desktop = plainObject(presentation.desktop) || {};\n    var seed = readServerPageShellSeed(store);\n    var payloadLoaded = !!(store && store.productEditorConfigProductData);\n    return {\n      desktopMediaSplit: normalizeDesktopMediaSplit(desktop.mediaSplit)\n        || (payloadLoaded ? '' : normalizeDesktopMediaSplit(seed.desktopMediaSplit)),\n      desktopFullWidth: desktop.fullWidth === true\n        || (!payloadLoaded && desktop.fullWidth !== false && seed.desktopFullWidth === true),\n      formMaxWidth: normalizePageShellPixels(desktop.formMaxWidth, 320, 3000)\n        || (payloadLoaded ? 0 : normalizePageShellPixels(seed.desktopFormMaxWidth, 320, 3000)),\n      thumbnailMaxWidth: normalizePageShellPixels(desktop.thumbnailMaxWidth, 40, 800)\n        || (payloadLoaded ? 0 : normalizePageShellPixels(seed.desktopThumbnailMaxWidth, 40, 800))\n    };\n  }\n\n  function syncProductPageShellPixelAttribute(target, attribute, property, pixels) {\n    if (pixels > 0) {\n      target.setAttribute(attribute, String(pixels));\n      try { target.style.setProperty(property, pixels + 'px'); } catch (_) { /* inline style unavailable */ }\n      return;\n    }\n    target.removeAttribute(attribute);\n    try { target.style.removeProperty(property); } catch (_) { /* inline style unavailable */ }\n  }\n\n  function syncProductPageShellAttributes(store, productInfo) {\n    var target = productInfo || (store && store.root && store.root.closest('product-info'));\n    if (!target) return;\n    var shell = resolveProductPageShell(store);\n    if (shell.desktopMediaSplit) target.setAttribute('data-bg-desktop-media-split', shell.desktopMediaSplit);\n    else target.removeAttribute('data-bg-desktop-media-split');\n    if (shell.desktopFullWidth) target.setAttribute('data-bg-desktop-full-width', 'true');\n    else target.removeAttribute('data-bg-desktop-full-width');\n    syncProductPageShellPixelAttribute(target, 'data-bg-form-max-width', '--bg-page-shell-form-max', shell.formMaxWidth);\n    syncProductPageShellPixelAttribute(target, 'data-bg-thumbnail-max-width', '--bg-page-shell-thumb-max', shell.thumbnailMaxWidth);\n  }\n\n  // ===== Phone experiences (2026-09-09). Quick Build and App mode are modifiers on the Intent First page for phones.\n  // Both show the page's 3D preview when it has one, else the module's flat picture of the design or product photo\n  // (APP-MODE-S1, OD-379; Quick Build since QUICK-BUILD-2D, OD-393). This runtime stays the only owner of options,\n  // pricing, artwork and the cart: the experience module (bg-designer-storefront-mobile-experience.js + .css, loaded on\n  // demand on phones only) re-lays out the existing DOM and drives every change through the bounded adapter below. A\n  // missing asset, a failed load, a desktop viewport, App mode on a short phone, or any other page type leaves today's\n  // page untouched. Nothing here is product-specific: the experience is the product's presentation.mobileExperience setting (page shell metafield seed before the payload lands, payload truth after). =====\n  var PRODUCT_PAGE_MOBILE_EXPERIENCES = ['quick_build', 'app_shell'];\n  var MOBILE_EXPERIENCE_PHONE_QUERY = '(max-width: 749px)';\n  // App mode owner decision: phones shorter than this keep today's page.\n  var MOBILE_EXPERIENCE_APP_SHELL_MIN_HEIGHT = 640;\n  var MOBILE_EXPERIENCE_STANDARD_SESSION_KEY = 'bg-mobile-experience-standard-v1';\n  function normalizeMobileExperience(value) {\n    var key = text(value).toLowerCase().replace(/-/g, '_');\n    return PRODUCT_PAGE_MOBILE_EXPERIENCES.indexOf(key) === -1 ? '' : key;\n  }\n\n  // QA override (?bg_mobile_experience=quick_build|app_shell|standard) rides the same Admin permission as the page-type override.\n  function readMobileExperienceOverride(store) {\n    if (readProductPresentationConfig(store).allowPrototypeUrlOverride !== true) return '';\n    var override = '';\n    try { override = text(new URLSearchParams(window.location.search).get('bg_mobile_experience')).toLowerCase(); } catch (_) {}\n    if (override === 'standard') return 'standard';\n    return normalizeMobileExperience(override);\n  }\n\n  function resolveProductPageMobileExperience(store) {\n    var override = readMobileExperienceOverride(store);\n    if (override === 'standard') return '';\n    if (override) return override;\n    var presentation = readProductPresentationConfig(store);\n    var seed = readServerPageShellSeed(store);\n    var payloadLoaded = !!(store && store.productEditorConfigProductData);\n    return normalizeMobileExperience(presentation.mobileExperience)\n      || (payloadLoaded ? '' : normalizeMobileExperience(seed.mobileExperience));\n  }\n\n  function getMobileExperienceSessionKey(store) {\n    return MOBILE_EXPERIENCE_STANDARD_SESSION_KEY + ':' + (text(store && store.config && store.config.productId)\n      || core.slugify(text(store && store.config && store.config.handle) || 'product'));\n  }\n\n  // SB-11 (2026-09-25): customers no longer choose the standard page. The per-tab choice an older page remembered (\"View standard product page\")\n  // is deleted when a phone layout loads and never written again, so the builder always comes back. Staff reach the standard page with the\n  // Admin-gated ?bg_mobile_experience=standard address, which is never kept.\n  function clearLegacyStandardPageRequest(store) {\n    if (!store || store.mobileExperienceLegacyChoiceCleared) return;\n    store.mobileExperienceLegacyChoiceCleared = true;\n    try { window.sessionStorage.removeItem(getMobileExperienceSessionKey(store)); } catch (_) { /* storage may be blocked */ }\n  }\n\n  function isPhoneViewportForMobileExperience() {\n    return !!(window.matchMedia && window.matchMedia(MOBILE_EXPERIENCE_PHONE_QUERY).matches);\n  }\n\n  // '' when the experience may mount; otherwise the reason it stays off.\n  function describeMobileExperienceGate(store, experience) {\n    if (!experience) return 'not_configured';\n    if (!store || !store.root || store.sectionUnloaded) return 'unloaded';\n    if (getProductFormPresentation(store) !== 'intent_first') return 'page_type';\n    if (store.intentFirstPresentationReady !== true) return 'not_ready';\n    if (!isPhoneViewportForMobileExperience()) return 'width';\n    if (experience === 'app_shell' && Number(window.innerHeight || 0) > 0 && Number(window.innerHeight) < MOBILE_EXPERIENCE_APP_SHELL_MIN_HEIGHT) return 'height';\n    return '';\n  }\n\n  function getMobileExperienceAssetSources(store) {\n    var productInfo = store && store.root && store.root.closest('product-info');\n    return {\n      script: text(productInfo && productInfo.getAttribute('data-bg-mobile-experience-script-src')),\n      style: text(productInfo && productInfo.getAttribute('data-bg-mobile-experience-style-src'))\n    };\n  }\n\n  function loadMobileExperienceModule(store) {\n    var existing = window.BgDesignerStorefrontMobileExperience;\n    if (existing && typeof existing.mount === 'function') return Promise.resolve(existing);\n    if (store.mobileExperienceModulePromise) return store.mobileExperienceModulePromise;\n    var sources = getMobileExperienceAssetSources(store);\n    if (!sources.script) return Promise.reject(new Error('Mobile experience asset is not configured.'));\n    store.mobileExperienceModulePromise = Promise.all([\n      sources.style ? loadStylesheet(sources.style) : Promise.resolve(null),\n      new Promise(function (resolve, reject) {\n        var script = document.createElement('script');\n        script.src = sources.script;\n        script.defer = true;\n        script.onload = function () {\n          var module = window.BgDesignerStorefrontMobileExperience;\n          if (module && typeof module.mount === 'function') resolve(module);\n          else reject(new Error('Mobile experience module did not register.'));\n        };\n        script.onerror = function () { reject(new Error('Failed to load the mobile experience asset.')); };\n        document.head.appendChild(script);\n      })\n    ]).then(function (results) { return results[1]; });\n    store.mobileExperienceModulePromise.catch(function () { store.mobileExperienceModulePromise = null; });\n    return store.mobileExperienceModulePromise;\n  }\n\n  function formatMobileExperiencePrice(store, price, priceStore) {\n    price = shownPrice(price);\n    var total = numberValue(price && price.total, NaN);\n    var compare = numberValue(price && price.compareTotal, NaN);\n    // BD-NO-ROW-ZERO-PRICE: no money for a choice no price row prices; the phone price slot says the sentence instead.\n    var unavailable = showsNoPriceRow(priceStore || store) ? NO_PRICE_ROW_MESSAGE : '';\n    var ready = !unavailable && Number.isFinite(total) && total > 0;\n    var hasCompare = ready && hasShownComparePrice(compare, total);\n    return {\n      ready: ready,\n      total: ready ? total : 0,\n      formattedTotal: ready ? formatShownMoney(total) : '',\n      compare: hasCompare ? formatShownMoney(compare) : '',\n      savings: hasCompare ? formatShownMoney(roundMoney(compare - total)) : '',\n      perPiece: ready ? formatShownMoney(numberValue(price.currentPerPiece, 0)) : '',\n      unit: getQuantityPerUnitLabel(store),\n      quantity: Math.max(1, Math.round(numberValue(price && price.quantity, numberValue(store.state.quantity, 1)))),\n      badge: getShownDiscountBadgeText(store, price),\n      note: ready ? getSalePendingNote(priceStore || store) : '',\n      freeShipping: !!(price && price.hasFreeShipping),\n      unavailable: unavailable\n    };\n  }\n\n  // Quick Build keeps the last committed artwork if Studio closes without Approve. The existing shell owns launching, saves and approval messages.\n  function beginMobileArtworkLaunch(store) {\n    settleMobileArtworkLaunch(store, true);\n    var keys = ['template', 'project', 'artworkMode', 'artworkPrimaryChoice', 'artworkSecondaryChoice', 'canvaUrl', 'reorderContext', 'reorderFallback', 'guidedFillArmed', 'guidedFillProjectId'];\n    var snapshot = { artworkQuote: captureArtworkQuote(store) };\n    keys.forEach(function (key) { snapshot[key] = store.state[key] && typeof store.state[key] === 'object' ? deepClone(store.state[key], {}) : store.state[key]; });\n    var methodHolder = getArtworkMethodHolder(store);\n    if (methodHolder) {\n      snapshot.selections = {};\n      snapshot.selections[getHolderId(methodHolder)] = store.state.selections[getHolderId(methodHolder)];\n    }\n    // Keep File references; JSON cloning loses pending native file objects.\n    snapshot.uploads = {};\n    Object.keys(store.state.uploads || {}).forEach(function (key) { snapshot.uploads[key] = store.state.uploads[key].slice(); });\n    var pending = { snapshot: snapshot, observer: null, returnUrl: window.location.href };\n    store.mobileArtworkLaunch = pending;\n    var shell = store.editorShell && store.editorShell.ensureOverlay && store.editorShell.ensureOverlay();\n    if (shell && window.MutationObserver) {\n      var opened = shell.classList.contains('is-open');\n      pending.observer = new window.MutationObserver(function () {\n        if (shell.classList.contains('is-open')) opened = true;\n        else if (opened && store.mobileArtworkLaunch === pending) settleMobileArtworkLaunch(store, false);\n      });\n      pending.observer.observe(shell, { attributes: true, attributeFilter: ['class', 'aria-hidden'] });\n    }\n  }\n\n  function settleMobileArtworkLaunch(store, approved) {\n    var pending = store.mobileArtworkLaunch;\n    if (!pending) return;\n    store.mobileArtworkLaunch = null;\n    if (pending.observer) pending.observer.disconnect();\n    if (approved) return;\n    if (pending.operation && !isArtworkOperationFresh(store, pending.operation)) return;\n    restoreArtworkSnapshot(store, pending.snapshot);\n    syncFormState(store);\n    render(store);\n    scheduleDesignerUrlStateSync(store, true);\n  }\n\n  // Phone Studio is top-level. Its existing Return and Next addresses let this seam distinguish discard from approval without changing Studio.\n  // Keep the previous artwork for this tab's session and consume it once.\n  function prepareMobileArtworkNavigation(store, launchUrl) {\n    var pending = store.mobileArtworkLaunch;\n    if (!pending) return launchUrl;\n    try {\n      var next = new URL(launchUrl, window.location.origin);\n      var nonce = String(Date.now()) + '-' + Math.random().toString(36).slice(2);\n      var snapshot = deepClone(pending.snapshot, {});\n      Object.keys(snapshot.uploads || {}).forEach(function (key) {\n        snapshot.uploads[key] = snapshot.uploads[key].filter(function (file) { return !!getUploadFilePublicUrl(file); });\n      });\n      window.sessionStorage.setItem('bgMobileArtworkReturn:' + text(store.config.handle), JSON.stringify({ nonce: nonce, at: Date.now(), returnUrl: pending.returnUrl, snapshot: snapshot }));\n      var returnUrl = new URL(pending.returnUrl);\n      returnUrl.searchParams.set('bg_artwork_return', nonce);\n      ['bgReturnUrl', 'adminReturnUrl', 'storefrontReturnUrl'].forEach(function (key) {\n        if (key === 'bgReturnUrl' || next.searchParams.has(key)) next.searchParams.set(key, returnUrl.toString());\n      });\n      // Browser Back can restore this document from the back/forward cache. Put its previous artwork back before it leaves, too.\n      settleMobileArtworkLaunch(store, false);\n      return next.toString();\n    } catch (_) { return launchUrl; }\n  }\n\n  function consumeMobileArtworkReturn(store) {\n    try {\n      var url = new URL(window.location.href);\n      var nonce = text(url.searchParams.get('bg_artwork_return'));\n      var key = 'bgMobileArtworkReturn:' + text(store.config.handle);\n      var stored = parseJson(window.sessionStorage.getItem(key), null);\n      window.sessionStorage.removeItem(key);\n      if (nonce) {\n        url.searchParams.delete('bg_artwork_return');\n        window.history.replaceState(window.history.state, document.title, url.toString());\n      }\n      if (!nonce || !stored || stored.nonce !== nonce || !stored.snapshot || typeof stored.snapshot !== 'object') return null;\n      var previous = new URL(stored.returnUrl);\n      if (previous.origin !== url.origin || previous.pathname !== url.pathname) return null;\n      // Discard may carry an autosaved project pointer. Restore the exact previous address before the canonical saved-project reader runs.\n      window.history.replaceState(window.history.state, document.title, previous.toString());\n      return stored.snapshot;\n    } catch (_) { return null; }\n  }\n\n  // Accepted upload types in words for customers (\"PDF, SVG or any image.\"), never the raw accept list of MIME types and extensions.\n  function describeUploadAccept(accepts) {\n    var names = { pdf: 'PDF', ai: 'AI', eps: 'EPS', svg: 'SVG', psd: 'PSD', tif: 'TIFF', tiff: 'TIFF', png: 'PNG', jpg: 'JPG', jpeg: 'JPG', webp: 'WEBP', heic: 'HEIC' };\n    var mimes = { 'application/pdf': 'PDF', 'application/illustrator': 'AI', 'application/postscript': 'EPS', 'application/eps': 'EPS', 'image/eps': 'EPS',\n      'image/svg+xml': 'SVG', 'image/tiff': 'TIFF', 'image/png': 'PNG', 'image/jpeg': 'JPG', 'image/webp': 'WEBP', 'image/heic': 'HEIC' };\n    var order = ['PDF', 'AI', 'EPS', 'SVG', 'PSD', 'TIFF', 'PNG', 'JPG', 'WEBP', 'HEIC'];\n    var found = [];\n    var anyImage = false;\n    (accepts || []).join(',').split(',').forEach(function (raw) {\n      var token = text(raw).toLowerCase();\n      if (!token) return;\n      if (token === 'image/*') { anyImage = true; return; }\n      var name = token.charAt(0) === '.' ? (names[token.slice(1)] || token.slice(1).toUpperCase()) : mimes[token];\n      if (name && found.indexOf(name) === -1) found.push(name);\n    });\n    found.sort(function (a, b) { return (order.indexOf(a) + 1 || 99) - (order.indexOf(b) + 1 || 99); });\n    if (anyImage) found.push('any image');\n    if (!found.length) return '';\n    return (found.length === 1 ? found[0] : found.slice(0, -1).join(', ') + ' or ' + found[found.length - 1]) + '.';\n  }\n\n  function normalizeMobileCanvaDesignUrl(value) {\n    var raw = text(value);\n    if (!/^[a-z][a-z0-9+.-]*:/i.test(raw)) raw = 'https://' + raw;\n    try {\n      var url = new URL(raw);\n      var host = url.hostname.toLowerCase().replace(/^www\\./, '');\n      if (!/^https?:$/.test(url.protocol) || url.username || url.password || url.port) return '';\n      if ((host === 'canva.com' && /^\\/design\\/[^/]+(?:\\/|$)/.test(url.pathname)) || (host === 'canva.link' && /^\\/[^/]+/.test(url.pathname))) return url.toString();\n    } catch (_) {}\n    return '';\n  }\n\n  // \"See all N\" names the browser's own count only when it shows more than the cards already on screen; otherwise it stays \"See all templates\".\n  function buildSeeAllTemplatesLabel(total, shown) {\n    var count = Math.max(0, Math.round(numberValue(total, 0)));\n    return count > Math.max(0, numberValue(shown, 0)) ? 'See all ' + count + ' templates' : 'See all templates';\n  }\n\n  // The browser's own result count for the current choices (its default configuration tab), computed from the browser's owners in one pass.\n  function getTemplateBrowserResultCount(store) {\n    var source = Object.assign({}, store, { templateModalState: Object.assign({}, getTemplateModalState(store), { activeConfigurationKey: '' }) });\n    var base = getTemplateModalBaseTemplates(source);\n    var active = getActiveTemplateModalConfiguration(source, getTemplateModalConfigurations(source, base));\n    var shown = getTemplatesForModalConfiguration(source, base, active).filter(function (template) {\n      return matchesTemplateSearch(source, template) && matchesTemplateFilters(source, template, '');\n    });\n    return shown.length + ((!active || active.matchesCurrent) && getStartBlankTemplateForModal(source) ? 1 : 0);\n  }\n\n  // That count walks the whole catalog (about 80 ms for 175 templates), so it is kept per choice set and computed off the tap path; labels show \"See all templates\" until it is known, then update in place.\n  function getTemplateBrowserTotalKey(store) {\n    var state = getTemplateModalState(store);\n    return JSON.stringify([(store.templates || []).length, text(store.templateModalMode), store.state && store.state.selections || {},\n      text(state.query), state.selectedFilters || {}]);\n  }\n\n  function readTemplateBrowserTotal(store) {\n    var memo = store.templateBrowserTotal;\n    return memo && memo.key === getTemplateBrowserTotalKey(store) ? memo.total : null;\n  }\n\n  function scheduleTemplateBrowserTotal(store, delay) {\n    if (!store || !(store.templates || []).length || readTemplateBrowserTotal(store) !== null) return;\n    window.clearTimeout(store.templateBrowserTotalTimer);\n    store.templateBrowserTotalTimer = window.setTimeout(function () {\n      store.templateBrowserTotalTimer = 0;\n      if (readTemplateBrowserTotal(store) !== null) return;\n      store.templateBrowserTotal = { key: getTemplateBrowserTotalKey(store), total: getTemplateBrowserResultCount(store) };\n      Array.prototype.slice.call(document.querySelectorAll('[data-bg-see-all-shown]')).forEach(function (node) {\n        var label = buildSeeAllTemplatesLabel(store.templateBrowserTotal.total, node.getAttribute('data-bg-see-all-shown'));\n        var target = node.querySelector('.bg-artwork-vx__strip-name') || node;\n        if (target.textContent !== label) target.textContent = label;\n      });\n    }, Math.max(0, numberValue(delay, 0)));\n  }\n\n  function artworkPriceContext(store) {\n    var state = store.state;\n    var key = JSON.stringify([state.selections, state.quantity, state.typedQuantity, state.apparelSizes,\n      state.artworkMode, state.template && getTemplateSelectionKey(state.template), state.channelOffer,\n      getCustomerPricingProfile(store), getShownSalePercentage(store), store.productData.customDesignCost]);\n    if (!store.artworkPriceMemo || store.artworkPriceMemo.key !== key) store.artworkPriceMemo = { key: key, prices: {} };\n    return store.artworkPriceMemo;\n  }\n  function mappedArtworkPrice(store, mode, template, original, effective) {\n    var artworkPriceMemo = artworkPriceContext(store);\n    var resolved = resolveArtworkMethodOption(store, mode);\n    if (resolved.status === 'ineligible') return null;\n    var match = resolved.status === 'eligible' ? resolved : null;\n    if (!match) return artworkPrice(original, effective);\n    var holder = match.holder;\n    var addon = buildAddonMetadataForOption(store, match.option, holder);\n    // Display-only and postage values are not an online service deal.\n    if (addon && (addon.excludeFromCart || addon.isPostage)) return null;\n    var memoKey = JSON.stringify([mode, template && getTemplateSelectionKey(template),\n      template && template.editServiceCost, original, match.option.hvId, holder.values]);\n    if (artworkPriceMemo.prices[memoKey]) return artworkPriceMemo.prices[memoKey];\n    // Same isolated projection as option-price previews. Mirror the price state of setArtworkChoice, without its live DOM/intent side effects.\n    function project(choice) {\n      var preview = Object.assign({}, store, {\n        suppressArtworkMethodPricePreview: !choice,\n        state: Object.assign({}, store.state, { selections: Object.assign({}, store.state.selections),\n          apparelSizes: Object.assign({}, store.state.apparelSizes), eddm: Object.assign({}, store.state.eddm), template: choice ? template : null,\n          artworkMode: choice ? mode : '', artworkPrimaryChoice: '', artworkSecondaryChoice: '' }),\n        uiState: Object.assign({}, store.uiState)\n      });\n      if (choice) {\n        preview.state.artworkPrimaryChoice = mode === 'customdesign' || mode === 'editservice' ? 'need-design' : 'service';\n        preview.state.artworkSecondaryChoice = mode === 'customdesign' ? 'custom-design' : (mode === 'editservice' ? 'use-template' : mode);\n        selectArtworkMethodOption(preview, mode);\n      }\n      recalculate(preview);\n      return getPricePresentation(preview);\n    }\n    var baseline = project(false);\n    var chosen = project(true);\n    var amount = roundMoney(chosen.total - baseline.total);\n    var compare = roundMoney(chosen.compareTotal - baseline.compareTotal);\n    // SB-18's free personalization deal belongs only on this row.\n    var listDeal = template ? Math.max(0, original - getTemplateEditServicePriceMeta(template).effectiveCost) : 0;\n    var price = artworkPrice(template ? roundMoney(compare + listDeal) : (amount === 0 && compare === 0 ? original : compare), amount);\n    artworkPriceMemo.prices[memoKey] = price;\n    return price;\n  }\n  function mappedArtworkPathPrice(store, mode, template) {\n    if (resolveArtworkMethodOption(store, mode).status !== 'eligible') return null;\n    var price = mappedArtworkPrice(store, mode, template || null, 0, 0);\n    return price && price.amount !== 0 ? price : null;\n  }\n  function artworkPrice(original, effective) {\n    return { original: original, amount: effective, display: effective === 0 ? 'Free' : (effective > 0 ? '+' : '') + core.formatMoney(effective),\n      originalDisplay: original > effective ? (effective > 0 ? '+' : '') + core.formatMoney(original) : '' };\n  }\n\n  function buildMobileExperienceAdapter(store) {\n    // Retire an existing runtime Scene before the phone layout takes over. Its pending dismissal stays in the shared state until popstate arrives.\n    closeProductPreview3dSceneSheet(store, { focus: false });\n    // Present the existing form controls inside the chosen phone layout. The canonical render and event handlers retain all artwork ownership.\n    function showNativeWorkflow() {\n      var active = store.mobileExperience;\n      if (active && typeof active.openNativeWorkflow === 'function') active.openNativeWorkflow();\n    }\n    // SB-09: data only. Quick Build opts into this seam; App mode keeps the original getArtwork/artworkAction/chooseTemplate/purchase contract.\n    function artworkRow(item, defaults) {\n      var display = getArtworkMethodDisplayConfig(store, item.mode) || {};\n      var original = Math.max(0, numberValue(item.priceCost, 0));\n      var fee = item.key === 'custom-design' ? getArtworkFeeAmounts(store).customDesignAmount : original;\n      var effective = applyDisplayDiscount(fee, getShownSalePercentage(store));\n      return {\n        key: item.key, action: item.action, mode: item.mode,\n        label: text(display.label) || defaults[0], description: text(display.description) || defaults[1],\n        price: ['custom-design', 'recreate-design', 'free-setup'].indexOf(item.key) !== -1\n          ? mappedArtworkPrice(store, item.mode, null, original, effective) : mappedArtworkPathPrice(store, item.mode)\n      };\n    }\n    function artworkTemplate(entry) {\n      if (!entry) return null;\n      var availability = getOfferedTemplateAvailability(store, entry);\n      var price = getTemplateEditServicePriceMeta(entry);\n      var feeStore = Object.assign({}, store, { state: Object.assign({}, store.state, { template: entry, artworkMode: 'editservice' }) });\n      var fee = getArtworkFeeAmounts(feeStore).templatePersonalizationAmount;\n      var display = getArtworkMethodDisplayConfig(store, 'editservice') || {};\n      var finishes = [];\n      if (availability.editservice && canApplyArtworkMethod(store, 'editservice')) finishes.push({ key: 'template-personalize', action: 'template-personalize',\n        label: text(display.label) || getTemplatePersonalizationOutcomeLabel(store), description: text(display.description) || 'Send your details after checkout. You approve a proof before we print.',\n        price: mappedArtworkPrice(store, 'editservice', entry, price.originalCost, applyDisplayDiscount(fee, getShownSalePercentage(store))) });\n      if (availability.designonline && canApplyArtworkMethod(store, 'designonline')) finishes.push({ key: 'template-customize-online', action: 'template-customize-online',\n        label: \"I\u2019ll edit it online\", description: 'Open it in the design studio.', launch: true, price: mappedArtworkPathPrice(store, 'designonline', entry) });\n      return { key: getTemplateSelectionKey(entry), title: text(entry.title) || 'Design template',\n        previewUrl: text(getTemplateFrontPreview(entry)), selected: !!store.state.template && getTemplateSelectionKey(entry) === getTemplateSelectionKey(store.state.template), finishes: finishes };\n    }\n    function artworkPlan() {\n      var availability = getStoreArtworkAvailability(store);\n      var presentation = readProductPresentationConfig(store);\n      var wording = plainObject(presentation.artworkCardCopy);\n      var items = buildArtworkActionItems(store, availability);\n      var groups = groupVersionedArtworkItems(items);\n      var chooser = getReorderChooserState(store);\n      var chooserPresentation = isReorderChooserPresentation(store);\n      var signedIn = isCustomerLoggedIn(store);\n      var templates = stripTemplates();\n      var limit = Math.max(1, Math.min(8, Math.round(numberValue(getExperimentalPresentationSettings(store, 'intentFirst').templateCardLimit, 6))));\n      var uploadFields = normalizeUploadFields(store.binding).map(function (field) {\n        var replacement = (store.mobileArtworkUploadReplacements || {})[field.id];\n        var failedFiles = replacement ? replacement.failedFiles || [] : [];\n        return { id: field.id, label: field.label, accept: field.accept, required: field.required,\n          pickerPending: !!(store.mobileArtworkUploadPickers || {})[field.id],\n          files: getUploadFieldFiles(store, field.id).concat(failedFiles).map(function (file) {\n            var done = !!getUploadFilePublicUrl(file);\n            return { id: text(file.clientId) || getUploadFilePublicUrl(file) || text(file.name || file.fileName), name: text(file.name || file.fileName), status: done ? 'complete' : (file.uploadFailed ? 'error' : 'uploading'),\n              percent: done ? 100 : numberValue(file.uploadProgress, 0),\n              error: text(file.uploadFailureMessage) || (isUploadFileTypeRefused(file) ? 'This file type is not accepted. Choose a file of an accepted type.' : 'The file did not finish uploading. Check your connection and choose it again.'),\n              previewUrl: /^image\\//.test(text(file.contentType)) ? getUploadFilePublicUrl(file) : '' };\n          }) };\n      });\n      var defaults = {\n        'upload-files': ['Upload a file', describeUploadAccept(uploadFields.map(function (field) { return field.accept; }))],\n        // The Can edit how-to line is the shared help's own (never replaced by an Admin description, which Quick Build shows as a separate note).\n        'share-canva': ['Paste a Canva link', ''],\n        reorder: ['Reorder a past design', 'Pick artwork from an earlier order.'],\n        'custom-design': ['Have our designers make it', 'Tell us your idea after checkout. Proof included.'],\n        'recreate-design': ['Recreate my old sign', 'Send a photo after checkout. We rebuild it.'],\n        'free-setup': ['Free setup', 'Send your details after checkout.'],\n        'send-later': ['Send artwork after checkout', '']\n      };\n      // A path the artwork option group cannot take is not offered (a rule may leave no free value; the choice would be refused, never charged).\n      var applicable = function (item) { return canApplyArtworkMethod(store, item.mode); };\n      var own = groups.have.filter(function (item) {\n        return item.key !== 'reorder' || (signedIn && chooser.status === 'loaded' && chooser.items.length > 0);\n      }).filter(applicable).map(function (item) { return artworkRow(item, defaults[item.key]); });\n      // The approved order (P07): upload first, then the Canva link, then past designs.\n      var ownOrder = ['upload-files', 'share-canva', 'reorder'];\n      own.sort(function (a, b) { return (ownOrder.indexOf(a.key) + 1 || 99) - (ownOrder.indexOf(b.key) + 1 || 99); });\n      var services = groups.service.filter(applicable).map(function (item) { return artworkRow(item, defaults[item.key] || [item.title, item.copy]); });\n      var blank = availability.designonline && !isPitchPrintLaunchProvider(store) && canApplyArtworkMethod(store, 'designonline');\n      var designDisplay = getArtworkMethodDisplayConfig(store, 'designonline') || {};\n      if (blank) services.unshift({ key: 'design-online', action: 'design-online', label: text(designDisplay.label) || 'Design it online myself',\n        description: text(designDisplay.description) || 'Start from a blank design in the design studio.', launch: true, price: mappedArtworkPathPrice(store, 'designonline') });\n      var hasService = services.some(function (row) { return !row.launch; });\n      var selected = artworkTemplate(store.state.template);\n      var mode = text(store.state.artworkMode).toLowerCase();\n      var project = store.state.project || {};\n      var files = uploadFields.reduce(function (all, field) { return all.concat(field.files); }, []);\n      var required = !!getGuidedArtworkStepRequirement(store);\n      var current = { group: '', label: 'Choose design', previewUrl: '', required: required, unfinishedTemplate: false };\n      if (text(project.projectId)) {\n        current.group = selected ? 'template' : (mode === 'uploadfiles' ? 'own' : 'create');\n        current.label = getContextualSelectedDesignTitle(store);\n        current.previewUrl = text(readProjectPreviewList(project)[0]);\n        if (selected) selected = Object.assign({}, selected, { title: current.label, previewUrl: current.previewUrl });\n      } else if (selected && (mode === 'designonline' || mode === 'editservice' || !mode)) {\n        current = { group: 'template', label: selected.title, previewUrl: selected.previewUrl, required: required,\n          unfinishedTemplate: !text(project.projectId) && mode !== 'editservice' };\n      } else if (mode === 'uploadfiles' && files.length) {\n        current.group = 'own'; current.label = 'Your upload'; current.previewUrl = files[0].previewUrl;\n      } else if (mode === 'uploadcanva' && isValidCanvaUrl(store.state.canvaUrl)) {\n        current.group = 'own'; current.label = 'Canva link';\n        // CANVA-EDIT-LINK: Quick Build shows the view-only advisory in its summary.\n        if (isCanvaViewOnlyLink(store.state.canvaUrl)) current.viewOnly = true;\n      } else if (mode === 'reorder') { current.group = 'own'; current.label = 'Past design'; }\n      else if (mode === 'youhaveart') { current.group = 'later'; current.label = 'After checkout'; }\n      else {\n        var service = services.find(function (row) { return row.mode === mode; });\n        if (service) { current.group = 'create'; current.label = service.label; }\n      }\n      // Rules can change after a choice. Never keep claiming a method whose mapped value the calculator has since removed or replaced.\n      if (store.artworkChoiceNotice || (mode && !artworkChoiceMatchesSelection(store))) {\n        current = { group: '', label: 'Choose design', previewUrl: '', required: true, unfinishedTemplate: false };\n      }\n      var recommended = getRecommendedGuidedArtworkMethodKey(store);\n      var cards = [];\n      function card(key, title, description, rows, recommendedKeys) {\n        var copy = plainObject(wording[key]);\n        cards.push({ key: key, title: text(copy.title) || title, description: text(copy.description) || description,\n          rows: rows, recommended: recommendedKeys.indexOf(recommended) !== -1, selected: current.group === key && !current.unfinishedTemplate,\n          directAction: key === 'create' && !hasService ? 'design-online' : '',\n          price: key === 'create' && !hasService ? services[0].price : null });\n      }\n      if (((availability.designonline && canApplyArtworkMethod(store, 'designonline')) || (availability.editservice && canApplyArtworkMethod(store, 'editservice'))) && templates.length) card('template', 'Pick a template', 'Choose a ready-made design and make it yours.', [], ['use-template']);\n      if (own.length || (chooserPresentation && availability.reorder && signedIn && (chooser.status === 'idle' || chooser.status === 'loading'))) card('own', 'Use my own design', 'Upload a file or paste a Canva link.', own, groups.have.map(function (item) { return item.key; }));\n      if (services.length) card('create', hasService ? 'Create a new design' : 'Design it online', 'Start from a blank design in our design studio.', services, groups.service.map(function (item) { return item.key; }).concat(['designonline']));\n      var later = groups.later.length && applicable(groups.later[0]) ? artworkRow(groups.later[0], defaults['send-later']) : null;\n      var missing = !!(store.mobileArtworkTemplateDetached || store.selectedDesignCompatibilityConflict) && !store.state.template;\n      var opening = current.unfinishedTemplate ? 'finish' : (missing && cards.some(function (card) { return card.key === 'template'; }) ? 'template' :\n        (presentation.artworkSheetOpensOn === 'templates' && cards.some(function (card) { return card.key === 'template'; }) ? 'template' : (cards.length === 1 ? cards[0].key : 'choices')));\n      return { cards: cards, later: later, current: current, selectedTemplate: selected, opening: opening,\n        visible: !isArtworkSectionAdminDisabled(store) || !!(artworkOwners.has(store) && artworkOwners.get(store).recovery), notice: store.artworkChoiceNotice || (missing ? 'That design does not fit this size. Pick another.' : ''),\n        // Shown beside the purchase button and the notice (an add on its way, why nothing was added).\n        purchaseNotice: getPurchaseNotice(store),\n        templates: { items: templates.slice(0, limit).map(artworkTemplate), total: readTemplateBrowserTotal(store) },\n        upload: { canvasProof: shouldLaunchEditorForArtworkUpload(store), fields: uploadFields,\n          complete: files.length > 0 && files.every(function (file) { return file.status === 'complete'; }) && uploadFields.every(function (field) { return !field.required || field.files.length > 0; }) },\n        reorder: { chooser: chooserPresentation || (signedIn && chooser.status === 'loaded' && chooser.items.length > 0), loading: chooserPresentation && availability.reorder && signedIn && (chooser.status === 'idle' || chooser.status === 'loading'),\n          busy: !!chooser.busyLookup, error: chooser.error, items: signedIn ? chooser.items.map(function (item) {\n            var date = new Date(item.updatedAt);\n            return { key: item.lookup, title: item.title, previewUrl: item.previewUrl, price: mappedArtworkPathPrice(store, 'reorder'),\n              description: (item.status === 'ordered' ? 'Ordered' : 'Saved') + (Number.isNaN(date.getTime()) ? '' : ' ' + date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })) };\n          }) : [] } };\n    }\n    // A detached element, not a stub: the shared handler may test it with Node.contains (a plain object makes that throw and the choice fail).\n    function artworkTarget(attributes) {\n      var node = document.createElement('button');\n      Object.keys(attributes).forEach(function (name) { node.setAttribute(name, attributes[name]); });\n      return node;\n    }\n    function applyArtwork(action, payload) {\n      var data = payload || {};\n      if (data.operation && !isArtworkOperationFresh(store, data.operation)) return false;\n      var blocks = readBlocks(store);\n      // The plan is read only by the actions that need it: navigation and preparation stay cheap inside the tap.\n      var planned = null;\n      function currentPlan() { return planned || (planned = artworkPlan()); }\n      // Entering a step only looks. A path's own action replaces an earlier choice (after checkout included), so X after looking changes nothing.\n      if (action === 'enter') return true;\n      if (action === 'close-browser') { closeTemplateModal(store, { skipRender: true, skipFocus: true }); return true; }\n      if (action === 'prepare') {\n        ensureArtworkStripDataLoaded(store);\n        if (isReorderChooserPresentation(store) && getStoreArtworkAvailability(store).reorder && isCustomerLoggedIn(store)\n          && getReorderChooserState(store).status === 'idle') fetchReorderChooserItems(store);\n        // After the sheet's entrance, so the count never lands in a tap.\n        scheduleTemplateBrowserTotal(store, numberValue(data.after, 400));\n        return true;\n      }\n      if (action === 'browse-templates') {\n        store.mobileArtworkTemplateReturn = typeof data.onChoose === 'function' ? data.onChoose : null;\n        store.mobileArtworkTemplateClose = typeof data.onClose === 'function' ? data.onClose : null;\n        openTemplateModal(store, 'templatebrowse'); return true;\n      }\n      if (action === 'pick-template') {\n        var entry = getTemplateBySelectionKey(store, text(data.key)) || findStripTemplate(data.key);\n        if (!entry) return false;\n        // Re-picking the template already on the sign only reopens its finish step: looking never undoes a chosen finish.\n        if (store.state.template && getTemplateSelectionKey(store.state.template) === getTemplateSelectionKey(entry)) return true;\n        store.templateModalMode = 'templatebrowse';\n        return chooseTemplateEntry(store, entry, '', { preserveUnresolvedFinish: true, mobileArtwork: true, operation: data.operation });\n      }\n      if (action === 'canva') {\n        var link = normalizeMobileCanvaDesignUrl(data.url);\n        if (!link || !getStoreArtworkAvailability(store).uploadcanva) return { ok: false, error: 'This is not a Canva design link. In Canva, tap Share, then Copy link.' };\n        if (!applyArtworkMethodOption(store, 'uploadcanva')) return { ok: false, error: 'This configuration requires a design service. Your current choice is unchanged.' };\n        store.state.canvaUrl = link;\n        handleArtworkAction(store, blocks, 'share-canva', null);\n        syncFormState(store); scheduleDesignerUrlStateSync(store, true);\n        return { ok: true };\n      }\n      if (action === 'upload-files' && !shouldLaunchEditorForArtworkUpload(store)) {\n        if (!getStoreArtworkAvailability(store).uploadfiles) return false;\n        var fields = normalizeUploadFields(store.binding);\n        var field = fields.find(function (field) { return field.id === data.fieldId; }) || fields.find(function (field) { return !getUploadFieldFiles(store, field.id).length; }) || fields[0];\n        if (!field) return false;\n        var replacements = store.mobileArtworkUploadReplacements || (store.mobileArtworkUploadReplacements = {});\n        var replacement = replacements[field.id];\n        // One transfer per field. Other fields can still pick and upload.\n        if (replacement && replacement.newIds && !replacement.failedFiles) return false;\n        if (handleArtworkAction(store, blocks, action, null) === false) return { ok: false, error: 'This configuration requires a design service. Your current choice is unchanged.' };\n        if (data.replace) {\n          store.uploadReplaceFieldId = field.id;\n          replacement = replacements[field.id] = { previousFiles: getUploadFieldFiles(store, field.id).filter(function (file) { return !!getUploadFilePublicUrl(file); }) };\n        }\n        var input = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-upload-field]')).find(function (node) { return node.getAttribute('data-bg-upload-field') === field.id; });\n        if (!input) {\n          // Completed native layouts may show only their summary. Keep the canonical field/binding available for the phone's Replace action.\n          var picker = document.createElement('div');\n          picker.hidden = true;\n          picker.innerHTML = buildUploadFieldMarkup(store, field, { idPrefix: 'bg-mobile-artwork-upload-' });\n          store.root.appendChild(picker);\n          syncUploadFieldInputs(store, picker, [field]);\n          input = picker.querySelector('[data-bg-upload-field]');\n        }\n        var pickers = store.mobileArtworkUploadPickers || (store.mobileArtworkUploadPickers = {});\n        var pickerOperation = {};\n        pickers[field.id] = pickerOperation;\n        input.addEventListener('cancel', function () {\n          if (pickers[field.id] !== pickerOperation) return;\n          delete pickers[field.id];\n          if (store.uploadReplaceFieldId === field.id) store.uploadReplaceFieldId = '';\n          if (replacements[field.id] === replacement && replacement && !replacement.newIds) delete replacements[field.id];\n          notifyMobileArtwork(store);\n        }, { once: true });\n        input.click(); // synchronous user activation: never defer the native picker\n        return true;\n      }\n      if (action === 'reorder-choose') {\n        if (!getStoreArtworkAvailability(store).reorder || !isCustomerLoggedIn(store) || getReorderChooserState(store).status !== 'loaded'\n          || !currentPlan().reorder.items.some(function (item) { return item.key === data.key; })) return false;\n        if (handleArtworkAction(store, blocks, 'reorder', artworkTarget({ 'data-bg-mobile-artwork': 'true' })) === false) return false;\n        return chooseReorderDesign(store, artworkTarget({ 'data-bg-reorder-lookup': data.key, 'data-bg-mobile-artwork': 'true' }));\n      }\n      if (action === 'design-online') {\n        if (!getStoreArtworkAvailability(store).designonline) return false;\n        if (!canApplyArtworkMethod(store, 'designonline')) { applyArtworkMethodOption(store, 'designonline'); return { ok: false, error: 'This configuration requires a design service. Your current choice is unchanged.' }; }\n        beginMobileArtworkLaunch(store);\n        applyArtworkMethodOption(store, 'designonline', 'customer', null);\n        clearProjectState(store);\n        return Promise.resolve(handleArtworkAction(store, blocks, 'template-customize-online', null)).then(function (ok) { if (ok === false) settleMobileArtworkLaunch(store, false); return ok; });\n      }\n      // The plan's rows and finishes, checked from their owners without building the plan (a chooser page reorders through reorder-choose).\n      var availability = getStoreArtworkAvailability(store);\n      var finishes = store.state.template ? getOfferedTemplateAvailability(store, store.state.template) : {};\n      var allowed = {\n        'upload-files': availability.uploadfiles, 'share-canva': availability.uploadcanva,\n        reorder: false, // Quick Build reorders only through an available past-design list.\n        'custom-design': availability.customdesign, 'recreate-design': availability.recreate, 'free-setup': availability.freesetup,\n        'send-later': availability.youhaveart, 'template-personalize': finishes.editservice, 'template-customize-online': finishes.designonline\n      };\n      if (!allowed[action]) return false;\n      if (action === 'upload-files' && shouldLaunchEditorForArtworkUpload(store)) action = 'upload-in-editor';\n      // A choice the artwork option group cannot take (no free value left) is refused with its reason, shown in the phone sheet.\n      var refused = { ok: false, error: 'This configuration requires a design service. Your current choice is unchanged.' };\n      if (action === 'upload-in-editor' || action === 'template-customize-online') {\n        var launchMode = action === 'upload-in-editor' ? 'uploadfiles' : 'designonline';\n        if (!canApplyArtworkMethod(store, launchMode)) { applyArtworkMethodOption(store, launchMode); return refused; }\n        beginMobileArtworkLaunch(store);\n        return Promise.resolve(handleArtworkAction(store, blocks, action, null)).then(function (ok) { if (ok === false) { settleMobileArtworkLaunch(store, false); return refused; } return ok; });\n      }\n      return Promise.resolve(handleArtworkAction(store, blocks, action, null)).then(function (ok) { return ok === false ? refused : ok; });\n    }\n    var productInfo = store.root.closest('product-info');\n    function nodeText(selector) {\n      var node = store.root.querySelector(selector);\n      return text(node && node.textContent);\n    }\n    // The strip walks the whole catalog: one walk per choice set, however many plan reads a tap makes (the key is the browser count's inputs).\n    var stripMemo = null;\n    function stripTemplates() {\n      // The strip also filters on the enabled template finishes.\n      var key = getTemplateBrowserTotalKey(store) + JSON.stringify(getStoreArtworkAvailability(store));\n      if (!stripMemo || stripMemo.key !== key) stripMemo = { key: key, list: getArtworkStripTemplates(store) };\n      return stripMemo.list.slice();\n    }\n    function findStripTemplate(key) {\n      return stripTemplates().find(function (entry) { return getTemplateSelectionKey(entry) === text(key); }) || null;\n    }\n    function readShortTitle() {\n      return text(readProductPresentationConfig(store).shortTitle);\n    }\n    function readPhoneNotices(location) { return getProductPageNotices(store, location).map(function (notice) { return { text: notice.text, emphasis: notice.emphasis }; }); }\n    // The live viewer while the scene itself shows: the preview stage is up (phase active or updating) and the customer chose the 3D view. The\n    // engine's own snapshot always reports 3D, so the storefront's phase and view choice decide.\n    function readScenePreviewViewer() {\n      var state = store.productPreview3d;\n      var viewer = state && state.viewer;\n      if (!viewer || !viewer.state || state.viewMode === '2d') return null;\n      var chrome = getProductPreview3dChrome(store);\n      var phase = chrome && !chrome.stage.hidden ? text(chrome.stage.getAttribute('data-bg-pdp-3d-phase')) : '';\n      return phase === 'active' || phase === 'updating' ? viewer : null;\n    }\n    return {\n      root: store.root,\n      productInfo: productInfo,\n      getArtworkPlan: artworkPlan,\n      getArtworkTemplateTotal: function () { return readTemplateBrowserTotal(store); },\n      applyArtwork: applyArtwork,\n      purchaseArtwork: function () {\n        // The existing validation and review-target owner decide the fallback.\n        var validation = validateState(store);\n        if (!validation.valid && !validation.allowArtworkLater) {\n          showNativeWorkflow();\n          if (!revealGuidedArtworkPurchaseStep(store)) scrollToStickyPurchaseReviewTarget(store, validation);\n          return false;\n        }\n        var purchase = store.root.querySelector('[data-bg-presentation-purchase]') || getSubmitButton(store);\n        if (purchase && !purchase.disabled) { purchase.click(); return true; }\n        return false;\n      },\n      historyState: ensureProductPreview3dState(store),\n      isHistoryDismissal: function (event) { return isProductPreview3dSceneDismissal(store, event); },\n      handleHistoryTraversal: function (event) { handleProductPreview3dHistoryTraversal(store, event); },\n      // The phone sheet consumes its own Back before preview/navigation handlers. Reconcile the landed URL from current native selections.\n      syncUrl: function () {\n        store.urlStateLastSyncedUrl = '';\n        scheduleDesignerUrlStateSync(store, true);\n      },\n      // SB-01 (2026-09-25): the phone title is the product's short title setting (presentation.shortTitle), or the product title without one.\n      getProductTitle: function (fullTitle) {\n        return (!fullTitle && readShortTitle()) || text(store.config && store.config.productTitle) || text(document.title);\n      },\n      // SB-22: \"About {short title}\" on Details; blank = \"About this product\".\n      getShortTitle: function () { return readShortTitle(); },\n      // PDP-DISCLAIMERS: the notices showing now on each side of the phone purchase button (MOBILE-NOTICE-PLACEMENT 2026-10-28: below on its own seam).\n      getPageNotices: function () { return readPhoneNotices('above_add_to_cart'); },\n      getBelowPageNotices: function () { return readPhoneNotices('below_add_to_cart'); },\n      // Fresh eligibility for a tap without projecting labels or prices for any group. Native select() remains the synchronous commit authority.\n      getSelectionGroup: function (key) {\n        var row = getDesignFirstPresentationRows(store).find(function (entry) { return entry.key === text(key); });\n        if (!row) return null;\n        if (row.key === 'quantity') {\n          var context = buildQuantityPricingContext(store, store.state.quantity);\n          return {\n            key: row.key,\n            selectedId: String(numberValue(store.state.quantity, 0)),\n            options: (context.quantityOptions || []).map(function (quantity) { return { id: String(quantity), disabled: false }; })\n          };\n        }\n        return {\n          key: row.key,\n          selectedId: text((getSelectedOption(store, row.holder) || {}).hvId),\n          options: getVisibleOptions(store, row.holder).map(function (option) {\n            return { id: text(option && option.hvId), disabled: !!(option && option.outOfStock) || isOptionDisabledByRules(store, option) };\n          })\n        };\n      },\n      // Every option group the Intent First build renders, one row per group, with the same values, labels, price differences and availability the choice sheet shows.\n      getGroups: function (key, options) {\n        // Dashboard tiles need current values only. Price every choice only for an open picker; callers without this opt-in keep full rows.\n        var summaryOnly = !!(options && options.summaryOnly);\n        return getDesignFirstPresentationRows(store).filter(function (row) {\n          return !key || row.key === key;\n        }).map(function (row) {\n          var options = [];\n          if (!summaryOnly && row.key === 'quantity') {\n            var context = buildQuantityPricingContext(store, store.state.quantity);\n            var quantities = Array.isArray(context.quantityOptions) ? context.quantityOptions : [];\n            var prices = quantities.map(function (quantity) { return shownPrice(getPricePresentationForQuantity(store, quantity)); });\n            var highestUnit = prices.reduce(function (highest, price) { return Math.max(highest, numberValue(price && price.currentPerPiece, 0)); }, 0);\n            // BD-NO-ROW-ZERO-PRICE: no money for a choice no price row prices.\n            var quantityMoney = !showsNoPriceRow(store);\n            options = quantities.map(function (quantity, index) {\n              var price = prices[index] || {};\n              var savingsPercent = highestUnit > 0 ? Math.max(0, Math.round((1 - (numberValue(price.currentPerPiece, 0) / highestUnit)) * 100)) : 0;\n              return {\n                id: String(quantity),\n                label: Number(quantity).toLocaleString() + ' ' + getIntentFirstUnitNoun(store, quantity),\n                sublabel: quantityMoney ? formatShownMoney(numberValue(price.currentPerPiece, 0)) + '/' + getQuantityPerUnitLabel(store) : '',\n                delta: quantityMoney ? formatShownMoney(numberValue(price.total, 0)) + ' total' : '',\n                badge: quantityMoney && savingsPercent > 0 ? 'Save ' + savingsPercent + '%' : '',\n                selected: Number(store.state.quantity) === Number(quantity),\n                disabled: false,\n                imageUrl: '',\n                color: ''\n              };\n            });\n          } else if (!summaryOnly && row.holder) {\n            var holder = row.holder;\n            var selected = getSelectedOption(store, holder);\n            options = getVisibleOptions(store, holder).map(function (option) {\n              var id = text(option && option.hvId);\n              var active = !!(selected && text(selected.hvId) === id);\n              var difference = active ? null : getOptionPriceDifference(store, holder, option, false);\n              return {\n                id: id,\n                label: getOptionDisplayLabel(store, holder, option),\n                sublabel: getOptionFlavorText(option),\n                // SB-19 (2026-09-25): a row with no price change shows nothing.\n                delta: difference && Math.abs(numberValue(difference.amount, 0)) >= 0.005 ? formatOptionPriceDifference(difference.amount) : '',\n                badge: getOptionBadges(option)[0] || '',\n                selected: active,\n                disabled: !!(option && option.outOfStock) || isOptionDisabledByRules(store, option),\n                imageUrl: text(resolveOptionContextImageUrl(store, holder, option)) || text(getOptionPreviewUrl(option)),\n                color: text(getOptionHexColor(option))\n              };\n            });\n          }\n          // SB-19: the tile shows the value and, when the value splits into a\n          // lead and a qualifier (the shared Sides wording helper), the\n          // qualifier as a second line. Display only: option values, the page\n          // address and cart data never change.\n          var valueParts = getDesignFirstRowValueParts(store, row);\n          return {\n            key: row.key,\n            label: row.label,\n            value: valueParts.lead,\n            valueDetail: text(valueParts.sub),\n            hint: row.key === 'quantity' ? text((plainObject(readProductPresentationConfig(store).choiceSheet) || {}).quantitySubcopy) : text(getDesignFirstSheetSubcopy(store, row)),\n            selectedId: row.key === 'quantity' ? String(numberValue(store.state.quantity, 0)) : text((row.holder && getSelectedOption(store, row.holder) || {}).hvId),\n            allowCustomQuantity: row.key === 'quantity' && hasCanonicalNumericQuantityControl(store),\n            options: options\n          };\n        });\n      },\n      // Commit through the native holder controls (the only selection owner).\n      // SB-03/SB-23 (2026-09-25): a committed pick writes the page address at\n      // once, before the phone sheet retires its Back entry, so the address\n      // keeps the new choice.\n      select: function (key, valueId) {\n        if (text(key) === 'quantity') {\n          var quantityApplied = selectCanonicalQuantityValue(store, valueId);\n          if (quantityApplied) scheduleDesignerUrlStateSync(store, true);\n          return quantityApplied;\n        }\n        var row = getDesignFirstPresentationRows(store).find(function (entry) { return entry.key === text(key); });\n        var option = row && row.holder && getVisibleOptions(store, row.holder).find(function (entry) { return text(entry.hvId) === text(valueId); });\n        if (!option || option.outOfStock || isOptionDisabledByRules(store, option)) return false;\n        var control = findNativeHolderControl(store, text(key), text(valueId));\n        if (control && !control.disabled && typeof control.click === 'function') {\n          control.click();\n          if (store.selectedDesignCompatibilityConflict) showNativeWorkflow();\n          var applied = text(store.state.selections[text(key)]) === text(valueId);\n          if (applied) scheduleDesignerUrlStateSync(store, true);\n          return applied;\n        }\n        return false;\n      },\n      getSelections: function () {\n        return { selections: Object.assign({}, store.state.selections), quantity: store.state.quantity };\n      },\n      // Pure price projection for a draft (Quick Build editors): the same\n      // pricing rules on a copy of the state, never committed.\n      projectPrice: function (draft) {\n        var source = draft && typeof draft === 'object' ? draft : {};\n        var previewStore = Object.assign({}, store);\n        previewStore.state = Object.assign({}, store.state || {}, {\n          selections: Object.assign({}, store.state && store.state.selections || {}, plainObject(source.selections) || {}),\n          apparelSizes: Object.assign({}, store.state && store.state.apparelSizes || {})\n        });\n        if (Number(source.quantity) > 0) previewStore.state.quantity = Number(source.quantity);\n        previewStore.uiState = Object.assign({}, store.uiState || {});\n        try { recalculate(previewStore); } catch (_) { return null; }\n        if (!text(previewStore.state && previewStore.state.finalSku)) return null;\n        return formatMobileExperiencePrice(store, getPricePresentation(previewStore), previewStore);\n      },\n      getPrice: function () { return formatMobileExperiencePrice(store, getPricePresentation(store)); },\n      getSummary: function () { return buildCompactConfigurationSummary(store); },\n      captureArtworkOperation: function () { return captureArtworkOperation(store); },\n      getArtwork: function () {\n        var availability = getStoreArtworkAvailability(store);\n        var mode = text(store.state.artworkMode).toLowerCase();\n        var project = store.state.project || {};\n        var template = store.state.template;\n        var uploads = getPrimaryArtworkUploadFiles(store);\n        var result = { notice: store.artworkChoiceNotice, purchaseNotice: getPurchaseNotice(store), state: 'none', label: 'Choose design', detail: '', required: !!getGuidedArtworkStepRequirement(store) };\n        if (text(project.projectId)) {\n          result.state = 'project';\n          result.label = getContextualSelectedDesignTitle(store);\n          result.detail = 'Your saved design';\n        } else if (template && (mode === 'designonline' || mode === 'editservice' || !mode)) {\n          result.state = 'template';\n          result.label = text(template.title) || 'Starting design';\n          result.detail = mode === 'editservice' ? 'We personalize it for you' : 'Starting design';\n        } else if (mode === 'uploadfiles' && uploads.length) {\n          result.state = 'upload';\n          result.label = 'Your upload';\n          result.detail = uploads.length + (uploads.length === 1 ? ' file' : ' files');\n        } else if (mode === 'uploadcanva' && text(store.state.canvaUrl)) {\n          result.state = 'canva';\n          result.label = 'Canva link';\n        } else if (mode === 'youhaveart') {\n          result.state = 'later';\n          result.label = 'Artwork after checkout';\n          result.detail = 'We collect it after you order';\n        } else if (mode === 'reorder') {\n          result.state = 'reorder';\n          result.label = 'Past design';\n        }\n        result.prices = {};\n        var routeModes = { upload: 'uploadfiles', canva: 'uploadcanva', later: 'youhaveart', reorder: 'reorder', design: 'designonline' };\n        Object.keys(routeModes).forEach(function (key) { result.prices[key] = mappedArtworkPathPrice(store, routeModes[key], key === 'design' ? store.state.template : null); });\n        result.routes = {\n          templates: (canApplyArtworkMethod(store, 'designonline') || canApplyArtworkMethod(store, 'editservice')) && getArtworkStripTemplates(store).length > 0,\n          design: canApplyArtworkMethod(store, 'designonline') && !isPitchPrintLaunchProvider(store),\n          upload: canApplyArtworkMethod(store, 'uploadfiles'),\n          canva: canApplyArtworkMethod(store, 'uploadcanva'),\n          later: canApplyArtworkMethod(store, 'youhaveart'),\n          reorder: canApplyArtworkMethod(store, 'reorder'),\n          more: !isArtworkSectionAdminDisabled(store)\n        };\n        return result;\n      },\n      getReadiness: function () {\n        var purchase = store.root.querySelector('[data-bg-presentation-purchase]');\n        return {\n          title: nodeText('[data-bg-intent-first-readiness-title]'),\n          copy: nodeText('[data-bg-intent-first-readiness-copy]'),\n          purchaseLabel: text(purchase && purchase.textContent) || 'Add to cart',\n          // SB-17: phones show the price beside the button, never inside it.\n          actionLabel: getPresentationPurchaseLabel(store, { withoutPrice: true }),\n          purchaseDisabled: !!(purchase && purchase.disabled),\n          purchaseBusy: !!(purchase && purchase.getAttribute('aria-busy') === 'true'),\n          artworkRequired: !!(purchase && purchase.getAttribute('data-bg-artwork-required') === 'true'),\n          approvalPending: isPitchPrintDesignApprovalPending(store) // QUICK-BUILD-2D: Add to cart opens the shared panel at the box\n        };\n      },\n      // The presentation purchase button owns the cart handoff (artwork\n      // step reveal, revalidation, the signed native submit).\n      purchase: function () {\n        showNativeWorkflow();\n        var purchase = store.root.querySelector('[data-bg-presentation-purchase]');\n        if (purchase && typeof purchase.click === 'function') {\n          purchase.click();\n          return true;\n        }\n        var nativeButton = getSubmitButton(store);\n        if (nativeButton && !nativeButton.disabled && typeof nativeButton.click === 'function') {\n          nativeButton.click();\n          return true;\n        }\n        return false;\n      },\n      artworkAction: function (action) {\n        var key = text(action);\n        showNativeWorkflow();\n        var blocks = readBlocks(store);\n        if (key === 'manage') return true;\n        if (key === 'more') { requestContextualArtworkChange(store); return true; }\n        if (key === 'templates') { handleArtworkAction(store, blocks, 'browse-templates', null); return true; }\n        if (key === 'upload') {\n          handleArtworkAction(store, blocks, 'upload-files', null);\n          var input = store.root.querySelector('[data-bg-upload-field]');\n          if (input && typeof input.click === 'function') {\n            try { input.click(); } catch (_) { /* the native field stays reachable */ }\n          }\n          return true;\n        }\n        if (key === 'canva') { handleArtworkAction(store, blocks, 'share-canva', null); return true; }\n        if (key === 'reorder') { handleArtworkAction(store, blocks, 'reorder', null); return true; }\n        if (key === 'later') { handleArtworkAction(store, blocks, 'send-later', null); return true; }\n        if (key === 'design') {\n          if (!applyArtworkMethodOption(store, 'designonline')) return false;\n          setArtworkChoice(store, 'need-design', 'use-template', 'designonline');\n          render(store);\n          void launchDesigner(store, { authPrompt: 'customize-online' }); return true;\n        }\n        if (key === 'change') { requestContextualArtworkChange(store); return true; }\n        return false;\n      },\n      getTemplates: function (limit) {\n        var templates = getArtworkStripTemplates(store);\n        if (!templates.length) ensureArtworkStripDataLoaded(store);\n        var selectedKey = store.state.template ? getTemplateSelectionKey(store.state.template) : '';\n        var max = Math.max(1, Math.round(numberValue(limit, 6)));\n        return {\n          total: templates.length,\n          items: templates.slice(0, max).map(function (template) {\n            var key = getTemplateSelectionKey(template);\n            return {\n              key: key,\n              title: text(template.title) || 'Design template',\n              previewUrl: text(getTemplateFrontPreview(template)),\n              selected: !!selectedKey && key === selectedKey\n            };\n          })\n        };\n      },\n      chooseTemplate: function (key) {\n        if (!findStripTemplate(key)) return false;\n        showNativeWorkflow();\n        var target = document.createElement('button'); target.setAttribute('data-bg-template-key', text(key));\n        handleArtworkAction(store, readBlocks(store), 'strip-template', target);\n        return true;\n      },\n      getPhotos: function () { return captureDefaultMediaItems(store).map(function (item) { return { url: text(item.url), alt: text(item.alt) }; }); },\n      // APP-MODE-S1 (OD-379): the flat stage (no 3D preview) shows what the page gallery leads with: the design picture (the gallery's\n      // own resolver), else the 3D card's photo; pending while a saved design renders. QUICK-BUILD-2D: back = its picture 2 only, checked alike.\n      getStagePicture: function () {\n        var design = getIntentFirstRealDesignPreview(store), second = design && getDesignerMediaPreviewState(store).images[1], back = '';\n        try { var parsed = second && new URL(text(second.url), window.location.origin); if (parsed && /^https?:$/.test(parsed.protocol)) back = parsed.toString(); } catch (_) {}\n        return { design: design ? design.url : '', back: back, photo: text(decideHeroOverrideImage(store)) || text((captureDefaultMediaItems(store)[0] || {}).url),\n          pending: !design && isDesignPreviewPending(store), pendingLabel: getProductPreviewCopy(store, 'designLoading', 'Loading your design\u2026') };\n      },\n      getPreviewOwner: function () { return productInfo ? productInfo.querySelector('[data-bg-intent-first-live-mockup]') : null; },\n      is3dOpen: function () { return isIntentFirstProductPreview3dOpen(store); },\n      pauseAutoRotate: function () {\n        var viewer = store.productPreview3d && store.productPreview3d.viewer;\n        if (viewer && typeof viewer.setAutoRotate === 'function') {\n          try { viewer.setAutoRotate({ enabled: false }); } catch (_) {}\n        }\n      },\n      // SB-02/SB-12 (2026-09-25): the store's contact methods for the phone\n      // Help view. Chat comes from the page's chat snippet, which registers\n      // window.BgSiteChat only when the store's chat setting names a\n      // provider; the phone is the store contact phone from site settings.\n      getSupport: function () {\n        var site = plainObject(window.__siteCfg) || {};\n        var schema = plainObject(site.schema) || {};\n        var dial = text(schema.contact_phone).replace(/[^0-9+]/g, '');\n        var chat = window.BgSiteChat && typeof window.BgSiteChat.open === 'function' ? window.BgSiteChat : null;\n        return {\n          chat: chat ? { open: function () { return chat.open(); } } : null,\n          phone: dial.replace(/\\D/g, '').length >= 7 ? { href: 'tel:' + dial, label: text(site.phone_display) || text(schema.contact_phone) } : null\n        };\n      },\n      // SB-08 (2026-09-25) Scene seam: on a phone layout the Scene button\n      // opens the layout's own bottom sheet. The viewer snapshot stays the\n      // only state owner; the choices match the runtime's Scene sheet.\n      getSceneTrigger: function () {\n        var chrome = getProductPreview3dChrome(store);\n        return chrome && chrome.sceneButton && !chrome.sceneButton.hidden ? chrome.sceneButton : null;\n      },\n      getScene: function () {\n        var viewer = readScenePreviewViewer();\n        if (!viewer) return null;\n        var snapshot = viewer.state;\n        var background = resolveProductPreview3dBackgroundOptions(snapshot);\n        var scene = {\n          background: background.options.length ? {\n            current: text(background.current),\n            options: background.options.map(function (option) { return { id: text(option.id), label: text(option.label) }; })\n          } : null,\n          ground: snapshot.groundAvailable ? { on: !!snapshot.groundVisible } : null,\n          autoRotate: typeof viewer.setAutoRotate === 'function' ? { on: !!snapshot.autoRotate } : null\n        };\n        return scene.background || scene.ground || scene.autoRotate ? scene : null;\n      },\n      applyScene: function (change) {\n        var viewer = readScenePreviewViewer();\n        var source = plainObject(change) || {};\n        if (!viewer) return false;\n        if (text(source.backgroundId)) {\n          var background = resolveProductPreview3dBackgroundOptions(viewer.state);\n          var offered = background.options.some(function (option) { return text(option.id) === text(source.backgroundId); });\n          if (!offered) return false;\n          applyProductPreview3dBackground(store, background.kind, text(source.backgroundId));\n        }\n        if (typeof source.ground === 'boolean' && typeof viewer.setGroundVisible === 'function') viewer.setGroundVisible(source.ground);\n        if (typeof source.autoRotate === 'boolean' && typeof viewer.setAutoRotate === 'function') viewer.setAutoRotate({ enabled: source.autoRotate });\n        return true;\n      },\n      track: function (name, payload) {\n        emitStorefrontEvent(store, 'mobile_experience_' + text(name).replace(/[^a-z0-9_]/gi, '_').toLowerCase(), 'presentation', payload || {}, 'low');\n      }\n    };\n  }\n\n  function bindMobileExperienceViewportListeners(store) {\n    if (store.mobileExperienceViewportBound) return;\n    store.mobileExperienceViewportBound = true;\n    var timer = 0;\n    var lastWidth = Number(window.innerWidth || 0);\n    var onChange = function () {\n      var width = Number(window.innerWidth || 0);\n      var widthChanged = width !== lastWidth;\n      lastWidth = width;\n      // A soft keyboard shrinks only the height: never tear the experience\n      // down under a field the customer is typing into.\n      var active = document.activeElement;\n      if (!widthChanged && active && active.matches && active.matches('input, textarea, select')\n        && active.closest('product-info[data-bg-mobile-experience-active]')) return;\n      window.clearTimeout(timer);\n      timer = window.setTimeout(function () { syncProductPageMobileExperience(store); }, 150);\n    };\n    window.addEventListener('resize', onChange);\n    window.addEventListener('orientationchange', onChange);\n  }\n\n  function teardownProductPageMobileExperience(store, reason) {\n    var active = store && store.mobileExperience;\n    if (!active) return;\n    store.mobileExperience = null;\n    try { active.destroy(); } catch (_) { /* fail open: the native page is already the truth */ }\n    emitStorefrontEvent(store, 'mobile_experience_state', 'presentation', { state: 'standard', reason: text(reason) }, 'low');\n  }\n\n  // APP-MODE-S4 (both phone layouts since QUICK-BUILD-2D): consume PitchPrint's close, never its save or a restored project. The live\n  // reuse mode is 210's in-page return signal. Delay lets all close handlers render first; duplicate close notifications coalesce.\n  function syncMobilePitchPrintReturn(store) {\n    if (!store.mobileExperience || !isPitchPrintLaunchProvider(store)) return;\n    var state = store.mobilePitchPrintReturn;\n    if (!state) {\n      state = store.mobilePitchPrintReturn = { client: null, timer: 0, open: false, consumed: '' };\n      state.shown = function () { state.open = true; window.clearTimeout(state.timer); };\n      state.closed = function () {\n        state.open = false;\n        var active = store.mobileExperience;\n        window.clearTimeout(state.timer);\n        state.timer = window.setTimeout(function () {\n          var project = store.state.project || {};\n          var key = text(project.projectId) + ':' + text(project.refreshToken);\n          if (state.open || store.sectionUnloaded || !store.root.isConnected || store.root.__bgDesignerStore !== store || store.mobileExperience !== active || !active\n            || !isPitchPrintLaunchProvider(store) || store.pitchPrintReuseMode !== 'live' || !text(project.projectId) || key === state.consumed) return;\n          state.consumed = key;\n          active.openNativeWorkflow({ pitchPrintReturn: true });\n        }, 400);\n      };\n      window.addEventListener('pagehide', state.shown);\n      window.addEventListener('message', function (event) {\n        if (event.origin !== 'https://pitchprint.io') return;\n        var data = typeof event.data === 'string' ? parseJson(event.data, null) : event.data;\n        if (data && (data.event === 'before-show' || data.event === 'editor-shown')) state.shown();\n        if (data && data.event === 'after-close-app') state.closed();\n      });\n    }\n    var client = window.ppclient;\n    if (!client || typeof client.on !== 'function' || state.client === client) return;\n    state.client = client;\n    client.on('before-show', state.shown);\n    client.on('editor-shown', state.shown);\n    client.on('after-close-app', state.closed);\n  }\n\n  function syncProductPageMobileExperience(store) {\n    if (!store || !store.root) return;\n    var experience = resolveProductPageMobileExperience(store);\n    if (experience) clearLegacyStandardPageRequest(store);\n    var gate = describeMobileExperienceGate(store, experience);\n    var productInfo = store.root.closest('product-info');\n    if (productInfo) {\n      if (experience && !store.sectionUnloaded) productInfo.setAttribute('data-bg-mobile-experience', experience);\n      else productInfo.removeAttribute('data-bg-mobile-experience');\n    }\n    if (experience && !store.sectionUnloaded) bindMobileExperienceViewportListeners(store);\n    var active = store.mobileExperience;\n    if (active && (gate || active.experience !== experience)) {\n      teardownProductPageMobileExperience(store, gate || 'switched');\n      active = null;\n    }\n    if (gate) {\n      if (experience && gate !== 'not_ready' && !store.mobileExperienceGateReported) {\n        store.mobileExperienceGateReported = true;\n        emitStorefrontEvent(store, 'mobile_experience_state', 'presentation', { state: 'standard', reason: gate, requested: experience }, 'low');\n      }\n      return;\n    }\n    if (active) {\n      syncMobilePitchPrintReturn(store);\n      try { active.sync(); } catch (_) { teardownProductPageMobileExperience(store, 'sync_error'); }\n      return;\n    }\n    if (store.mobileExperienceFailed === experience || store.mobileExperienceMounting) return;\n    store.mobileExperienceMounting = true;\n    loadMobileExperienceModule(store).then(function (module) {\n      store.mobileExperienceMounting = false;\n      if (store.mobileExperience || store.sectionUnloaded) return;\n      if (resolveProductPageMobileExperience(store) !== experience || describeMobileExperienceGate(store, experience)) return;\n      var controller = module.mount(buildMobileExperienceAdapter(store), experience);\n      if (!controller || typeof controller.sync !== 'function' || typeof controller.destroy !== 'function') {\n        store.mobileExperienceFailed = experience;\n        return;\n      }\n      controller.experience = experience;\n      store.mobileExperience = controller;\n      syncMobilePitchPrintReturn(store);\n      emitStorefrontEvent(store, 'mobile_experience_state', 'presentation', { state: experience }, 'low');\n    }).catch(function (error) {\n      store.mobileExperienceMounting = false;\n      store.mobileExperienceFailed = experience;\n      emitStorefrontError(store, 'mobile_experience_mount_failed', 'mobile_experience', error, { experience: experience });\n    });\n  }\n\n  // Pure precedence seam kept separately so tests can execute the safety\n  // matrix instead of only matching source text.\n  //\n  // OP-08 class rule (ST2 completes it): the testing-presentation gate reads\n  // NO product-handle allow-list and no per-family theme capability bit. An\n  // explicitly stored admin layout, an explicit theme-section choice, or an\n  // admin-permitted URL override IS the capability.\n  function resolveProductFormPresentation(input) {\n    var source = input && typeof input === 'object' ? input : {};\n    var suffix = text(source.templateSuffix).toLowerCase();\n    var configured = normalizeProductFormPresentation(source.configured);\n    var productLayout = text(source.productLayout).toLowerCase();\n    var override = text(source.override).toLowerCase();\n    var intentFirstCompatible = source.intentFirstCompatible === true;\n    var oldPreviewOverride = override === 'legacy' || override === 'guided'\n      || override === 'guided_no_accordions' || override === 'guided_desktop_open_mobile_closed' || override === 'version_2';\n    var intentFirstPreviewOverride = override === 'intent_first'\n      && source.allowPrototypeUrlOverride === true\n      && intentFirstCompatible;\n    if (oldPreviewOverride) return normalizeProductFormPresentation(override);\n    if (override && !isKnownProductFormPresentation(override)) return 'legacy';\n    if (intentFirstPreviewOverride) return 'intent_first';\n    if (productLayout === 'guided' || productLayout === 'guided_no_accordions' || productLayout === 'guided_desktop_open_mobile_closed') return 'guided';\n    if (productLayout === 'intent_first' && intentFirstCompatible) return 'intent_first';\n    if (configured === 'intent_first' && intentFirstCompatible) return 'intent_first';\n    // Native Guided remains the inherited default when no explicit validated\n    // product layout is present. Admin's product-level choice intentionally\n    // outranks inheritance so the same mapped product can opt into a concept.\n    if (source.nativeGuidedLayout === true || suffix === 'designer-storefront-guided') return 'guided';\n    if (configured === 'intent_first' && !intentFirstCompatible) return 'legacy';\n    return configured;\n  }\n\n  function readGuidedPresentationSettings(store) {\n    var presentation = readProductPresentationConfig(store);\n    return plainObject(presentation.guided) || {};\n  }\n\n  // True when the resolved presentation is guided AND the product (or a\n  // bg_form preview override) selected the \"Guided. No accordions\" variant:\n  // every step renders permanently expanded with no collapse affordance.\n  function readGuidedLayoutVariant(store) {\n    var override = '';\n    try {\n      override = text(new URLSearchParams(window.location.search).get('bg_form')).toLowerCase();\n    } catch (_) {}\n    if (override === 'guided' || override === 'guided_no_accordions' || override === 'guided_desktop_open_mobile_closed') return override;\n    var presentation = readProductPresentationConfig(store);\n    var layout = text(presentation.layout).toLowerCase();\n    if (!layout) layout = readServerPresentationLayoutSeed(store);\n    return layout;\n  }\n\n  function isGuidedNoAccordionsLayout(store) {\n    if (getProductFormPresentation(store) !== 'guided') return false;\n    var layout = readGuidedLayoutVariant(store);\n    return layout === 'guided_no_accordions'\n      || (layout === 'guided_desktop_open_mobile_closed' && !isMobileProductOptionsViewport());\n  }\n\n  function hasNativeGuidedLayout(store) {\n    if (store && store.config && store.config.nativeGuidedLayout === true) return true;\n    var productInfo = store && store.root && store.root.closest('product-info');\n    return !!(productInfo && productInfo.getAttribute('data-bg-guided-native-layout') === 'true');\n  }\n\n  function getProductFormPresentation(store) {\n    if (store && store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid\n      && store.config && store.config.intentFirstPresentationCompatible === true) {\n      return 'intent_first';\n    }\n    var presentationConfig = readProductPresentationConfig(store);\n    var override = '';\n    try {\n      override = new URLSearchParams(window.location.search).get('bg_form');\n    } catch (_) {}\n    var productLayout = text(presentationConfig.layout);\n    if (!productLayout) productLayout = readServerPresentationLayoutSeed(store);\n    return resolveProductFormPresentation({\n      templateSuffix: store && store.config && store.config.templateSuffix,\n      nativeGuidedLayout: hasNativeGuidedLayout(store),\n      configured: store && store.config && store.config.productFormPresentation,\n      productLayout: productLayout,\n      allowPrototypeUrlOverride: presentationConfig.allowPrototypeUrlOverride === true,\n      intentFirstCompatible: store && store.config && store.config.intentFirstPresentationCompatible === true,\n      override: override\n    });\n  }\n\n  function syncProductFormPresentationBodyClasses() {\n    if (!document.body) return;\n    var intentFirst = document.querySelector('product-info[data-bg-product-form-presentation=\"intent_first\"]');\n    var activeProductInfo = intentFirst;\n    document.body.classList.toggle('bg-product-form--intent-first', !!intentFirst);\n\n    var main = document.getElementById('MainContent');\n    if (!main) return;\n    Array.prototype.slice.call(main.children || []).forEach(function (child) {\n      if (!child || !child.removeAttribute) return;\n      child.removeAttribute('data-bg-pdp-band');\n      child.removeAttribute('data-bg-pdp-band-tone');\n    });\n    if (!activeProductInfo || !activeProductInfo.closest) return;\n    var productSection = activeProductInfo.closest('.shopify-section');\n    if (!productSection || productSection.parentNode !== main) return;\n    var afterProduct = false;\n    var bandIndex = 0;\n    var pendingReviewTone = '';\n    Array.prototype.slice.call(main.children || []).forEach(function (child) {\n      if (child === productSection) {\n        afterProduct = true;\n        return;\n      }\n      if (!afterProduct || !child.matches || !child.matches('.shopify-section')) return;\n      var tone = pendingReviewTone || (bandIndex % 2 === 0 ? 'surface' : 'tint');\n      child.setAttribute('data-bg-pdp-band', '');\n      child.setAttribute('data-bg-pdp-band-tone', tone);\n      if (pendingReviewTone) {\n        pendingReviewTone = '';\n        bandIndex += 1;\n      } else if (child.querySelector && child.querySelector('.prodMetaBlockHeader')) {\n        // The static Reviews heading and the following Stamped app are one\n        // visual section in the handoff, while the app's internals stay owned\n        // by Stamped.\n        pendingReviewTone = tone;\n      } else {\n        bandIndex += 1;\n      }\n    });\n  }\n\n  function bindExperimentalPresentationLifecycle() {\n    if (document.__bgExperimentalPresentationLifecycleBound) return;\n    document.__bgExperimentalPresentationLifecycleBound = true;\n    document.addEventListener('shopify:section:unload', function (event) {\n      var section = event && event.target;\n      if (!section || !section.querySelectorAll) return;\n      var roots = Array.prototype.slice.call(section.querySelectorAll('[data-bg-designer-storefront-root]'));\n      if (section.matches && section.matches('[data-bg-designer-storefront-root]')) roots.unshift(section);\n      roots.forEach(function (root) {\n        var store = root && root.__bgDesignerStore;\n        var productInfo = root && root.closest && root.closest('product-info');\n        if (store) {\n          store.sectionUnloaded = true;\n          cancelSetupDataRereads(store);\n          store.intentFirstActiveIntent = '';\n          teardownProductPageMobileExperience(store, 'section_unload');\n        }\n        if (productInfo) {\n          productInfo.removeAttribute('data-bg-product-form-presentation');\n          productInfo.removeAttribute('data-bg-guided-no-accordions');\n          productInfo.removeAttribute('data-bg-guided-hide-step-numbers');\n          productInfo.removeAttribute('data-bg-intent-first-ready');\n          productInfo.removeAttribute('data-bg-intent-first-media-ready');\n        }\n        Array.prototype.slice.call(productInfo ? productInfo.querySelectorAll(\n          '[data-bg-intent-first-title-eyebrow], [data-bg-intent-first-title-tagline]'\n        ) : []).forEach(function (node) {\n          if (node.parentNode) node.parentNode.removeChild(node);\n        });\n        if (root) {\n          root.removeAttribute('data-bg-product-form-presentation');\n          root.removeAttribute('data-bg-guided-no-accordions');\n          root.removeAttribute('data-bg-guided-hide-step-numbers');\n        }\n        var sheet = document.querySelector('[data-bg-design-first-sheet]');\n        if (sheet && sheet.__bgDesignFirstStore === store) closeDesignFirstChoiceSheet(store);\n        var sticky = document.getElementById('bgDesignerStickyPurchaseBar');\n        if (sticky && sticky.__bgDesignerStore === store) {\n          setStickyPurchaseVisible(sticky, false);\n          sticky.__bgDesignerStore = null;\n        }\n      });\n      window.requestAnimationFrame(syncProductFormPresentationBodyClasses);\n    });\n  }\n\n  function applyProductFormPresentationMode(store) {\n    if (!store || !store.root) return 'legacy';\n    if (store.sectionUnloaded) return 'legacy';\n    var mode = getProductFormPresentation(store);\n    var productInfo = store.root.closest('product-info');\n    var cartDesignEditor = getCartDesignEditor(store);\n    store.productFormPresentation = mode;\n    store.root.setAttribute('data-bg-product-form-presentation', mode);\n    if (productInfo) productInfo.setAttribute('data-bg-product-form-presentation', mode);\n    // Guided variant flags are attributes so CSS can restyle without a second\n    // render pass: no-accordions drops the between-step divider borders, and\n    // the per-product hideStepNumbers setting removes the 1/2/3 bubbles.\n    var guidedNoAccordions = mode === 'guided' && isGuidedNoAccordionsLayout(store);\n    var hideGuidedStepNumbers = mode === 'guided'\n      && readGuidedPresentationSettings(store).hideStepNumbers === true;\n    [store.root, productInfo].forEach(function (target) {\n      if (!target) return;\n      if (guidedNoAccordions) target.setAttribute('data-bg-guided-no-accordions', 'true');\n      else target.removeAttribute('data-bg-guided-no-accordions');\n      if (hideGuidedStepNumbers) target.setAttribute('data-bg-guided-hide-step-numbers', 'true');\n      else target.removeAttribute('data-bg-guided-hide-step-numbers');\n    });\n    syncProductPageShellAttributes(store, productInfo);\n    syncProductFormPresentationBodyClasses();\n    if (cartDesignEditor) {\n      store.root.setAttribute('data-bg-cart-design-editor', cartDesignEditor);\n      if (productInfo) productInfo.setAttribute('data-bg-cart-design-editor', cartDesignEditor);\n    } else {\n      store.root.removeAttribute('data-bg-cart-design-editor');\n      if (productInfo) productInfo.removeAttribute('data-bg-cart-design-editor');\n    }\n    return mode;\n  }\n\n  function setGuidedText(element, value) {\n    if (!element) return;\n    var nextValue = text(value);\n    if (element.textContent !== nextValue) element.textContent = nextValue;\n  }\n\n  function ensureGuidedProductFormChrome(store) {\n    if (!store || !store.root || applyProductFormPresentationMode(store) !== 'guided') return null;\n    var root = store.root;\n    var optionsBlock = root.querySelector('[data-bg-designer-block=\"options\"]');\n    if (!optionsBlock) return null;\n    var priceOverview = root.querySelector('[data-bg-guided-price-overview]');\n    if (!priceOverview) {\n      priceOverview = document.createElement('section');\n      priceOverview.className = 'bg-designer-storefront-guided__price-overview';\n      priceOverview.setAttribute('data-bg-guided-price-overview', '');\n      priceOverview.setAttribute('aria-label', 'Current configuration price');\n      priceOverview.setAttribute('aria-live', 'polite');\n      priceOverview.innerHTML = '' +\n        '<div class=\"bg-designer-storefront-guided__price-row\">' +\n          '<strong class=\"bg-designer-storefront-guided__price\" data-bg-guided-price></strong>' +\n          '<s class=\"bg-designer-storefront-guided__compare\" data-bg-guided-compare hidden></s>' +\n          '<span class=\"bg-designer-storefront-guided__unit\" data-bg-guided-unit></span>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-guided__value-row\">' +\n          '<span class=\"bg-designer-storefront-guided__savings\" data-bg-guided-savings hidden></span>' +\n          '<span class=\"bg-designer-storefront-guided__shipping\" data-bg-guided-shipping hidden>Free shipping</span>' +\n        '</div>';\n      root.insertBefore(priceOverview, optionsBlock);\n    }\n    var heading = root.querySelector('[data-bg-guided-config-heading]');\n    if (heading && heading.parentNode) heading.parentNode.removeChild(heading);\n    return {\n      priceOverview: priceOverview\n    };\n  }\n\n  function ensureGuidedMobileProductOverview(store) {\n    if (!store || !store.root || getProductFormPresentation(store) !== 'guided') return null;\n    var infoContainer = store.root.closest('.product__info-container');\n    if (!infoContainer) return null;\n    var productInfo = store.root.closest('product-info');\n    var overview = productInfo && productInfo.querySelector('[data-bg-guided-mobile-overview]');\n    if (!overview) {\n      overview = document.createElement('section');\n      overview.className = 'bg-designer-storefront-guided__mobile-overview';\n      overview.setAttribute('data-bg-guided-mobile-overview', '');\n      overview.setAttribute('aria-label', 'Current configuration price');\n      overview.setAttribute('aria-live', 'polite');\n      overview.setAttribute('aria-atomic', 'true');\n      overview.innerHTML = '' +\n        '<div class=\"bg-designer-storefront-guided__mobile-price-row\">' +\n          '<strong class=\"bg-designer-storefront-guided__mobile-price\" data-bg-guided-mobile-price></strong>' +\n          '<s class=\"bg-designer-storefront-guided__mobile-compare\" data-bg-guided-mobile-compare hidden></s>' +\n          '<span class=\"bg-designer-storefront-guided__mobile-unit\" data-bg-guided-mobile-unit></span>' +\n        '</div>' +\n        '<p class=\"bg-designer-storefront-guided__mobile-savings\" data-bg-guided-mobile-savings hidden></p>';\n      infoContainer.insertBefore(overview, store.root);\n    }\n    return overview;\n  }\n\n  function getGuidedTurnaroundText(store, priceRecord) {\n    var turnaround = text(priceRecord && priceRecord.estTurnaround);\n    if (!turnaround) return '';\n    var baseTurnaround = turnaround\n      .replace(/\\s+after proof approval\\.?$/i, '')\n      .replace(/\\s*\\.*$/, '');\n    if (!baseTurnaround) return '';\n    // RE3: the proof-approval suffix follows the proof-copy lane \u2014 a design\n    // made online has no staff proof step, while upload/service/reorder lanes\n    // keep it.\n    return baseTurnaround + (isDesignOnlineNoProofLane(store) ? '' : ' after proof approval');\n  }\n\n  function renderGuidedMobileProductOverview(store, presentation) {\n    var overview = ensureGuidedMobileProductOverview(store);\n    if (!overview) return;\n    presentation = shownPrice(presentation);\n    var total = numberValue(presentation && presentation.total, 0);\n    var compareTotal = numberValue(presentation && presentation.compareTotal, 0);\n    var savings = Math.max(0, numberValue(presentation && presentation.savings, 0));\n    var quantity = Math.max(1, numberValue(presentation && presentation.quantity, 1));\n    // EDDM-ROUTE-STEP: while the quantity waits for routes the phone price\n    // line asks for routes in the price slot, in the same one-line box.\n    // EDDM-ROUTE-PENDING-HINTS: the ask has its own short copy key so it\n    // stays one line on a 320 px phone, and a sale keeps its savings line\n    // box (a non-breaking space, no amount) so nothing moves when routes\n    // arrive.\n    var routesPending = isEddmRouteQuantityPending(store);\n    var price = overview.querySelector('[data-bg-guided-mobile-price]');\n    var compare = overview.querySelector('[data-bg-guided-mobile-compare]');\n    var unit = overview.querySelector('[data-bg-guided-mobile-unit]');\n    var savingsNode = overview.querySelector('[data-bg-guided-mobile-savings]');\n    overview.classList.remove('is-loading');\n    overview.setAttribute('aria-busy', 'false');\n    setGuidedText(price, routesPending ? getGuidedCopy(store, 'mobilePriceRoutesPrompt') : formatShownMoney(total));\n    if (compare) {\n      compare.hidden = routesPending || !hasShownComparePrice(compareTotal, total);\n      setGuidedText(compare, compare.hidden ? '' : formatShownMoney(compareTotal));\n    }\n    setGuidedText(unit, routesPending ? '' : buildQuantityUnitLine(store, quantity, presentation.currentPerPiece));\n    if (savingsNode) {\n      var mobileSaleNote = getSalePendingNote(store);\n      savingsNode.hidden = !(savings > 0.01) && !mobileSaleNote;\n      savingsNode.classList.toggle('is-sale-pending', !!mobileSaleNote);\n      syncSalePendingRole(savingsNode, !!mobileSaleNote);\n      var savingsText = savingsNode.hidden ? '' : (routesPending ? '\u00A0' : (mobileSaleNote || 'You save ' + formatShownMoney(savings)));\n      if (savingsNode.textContent !== savingsText) savingsNode.textContent = savingsText;\n    }\n    overview.hidden = !(total > 0) || showsNoPriceRow(store);\n  }\n\n  function syncGuidedMobileProductLayout(store) {\n    if (!store || !store.root || getProductFormPresentation(store) !== 'guided') return;\n    if (hasNativeGuidedLayout(store)) return;\n    var infoContainer = store.root.closest('.product__info-container');\n    var infoWrapper = infoContainer && infoContainer.closest('.product__info-wrapper');\n    var product = infoWrapper && infoWrapper.closest('.product');\n    if (!infoContainer || !infoWrapper || !product) return;\n    if (!store.guidedMobileLayout) {\n      var mediaWrapper = product.querySelector(':scope > .product__media-wrapper');\n      if (!mediaWrapper) return;\n      var placeholder = document.createComment('bg-guided-mobile-media-origin');\n      product.insertBefore(placeholder, mediaWrapper);\n      store.guidedMobileLayout = {\n        mediaWrapper: mediaWrapper,\n        placeholder: placeholder,\n        infoContainer: infoContainer,\n        product: product\n      };\n    }\n    var layout = store.guidedMobileLayout;\n    var mobile = !!(window.matchMedia && window.matchMedia('(max-width: 749px)').matches);\n    if (mobile) {\n      if (layout.mediaWrapper.parentElement !== layout.infoContainer || layout.mediaWrapper.nextElementSibling !== store.root) {\n        layout.infoContainer.insertBefore(layout.mediaWrapper, store.root);\n      }\n    } else if (layout.placeholder.parentNode && layout.mediaWrapper.parentNode !== layout.product) {\n      layout.placeholder.parentNode.insertBefore(layout.mediaWrapper, layout.placeholder.nextSibling);\n    }\n    if (!store.guidedMobileLayoutBound) {\n      store.guidedMobileLayoutBound = true;\n      window.addEventListener('resize', function () {\n        scheduleGuidedProductFormPresentation(store);\n      });\n    }\n  }\n\n  function renderGuidedPriceOverview(store) {\n    var chrome = ensureGuidedProductFormChrome(store);\n    if (!chrome) return;\n    var presentation = shownPrice(getPricePresentation(store));\n    var total = numberValue(presentation && presentation.total, 0);\n    var compareTotal = numberValue(presentation && presentation.compareTotal, 0);\n    var savings = Math.max(0, numberValue(presentation && presentation.savings, 0));\n    var quantity = Math.max(1, numberValue(presentation && presentation.quantity, 1));\n    var price = chrome.priceOverview.querySelector('[data-bg-guided-price]');\n    var compare = chrome.priceOverview.querySelector('[data-bg-guided-compare]');\n    var unit = chrome.priceOverview.querySelector('[data-bg-guided-unit]');\n    var savingsNode = chrome.priceOverview.querySelector('[data-bg-guided-savings]');\n    var shipping = chrome.priceOverview.querySelector('[data-bg-guided-shipping]');\n    renderGuidedMobileProductOverview(store, presentation);\n    setGuidedText(price, formatShownMoney(total));\n    if (compare) {\n      compare.hidden = !hasShownComparePrice(compareTotal, total);\n      setGuidedText(compare, compare.hidden ? '' : formatShownMoney(compareTotal));\n    }\n    setGuidedText(unit, buildQuantityUnitLine(store, quantity, presentation.currentPerPiece));\n    if (savingsNode) {\n      var guidedSaleNote = getSalePendingNote(store);\n      savingsNode.hidden = !(savings > 0.01) && !guidedSaleNote;\n      savingsNode.classList.toggle('is-sale-pending', !!guidedSaleNote);\n      syncSalePendingRole(savingsNode, !!guidedSaleNote);\n      setGuidedText(savingsNode, savingsNode.hidden ? '' : (guidedSaleNote || 'You save ' + formatShownMoney(savings)));\n    }\n    if (shipping) shipping.hidden = !(presentation && presentation.hasFreeShipping);\n    chrome.priceOverview.hidden = !(total > 0);\n  }\n\n  function getGuidedOptionStepSummary(store, holderId) {\n    var holder = (Array.isArray(store && store.holders) ? store.holders : []).find(function (entry) {\n      return getHolderId(entry) === holderId;\n    });\n    var selected = holder ? getSelectedOption(store, holder) : null;\n    if (!holder || !selected) return '';\n    var label = getOptionDisplayLabel(store, holder, selected);\n    var flavor = getOptionFlavorText(selected);\n    return label + (flavor ? ' \u00B7 ' + flavor : '');\n  }\n\n  function getGuidedArtworkStepSummary(store) {\n    // The v4 wizard treats a defaulted artwork mode as an open question until\n    // the customer answers it, so the step keeps prompting instead of\n    // reporting the silent default as a decision.\n    if (isVersionedArtworkWizardUnresolved(store)) return '';\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var primaryChoice = text(store && store.state && store.state.artworkPrimaryChoice);\n    var secondaryChoice = text(store && store.state && store.state.artworkSecondaryChoice);\n    var template = store && store.state && store.state.template;\n    var projectId = text(store && store.state && store.state.project && store.state.project.projectId);\n    if (mode === 'uploadcanva') {\n      return isValidCanvaUrl(store.state.canvaUrl) ? 'Canva link added' : 'Share Canva link \u2014 Link required';\n    }\n    if (mode === 'uploadfiles') {\n      var files = getPrimaryArtworkUploadFiles(store);\n      if (!files.length && hasEditorUploadedArtwork(store)) {\n        return isPitchPrintDesignApprovalPending(store) ? 'Design saved requiring approval' : 'Design saved';\n      }\n      return files.length\n        ? buildUploadedFileCountLabel(files)\n        : 'Upload print-ready file \u2014 File required';\n    }\n    if (mode === 'customdesign') {\n      var customDesignAmount = Math.max(0, numberValue(getPricePresentation(store).designFeeTotal, 0));\n      return 'Custom design' + (customDesignAmount > 0 ? ' \u00B7 +' + core.formatMoney(customDesignAmount) : '');\n    }\n    if (mode === 'youhaveart') return 'Artwork after checkout';\n    if (mode === 'freesetup' || mode === 'recreate' || mode === 'reorder') {\n      // An armed reorder reference names the chosen design \u2014 the summary is a\n      // decision record, not the method pitch.\n      if (mode === 'reorder' && isReorderReferenceSelected(store)) {\n        var referenceTitle = text(store.state.reorderContext && store.state.reorderContext.title);\n        return referenceTitle ? 'Reorder \u00B7 ' + referenceTitle : 'Reorder';\n      }\n      var serviceDisplay = getArtworkMethodDisplayConfig(store, mode);\n      return text(serviceDisplay && serviceDisplay.label)\n        || (mode === 'freesetup' ? 'Free Setup' : (mode === 'recreate' ? 'Recreate a Design'\n          // A fallback-resolved chooser summarizes as the honest reorder\n          // promise, not as \"Your designs\" (nothing was loaded).\n          : (isReorderChooserPresentation(store) && !isReorderFallbackSelected(store) ? 'Your designs' : 'Place a reorder')));\n    }\n    if (projectId) {\n      return isPitchPrintDesignApprovalPending(store) ? 'Design saved requiring approval' : 'Design saved';\n    }\n    if (template) return 'Template \u00B7 ' + (text(template.title) || 'Selected template');\n    if (secondaryChoice === 'use-template' || mode === 'designonline' || mode === 'editservice') {\n      return 'Template \u00B7 Choose a template';\n    }\n    if (store && store.guidedArtworkIntentSelected === true) {\n      if (primaryChoice === 'have-design') return 'Choose how to provide artwork';\n      if (primaryChoice === 'need-design' || primaryChoice === 'service') return 'Choose a design option';\n    }\n    return '';\n  }\n\n  function getGuidedArtworkStepComplete(store) {\n    if (isVersionedArtworkWizardUnresolved(store)) return false;\n    return getGuidedArtworkStepCompleteCore(store);\n  }\n\n  function getGuidedArtworkStepCompleteCore(store) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    if (mode === 'uploadcanva') return isValidCanvaUrl(store.state.canvaUrl);\n    if (mode === 'uploadfiles') return isArtworkUploadProvided(store);\n    if (mode === 'customdesign' || mode === 'youhaveart') return true;\n    // Service selections are complete on their own: getArtworkIncompleteState\n    // treats the `service` primary choice as resolved, so the step header must\n    // agree or the summary keeps prompting for a choice that is already made.\n    // The PX-04 chooser is different: \"Your designs\" is only complete once a\n    // design is actually chosen (the restore flips the mode to designonline),\n    // OR the pick resolves as an honest reorder reference (RE2 \u2014 the design\n    // is attached for staff to fit, no editor load), OR the customer resolves\n    // it with the \"I don't see my design\" fallback (RE1). All ungated.\n    if (mode === 'reorder' && isReorderChooserPresentation(store)) {\n      return isReorderFallbackSelected(store) || isReorderReferenceSelected(store);\n    }\n    if (mode === 'freesetup' || mode === 'recreate' || mode === 'reorder') return true;\n    if (getArtworkSectionConfig(store).sectionLayout === 'v2'\n      && store.state.template\n      && mode !== 'designonline'\n      && mode !== 'editservice') return false;\n    if (mode === 'designonline' || mode === 'editservice' || text(store && store.state && store.state.artworkSecondaryChoice) === 'use-template') {\n      // A saved online design answers for itself: it completes the step only\n      // when its document holds artwork (a template that pre-places objects\n      // counts). Without a saved project the chosen template completes it as\n      // before; the cart validation still asks for the save.\n      if (mode === 'designonline' && text(store.state.project && store.state.project.projectId)) return hasSavedProjectArtwork(store);\n      return !!(store.state.template || text(store.state.project && store.state.project.projectId));\n    }\n    return false;\n  }\n\n  function syncGuidedStaticOptionDetails(store) {\n    var blocks = readBlocks(store);\n    var optionsBlock = blocks.options;\n    if (!optionsBlock) return;\n    var details = optionsBlock.querySelector('[data-bg-guided-static-details]');\n    var staticSections = Array.prototype.slice.call(\n      optionsBlock.querySelectorAll('[data-bg-option-group].bg-designer-storefront__option-section--static')\n    ).filter(function (section) {\n      return !section.hidden && !section.closest('[hidden]');\n    });\n    if (!staticSections.length) {\n      if (details) details.remove();\n      return;\n    }\n    if (!details) {\n      details = document.createElement('div');\n      details.className = 'bg-designer-storefront-guided__static-details';\n      details.setAttribute('data-bg-guided-static-details', '');\n      details.setAttribute('role', 'group');\n      details.setAttribute('aria-label', 'Selected product options');\n      details.innerHTML = '<div class=\"bg-designer-storefront-guided__static-details-list\" data-bg-guided-static-details-list></div>';\n      optionsBlock.insertBefore(details, optionsBlock.firstChild);\n    }\n    var list = details.querySelector('[data-bg-guided-static-details-list]');\n    if (!list) return;\n    staticSections.forEach(function (section) {\n      if (section.parentNode !== list) list.appendChild(section);\n    });\n  }\n\n  // PDP-TOKENIZE-02 Stage C: sibling of syncGuidedStaticOptionDetails for\n  // holders pinned to ui.presentation === 'inline'. Unlike --static sections\n  // these keep their live controls; they render as a compact group above the\n  // accordion. Selection/validation state is untouched \u2014 inline holders still\n  // count toward guided completeness, the step summaries simply omit them\n  // (mirroring static handling). Default '' means no section carries the\n  // attribute and this function removes nothing but an empty container.\n  function syncGuidedInlineOptionSections(store) {\n    var blocks = readBlocks(store);\n    var optionsBlock = blocks.options;\n    if (!optionsBlock) return;\n    var container = optionsBlock.querySelector('[data-bg-guided-inline-options]');\n    var inlineSections = Array.prototype.slice.call(\n      optionsBlock.querySelectorAll('[data-bg-option-group][data-bg-holder-presentation=\"inline\"]')\n    ).filter(function (section) {\n      if (section.classList.contains('bg-designer-storefront__option-section--static')) return false;\n      return !section.hidden && !section.closest('[hidden]');\n    });\n    if (!inlineSections.length) {\n      if (container) container.remove();\n      return;\n    }\n    if (!container) {\n      container = document.createElement('div');\n      container.className = 'bg-designer-storefront-guided__inline-options';\n      container.setAttribute('data-bg-guided-inline-options', '');\n      container.setAttribute('role', 'group');\n      container.setAttribute('aria-label', 'Product options');\n      container.innerHTML = '<div class=\"bg-designer-storefront-guided__inline-options-list\" data-bg-guided-inline-options-list></div>';\n      var staticDetails = optionsBlock.querySelector('[data-bg-guided-static-details]');\n      optionsBlock.insertBefore(container, staticDetails ? staticDetails.nextSibling : optionsBlock.firstChild);\n    }\n    var list = container.querySelector('[data-bg-guided-inline-options-list]');\n    if (!list) return;\n    inlineSections.forEach(function (section) {\n      if (section.parentNode !== list) list.appendChild(section);\n    });\n  }\n\n  function buildGuidedStepDescriptors(store) {\n    var blocks = readBlocks(store);\n    var steps = [];\n    Array.prototype.slice.call(blocks.options ? blocks.options.querySelectorAll('[data-bg-option-group]') : []).forEach(function (section) {\n      if (section.classList.contains('bg-designer-storefront__option-section--static')) return;\n      // PDP-TOKENIZE-02 Stage C: inline-pinned holders are not accordion\n      // steps (same skip shape as --static above).\n      if (text(section.getAttribute('data-bg-holder-presentation')) === 'inline') return;\n      var holderId = text(section.getAttribute('data-bg-holder-id'));\n      var summary = getGuidedOptionStepSummary(store, holderId);\n      steps.push({\n        key: 'option-' + holderId,\n        title: text(section.getAttribute('aria-label')) || 'Product option',\n        summary: summary || getGuidedCopy(store, 'stepOptionPrompt'),\n        complete: !!summary,\n        section: section\n      });\n    });\n    var quantitySection = blocks.quantity && blocks.quantity.querySelector('[data-bg-quantity-group]');\n    var quantityFromRoutes = false;\n    if (quantitySection) {\n      var quantity = Math.max(0, numberValue(store && store.state && store.state.quantity, 0));\n      quantityFromRoutes = getQuantityMode(store) === 'eddmRoutes';\n      var routesPending = isEddmRouteQuantityPending(store);\n      steps.push({\n        key: 'quantity',\n        title: getGuidedCopy(store, 'stepQuantityTitle'),\n        summary: routesPending\n          ? getGuidedCopy(store, 'stepQuantityRoutesPrompt')\n          : (quantity > 0 ? quantity.toLocaleString() : getGuidedCopy(store, 'stepQuantityPrompt')),\n        complete: !routesPending && quantity > 0,\n        section: quantitySection\n      });\n    }\n    var customerInputSection = blocks.customerInputs && blocks.customerInputs.querySelector('.bg-designer-storefront__customer-input-section');\n    if (customerInputSection) {\n      var customerValidation = validateCustomerInputs(store);\n      steps.push({\n        key: 'details',\n        title: getGuidedCopy(store, 'stepDetailsTitle'),\n        summary: customerValidation.valid ? getGuidedCopy(store, 'stepDetailsDone') : getGuidedCopy(store, 'stepDetailsPrompt'),\n        complete: customerValidation.valid,\n        section: customerInputSection\n      });\n    }\n    var artworkSection = blocks.artwork && blocks.artwork.querySelector('.bg-designer-storefront__artwork-section');\n    if (artworkSection) {\n      var artworkSummary = getGuidedArtworkStepSummary(store);\n      var artworkChoiceState = store && store.state ? store.state : {};\n      steps.push({\n        key: 'artwork',\n        title: getGuidedCopy(store, 'stepArtworkTitle'),\n        summary: artworkSummary || getGuidedCopy(store, 'stepArtworkPrompt'),\n        complete: getGuidedArtworkStepComplete(store),\n        actionRequired: !artworkSummary\n          && !text(artworkChoiceState.artworkSecondaryChoice)\n          && !text(artworkChoiceState.artworkMode),\n        section: artworkSection\n      });\n    }\n    var uploadSection = blocks.uploads && blocks.uploads.querySelector('.bg-designer-storefront__upload-section');\n    if (uploadSection) {\n      var uploadValidation = validateArtworkInputState(store);\n      if (uploadValidation.valid) uploadValidation = validateDetailUploadFields(store);\n      // A refused or interrupted file blocks the purchase, so the step is not ready.\n      var detailUploadFailed = uploadValidation.valid && hasFailedDetailUploads(store);\n      steps.push({\n        key: 'artwork-details',\n        title: getGuidedCopy(store, 'stepArtworkDetailsTitle'),\n        summary: detailUploadFailed\n          ? getGuidedCopy(store, 'stepArtworkDetailsFileFailed')\n          : (uploadValidation.valid ? getGuidedCopy(store, 'stepArtworkDetailsDone') : getGuidedCopy(store, 'stepArtworkDetailsPrompt')),\n        complete: uploadValidation.valid && !detailUploadFailed,\n        section: uploadSection\n      });\n    }\n    // Always-expanded steps stay in place and keep their header, but never\n    // collapse: the whole list under guided_no_accordions, or just quantity\n    // when the per-product guided flag is set or the quantity comes from mail\n    // routes (EDDM-ROUTE-STEP: that step holds the route tool, so Select EDDM\n    // Routes is one press away after the route option, on every layout).\n    var expandAllSteps = isGuidedNoAccordionsLayout(store);\n    var quantityAlwaysExpanded = expandAllSteps\n      || quantityFromRoutes\n      || (readGuidedLayoutVariant(store) !== 'guided_desktop_open_mobile_closed'\n        && readGuidedPresentationSettings(store).quantitySectionAlwaysExpanded === true);\n    steps.forEach(function (step) {\n      step.alwaysExpanded = expandAllSteps || (step.key === 'quantity' && quantityAlwaysExpanded);\n    });\n    return steps.filter(function (step) {\n      return step.section && !step.section.hidden && !step.section.closest('[hidden]');\n    });\n  }\n\n  // Direct-child lookup that never routes through the CSS selector engine:\n  // holder htmlIDs are staff-authored and can contain characters (spaces)\n  // that break an id-anchored `:scope >` match.\n  function getGuidedStepDirectChild(section, attribute) {\n    if (!section || !section.children) return null;\n    return Array.prototype.slice.call(section.children).filter(function (child) {\n      return child.hasAttribute && child.hasAttribute(attribute);\n    })[0] || null;\n  }\n\n  function setGuidedStepOpenState(step, isOpen) {\n    if (!step || !step.section) return;\n    if (step.alwaysExpanded) isOpen = true;\n    var section = step.section;\n    var toggle = getGuidedStepDirectChild(section, 'data-bg-guided-step-toggle');\n    var panel = getGuidedStepDirectChild(section, 'data-bg-guided-step-panel');\n    var summary = toggle && toggle.querySelector('[data-bg-guided-step-summary]');\n    section.classList.toggle('is-open', !!isOpen);\n    if (toggle) toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');\n    if (summary) summary.hidden = !!isOpen;\n    if (panel) {\n      panel.setAttribute('aria-hidden', isOpen ? 'false' : 'true');\n      if (isOpen) panel.removeAttribute('inert');\n      else panel.setAttribute('inert', '');\n    }\n  }\n\n  function updateGuidedStepHeader(step, index) {\n    var section = step.section;\n    section.classList.add('bg-designer-storefront-guided__step');\n    section.classList.toggle('is-complete', !!step.complete);\n    section.classList.toggle('is-action-required', !!step.actionRequired);\n    section.classList.toggle('bg-designer-storefront-guided__step--always-open', !!step.alwaysExpanded);\n    section.setAttribute('data-bg-guided-step-key', step.key);\n    var toggle = getGuidedStepDirectChild(section, 'data-bg-guided-step-toggle');\n    var panel = getGuidedStepDirectChild(section, 'data-bg-guided-step-panel');\n    if (!toggle || !panel) return;\n    // The header of an always-expanded step is informational, not a control:\n    // disabling the button removes it from keyboard order while the flag\n    // holds, and re-enables cleanly if a later config pass clears the flag.\n    toggle.disabled = !!step.alwaysExpanded;\n    var numberNode = toggle.querySelector('[data-bg-guided-step-number]');\n    var titleNode = toggle.querySelector('[data-bg-guided-step-title]');\n    var summaryNode = toggle.querySelector('[data-bg-guided-step-summary]');\n    setGuidedText(numberNode, String(index + 1));\n    setGuidedText(titleNode, step.title);\n    setGuidedText(summaryNode, step.summary);\n  }\n\n  function decorateGuidedStep(store, step, index) {\n    var section = step.section;\n    if (!section) return;\n    if (section.getAttribute('data-bg-guided-step-ready') !== 'true') {\n      var panelId = 'bg-guided-step-' + core.slugify(text(store.root.id) || text(store.config.handle) || 'product') + '-' + core.slugify(step.key);\n      var panel = document.createElement('div');\n      var inner = document.createElement('div');\n      var toggle = document.createElement('button');\n      panel.className = 'bg-designer-storefront-guided__step-panel';\n      panel.setAttribute('data-bg-guided-step-panel', '');\n      panel.id = panelId;\n      inner.className = 'bg-designer-storefront-guided__step-panel-inner';\n      while (section.firstChild) inner.appendChild(section.firstChild);\n      panel.appendChild(inner);\n      toggle.type = 'button';\n      toggle.className = 'bg-designer-storefront-guided__step-toggle';\n      toggle.setAttribute('data-bg-guided-step-toggle', '');\n      toggle.setAttribute('aria-controls', panelId);\n      toggle.innerHTML = '' +\n        '<span class=\"bg-designer-storefront-guided__step-number\" data-bg-guided-step-number></span>' +\n        '<span class=\"bg-designer-storefront-guided__step-copy\">' +\n          '<span class=\"bg-designer-storefront-guided__step-title\" data-bg-guided-step-title></span>' +\n          '<span class=\"bg-designer-storefront-guided__step-summary\" data-bg-guided-step-summary></span>' +\n        '</span>' +\n        '<span class=\"bg-designer-storefront-guided__step-caret\" aria-hidden=\"true\">\u2304</span>';\n      section.appendChild(toggle);\n      section.appendChild(panel);\n      section.setAttribute('data-bg-guided-step-ready', 'true');\n      toggle.addEventListener('click', function () {\n        if (section.classList.contains('bg-designer-storefront-guided__step--always-open')) return;\n        var isOpen = section.classList.contains('is-open');\n        store.guidedOpenStepKey = isOpen ? '' : step.key;\n        buildGuidedStepDescriptors(store).forEach(function (candidate) {\n          setGuidedStepOpenState(candidate, !isOpen && candidate.key === step.key);\n        });\n      });\n    }\n    updateGuidedStepHeader(step, index);\n  }\n\n  function renderGuidedProductFormPresentation(store) {\n    if (!store || applyProductFormPresentationMode(store) !== 'guided') return;\n    renderGuidedPriceOverview(store);\n    syncGuidedMobileProductLayout(store);\n    syncGuidedStaticOptionDetails(store);\n    syncGuidedInlineOptionSections(store);\n    var steps = buildGuidedStepDescriptors(store);\n    if (!steps.length) return;\n    var guidedVariant = readGuidedLayoutVariant(store);\n    if (store.guidedRenderedVariant !== guidedVariant) {\n      if (guidedVariant === 'guided_desktop_open_mobile_closed') store.guidedOpenStepKey = '';\n      store.guidedRenderedVariant = guidedVariant;\n    }\n    // The hybrid starts compact on mobile. Desktop expansion never changes\n    // the customer's mobile open-step slot, including across a resize.\n    if (store.guidedOpenStepKey == null && guidedVariant === 'guided_desktop_open_mobile_closed') {\n      store.guidedOpenStepKey = '';\n    }\n    var hasCurrentStep = steps.some(function (step) {\n      return step.key === store.guidedOpenStepKey;\n    });\n    // Default the single-open slot to the first COLLAPSIBLE step; an\n    // always-expanded step is open regardless, so spending the slot on it\n    // would leave every accordion step closed.\n    var firstCollapsible = steps.filter(function (step) { return !step.alwaysExpanded; })[0] || steps[0];\n    if (!hasCurrentStep && store.guidedOpenStepKey !== '') {\n      store.guidedOpenStepKey = firstCollapsible.key;\n    }\n    if (store.guidedOpenStepKey == null) store.guidedOpenStepKey = firstCollapsible.key;\n    steps.forEach(function (step, index) {\n      decorateGuidedStep(store, step, index);\n      setGuidedStepOpenState(step, step.key === store.guidedOpenStepKey);\n    });\n  }\n\n  function scheduleGuidedProductFormPresentation(store) {\n    if (!store || getProductFormPresentation(store) !== 'guided' || store.guidedPresentationFrame) return;\n    var schedule = window.requestAnimationFrame || function (callback) { return window.setTimeout(callback, 0); };\n    store.guidedPresentationFrame = schedule(function () {\n      store.guidedPresentationFrame = 0;\n      renderGuidedProductFormPresentation(store);\n    });\n  }\n\n  // Version 2 presentation (\"compact configurator\"): a scan-friendly single-page\n  // adapter over the same shared state. It only adds a live price hero above the\n  // options block and relies on scoped CSS (bg-designer-storefront-presentation-lab.css)\n  // to expose the existing quantity tiers and compact the option tiles. All money\n  // figures come from getPricePresentation/getCurrentPriceRecord; no pricing or\n  // cart logic is duplicated here.\n  function ensureVersion2ProductFormChrome(store) {\n    if (!store || !store.root || applyProductFormPresentationMode(store) !== 'version_2') return null;\n    var root = store.root;\n    var optionsBlock = root.querySelector('[data-bg-designer-block=\"options\"]');\n    if (!optionsBlock) return null;\n    var hero = root.querySelector('[data-bg-v2-hero]');\n    if (!hero) {\n      hero = document.createElement('section');\n      hero.className = 'bg-designer-storefront-v2__hero';\n      hero.setAttribute('data-bg-v2-hero', '');\n      hero.setAttribute('aria-label', 'Current configuration price');\n      hero.setAttribute('aria-live', 'polite');\n      hero.innerHTML = '' +\n        '<div class=\"bg-designer-storefront-v2__hero-price-row\">' +\n          '<strong class=\"bg-designer-storefront-v2__hero-total\" data-bg-v2-total></strong>' +\n          '<s class=\"bg-designer-storefront-v2__hero-compare\" data-bg-v2-compare hidden></s>' +\n          '<span class=\"bg-designer-storefront-v2__hero-unit\" data-bg-v2-unit></span>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-v2__hero-meta-row\">' +\n          '<span class=\"bg-designer-storefront-v2__hero-savings\" data-bg-v2-savings hidden></span>' +\n          '<span class=\"bg-designer-storefront-v2__hero-shipping\" data-bg-v2-shipping hidden>Free shipping</span>' +\n          '<span class=\"bg-designer-storefront-v2__hero-turnaround\" data-bg-v2-turnaround hidden></span>' +\n        '</div>';\n      root.insertBefore(hero, optionsBlock);\n    }\n    return { hero: hero };\n  }\n\n  // OD-122: the intent-first hero says the sale sentence under its price line.\n  function syncIntentFirstSaleNote(unitNode, note) {\n    if (!unitNode || !unitNode.parentNode) return;\n    var noteNode = unitNode.parentNode.querySelector('[data-bg-intent-first-sale-note]');\n    if (!noteNode && !note) return;\n    if (!noteNode) {\n      noteNode = document.createElement('p');\n      noteNode.className = 'bg-designer-storefront__sale-pending-note';\n      noteNode.setAttribute('data-bg-intent-first-sale-note', '');\n      noteNode.setAttribute('role', 'status');\n      unitNode.parentNode.insertBefore(noteNode, unitNode.nextSibling);\n    }\n    noteNode.hidden = !note;\n    setGuidedText(noteNode, note);\n  }\n\n  function renderVersion2ProductFormPresentation(store) {\n    if (!store || applyProductFormPresentationMode(store) !== 'version_2') return;\n    var chrome = ensureVersion2ProductFormChrome(store);\n    if (!chrome) return;\n    var presentation = shownPrice(getPricePresentation(store));\n    var priceRecord = getCurrentPriceRecord(store);\n    var total = numberValue(presentation && presentation.total, 0);\n    var compareTotal = numberValue(presentation && presentation.compareTotal, 0);\n    var savings = Math.max(0, numberValue(presentation && presentation.savings, 0));\n    var quantity = Math.max(1, numberValue(presentation && presentation.quantity, 1));\n    var currentPerPiece = numberValue(presentation && presentation.currentPerPiece, 0);\n    var estTurnaround = text(priceRecord && priceRecord.estTurnaround);\n    var totalNode = chrome.hero.querySelector('[data-bg-v2-total]');\n    var compareNode = chrome.hero.querySelector('[data-bg-v2-compare]');\n    var unitNode = chrome.hero.querySelector('[data-bg-v2-unit]');\n    var savingsNode = chrome.hero.querySelector('[data-bg-v2-savings]');\n    var shippingNode = chrome.hero.querySelector('[data-bg-v2-shipping]');\n    var turnaroundNode = chrome.hero.querySelector('[data-bg-v2-turnaround]');\n    setGuidedText(totalNode, formatShownMoney(total));\n    if (compareNode) {\n      compareNode.hidden = !hasShownComparePrice(compareTotal, total);\n      setGuidedText(compareNode, compareNode.hidden ? '' : formatShownMoney(compareTotal));\n    }\n    setGuidedText(unitNode, buildQuantityUnitLine(store, quantity, currentPerPiece));\n    var version2SaleNote = getSalePendingNote(store);\n    if (savingsNode && version2SaleNote) {\n      savingsNode.hidden = false;\n      savingsNode.classList.add('is-sale-pending');\n      syncSalePendingRole(savingsNode, true);\n      setGuidedText(savingsNode, version2SaleNote);\n    } else if (savingsNode) {\n      savingsNode.classList.remove('is-sale-pending');\n      syncSalePendingRole(savingsNode, false);\n      savingsNode.hidden = !(savings > 0.01);\n      var discountPct = Math.round(getClaimedSalePercentage(store));\n      // SB-18: the percent rides the savings line only when the two shown\n      // prices agree with it (the sale badge rule, shownPricesMatchDiscountPercent).\n      setGuidedText(savingsNode, savingsNode.hidden\n        ? ''\n        : 'You save ' + formatShownMoney(savings) + (shownPricesMatchDiscountPercent(presentation, discountPct) ? ' \u2014 ' + discountPct + '% off applied' : ''));\n    }\n    if (shippingNode) shippingNode.hidden = !(presentation && presentation.hasFreeShipping);\n    if (turnaroundNode) {\n      turnaroundNode.hidden = !estTurnaround;\n      setGuidedText(turnaroundNode, estTurnaround ? 'Est. turnaround: ' + estTurnaround + (isDesignOnlineNoProofLane(store) ? '' : ' after proof approval') : '');\n    }\n    chrome.hero.hidden = !(total > 0);\n  }\n\n  function scheduleVersion2ProductFormPresentation(store) {\n    if (!store || getProductFormPresentation(store) !== 'version_2' || store.version2PresentationFrame) return;\n    var schedule = window.requestAnimationFrame || function (callback) { return window.setTimeout(callback, 0); };\n    store.version2PresentationFrame = schedule(function () {\n      store.version2PresentationFrame = 0;\n      renderVersion2ProductFormPresentation(store);\n    });\n  }\n\n  function getExperimentalPresentationSettings(store, key) {\n    var presentation = readProductPresentationConfig(store);\n    return plainObject(presentation && presentation[key]) || {};\n  }\n\n  function getExperimentalPresentationSettingsForMode(store, mode) {\n    var key = {\n      intent_first: 'intentFirst'\n    }[text(mode).toLowerCase()];\n    return key ? getExperimentalPresentationSettings(store, key) : {};\n  }\n\n  // AD1 (OP-01): per-product trust-signal content. The bounded ordered list\n  // lives at productPageConfig.presentation.trustSignals and is shared by\n  // every presentation that renders the trust row (intent_first). A 'text'\n  // entry renders its authored label; a\n  // 'turnaround' entry keeps the data-driven value slot \u2014 its label fills\n  // from the live price record's estTurnaround through each presentation's\n  // existing fill code, and it hides when no turnaround exists. Absent (or\n  // entirely invalid) config leaves each presentation's built-in markup\n  // untouched, byte for byte.\n  var TRUST_SIGNAL_MAX_COUNT = 6;\n  var TRUST_SIGNAL_LABEL_MAX_LENGTH = 80;\n  var TRUST_SIGNAL_SUPPORTING_MAX_LENGTH = 160;\n\n  // Built-in trust-row content, one constant per presentation. These are the\n  // exact historical bytes: the chrome builders concatenate them unchanged,\n  // and syncConfiguredTrustSignals restores them when authored content is\n  // removed. Do not edit copy here without a byte-parity regression update.\n  var INTENT_FIRST_TRUST_DEFAULT_MARKUP = '<span data-bg-intent-first-trust-turnaround hidden><strong data-bg-intent-first-trust-turnaround-value></strong><small>Current turnaround</small></span><span><strong>Proof before print</strong><small>Review before production</small></span><span><strong>Reprint promise</strong><small>We stand behind the job</small></span>';\n\n  function getConfiguredTrustSignals(store) {\n    var presentation = readProductPresentationConfig(store);\n    var raw = presentation && presentation.trustSignals;\n    if (!Array.isArray(raw)) return null;\n    var signals = [];\n    for (var index = 0; index < raw.length && signals.length < TRUST_SIGNAL_MAX_COUNT; index += 1) {\n      var entry = plainObject(raw[index]);\n      if (!entry) continue;\n      var source = text(entry.source).toLowerCase() === 'turnaround' ? 'turnaround' : 'text';\n      var label = text(entry.label).slice(0, TRUST_SIGNAL_LABEL_MAX_LENGTH);\n      var supporting = text(entry.supporting).slice(0, TRUST_SIGNAL_SUPPORTING_MAX_LENGTH);\n      if (source === 'text' && !label) continue;\n      signals.push({ source: source, label: label, supporting: supporting });\n    }\n    return signals.length ? signals : null;\n  }\n\n  function buildConfiguredTrustSignalsMarkup(signals, turnaroundAttribute) {\n    return signals.map(function (signal) {\n      if (signal.source === 'turnaround' && turnaroundAttribute) {\n        return '<span ' + turnaroundAttribute + ' hidden><strong ' + turnaroundAttribute + '-value></strong>' +\n          '<small>' + escapeHtml(signal.supporting) + '</small></span>';\n      }\n      return '<span><strong>' + escapeHtml(signal.label) + '</strong>' +\n        (signal.supporting ? '<small>' + escapeHtml(signal.supporting) + '</small>' : '') + '</span>';\n    }).join('');\n  }\n\n  // Reconciles one trust node against the configured content. Unset config\n  // never touches the node (the built-in markup stays byte-identical);\n  // configured content replaces it exactly once per revision, and removing\n  // the config restores the presentation's default markup.\n  function syncConfiguredTrustSignals(store, node, options) {\n    if (!node) return;\n    var settings = options && typeof options === 'object' ? options : {};\n    var signals = getConfiguredTrustSignals(store);\n    var revision = signals ? JSON.stringify(signals) : '';\n    var applied = node.getAttribute('data-bg-trust-configured') || '';\n    if (!signals) {\n      if (applied) {\n        node.innerHTML = text(settings.defaultMarkup);\n        node.removeAttribute('data-bg-trust-configured');\n      }\n      return;\n    }\n    if (applied === revision) return;\n    node.innerHTML = buildConfiguredTrustSignalsMarkup(signals, text(settings.turnaroundAttribute));\n    node.setAttribute('data-bg-trust-configured', revision);\n  }\n\n  function findPresentationHolder(store, names) {\n    var targets = Array.isArray(names) ? names.map(function (name) {\n      return text(name).toLowerCase();\n    }) : [];\n    return (Array.isArray(store && store.holders) ? store.holders : []).find(function (holder) {\n      var label = text(holder && holder.displayName).toLowerCase();\n      return targets.some(function (target) {\n        return label === target || label.indexOf(target) !== -1;\n      });\n    }) || null;\n  }\n\n  // Bounded per-holder presentation seam (productPageConfig.presentation\n  // .optionPresentation, storefront UX program ST1). ST1 implements exactly\n  // one type \u2014 'image_cards': the featured full-width selector the\n  // intent-first page renders above the commerce card. Unknown types fail\n  // closed to the existing controls; absent config renders byte-identically.\n  function getFeaturedImageCardsHolder(store) {\n    var presentation = readProductPresentationConfig(store);\n    var map = plainObject(presentation.optionPresentation);\n    if (!map) return null;\n    var holders = Array.isArray(store && store.holders) ? store.holders : [];\n    for (var index = 0; index < holders.length; index += 1) {\n      var holder = holders[index];\n      var entry = plainObject(map[getHolderId(holder)]);\n      if (!entry || text(entry.type).toLowerCase() !== 'image_cards') continue;\n      if (isHolderUnavailableByRules(store, holder)) continue;\n      if (shouldHideOptionTemplateHolder(store, holder)) continue;\n      if (getVisibleOptions(store, holder).length < 2) continue;\n      return holder;\n    }\n    return null;\n  }\n\n  // ST2 (PDP-OPTION-01): the remaining bounded presentation types on the SAME\n  // per-holder seam. Every presentation projects into the canonical native\n  // holder/value controls \u2014 selection, pricing, rules, media, and cart flows\n  // never fork. Unknown types, misplaced types ('quantity_pricing_table' on a\n  // holder, a second 'image_cards' outside the featured slot), and absent\n  // config all fail closed to today's build tile.\n  var INTENT_FIRST_INLINE_PRESENTATION_TYPES = ['pills', 'color_swatches', 'image_swatches', 'compact_grid', 'select'];\n  var INTENT_FIRST_SWATCH_SIZES = ['small', 'medium', 'large', 'extra_large'];\n\n  // Bounded swatch display settings for an inline row (size tier, label\n  // placement, price-delta visibility). Absent config keeps the built-in\n  // look: medium swatches, inline labels, price differences shown.\n  function getIntentFirstInlineDisplaySettings(store, holderId) {\n    var entry = getOptionPresentationEntry(store, holderId) || {};\n    var size = text(entry.swatchSize).toLowerCase();\n    var placement = text(entry.labelPlacement).toLowerCase();\n    return {\n      swatchSize: INTENT_FIRST_SWATCH_SIZES.indexOf(size) !== -1 ? size : 'medium',\n      labelPlacement: placement === 'below' ? 'below' : 'inline',\n      showPriceDelta: entry.showPriceDelta !== false\n    };\n  }\n\n  function getOptionPresentationEntry(store, key) {\n    var presentation = readProductPresentationConfig(store);\n    var map = plainObject(presentation.optionPresentation);\n    if (!map) return null;\n    var entry = plainObject(map[text(key)]) || null;\n    return entry && isMobileProductOptionsViewport() && plainObject(entry.mobile)\n      ? Object.assign({}, entry, entry.mobile) : entry;\n  }\n\n  // Slice 4 (price change labels): ONE product-level switch, per-holder\n  // opt-out. Off (the default) keeps every surface byte-identical.\n  function areProductPriceChangeLabelsEnabled(store) {\n    var presentation = readProductPresentationConfig(store);\n    return presentation.priceChangeLabels === true;\n  }\n\n  function isHolderPriceChangeLabelEnabled(store, holderId) {\n    if (!areProductPriceChangeLabelsEnabled(store)) return false;\n    var entry = getOptionPresentationEntry(store, holderId) || {};\n    return entry.showPriceDelta !== false;\n  }\n\n  // Real price difference for one option at the CURRENT configuration and\n  // quantity, or blank. Blank beats an invented number: a choice the current\n  // quantity cannot price (cross-style quantity ladders differ) renders no\n  // label at all.\n  function buildIntentPriceChangeLabelMarkup(store, holder, option, isSelected) {\n    if (!holder || !option) return '';\n    if (!isHolderPriceChangeLabelEnabled(store, getHolderId(holder))) return '';\n    var difference = getOptionPriceDifference(store, holder, option, isSelected);\n    if (!difference || Math.abs(numberValue(difference.amount, 0)) < 0.005) return '';\n    return buildOptionPriceDifferenceMarkup(store, holder, option, isSelected, difference);\n  }\n\n  function getIntentFirstRowPresentationType(store, row) {\n    if (!row) return '';\n    var entry = getOptionPresentationEntry(store, row.key);\n    var type = entry ? text(entry.type).toLowerCase() : '';\n    if (!type) return '';\n    if (row.key === 'quantity') {\n      // Quantity presentation feeds from the Pricing quantity field (the\n      // legacy 'quantity_pricing_table' page opt-in is retired); the row only\n      // exists in tile mode, so it never takes an inline type.\n      return '';\n    }\n    if (type === 'sheet') return 'sheet';\n    if (INTENT_FIRST_INLINE_PRESENTATION_TYPES.indexOf(type) !== -1) return type;\n    return '';\n  }\n\n  // PDP-COMPARE-01: bounded per-value comparison content configured on the\n  // featured holder's presentation entry. Informational only \u2014 never a\n  // pricing surface. Returns [] unless at least one visible value carries at\n  // least one non-empty field, which is exactly the \"compare link appears\n  // only when configured\" gate.\n  var INTENT_FIRST_COMPARE_FIELDS = [\n    ['bestUse', 'Best use'],\n    ['printMethod', 'Print method'],\n    ['shapeFlexibility', 'Shape flexibility'],\n    ['costTier', 'Relative cost'],\n    ['keyLimitation', 'Keep in mind']\n  ];\n\n  function getIntentFirstCompareContent(store, holder) {\n    if (!holder) return [];\n    var entry = getOptionPresentationEntry(store, getHolderId(holder));\n    var compareMap = entry && plainObject(entry.compare);\n    if (!compareMap) return [];\n    // Row names are operator-editable per holder; absent/blank config keeps\n    // the built-in defaults. A row still renders only when its value is set.\n    var configuredLabels = plainObject(entry.compareLabels) || {};\n    var rows = [];\n    getVisibleOptions(store, holder).forEach(function (option) {\n      var record = plainObject(compareMap[text(option && option.hvId)]);\n      if (!record) return;\n      var facts = INTENT_FIRST_COMPARE_FIELDS.map(function (field) {\n        return { key: field[0], label: text(configuredLabels[field[0]]) || field[1], value: text(record[field[0]]) };\n      }).filter(function (fact) { return !!fact.value; });\n      if (facts.length) rows.push({ option: option, facts: facts });\n    });\n    return rows;\n  }\n\n  function getIntentFirstComparePluralLabel(holder) {\n    var label = text(holder && holder.displayName).toLowerCase() || 'options';\n    return /s$/i.test(label) ? label : label + 's';\n  }\n\n  function openIntentFirstCompareSheet(store, returnFocus) {\n    var holder = getFeaturedImageCardsHolder(store);\n    if (!holder || (getOptionPresentationEntry(store, getHolderId(holder)) || {}).showCompare === false || !getIntentFirstCompareContent(store, holder).length) return;\n    var sheet = getDesignFirstSheet();\n    var priorOwner = sheet.__bgDesignFirstStore;\n    if (priorOwner && priorOwner !== store) closeDesignFirstChoiceSheet(priorOwner);\n    store.designFirstSheetState = {\n      key: '__compare',\n      mode: 'compare',\n      returnFocusKey: '__compare',\n      returnFocus: returnFocus || document.activeElement,\n      backgroundInertRecords: []\n    };\n    sheet.__bgDesignFirstStore = store;\n    // Compare mode is an informational surface: the sheet chrome drops the\n    // back arrow and pricing footer, and pins the close control top-right.\n    sheet.setAttribute('data-bg-sheet-mode', 'compare');\n    sheet.hidden = false;\n    sheet.setAttribute('aria-hidden', 'false');\n    sheet.removeAttribute('inert');\n    document.body.classList.add('bg-design-first-sheet--open');\n    setDesignFirstBackgroundInert(store, true);\n    renderDesignFirstChoiceSheet(store);\n    focusSelectedDesignFirstSheetChoice(store);\n  }\n\n  function renderIntentFirstCompareSheetContent(store, sheet) {\n    var holder = getFeaturedImageCardsHolder(store);\n    var content = holder ? getIntentFirstCompareContent(store, holder) : [];\n    if (!content.length) {\n      closeDesignFirstChoiceSheet(store);\n      return;\n    }\n    var title = sheet.querySelector('[data-bg-design-first-sheet-title]');\n    var subcopy = sheet.querySelector('[data-bg-design-first-sheet-subcopy]');\n    var choices = sheet.querySelector('[data-bg-design-first-sheet-choices]');\n    var total = sheet.querySelector('[data-bg-design-first-sheet-total]');\n    var summary = sheet.querySelector('[data-bg-design-first-sheet-summary]');\n    var pluralLabel = getIntentFirstComparePluralLabel(holder);\n    var entry = getOptionPresentationEntry(store, getHolderId(holder)) || {};\n    setGuidedText(title, text(entry.compareTitle) || 'Compare ' + pluralLabel);\n    setChoiceSheetSubcopy(sheet, text(entry.compareSubcopy));\n    // BD-NO-ROW-ZERO-PRICE: the sheet total says the sentence, never $0.00.\n    var sheetNoPriceRow = showsNoPriceRow(store);\n    setGuidedText(total, sheetNoPriceRow ? NO_PRICE_ROW_MESSAGE : formatShownMoney(numberValue(shownPrice(getPricePresentation(store)).total, 0)));\n    setGuidedText(summary, buildCompactConfigurationSummary(store));\n    if (!choices) return;\n    var selected = getSelectedOption(store, holder);\n    choices.removeAttribute('data-bg-sheet-choice-type');\n    var fields = INTENT_FIRST_COMPARE_FIELDS.filter(function (field) {\n      return content.some(function (row) { return row.facts.some(function (fact) { return fact.key === field[0]; }); });\n    });\n    choices.innerHTML = '<div class=\"bg-intent-first__compare-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"' + escapeHtml(text(entry.compareTitle) || 'Compare ' + pluralLabel) + '\"><table class=\"bg-intent-first__compare-table\"><thead><tr><th scope=\"col\">' + escapeHtml(text(holder.displayName) || 'Option') + '</th>' + content.map(function (row) {\n      var option = row.option;\n      var optionId = text(option.hvId);\n      var active = !!(selected && text(selected.hvId) === optionId);\n      var disabled = !!option.outOfStock || isOptionDisabledByRules(store, option);\n      var imageUrl = getOptionPreviewUrlInContext(store, holder, option);\n      return '<th scope=\"col\"' + (active ? ' class=\"is-selected\"' : '') + '>' + (imageUrl ? '<img src=\"' + escapeHtml(imageUrl) + '\" alt=\"\" loading=\"lazy\" decoding=\"async\">' : '') + '<strong>' + escapeHtml(getOptionDisplayLabel(store, holder, option)) + '</strong><button type=\"button\" class=\"bg-intent-first__compare-card-state\" data-bg-intent-first-compare-hvid=\"' + escapeHtml(optionId) + '\" aria-pressed=\"' + (active ? 'true' : 'false') + '\" aria-label=\"' + escapeHtml((active ? 'Selected: ' : 'Select ') + getOptionDisplayLabel(store, holder, option)) + '\"' + (disabled ? ' disabled' : '') + '>' + (active ? 'Selected' : 'Select') + '</button></th>';\n    }).join('') + '</tr></thead><tbody>' + fields.map(function (field) {\n      return '<tr><th scope=\"row\">' + escapeHtml(text((entry.compareLabels || {})[field[0]]) || field[1]) + '</th>' + content.map(function (row) {\n        var fact = row.facts.find(function (candidate) { return candidate.key === field[0]; });\n        return '<td' + (selected && text(selected.hvId) === text(row.option.hvId) ? ' class=\"is-selected\"' : '') + '>' + (fact ? escapeHtml(fact.value) : '<span aria-label=\"Not specified\">\u2014</span>') + '</td>';\n      }).join('') + '</tr>';\n    }).join('') + '</tbody></table></div>';\n    Array.prototype.slice.call(choices.querySelectorAll('[data-bg-intent-first-compare-hvid]')).forEach(function (card) {\n      card.addEventListener('click', function () {\n        var control = findNativeHolderControl(store, getHolderId(holder), card.getAttribute('data-bg-intent-first-compare-hvid'));\n        if (control && !control.disabled && typeof control.click === 'function') control.click();\n        closeDesignFirstChoiceSheet(store);\n      });\n    });\n  }\n\n  // PDP-PRICE-01: canonical quantity forwarding shared by the build sheet and\n  // the quantity pricing table. Discrete modes click the native row/radio;\n  // typed/range modes commit through the native number input so bounds,\n  // snapping, and bracket resolution stay with the canonical owner.\n  function selectCanonicalQuantityValue(store, value) {\n    var target = text(value);\n    if (!target || !store || !store.root) return false;\n    var nativeRow = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-quantity-row-target]')).find(function (candidate) {\n      return text(candidate.getAttribute('data-bg-quantity-row-target')) === target;\n    });\n    if (nativeRow && typeof nativeRow.click === 'function') {\n      nativeRow.click();\n      return true;\n    }\n    var nativeInput = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-quantity-option]')).find(function (candidate) {\n      return text(candidate.value) === target;\n    });\n    if (nativeInput && typeof nativeInput.click === 'function') {\n      nativeInput.click();\n      return true;\n    }\n    var numberInput = store.root.querySelector('[data-bg-quantity-number]');\n    if (numberInput) {\n      numberInput.value = target;\n      var changeEvent;\n      try {\n        changeEvent = new window.Event('change', { bubbles: true });\n      } catch (_) {\n        changeEvent = document.createEvent('Event');\n        changeEvent.initEvent('change', true, false);\n      }\n      numberInput.dispatchEvent(changeEvent);\n      return true;\n    }\n    return false;\n  }\n\n  function buildIntentFirstInlineValueControls(store, holder, type) {\n    var holderId = getHolderId(holder);\n    var selected = getSelectedOption(store, holder);\n    var display = getIntentFirstInlineDisplaySettings(store, holderId);\n    return getVisibleOptions(store, holder).map(function (option) {\n      var optionId = text(option && option.hvId);\n      var active = !!(selected && text(selected.hvId) === optionId);\n      var disabled = !!(option && option.outOfStock) || isOptionDisabledByRules(store, option);\n      var label = getOptionDisplayLabel(store, holder, option);\n      var priceSuffix = display.showPriceDelta ? buildAddonPriceLabelMarkup(store, holder, option) : '';\n      // Slice 4: with price change labels on, the REAL difference at the\n      // current configuration replaces the static add-on label (blank when\n      // the choice cannot price at the current quantity).\n      if (isHolderPriceChangeLabelEnabled(store, holderId)) {\n        priceSuffix = buildIntentPriceChangeLabelMarkup(store, holder, option, active);\n      }\n      var priceLine = priceSuffix || isHolderPriceChangeLabelEnabled(store, holderId)\n        ? '<span class=\"bg-designer-storefront__option-price bg-designer-storefront__option-price--reserved\">' + (priceSuffix || '') + '</span>'\n        : '';\n      var inner;\n      var extraClass = '';\n      if (type === 'color_swatches' || type === 'image_swatches') {\n        // Color swatches prefer the value's hex; image swatches prefer its\n        // image (falling back to the hex when no image exists).\n        var swatchStyle = getOptionPreviewStyle(option, type === 'color_swatches', '', resolveOptionContextImageUrl(store, holder, option));\n        inner = '<span class=\"bg-intent-first__inline-swatch\"' + swatchStyle + ' aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-intent-first__inline-value-label\">' + escapeHtml(label) + priceLine + '</span>';\n        extraClass = ' bg-intent-first__inline-value--swatch';\n        if (type === 'image_swatches') extraClass += ' bg-intent-first__inline-value--image-swatch';\n      } else {\n        inner = '<span class=\"bg-intent-first__inline-value-label\">' + escapeHtml(label) + priceLine + '</span>';\n      }\n      return '<button type=\"button\" class=\"bg-intent-first__inline-value' + extraClass + (active ? ' is-selected' : '') + '\" role=\"radio\" aria-checked=\"' + (active ? 'true' : 'false') + '\" data-bg-intent-first-inline-holder=\"' + escapeHtml(holderId) + '\" data-bg-intent-first-inline-hvid=\"' + escapeHtml(optionId) + '\" tabindex=\"' + (active ? '0' : '-1') + '\"' + (disabled ? ' disabled aria-disabled=\"true\"' : '') + '>' + inner + '</button>';\n    }).join('');\n  }\n\n  function buildIntentFirstInlineRowMarkup(store, row, type) {\n    var holder = row.holder;\n    var holderId = getHolderId(holder);\n    var modifier = type.replace(/_/g, '-');\n    if (type === 'select') {\n      var selected = getSelectedOption(store, holder);\n      var selectId = 'bg-intent-first-select-' + escapeHtml(holderId);\n      var options = getVisibleOptions(store, holder).map(function (option) {\n        var optionId = text(option && option.hvId);\n        var active = !!(selected && text(selected.hvId) === optionId);\n        var disabled = !!(option && option.outOfStock) || isOptionDisabledByRules(store, option);\n        return '<option value=\"' + escapeHtml(optionId) + '\"' + (active ? ' selected' : '') + (disabled ? ' disabled' : '') + '>' + escapeHtml(getOptionDisplayLabel(store, holder, option)) + '</option>';\n      }).join('');\n      return '<div class=\"bg-intent-first__build-row bg-intent-first__build-row--select\" data-bg-intent-first-row-type=\"select\">' +\n        '<label class=\"bg-intent-first__row-label\" for=\"' + selectId + '\"><span>' + escapeHtml(row.label) + '</span></label>' +\n        '<select class=\"bg-intent-first__inline-select\" id=\"' + selectId + '\" data-bg-intent-first-inline-select=\"' + escapeHtml(holderId) + '\">' + options + '</select>' +\n      '</div>';\n    }\n    var display = getIntentFirstInlineDisplaySettings(store, holderId);\n    var isSwatchType = type === 'color_swatches' || type === 'image_swatches';\n    var groupClasses = 'bg-intent-first__inline-group bg-intent-first__inline-group--' + escapeHtml(modifier);\n    if (isSwatchType) {\n      groupClasses += ' bg-intent-first__inline-group--size-' + escapeHtml(display.swatchSize.replace(/_/g, '-'));\n      if (display.labelPlacement === 'below') groupClasses += ' bg-intent-first__inline-group--labels-below';\n    }\n    return '<div class=\"bg-intent-first__build-row bg-intent-first__build-row--' + escapeHtml(modifier) + '\" data-bg-intent-first-row-type=\"' + escapeHtml(type) + '\">' +\n      '<div class=\"bg-intent-first__row-label\"><span>' + escapeHtml(row.label) + '</span></div>' +\n      '<div class=\"' + groupClasses + '\" role=\"radiogroup\" aria-label=\"' + escapeHtml(row.label) + '\" data-bg-intent-first-inline-group=\"' + escapeHtml(holderId) + '\">' +\n        buildIntentFirstInlineValueControls(store, holder, type) +\n      '</div>' +\n    '</div>';\n  }\n\n  function buildIntentFirstBuildTileMarkup(store, row) {\n    var parts = getDesignFirstRowValueParts(store, row);\n    return '<button type=\"button\" data-bg-intent-first-build-key=\"' + escapeHtml(row.key) + '\" aria-label=\"Edit ' + escapeHtml(row.label) + '\"><span>' + escapeHtml(row.label) + '</span><strong>' + escapeHtml(parts.lead) + '</strong>' + (parts.sub ? '<small>' + escapeHtml(parts.sub) + '</small>' : '') + '<em aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m16 3 5 5-12 12-6 1 1-6Z M13 6l5 5\"/></svg></em></button>';\n  }\n\n  function renderIntentFirstBuildArea(store, build, rows) {\n    var rowTypes = rows.map(function (row) { return getIntentFirstRowPresentationType(store, row); });\n    var hasConfiguredPresentation = rowTypes.some(function (type) { return type && type !== 'sheet'; });\n    // S3: the template's size row renders as a summary tile in either mode,\n    // whatever inline presentation the row is configured with.\n    var lockedSizeHolder = getIntentFirstTemplateSizeHolder(store);\n    var lockedSizeKey = lockedSizeHolder ? getHolderId(lockedSizeHolder) : '';\n    build.setAttribute('data-bg-intent-first-build-count', String(rows.length));\n    if (!hasConfiguredPresentation) {\n      // Byte-identical legacy path: with no configured inline presentation the\n      // compact tile grid renders exactly as before ST2.\n      build.removeAttribute('data-bg-intent-first-build-mode');\n      build.innerHTML = rows.map(function (row) {\n        if (lockedSizeKey && row.key === lockedSizeKey) return buildIntentFirstTemplateSizeSummaryMarkup(store, row);\n        return buildIntentFirstBuildTileMarkup(store, row);\n      }).join('');\n      return;\n    }\n    build.setAttribute('data-bg-intent-first-build-mode', 'stack');\n    build.innerHTML = rows.map(function (row, index) {\n      var type = rowTypes[index];\n      if (lockedSizeKey && row.key === lockedSizeKey) {\n        return '<div class=\"bg-intent-first__build-row bg-intent-first__build-row--tile\" data-bg-intent-first-row-type=\"sheet\">' + buildIntentFirstTemplateSizeSummaryMarkup(store, row) + '</div>';\n      }\n      if (type && type !== 'sheet') return buildIntentFirstInlineRowMarkup(store, row, type);\n      return '<div class=\"bg-intent-first__build-row bg-intent-first__build-row--tile\" data-bg-intent-first-row-type=\"sheet\">' + buildIntentFirstBuildTileMarkup(store, row) + '</div>';\n    }).join('');\n  }\n\n  function getPresentationHolderValue(store, names, fallback) {\n    var holder = findPresentationHolder(store, names);\n    var selected = holder ? getSelectedOption(store, holder) : null;\n    return selected ? getSelectedOptionDisplayValue(selected) : text(fallback);\n  }\n\n  function getPresentationPurchaseLabel(store, options) {\n    var presentation = getProductFormPresentation(store);\n    if (isPrototypeProductFormPresentation(presentation)) {\n      if (store && store.purchaseSubmissionInFlight) return 'Adding your job to the cart';\n      if (presentation === 'intent_first') {\n        if (store && store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid && text(store.state && store.state.artworkMode).toLowerCase() === 'designonline'\n          && !text(store.state && store.state.project && store.state.project.projectId)) return 'Customize this design';\n        // PDP-PITCHPRINT-RETURN-APPROVAL (OD-370): a design waiting for its approval box reads Approve Design (the Guided page's words).\n        var intentRequirement = getGuidedArtworkPurchaseRequirement(store);\n        if (intentRequirement) return intentRequirement.key === 'design-approval' ? getGuidedArtworkPurchaseAction(store, intentRequirement).label : (text(getExperimentalPresentationSettings(store, 'intentFirst').chooseDesignLabel) || 'Choose Design');\n        if (store && store.editingLineKey) return 'Update cart item';\n        // SB-17 (2026-09-25): phone layouts show the price beside the button.\n        if (options && options.withoutPrice) return 'Add to cart';\n        var intentTotal = numberValue(shownPrice(getPricePresentation(store)).total, NaN);\n        return Number.isFinite(intentTotal) && intentTotal > 0 && !showsNoPriceRow(store)\n          ? 'Add to cart \u2014 ' + formatShownMoney(intentTotal)\n          : 'Add to cart';\n      }\n    }\n    var nativeButton = getSubmitButton(store);\n    var nativeLabel = nativeButton && nativeButton.querySelector ? nativeButton.querySelector('span') : null;\n    return text(nativeLabel && nativeLabel.textContent) || text(nativeButton && nativeButton.textContent) ||\n      (store && store.editingLineKey ? 'Update cart item' : 'Add to cart');\n  }\n\n  function canResolveExperimentalPresentationArtwork(store) {\n    var artworkMode = text(store && store.state && store.state.artworkMode);\n    if (artworkMode) return true;\n    if (getProductFormPresentation(store) === 'intent_first' && text(store && store.intentFirstActiveIntent)) return false;\n    var availability = getStoreArtworkAvailability(store);\n    var selectedTemplate = store && store.state && store.state.template;\n    if (selectedTemplate) {\n      return !!getTemplateModeAvailability(availability, selectedTemplate).editservice;\n    }\n    return !!(availability && availability.youhaveart);\n  }\n\n  function forwardExperimentalPresentationPurchase(store, trigger) {\n    var mode = getProductFormPresentation(store);\n    if (!isPrototypeProductFormPresentation(mode)) return false;\n    if (store && store.purchaseSubmissionInFlight) return true;\n    if (mode === 'intent_first') {\n      if (store && store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid\n        && text(store.state && store.state.artworkMode).toLowerCase() === 'designonline'\n        && !text(store.state && store.state.project && store.state.project.projectId)) {\n        void launchDesigner(store, { authPrompt: 'customize-online' });\n        return true;\n      }\n      if (getGuidedArtworkPurchaseRequirement(store)) {\n        revealGuidedArtworkPurchaseStep(store);\n        return true;\n      }\n      var intentNativeButton = getSubmitButton(store);\n      if (intentNativeButton && !intentNativeButton.disabled && intentNativeButton.getAttribute('aria-busy') !== 'true') {\n        intentNativeButton.click();\n      }\n      return true;\n    }\n    return true;\n  }\n\n  function bindPresentationPurchaseButton(store, button) {\n    if (!button || button.dataset.bgPresentationPurchaseBound === '1') return;\n    button.dataset.bgPresentationPurchaseBound = '1';\n    button.addEventListener('click', function () {\n      forwardExperimentalPresentationPurchase(store, button);\n    });\n  }\n\n  function syncPresentationPurchaseButton(store, button) {\n    if (!button) return;\n    var nativeButton = getSubmitButton(store);\n    var busy = !!(nativeButton && nativeButton.getAttribute('aria-busy') === 'true')\n      || !!(store && store.purchaseSubmissionInFlight);\n    var presentation = getProductFormPresentation(store);\n    var total = numberValue(getPricePresentation(store).total, NaN);\n    var waitingForPrice = presentation === 'intent_first' && (!(Number.isFinite(total) && total > 0) || showsNoPriceRow(store));\n    var artworkRequirement = presentation === 'intent_first' ? getGuidedArtworkPurchaseRequirement(store) : null;\n    button.disabled = !nativeButton || !!nativeButton.disabled || busy || waitingForPrice;\n    button.setAttribute('aria-disabled', button.disabled ? 'true' : 'false');\n    if (artworkRequirement) button.setAttribute('data-bg-artwork-required', 'true');\n    else button.removeAttribute('data-bg-artwork-required');\n    button.textContent = getPresentationPurchaseLabel(store);\n    var action = text(nativeButton && nativeButton.getAttribute('data-bg-purchase-action'));\n    if (action) button.setAttribute('data-bg-purchase-action', action);\n    else button.removeAttribute('data-bg-purchase-action');\n    if (busy) button.setAttribute('aria-busy', 'true');\n    else button.removeAttribute('aria-busy');\n    button.classList.toggle('bg-designer-storefront__purchase-button--submitting', busy);\n    bindPresentationPurchaseButton(store, button);\n  }\n\n  // OP-08: the prototype-era display-title override ('Full Color Yard Signs'\n  // force-written over the H1/breadcrumb) is removed \u2014 every presentation\n  // shows the product's own Shopify title. The restore helper stays so pages\n  // rendered by an older runtime clean up on the next pass.\n  function restoreExperimentalPresentationDisplayTitle(productInfo) {\n    Array.prototype.slice.call(productInfo ? productInfo.querySelectorAll('[data-bg-presentation-original-title]') : []).forEach(function (node) {\n      setGuidedText(node, node.getAttribute('data-bg-presentation-original-title'));\n      node.removeAttribute('data-bg-presentation-original-title');\n    });\n  }\n\n  function buildLiveSignPreviewMarkup(options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    // The yard-sign Live Sign layout keeps its size/sides/stakes chips; the\n    // intent-first card carries its preview controls instead.\n    var chips = settings.chips !== false;\n    var designPreviewUrl = text(settings.designPreviewUrl);\n    var designPreviewAlt = text(settings.designPreviewAlt) || 'Selected design preview';\n    var boardMarkup = designPreviewUrl\n      ? '<img class=\"bg-live-sign__preview-art\" src=\"' + escapeHtml(designPreviewUrl) + '\" alt=\"' + escapeHtml(designPreviewAlt) + '\">'\n      : '<span class=\"bg-live-sign__preview-message\">YOUR<br>SERVICE</span><span class=\"bg-live-sign__preview-detail\">123-456-7890</span>';\n    return '' +\n      '<div class=\"bg-live-sign__preview-card\">' +\n        '<div class=\"bg-live-sign__preview-head\"><span data-bg-live-sign-preview-noun>Your sign</span><strong data-bg-live-sign-preview-dimension></strong></div>' +\n        '<div class=\"bg-live-sign__preview-scene\" data-bg-live-sign-preview aria-label=\"Live sign preview\">' +\n          '<div class=\"bg-live-sign__preview-assembly\" data-bg-live-sign-preview-assembly>' +\n            '<div class=\"bg-live-sign__preview-sign\" data-bg-live-sign-board>' +\n              boardMarkup +\n            '</div>' +\n            '<span class=\"bg-live-sign__stake bg-live-sign__stake--left\" aria-hidden=\"true\"></span>' +\n            '<span class=\"bg-live-sign__stake bg-live-sign__stake--right\" aria-hidden=\"true\"></span>' +\n            '<span class=\"bg-live-sign__stake-crossbar\" aria-hidden=\"true\"></span>' +\n          '</div>' +\n        '</div>' +\n        (chips ? '<div class=\"bg-live-sign__preview-chips\"><span data-bg-live-sign-preview-size></span><span data-bg-live-sign-preview-sides></span><span data-bg-live-sign-preview-stakes></span></div>' : '') +\n      '</div>';\n  }\n\n  function getLiveSignOptionSubcopy(key, label) {\n    var normalized = text(label).toLowerCase();\n    if (key === 'size') {\n      if (/12[^0-9]+18|18[^0-9]+12/.test(normalized)) return '18\" x 12\" (Bandit)';\n      if (/18[^0-9]+24|24[^0-9]+18/.test(normalized)) return '24\" x 18\" (Standard)';\n      if (/24[^0-9]+24/.test(normalized)) return '24\" x 24\" (Square)';\n      if (/24[^0-9]+36|36[^0-9]+24/.test(normalized)) return '36\" x 24\" (Jumbo)';\n      return 'Outdoor coroplast sign';\n    }\n    if (key === 'sides') {\n      if (normalized.indexOf('single') !== -1) return 'Print on the front only';\n      if (normalized.indexOf('different') !== -1) return 'Different image each side';\n      return 'Same image both sides';\n    }\n    if (key === 'stakes') {\n      if (/(?:no|none|without)/.test(normalized)) return 'I already have stakes';\n      if (normalized.indexOf('standard') !== -1 || normalized.indexOf('economy') !== -1) return '10\" wire, one per sign';\n      return 'Outdoor display hardware';\n    }\n    return '';\n  }\n\n  function getLiveSignPreviewNoun(store) {\n    var configured = text(store && store.productData && (store.productData.quantityUnitLabel || store.productData.unitLabel));\n    if (!configured) return 'Your design';\n    return 'Your ' + getQuantityPerUnitLabel(store);\n  }\n\n  // Sides wording when the product has no Sides choice: the binding's sides\n  // policy still says how the piece prints. Unknown \u2192 no chip.\n  function getLiveSignSidesPolicyPreviewLabel(store) {\n    var policy = findProductCommerceSidesPolicy(store, null);\n    var mode = text(policy && policy.mode).toLowerCase();\n    if (!mode) return '';\n    if (/single/.test(mode)) return 'Print on the front only';\n    if (/same/.test(mode)) return 'Same image both sides';\n    if (/different|distinct|separate/.test(mode)) return 'Different image each side';\n    return '';\n  }\n\n  function setLiveSignPreviewChip(node, label) {\n    if (!node) return;\n    setGuidedText(node, label);\n    node.hidden = !label;\n  }\n\n  function renderLiveSignPreview(store, scope) {\n    if (!scope || !scope.querySelectorAll) return;\n    var size = buildSelectedSizePayload(store);\n    // A quantity-only product (a plastic card, a flyer) has no Size choice:\n    // the card then shows no made-up dimension and keeps the design's own\n    // shape instead of a 1\" x 1\" square.\n    var hasSize = numberValue(size && size.selectedWidth, 0) > 0 && numberValue(size && size.selectedHeight, 0) > 0;\n    var width = Math.max(1, numberValue(size && size.selectedWidth, 18));\n    var height = Math.max(1, numberValue(size && size.selectedHeight, 12));\n    var orientation = text(size && size.selectedOrientation).toLowerCase();\n    if (orientation === 'landscape' && width < height) {\n      var landscapeHeight = height;\n      height = width;\n      width = landscapeHeight;\n    } else if (orientation === 'portrait' && width > height) {\n      var portraitWidth = width;\n      width = height;\n      height = portraitWidth;\n    }\n    var sizeLabel = hasSize ? String(Math.max(width, height)) + '\" x ' + String(Math.min(width, height)) + '\"' : '';\n    var sidesHolder = findPresentationHolder(store, ['sides', 'printed sides']);\n    var stakesHolder = findPresentationHolder(store, ['stakes', 'stand', 'frame']);\n    var sidesLabel = sidesHolder ? getPresentationHolderValue(store, ['sides', 'printed sides'], 'Single sided') : '';\n    var stakesLabel = stakesHolder ? getPresentationHolderValue(store, ['stakes', 'stand', 'frame'], 'H-stakes') : '';\n    var sidesPreviewLabel = sidesHolder ? getLiveSignOptionSubcopy('sides', sidesLabel) : getLiveSignSidesPolicyPreviewLabel(store);\n    // Stakes exist only when the product offers them; a card has none.\n    var stakesPreviewLabel = stakesHolder ? (/(?:no|none|without)/i.test(stakesLabel) ? 'No stakes' : 'H stakes included') : '';\n    var hasStakes = !!stakesHolder && !/(?:no|none|without)/i.test(stakesLabel);\n    var noun = getLiveSignPreviewNoun(store);\n    var mobilePreviewWidth = Math.round(200 * (hasSize ? width : 24) / 36);\n    var desktopPreviewWidth = Math.round(240 * (hasSize ? width : 24) / 36);\n    Array.prototype.slice.call(scope.querySelectorAll('[data-bg-live-sign-preview]')).forEach(function (preview) {\n      var art = preview.querySelector('.bg-live-sign__preview-art');\n      var artWidth = art ? numberValue(art.naturalWidth, 0) : 0;\n      var artHeight = art ? numberValue(art.naturalHeight, 0) : 0;\n      if (hasSize) {\n        preview.style.setProperty('--bg-live-sign-aspect', String(width) + ' / ' + String(height));\n      } else if (artWidth > 0 && artHeight > 0) {\n        preview.style.setProperty('--bg-live-sign-aspect', String(artWidth) + ' / ' + String(artHeight));\n      } else {\n        preview.style.removeProperty('--bg-live-sign-aspect');\n      }\n      preview.style.setProperty('--bg-live-sign-preview-width-mobile', String(mobilePreviewWidth) + 'px');\n      preview.style.setProperty('--bg-live-sign-preview-width-desktop', String(desktopPreviewWidth) + 'px');\n      preview.style.setProperty('--bg-live-sign-preview-message-mobile', String(Math.max(13, Math.round(mobilePreviewWidth / 7))) + 'px');\n      preview.style.setProperty('--bg-live-sign-preview-message-desktop', String(Math.max(15, Math.round(desktopPreviewWidth / 7))) + 'px');\n      preview.style.setProperty('--bg-live-sign-preview-detail-mobile', String(Math.max(8, Math.round(mobilePreviewWidth / 13))) + 'px');\n      preview.style.setProperty('--bg-live-sign-preview-detail-desktop', String(Math.max(9, Math.round(desktopPreviewWidth / 13))) + 'px');\n      preview.setAttribute('data-bg-live-sign-landscape', hasSize ? (width >= height ? 'true' : 'false') : (artWidth > 0 && artHeight > 0 && artHeight > artWidth ? 'false' : 'true'));\n      preview.setAttribute('data-bg-live-sign-has-stakes', hasStakes ? 'true' : 'false');\n      // A product that offers stakes is a ground sign: sky and lawn behind it.\n      // Anything else (a card, a flyer) sits on a neutral studio surface.\n      preview.setAttribute('data-bg-live-sign-scene', stakesHolder ? 'ground' : 'neutral');\n      var card = preview.closest('.bg-live-sign__preview-card');\n      setGuidedText(card && card.querySelector('[data-bg-live-sign-preview-noun]'), noun);\n      setLiveSignPreviewChip(card && card.querySelector('[data-bg-live-sign-preview-dimension]'), sizeLabel);\n      setLiveSignPreviewChip(card && card.querySelector('[data-bg-live-sign-preview-size]'), sizeLabel);\n      setLiveSignPreviewChip(card && card.querySelector('[data-bg-live-sign-preview-sides]'), sidesPreviewLabel);\n      setLiveSignPreviewChip(card && card.querySelector('[data-bg-live-sign-preview-stakes]'), stakesPreviewLabel);\n      if (art && !hasSize && !(artWidth > 0 && artHeight > 0) && !art.__bgLiveSignAspectBound) {\n        // The design's shape is known only once its picture loads.\n        art.__bgLiveSignAspectBound = true;\n        art.addEventListener('load', function () { renderLiveSignPreview(store, scope); }, { once: true });\n      }\n    });\n  }\n\n  function getDesignFirstPresentationRows(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var excludeHolderId = text(settings.excludeHolderId);\n    var rows = (Array.isArray(store && store.holders) ? store.holders : []).filter(function (holder) {\n      if (!holder) return false;\n      if (excludeHolderId && getHolderId(holder) === excludeHolderId) return false;\n      if (isHolderUnavailableByRules(store, holder)) return false;\n      if (shouldHideOptionTemplateHolder(store, holder)) return false;\n      return getVisibleOptions(store, holder).length > 0;\n    }).map(function (holder) {\n      return {\n        key: getHolderId(holder),\n        label: text(holder.displayName) || 'Option',\n        holder: holder\n      };\n    });\n    if (!(store && store.productData && store.productData.hideQty === true)) {\n      rows.push({ key: 'quantity', label: 'Quantity', holder: null });\n    }\n    return rows;\n  }\n\n  // SF-19 (2026-09-13) / SB-19 (2026-09-25): a sides choice reads as a lead\n  // (\"Double-sided\") plus a qualifier (\"same image\") so a compact tile can\n  // stack the two inside one fixed height, or show the whole name when it\n  // fits. Every word comes from the option name in product settings: the\n  // split falls at the name's own parenthesis (\"Double Sided (Same image)\")\n  // or after its \"...sided\" / \"...sides\" word (\"Double-sided same image\");\n  // nothing is reworded and the name itself rides along as `full`.\n  // Holder-family driven (the same sides / printed sides / printing families\n  // the phone labels use).\n  function isSidesFamilyHolder(holder) {\n    var label = text(holder && holder.displayName).toLowerCase();\n    return label === 'sides' || label === 'printed sides' || label === 'printing';\n  }\n\n  function splitSidesLabel(holder, label) {\n    var clean = text(label).replace(/\\s+/g, ' ').trim();\n    if (!clean || !isSidesFamilyHolder(holder)) return { lead: clean, sub: '', full: clean };\n    var lead = clean;\n    var sub = '';\n    var parenthetical = clean.match(/^(.*\\S)\\s*\\(([^()]*)\\)$/);\n    var sided = parenthetical ? null : clean.match(/^(.*?\\bside[sd])\\b[\\s:,;\\u2013\\u2014-]*(.*)$/i);\n    if (parenthetical && text(parenthetical[2])) {\n      lead = text(parenthetical[1]);\n      sub = text(parenthetical[2]);\n    } else if (sided && text(sided[2])) {\n      lead = text(sided[1]);\n      sub = text(sided[2]);\n    }\n    return { lead: lead, sub: sub, full: clean };\n  }\n\n  // SF-5 (2026-09-13): tiles show the plain option label; flavor text lives\n  // only in the choice sheet (and the featured cards) where there is room.\n  function getDesignFirstRowValueParts(store, row) {\n    if (!row) return { lead: '', sub: '', full: '' };\n    if (row.key === 'quantity') {\n      var quantity = Number(store && store.state && store.state.quantity || 0);\n      var quantityLead = quantity.toLocaleString() + ' ' + getIntentFirstUnitNoun(store, quantity);\n      return { lead: quantityLead, sub: '', full: quantityLead };\n    }\n    var selected = row.holder ? getSelectedOption(store, row.holder) : null;\n    var value = getOptionLabel(selected) || 'Choose';\n    return splitSidesLabel(row.holder, value);\n  }\n\n  function getDesignFirstRowValue(store, row) {\n    return getDesignFirstRowValueParts(store, row).lead;\n  }\n\n  function getDesignFirstSheet() {\n    var sheet = document.querySelector('[data-bg-design-first-sheet]');\n    if (sheet) {\n      var existingOwner = sheet.__bgDesignFirstStore;\n      if (existingOwner && existingOwner.root && !document.body.contains(existingOwner.root)) {\n        closeDesignFirstChoiceSheet(existingOwner);\n      }\n      return sheet;\n    }\n    sheet = document.createElement('div');\n    sheet.className = 'bg-design-first-sheet';\n    sheet.hidden = true;\n    sheet.setAttribute('data-bg-design-first-sheet', '');\n    sheet.setAttribute('aria-hidden', 'true');\n    sheet.setAttribute('inert', '');\n    sheet.innerHTML = '' +\n      '<button type=\"button\" class=\"bg-design-first-sheet__backdrop\" data-bg-design-first-sheet-close tabindex=\"-1\" aria-label=\"Close choices\"></button>' +\n      '<section class=\"bg-design-first-sheet__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bg-design-first-sheet-title\" tabindex=\"-1\">' +\n        '<header class=\"bg-design-first-sheet__header\"><div><h2 id=\"bg-design-first-sheet-title\" data-bg-design-first-sheet-title></h2><p id=\"bg-design-first-sheet-subcopy\" data-bg-design-first-sheet-subcopy></p></div><button type=\"button\" class=\"bg-design-first-sheet__close\" data-bg-design-first-sheet-close aria-label=\"Close\"><svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path d=\"m6 6 12 12M18 6 6 18\"/></svg></button></header>' +\n        '<div class=\"bg-design-first-sheet__choices\" data-bg-design-first-sheet-choices></div>' +\n        '<footer class=\"bg-design-first-sheet__footer\"><div data-bg-design-first-sheet-summary-group><strong data-bg-design-first-sheet-total></strong><span data-bg-design-first-sheet-summary></span></div><button type=\"button\" class=\"bg-design-first-sheet__done\" data-bg-design-first-sheet-close>Done</button></footer>' +\n      '</section>';\n    document.body.appendChild(sheet);\n    Array.prototype.slice.call(sheet.querySelectorAll('[data-bg-design-first-sheet-close]')).forEach(function (button) {\n      button.addEventListener('click', function () { closeDesignFirstChoiceSheet(sheet.__bgDesignFirstStore); });\n    });\n    sheet.addEventListener('keydown', function (event) {\n      var store = sheet.__bgDesignFirstStore;\n      if (!store || sheet.hidden) return;\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        closeDesignFirstChoiceSheet(store);\n        return;\n      }\n      if (event.key !== 'Tab') return;\n      var focusable = Array.prototype.slice.call(sheet.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')).filter(function (node) {\n        return !node.hidden && node.tabIndex >= 0 && !node.closest('[hidden]');\n      });\n      if (!focusable.length) return;\n      var first = focusable[0];\n      var last = focusable[focusable.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    });\n    if (!document.__bgDesignFirstSectionUnloadBound) {\n      document.__bgDesignFirstSectionUnloadBound = true;\n      document.addEventListener('shopify:section:unload', function (event) {\n        var activeSheet = document.querySelector('[data-bg-design-first-sheet]');\n        var owner = activeSheet && activeSheet.__bgDesignFirstStore;\n        var section = event && event.target;\n        if (!owner || !owner.root) return;\n        if (!document.body.contains(owner.root) || (section && section.contains && section.contains(owner.root))) {\n          closeDesignFirstChoiceSheet(owner);\n        }\n      });\n    }\n    return sheet;\n  }\n\n  function setDesignFirstBackgroundInert(store, inert) {\n    var state = store && store.designFirstSheetState;\n    if (!state || !document.body) return;\n    if (inert) {\n      var sheet = document.querySelector('[data-bg-design-first-sheet]');\n      state.backgroundInertRecords = Array.prototype.slice.call(document.body.children).filter(function (node) {\n        return node !== sheet && !/^(?:SCRIPT|STYLE|LINK)$/.test(node.tagName);\n      }).map(function (node) {\n        var wasInert = node.hasAttribute('inert');\n        if (!wasInert) node.setAttribute('inert', '');\n        return { node: node, wasInert: wasInert };\n      });\n      return;\n    }\n    (Array.isArray(state.backgroundInertRecords) ? state.backgroundInertRecords : []).forEach(function (entry) {\n      if (entry && entry.node && !entry.wasInert) entry.node.removeAttribute('inert');\n    });\n    state.backgroundInertRecords = [];\n  }\n\n  function closeDesignFirstChoiceSheet(store) {\n    var sheet = document.querySelector('[data-bg-design-first-sheet]');\n    if (!sheet) return;\n    var owner = sheet.__bgDesignFirstStore || store;\n    var state = owner && owner.designFirstSheetState;\n    sheet.hidden = true;\n    sheet.setAttribute('aria-hidden', 'true');\n    sheet.setAttribute('inert', '');\n    sheet.removeAttribute('data-bg-sheet-mode');\n    document.body.classList.remove('bg-design-first-sheet--open');\n    setDesignFirstBackgroundInert(owner, false);\n    if (owner) owner.designFirstSheetState = null;\n    sheet.__bgDesignFirstStore = null;\n    var returnFocus = state && state.returnFocusKey && owner && owner.root\n      ? (text(state.returnFocusKey) === '__compare'\n        // The compare surface's opener re-renders with the featured host;\n        // restore focus to the fresh link node rather than the stale one.\n        ? owner.root.querySelector('[data-bg-intent-first-compare-open]')\n        : Array.prototype.slice.call(owner.root.querySelectorAll(\n            '[data-bg-intent-first-build-key], [data-bg-intent-first-template-size-change]'\n          )).find(function (button) {\n            return text(button.getAttribute('data-bg-intent-first-build-key') || button.getAttribute('data-bg-intent-first-template-size-change')) === text(state.returnFocusKey);\n          }))\n      : null;\n    if (!returnFocus) returnFocus = state && state.returnFocus;\n    if (returnFocus && document.body.contains(returnFocus) && typeof returnFocus.focus === 'function') returnFocus.focus();\n    // Copy and convert: the shape/size choice sheet closed \u2014 open the editor\n    // on the copy with the chosen configuration.\n    if (owner && owner.pendingStyleConversion && owner.pendingStyleConversion.awaitingShape) {\n      owner.pendingStyleConversion.awaitingShape = false;\n      void launchDesigner(owner, { showPreloader: true, authPrompt: '' });\n    }\n    // S3: the size sheet opened from the template's size summary closed \u2014 a\n    // different size drops the template and reopens the template picker at\n    // the new size; the same size keeps the template.\n    if (owner && owner.pendingTemplateSizeChange) {\n      var pendingSize = owner.pendingTemplateSizeChange;\n      owner.pendingTemplateSizeChange = null;\n      if (didIntentFirstTemplateSizeChange(owner, pendingSize)) releaseIntentFirstTemplateForNewSize(owner, pendingSize);\n    }\n  }\n\n  // OP-08: sheet helper copy derives from product data (unit noun, authored\n  // holder help text) \u2014 never baked product vocabulary.\n  function getDesignFirstSheetSubcopy(store, row) {\n    var entry = row && getOptionPresentationEntry(store, row.key) || {};\n    var settings = plainObject(readProductPresentationConfig(store).choiceSheet) || {};\n    return text(row && row.key === 'quantity' ? settings.quantitySubcopy : entry.sheetSubcopy);\n  }\n\n  function setChoiceSheetSubcopy(sheet, copy) {\n    var node = sheet.querySelector('[data-bg-design-first-sheet-subcopy]');\n    var dialog = sheet.querySelector('.bg-design-first-sheet__dialog');\n    setGuidedText(node, copy);\n    if (node) node.hidden = !copy;\n    if (dialog) {\n      if (copy) dialog.setAttribute('aria-describedby', 'bg-design-first-sheet-subcopy');\n      else dialog.removeAttribute('aria-describedby');\n    }\n  }\n\n  function getChoiceSheetType(store, row) {\n    var entry = getOptionPresentationEntry(store, row.key) || {};\n    if (['buttons', 'pills', 'color_swatches', 'image_swatches', 'compact_grid', 'select'].indexOf(entry.sheetType) !== -1) return entry.sheetType;\n    var nativeType = getHolderType(row.holder);\n    return nativeType === 'colorSwatch' ? 'color_swatches' : nativeType === 'swatch' ? 'image_swatches' : nativeType === 'dropdown' ? 'select' : 'buttons';\n  }\n\n  function focusSelectedDesignFirstSheetChoice(store) {\n    window.requestAnimationFrame(function () {\n      var sheet = document.querySelector('[data-bg-design-first-sheet]');\n      if (!sheet || sheet.hidden || sheet.__bgDesignFirstStore !== store) return;\n      var selected = sheet.querySelector('.bg-design-first-sheet__choice.is-selected, [data-bg-design-first-sheet-select]');\n      var dialog = sheet.querySelector('.bg-design-first-sheet__dialog');\n      if (selected && typeof selected.focus === 'function') selected.focus();\n      else if (dialog && typeof dialog.focus === 'function') dialog.focus();\n    });\n  }\n\n  function findNativeHolderControl(store, holderId, hvid) {\n    return Array.prototype.slice.call(store.root.querySelectorAll(\n      '[data-bg-holder-value][data-bg-hvid], [data-bg-holder-input][data-bg-hvid]'\n    )).find(function (control) {\n      var controlHolderId = text(control.getAttribute('data-bg-holder-value') || control.getAttribute('data-bg-holder-input'));\n      return controlHolderId === text(holderId) && text(control.getAttribute('data-bg-hvid')) === text(hvid);\n    }) || null;\n  }\n\n  function selectDesignFirstSheetOption(store, holderId, hvid) {\n    var control = findNativeHolderControl(store, holderId, hvid);\n    if (control && !control.disabled && typeof control.click === 'function') control.click();\n    if (store.selectedDesignCompatibilityConflict) {\n      closeDesignFirstChoiceSheet(store);\n      window.requestAnimationFrame(function () {\n        var warning = store.root && store.root.querySelector('[data-bg-selected-design-compatibility]');\n        if (warning && typeof warning.focus === 'function') warning.focus();\n      });\n      return;\n    }\n    renderDesignFirstChoiceSheet(store);\n    focusSelectedDesignFirstSheetChoice(store);\n  }\n\n  function renderDesignFirstChoiceSheet(store) {\n    var state = store && store.designFirstSheetState;\n    var sheet = document.querySelector('[data-bg-design-first-sheet]');\n    if (!state || !sheet || sheet.hidden) return;\n    var choices = sheet.querySelector('[data-bg-design-first-sheet-choices]');\n    // Only this sheet's direct copy belongs to the adapter. Never remove the\n    // canonical copy inside Numeric's persistent quantity host.\n    Array.prototype.slice.call(choices ? choices.querySelectorAll(':scope > .bg-designer-storefront__quantity-presentation-copy') : []).forEach(function (copy) {\n      choices.removeChild(copy);\n    });\n    if (state.mode === 'compare') {\n      renderIntentFirstCompareSheetContent(store, sheet);\n      return;\n    }\n    var row = getDesignFirstPresentationRows(store).find(function (entry) { return entry.key === state.key; });\n    if (!row) {\n      closeDesignFirstChoiceSheet(store);\n      return;\n    }\n    var title = sheet.querySelector('[data-bg-design-first-sheet-title]');\n    var subcopy = sheet.querySelector('[data-bg-design-first-sheet-subcopy]');\n    var total = sheet.querySelector('[data-bg-design-first-sheet-total]');\n    var summary = sheet.querySelector('[data-bg-design-first-sheet-summary]');\n    var entry = getOptionPresentationEntry(store, row.key) || {};\n    var sheetSettings = plainObject(readProductPresentationConfig(store).choiceSheet) || {};\n    setGuidedText(title, text(row.key === 'quantity' ? sheetSettings.quantityTitle : entry.sheetTitle) || row.label);\n    setChoiceSheetSubcopy(sheet, getDesignFirstSheetSubcopy(store, row));\n    var summaryGroup = sheet.querySelector('[data-bg-design-first-sheet-summary-group]');\n    if (summaryGroup) summaryGroup.hidden = sheetSettings.showSummary === false;\n    setGuidedText(sheet.querySelector('.bg-design-first-sheet__done'), text(sheetSettings.doneLabel) || 'Done');\n    sheet.setAttribute('data-bg-sheet-summary', sheetSettings.showSummary === false ? 'false' : 'true');\n    if (choices) choices.setAttribute('data-bg-sheet-choice-type', row.key === 'quantity' ? 'quantity' : getChoiceSheetType(store, row));\n    // BD-NO-ROW-ZERO-PRICE: the sheet total says the sentence, never $0.00.\n    var sheetNoPriceRow = showsNoPriceRow(store);\n    setGuidedText(total, sheetNoPriceRow ? NO_PRICE_ROW_MESSAGE : formatShownMoney(numberValue(shownPrice(getPricePresentation(store)).total, 0)));\n    setGuidedText(summary, buildCompactConfigurationSummary(store));\n    if (!choices) return;\n    if (row.key === 'quantity') {\n      var quantityContext = buildQuantityPricingContext(store, store.state.quantity);\n      var quantities = Array.isArray(quantityContext.quantityOptions) ? quantityContext.quantityOptions : [];\n      var quantityPrices = quantities.map(function (quantity) { return shownPrice(getPricePresentationForQuantity(store, quantity)); });\n      var highestUnitPrice = quantityPrices.reduce(function (highest, price) {\n        return Math.max(highest, numberValue(price && price.currentPerPiece, 0));\n      }, 0);\n      choices.innerHTML = quantities.map(function (quantity) {\n        var price = shownPrice(getPricePresentationForQuantity(store, quantity));\n        var selected = Number(store.state.quantity) === Number(quantity);\n        var savingsPercent = highestUnitPrice > 0\n          ? Math.max(0, Math.round((1 - (numberValue(price.currentPerPiece, 0) / highestUnitPrice)) * 100))\n          : 0;\n        var choiceCopy = sheetNoPriceRow\n          ? ''\n          : '<span class=\"bg-design-first-sheet__choice-copy\"><strong>' + escapeHtml(formatShownMoney(price.currentPerPiece)) + '/' + escapeHtml(getQuantityPerUnitLabel(store)) + '</strong><small>' + escapeHtml(formatShownMoney(price.total)) + ' total</small></span>';\n        return '<button type=\"button\" class=\"bg-design-first-sheet__choice' + (selected ? ' is-selected' : '') + '\" data-bg-design-first-sheet-quantity=\"' + escapeHtml(String(quantity)) + '\" aria-pressed=\"' + (selected ? 'true' : 'false') + '\"><span class=\"bg-design-first-sheet__lead\">' + escapeHtml(Number(quantity).toLocaleString()) + '</span>' + choiceCopy + (!sheetNoPriceRow && savingsPercent > 0 ? '<span class=\"bg-design-first-sheet__tag\">Save ' + escapeHtml(String(savingsPercent)) + '%</span>' : '') + '</button>';\n      }).join('');\n      Array.prototype.slice.call(choices.querySelectorAll('[data-bg-design-first-sheet-quantity]')).forEach(function (button) {\n        button.addEventListener('click', function () {\n          selectCanonicalQuantityValue(store, button.getAttribute('data-bg-design-first-sheet-quantity'));\n          renderDesignFirstChoiceSheet(store);\n          focusSelectedDesignFirstSheetChoice(store);\n        });\n      });\n      var quantityCopy = buildQuantityPresentationCopy(store);\n      if (quantityCopy) choices.appendChild(quantityCopy);\n      return;\n    }\n    var holder = row.holder;\n    var holderId = getHolderId(holder);\n    var selected = getSelectedOption(store, holder);\n    var choiceType = getChoiceSheetType(store, row);\n    var display = getIntentFirstInlineDisplaySettings(store, holderId);\n    choices.setAttribute('data-bg-sheet-swatch-size', display.swatchSize);\n    choices.setAttribute('data-bg-sheet-label-placement', display.labelPlacement);\n    if (choiceType === 'select') {\n      choices.innerHTML = '<select class=\"bg-design-first-sheet__select\" aria-label=\"' + escapeHtml(row.label) + '\" data-bg-design-first-sheet-select>' +\n        getVisibleOptions(store, holder).map(function (option) {\n          var active = selected && text(selected.hvId) === text(option.hvId);\n          var disabled = option.outOfStock || isOptionDisabledByRules(store, option);\n          return '<option value=\"' + escapeHtml(text(option.hvId)) + '\"' + (active ? ' selected' : '') + (disabled ? ' disabled' : '') + '>' + escapeHtml(getOptionDisplayLabel(store, holder, option)) + '</option>';\n        }).join('') + '</select>';\n      choices.querySelector('select').addEventListener('change', function (event) {\n        selectDesignFirstSheetOption(store, holderId, event.target.value);\n      });\n      return;\n    }\n    choices.innerHTML = getVisibleOptions(store, holder).map(function (option) {\n      var optionId = text(option && option.hvId);\n      var active = selected && text(selected.hvId) === optionId;\n      var disabled = !!(option && option.outOfStock) || isOptionDisabledByRules(store, option);\n      var badge = getOptionBadges(option)[0] || (active ? 'Selected' : '');\n      var deltaMarkup = buildIntentPriceChangeLabelMarkup(store, holder, option, !!active);\n      var swatch = choiceType === 'color_swatches' || choiceType === 'image_swatches';\n      var media = swatch ? '<span class=\"bg-design-first-sheet__swatch\"' + getOptionPreviewStyle(option, choiceType === 'color_swatches', '', resolveOptionContextImageUrl(store, holder, option)) + ' aria-hidden=\"true\"></span>' : '';\n      // SF-19: a sides choice reads \"Double Sided\" with its qualifier as the\n      // small line; authored flavor text still wins that slot when present.\n      var labelParts = splitSidesLabel(holder, getOptionDisplayLabel(store, holder, option));\n      var flavor = getOptionFlavorText(option) || labelParts.sub;\n      return '<button type=\"button\" class=\"bg-design-first-sheet__choice' + (active ? ' is-selected' : '') + '\" data-bg-design-first-sheet-holder=\"' + escapeHtml(holderId) + '\" data-bg-design-first-sheet-hvid=\"' + escapeHtml(optionId) + '\" aria-pressed=\"' + (active ? 'true' : 'false') + '\"' + (disabled ? ' disabled aria-disabled=\"true\"' : '') + '>' + media + '<span class=\"bg-design-first-sheet__choice-copy\"><strong>' + escapeHtml(labelParts.lead) + '</strong>' + (deltaMarkup ? '<span class=\"bg-designer-storefront__option-price\">' + deltaMarkup + '</span>' : '') + (flavor ? '<small>' + escapeHtml(flavor) + '</small>' : '') + '</span>' + (badge ? '<span class=\"bg-design-first-sheet__tag\">' + escapeHtml(badge) + '</span>' : '') + '</button>';\n    }).join('');\n    Array.prototype.slice.call(choices.querySelectorAll('[data-bg-design-first-sheet-hvid]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        selectDesignFirstSheetOption(store, holderId, button.getAttribute('data-bg-design-first-sheet-hvid'));\n      });\n    });\n  }\n\n  function openDesignFirstChoiceSheet(store, key, returnFocus) {\n    if (text(key) === 'quantity' && hasCanonicalNumericQuantityControl(store)) {\n      var input = store.root.querySelector('[data-bg-quantity-number]');\n      if (input) {\n        input.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        input.focus({ preventScroll: true });\n      }\n      return;\n    }\n    var sheet = getDesignFirstSheet();\n    var priorOwner = sheet.__bgDesignFirstStore;\n    if (priorOwner && priorOwner !== store) closeDesignFirstChoiceSheet(priorOwner);\n    store.designFirstSheetState = {\n      key: text(key),\n      returnFocusKey: text(key),\n      returnFocus: returnFocus || document.activeElement,\n      backgroundInertRecords: []\n    };\n    sheet.__bgDesignFirstStore = store;\n    sheet.removeAttribute('data-bg-sheet-mode');\n    sheet.hidden = false;\n    sheet.setAttribute('aria-hidden', 'false');\n    sheet.removeAttribute('inert');\n    document.body.classList.add('bg-design-first-sheet--open');\n    setDesignFirstBackgroundInert(store, true);\n    renderDesignFirstChoiceSheet(store);\n    focusSelectedDesignFirstSheetChoice(store);\n  }\n\n  function getIntentFirstEligibleTemplates(store) {\n    var availability = getStoreArtworkAvailability(store);\n    var templates = getTemplateModalBaseTemplates(store);\n    return (Array.isArray(templates) ? templates : []).filter(function (template) {\n      if (!template || isStartBlankTemplate(template)) return false;\n      var modes = getTemplateModeAvailability(availability, template);\n      if (!modes.editservice && !modes.designonline) return false;\n      var configuration = getTemplateModalConfiguration(store, template);\n      return !!(configuration && configuration.mappable && configuration.matchesCurrent);\n    });\n  }\n\n  // OP-08 + OP-06 subtraction (ST1): the prototype-era intent panel\n  // builders (intent cards, branch panels, baked yard-sign title/media\n  // copy) were dead code \u2014 nothing rendered them since the Three Outcomes\n  // composition shipped \u2014 and they carried baked product words and the\n  // dishonest saved-design reorder promise. Removed outright.\n\n  function getContextualSelectedDesignTitle(store) {\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var template = store && store.state && store.state.template ? store.state.template : {};\n    return text(project.title || project.name || project.designTitle || template.title || template.templateName || template.name)\n      || (text(project.projectId) ? 'Your design' : 'Selected design');\n  }\n\n  function getContextualSourceTitle(context) {\n    var authored = text(context && context.sourceTitle);\n    if (authored) return authored;\n    var labels = {\n      product_specific: 'Product templates',\n      industry: 'Industry templates',\n      all_templates: 'All templates'\n    };\n    return labels[text(context && context.preset)] || 'Templates';\n  }\n\n  function formatContextualSavedProjectDate(project) {\n    var raw = text(project && (project.updatedAt || project.lastEditedAt || project.modifiedAt));\n    var parsed = Date.parse(raw);\n    if (!raw || !Number.isFinite(parsed)) return '';\n    try {\n      return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(new Date(parsed));\n    } catch (_) {\n      return new Date(parsed).toISOString().slice(0, 10);\n    }\n  }\n\n  function buildSelectedDesignCompatibilityRecoveryMarkup(store) {\n    var conflict = store && store.selectedDesignCompatibilityConflict;\n    if (!conflict) return '';\n    var designTitle = text(conflict.designTitle) || getContextualSelectedDesignTitle(store);\n    var choiceNoun = text(conflict.choiceNoun) || 'size';\n    return '' +\n      '<div class=\"bg-intent-first__compatibility-recovery\" data-bg-selected-design-compatibility role=\"alert\" tabindex=\"-1\">' +\n        '<div><strong>Your new ' + escapeHtml(choiceNoun) + ' doesn\\'t fit the selected template.</strong>' +\n        '<p>\u201C' + escapeHtml(designTitle) + '\u201D isn\\'t available at ' + escapeHtml(text(conflict.nextLabel) || 'this ' + choiceNoun) + '. Keep your ' + escapeHtml(choiceNoun) + ' and pick another design, or switch back to ' + escapeHtml(text(conflict.previousLabel) || 'the previous ' + choiceNoun) + ' to keep \u201C' + escapeHtml(designTitle) + '\u201D.</p></div>' +\n        '<div class=\"bg-intent-first__recovery-actions\">' +\n          '<button type=\"button\" data-bg-contextual-recovery=\"pick-another\">Pick another design</button>' +\n          '<button type=\"button\" data-bg-contextual-recovery=\"keep-design\">Keep \u201C' + escapeHtml(designTitle) + '\u201D</button>' +\n        '</div>' +\n      '</div>';\n  }\n\n  function getIntentFirstSelectedDesignContext(store) {\n    // With the artwork section disabled by Admin there is no design flow on\n    // this page, so a lingering handoff or saved project cannot open the\n    // selected-design chrome (its finish actions live in the artwork region).\n    if (isArtworkSectionAdminDisabled(store)) return null;\n    // RE3 \"Change artwork\": the customer asked for the artwork questions, so\n    // the contextual chrome yields to the canonical artwork section for the\n    // rest of this page view. State is untouched \u2014 the design stays loaded\n    // and recoverable through the standard artwork flows.\n    if (store && store.contextualArtworkChangeRequested) return null;\n    // PDP-PITCHPRINT-RETURN-APPROVAL (OD-370): a PitchPrint design owing the approval box (product rules) shows the section holding it.\n    if (shouldShowPitchPrintDesignApproval(store)) return null;\n    var collectionContext = store && store.collectionTemplateHandoff;\n    if (collectionContext && collectionContext.valid) return collectionContext;\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    if (!text(project.projectId)) return null;\n    return {\n      valid: true,\n      origin: 'saved_project',\n      returnPath: '',\n      preset: '',\n      sourceTitle: 'My Designs',\n      intendedFinish: 'designonline'\n    };\n  }\n\n  // OBS-36: a Style switch from a collection-origin page carries only the\n  // collection's return path (STYLE_RETURN_PARAM, validated on arrival by\n  // normalizeTemplateCollectionReturnPath). The arriving page renders the\n  // same \"Back to templates\" link the collection lane renders, and no other\n  // part of that lane.\n  function buildStyleSwitchReturnMarkup(store) {\n    var returnPath = text(store && store.styleSwitchReturnPath);\n    if (!returnPath) return '';\n    return '<div class=\"bg-intent-first__selected-nav\"><a href=\"' + escapeHtml(returnPath) + '\" data-bg-contextual-back>Back to templates</a></div>';\n  }\n\n  function renderIntentFirstSelectedDesignContext(store, hero, artworkBlock) {\n    var host = hero && hero.querySelector('[data-bg-intent-first-selected-context]');\n    var artworkHost = hero && hero.querySelector('[data-bg-intent-first-artwork-host]');\n    var bodyHost = artworkHost && artworkHost.querySelector('[data-bg-intent-first-selected-body]');\n    if (!bodyHost && artworkHost) {\n      bodyHost = document.createElement('div');\n      bodyHost.setAttribute('data-bg-intent-first-selected-body', '');\n      bodyHost.hidden = true;\n      artworkHost.insertBefore(bodyHost, artworkBlock || artworkHost.firstChild);\n    }\n    var context = getIntentFirstSelectedDesignContext(store);\n    var hasDesign = !!(store && store.state && (store.state.template || text(store.state.project && store.state.project.projectId)));\n    if (!host || !context || !context.valid || !hasDesign) {\n      if (host) {\n        // Without the selected-design chrome, a carried collection return\n        // path still renders its one link (OBS-36), and nothing else.\n        var returnOnlyMarkup = buildStyleSwitchReturnMarkup(store);\n        host.hidden = !returnOnlyMarkup;\n        host.innerHTML = returnOnlyMarkup;\n      }\n      if (bodyHost) {\n        bodyHost.hidden = true;\n        bodyHost.innerHTML = '';\n      }\n      if (artworkBlock) {\n        artworkBlock.hidden = false;\n        artworkBlock.removeAttribute('aria-hidden');\n      }\n      return false;\n    }\n    var template = store.state.template || {};\n    var project = store.state.project || {};\n    var hasProject = !!text(project.projectId);\n    var title = getContextualSelectedDesignTitle(store);\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var availability = getOfferedTemplateAvailability(store, template);\n    var preview = getDesignerMediaPreviewState(store);\n    var previewUrl = text(preview && preview.images && preview.images[0] && preview.images[0].url);\n    var savedDate = formatContextualSavedProjectDate(project);\n    var sourceTitle = getContextualSourceTitle(context);\n    var bannerThumb = previewUrl\n      ? '<img class=\"bg-intent-first__selected-banner-thumb\" src=\"' + escapeHtml(previewUrl) + '\" alt=\"\" loading=\"eager\" decoding=\"async\">'\n      : '';\n    // STOREFRONT-SAVED-EMPTY: a design this browser could not read filled\n    // nothing in, so the banner makes no claim about it.\n    var savedDesignUnavailable = hasProject && getSavedDesignReadinessState(store) === 'unavailable';\n    var bannerCopy = hasProject\n      ? '<div class=\"bg-intent-first__selected-copy\"><span>Saved design</span><h3>Welcome back \u2014 \u201C' + escapeHtml(title) + '\u201D is saved</h3>' + (savedDesignUnavailable ? '' : '<p>' + (savedDate ? 'Last edited ' + escapeHtml(savedDate) + ' \u00B7 ' : '') + 'your size and quantity are filled in from that design.</p>') + '</div>'\n      : '<div class=\"bg-intent-first__selected-copy\"><span>Design selected</span><h3>Design selected: \u201C' + escapeHtml(title) + '\u201D</h3><p>From ' + escapeHtml(sourceTitle) + '</p></div>';\n    var banner = '<div class=\"bg-intent-first__selected-banner\">' + bannerThumb + bannerCopy + '</div>';\n    var backLink = context.returnPath\n      ? '<a href=\"' + escapeHtml(context.returnPath) + '\" data-bg-contextual-back>Back to templates</a>'\n      : '';\n    // RE3: a loaded design keeps ONE escape \u2014 the \"Change artwork\" quiet\n    // action beside the design actions below. The template-swap \"Change\n    // design\" link stays for template-only arrivals, where swapping the\n    // template is the natural change.\n    var navigationActions = backLink + (hasProject ? '' : '<button type=\"button\" data-bg-contextual-change>Change design</button>');\n    var navigation = navigationActions\n      ? '<div class=\"bg-intent-first__selected-nav\">' + navigationActions + '</div>'\n      : '';\n    // RE3 lane-aware caption: no staff proof exists to promise on the\n    // design-online lane (the editor's review-and-approve step is the\n    // approval), so that lane names the preview honestly instead.\n    var previewCaption = isDesignOnlineNoProofLane(store)\n      ? (hasProject ? 'Preview of your design.' : 'Template preview.')\n      : 'Template preview \u2014 your proof comes before production.';\n    var previewMarkup = previewUrl\n      ? '<figure class=\"bg-intent-first__selected-preview\"><img src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(title + ' preview') + '\" loading=\"eager\" decoding=\"async\"><figcaption>' + escapeHtml(previewCaption) + '</figcaption></figure>'\n      : '';\n    var finishMarkup = '';\n    if (hasProject) {\n      // RE3: the loaded-design actions are normal-sized. \"Edit design\" opens\n      // the editor on this design; \"Reorder as is\" renders ONLY when the\n      // design genuinely arrived through a reorder chooser pick (origin\n      // state, never a heuristic); \"Change artwork\" reveals the artwork\n      // questions without touching the loaded design.\n      var reorderOrigin = getContextualReorderOrigin(store);\n      finishMarkup = '<div class=\"bg-intent-first__selected-actions\">' +\n        '<button type=\"button\" class=\"bg-intent-first__selected-action bg-intent-first__selected-action--primary\" data-bg-contextual-resume>Edit design</button>' +\n        (reorderOrigin ? '<button type=\"button\" class=\"bg-intent-first__selected-action bg-intent-first__selected-action--secondary\" data-bg-contextual-reorder>Reorder as is</button>' : '') +\n        '<button type=\"button\" class=\"bg-intent-first__selected-change-artwork\" data-bg-contextual-change-artwork>Change artwork</button>' +\n      '</div>';\n    } else if (!mode) {\n      var choices = '';\n      if (availability.designonline) {\n        choices += '<button type=\"button\" data-bg-contextual-finish=\"designonline\"><strong>Customize online' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</strong><span>Edit the design yourself in Studio.</span></button>';\n      }\n      if (availability.editservice) {\n        choices += '<button type=\"button\" data-bg-contextual-finish=\"editservice\"><strong>' + buildTemplatePersonalizationChoiceTitleMarkup(store, store.state.template) + '</strong><span>We update the design and send your formal proof.</span></button>';\n      }\n      finishMarkup = '<fieldset class=\"bg-intent-first__finish\"><legend>How do you want to finish it?</legend>' + choices + '</fieldset>';\n    } else if (mode === 'designonline' && !store.selectedDesignCompatibilityConflict) {\n      finishMarkup = '<div class=\"bg-intent-first__selected-actions\"><button type=\"button\" class=\"button button--primary\" data-bg-contextual-customize>Customize this design</button></div>';\n    } else if (mode === 'editservice') {\n      finishMarkup = '<div class=\"bg-intent-first__finish-summary\" role=\"status\"><strong>' + escapeHtml(getTemplatePersonalizationOutcomeLabel(store)) + '</strong><span>Your formal proof still comes before production.</span></div>';\n    }\n    host.innerHTML = '<section class=\"bg-intent-first__selected-design bg-intent-first__selected-design--banner\" aria-label=\"Selected design\">' +\n      '<div class=\"bg-intent-first__selected-head\">' + banner + navigation + '</div>' +\n    '</section>';\n    host.hidden = false;\n    if (bodyHost) {\n      bodyHost.innerHTML = '<div class=\"bg-intent-first__selected-body\">' + previewMarkup + '<div class=\"bg-intent-first__selected-finish\">' + buildSelectedDesignCompatibilityRecoveryMarkup(store) + finishMarkup + '</div></div>';\n      bodyHost.hidden = false;\n    }\n    if (artworkBlock) {\n      artworkBlock.hidden = true;\n      artworkBlock.setAttribute('aria-hidden', 'true');\n    }\n    return true;\n  }\n\n  function scrollIntentFirstNativeDetails(store) {\n    window.requestAnimationFrame(function () {\n      var artwork = store && store.root && store.root.querySelector('.bg-designer-storefront__artwork');\n      var uploads = store && store.root && store.root.querySelector('.bg-designer-storefront__uploads:not([hidden])');\n      var target = uploads || artwork;\n      if (target && typeof target.scrollIntoView === 'function') target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  }\n\n  // RE3 \"Change artwork\": reveal the artwork questions from the contextual\n  // design state, NON-DESTRUCTIVELY \u2014 the exact semantics of the compact\n  // summary's Change (state untouched, the chooser expands, the loaded design\n  // stays recoverable through the standard artwork flows).\n  function requestContextualArtworkChange(store) {\n    if (!store) return;\n    store.contextualArtworkChangeRequested = true;\n    emitStorefrontEvent(store, 'artwork_contextual_change_requested', 'artwork', {\n      method: text(store.state && store.state.artworkMode).toLowerCase()\n    }, 'normal');\n    var blocks = readBlocks(store);\n    var layout = getArtworkSectionConfig(store).sectionLayout;\n    if (layout === 'v4') {\n      handleArtworkAction(store, blocks, 'artwork-wizard-nav', null);\n    } else if (layout === 'v1') {\n      handleArtworkAction(store, blocks, 'change-artwork-method', null);\n    } else {\n      handleArtworkAction(store, blocks, 'change-versioned-artwork', null);\n    }\n    window.requestAnimationFrame(function () {\n      var artwork = blocks && blocks.artwork;\n      if (artwork && !artwork.hidden && typeof artwork.scrollIntoView === 'function') {\n        artwork.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n  }\n\n  function bindIntentFirstHero(store, hero, settings) {\n    var changeDesign = hero.querySelector('[data-bg-contextual-change]');\n    if (changeDesign) changeDesign.addEventListener('click', function () {\n      store.templateModalMode = 'templatebrowse';\n      openChangeTemplateChooser(store);\n    });\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-contextual-finish]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        var finish = text(button.getAttribute('data-bg-contextual-finish'));\n        handleArtworkAction(store, readBlocks(store), finish === 'editservice' ? 'template-personalize' : 'template-customize-online', button);\n      });\n    });\n    var customize = hero.querySelector('[data-bg-contextual-customize]');\n    if (customize) customize.addEventListener('click', function () {\n      void launchDesigner(store, { authPrompt: 'customize-online' });\n    });\n    var resume = hero.querySelector('[data-bg-contextual-resume]');\n    if (resume) resume.addEventListener('click', function () {\n      void launchDesigner(store, {});\n    });\n    var reorder = hero.querySelector('[data-bg-contextual-reorder]');\n    if (reorder) reorder.addEventListener('click', function () {\n      // RE3: this control renders only for a genuine chooser-pick origin, and\n      // that pick already marked the line (context + serialized form state) \u2014\n      // re-marking here would overwrite an 'ordered' origin with 'saved'.\n      forwardExperimentalPresentationPurchase(store, reorder);\n    });\n    var changeArtwork = hero.querySelector('[data-bg-contextual-change-artwork]');\n    if (changeArtwork) changeArtwork.addEventListener('click', function () {\n      requestContextualArtworkChange(store);\n    });\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-contextual-recovery]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        var action = text(button.getAttribute('data-bg-contextual-recovery'));\n        var conflict = store.selectedDesignCompatibilityConflict;\n        if (!conflict) return;\n        if (action === 'keep-design') {\n          replaceArtworkSelections(store, Object.assign({}, conflict.previousSelections), 'reconcile');\n          store.selectedDesignCompatibilityConflict = null;\n          recalculate(store);\n          render(store);\n          window.requestAnimationFrame(function () {\n            var presentationControl = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-intent-first-build-key]')).find(function (candidate) {\n              return text(candidate.getAttribute('data-bg-intent-first-build-key')) === text(conflict.holderId);\n            });\n            if (presentationControl && typeof presentationControl.focus === 'function') {\n              try { presentationControl.focus({ preventScroll: true }); } catch (_) { presentationControl.focus(); }\n              return;\n            }\n            var kept = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-holder-value][data-bg-hvid]')).find(function (candidate) {\n              return text(candidate.getAttribute('data-bg-holder-value')) === text(conflict.holderId)\n                && text(candidate.getAttribute('data-bg-hvid')) === text(conflict.previousHvid);\n            });\n            if (kept && typeof kept.focus === 'function') {\n              try { kept.focus({ preventScroll: true }); } catch (_) { kept.focus(); }\n            }\n          });\n          return;\n        }\n        // Keep both the new product choice and the existing design until a\n        // compatible replacement is actually selected. Closing the chooser\n        // therefore returns to the same recoverable warning with no data loss.\n        store.templateModalMode = 'templatebrowse';\n        openChangeTemplateChooser(store);\n      });\n    });\n    // (ST1 subtraction) The prototype-era intent-panel bindings are gone with\n    // their builders \u2014 no hero markup emits those hooks any more.\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-build-key]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        openDesignFirstChoiceSheet(store, button.getAttribute('data-bg-intent-first-build-key'), button);\n      });\n    });\n    // S3: Change on the template's size summary opens the size sheet; the\n    // outcome is decided when the sheet closes (closeDesignFirstChoiceSheet).\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-template-size-change]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        var holderId = text(button.getAttribute('data-bg-intent-first-template-size-change'));\n        var holder = findHolderById(store, holderId);\n        var selected = holder ? getSelectedOption(store, holder) : null;\n        store.pendingTemplateSizeChange = { holderId: holderId, previousHvid: text(selected && selected.hvId) };\n        openDesignFirstChoiceSheet(store, holderId, button);\n      });\n    });\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-featured-hvid]')).forEach(function (card) {\n      card.addEventListener('click', function () {\n        var holder = getFeaturedImageCardsHolder(store);\n        if (!holder) return;\n        var hvid = text(card.getAttribute('data-bg-intent-first-featured-hvid'));\n        var control = findNativeHolderControl(store, getHolderId(holder), hvid);\n        if (control && !control.disabled && typeof control.click === 'function') control.click();\n        window.requestAnimationFrame(function () {\n          var replacement = store.root.querySelector('[data-bg-intent-first-featured-hvid=\"' + hvid + '\"]');\n          if (replacement && typeof replacement.focus === 'function') {\n            try { replacement.focus({ preventScroll: true }); } catch (_) { replacement.focus(); }\n          }\n        });\n      });\n    });\n    var featuredGroup = hero.querySelector('[data-bg-intent-first-featured-group]');\n    if (featuredGroup) featuredGroup.addEventListener('keydown', function (event) {\n      if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].indexOf(event.key) === -1) return;\n      var cards = Array.prototype.slice.call(featuredGroup.querySelectorAll('[data-bg-intent-first-featured-hvid]:not([disabled])'));\n      if (!cards.length) return;\n      var currentIndex = cards.indexOf(document.activeElement);\n      if (currentIndex === -1) {\n        currentIndex = cards.findIndex(function (candidate) { return candidate.getAttribute('aria-checked') === 'true'; });\n      }\n      var direction = (event.key === 'ArrowRight' || event.key === 'ArrowDown') ? 1 : -1;\n      var next = cards[((currentIndex === -1 ? 0 : currentIndex) + direction + cards.length) % cards.length];\n      if (!next) return;\n      event.preventDefault();\n      next.click();\n    });\n    // ST2 inline presentations: every activation forwards to the canonical\n    // native holder control; the re-rendered replacement control regains\n    // focus so keyboard flows survive the innerHTML rewrite.\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-inline-hvid]')).forEach(function (control) {\n      control.addEventListener('click', function () {\n        var holderId = text(control.getAttribute('data-bg-intent-first-inline-holder'));\n        var hvid = text(control.getAttribute('data-bg-intent-first-inline-hvid'));\n        var nativeControl = findNativeHolderControl(store, holderId, hvid);\n        if (nativeControl && !nativeControl.disabled && typeof nativeControl.click === 'function') nativeControl.click();\n        window.requestAnimationFrame(function () {\n          var replacement = store.root.querySelector('[data-bg-intent-first-inline-hvid=\"' + hvid + '\"]');\n          if (replacement && typeof replacement.focus === 'function') {\n            try { replacement.focus({ preventScroll: true }); } catch (_) { replacement.focus(); }\n          }\n        });\n      });\n    });\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-inline-group]')).forEach(function (group) {\n      group.addEventListener('keydown', function (event) {\n        if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].indexOf(event.key) === -1) return;\n        var values = Array.prototype.slice.call(group.querySelectorAll('[data-bg-intent-first-inline-hvid]:not([disabled])'));\n        if (!values.length) return;\n        var currentIndex = values.indexOf(document.activeElement);\n        if (currentIndex === -1) {\n          currentIndex = values.findIndex(function (candidate) { return candidate.getAttribute('aria-checked') === 'true'; });\n        }\n        var direction = (event.key === 'ArrowRight' || event.key === 'ArrowDown') ? 1 : -1;\n        var next = values[((currentIndex === -1 ? 0 : currentIndex) + direction + values.length) % values.length];\n        if (!next) return;\n        event.preventDefault();\n        next.click();\n      });\n    });\n    Array.prototype.slice.call(hero.querySelectorAll('[data-bg-intent-first-inline-select]')).forEach(function (select) {\n      select.addEventListener('change', function () {\n        var holderId = text(select.getAttribute('data-bg-intent-first-inline-select'));\n        var nativeControl = findNativeHolderControl(store, holderId, select.value);\n        if (nativeControl && !nativeControl.disabled && typeof nativeControl.click === 'function') nativeControl.click();\n      });\n    });\n    var compareOpen = hero.querySelector('[data-bg-intent-first-compare-open]');\n    if (compareOpen) compareOpen.addEventListener('click', function () {\n      openIntentFirstCompareSheet(store, compareOpen);\n    });\n    // Slice 2 style lock: \"Change <style>\" confirms once, then re-expands the\n    // section; the actual switch (with stash/restore) runs when a card is\n    // picked, through the one native interception.\n    var styleLockChange = hero.querySelector('[data-bg-style-lock-change]');\n    if (styleLockChange) styleLockChange.addEventListener('click', function () {\n      var holder = getStyleLockHolder(store);\n      if (!holder) return;\n      void confirmStyleLockChange(store, holder).then(function (accepted) {\n        if (!accepted) return;\n        store.styleLockChangeArmed = true;\n        render(store);\n        window.requestAnimationFrame(function () {\n          var group = store.root.querySelector('[data-bg-intent-first-featured-group]');\n          var selectedCard = group && group.querySelector('[aria-checked=\"true\"]');\n          if (selectedCard && typeof selectedCard.focus === 'function') {\n            try { selectedCard.focus({ preventScroll: true }); } catch (_) { selectedCard.focus(); }\n          }\n        });\n      });\n    });\n  }\n\n  function buildIntentFirstArtworkRegionMarkup() {\n    return '<section class=\"bg-intent-first__artwork-region\" data-bg-intent-first-artwork-region>' +\n      '<div class=\"bg-intent-first__intent-head\"><span data-bg-intent-first-design-label>Design</span><h2 data-bg-intent-first-artwork-title>How do you want to handle the design?</h2></div>' +\n      '<div data-bg-intent-first-artwork-host></div>' +\n    '</section>';\n  }\n\n  // ===== Style lock + per-style session stash (Yard Signs master program\n  // slice 2; 2026-09-09 ruling). Once REAL design work exists \u2014 a started or\n  // saved design, an upload, or a Canva link \u2014 the featured style section\n  // keeps its full card grid but shows a quiet \"Change <style>\" affordance,\n  // and picking another card asks first. Merely choosing a template never\n  // engages the lock: the customer may browse templates and styles freely. A\n  // change stashes the outgoing style's work (template, method, selections,\n  // quantity, project pointer, upload pointers \u2014 detach only, uploaded files\n  // are never deleted) in per-tab sessionStorage and restores the incoming\n  // style's stash. Data-driven: the locked holder is the product's featured\n  // image-cards holder; no product words live here. =====\n  function getStyleLockHolder(store) {\n    return getFeaturedImageCardsHolder(store);\n  }\n\n  // SF-4 (2026-09-13): presentation.intentFirst.templateStyleGuard (default\n  // on; the Admin switch is added by the settings lane) supersedes the\n  // \"merely choosing a template never engages the lock\" clause above: with\n  // the guard on, a SELECTED template engages the lock too, and any engaged\n  // lock collapses the style area to a summary with Change. Changing the\n  // style asks first (the existing dialog), a plain template selection is\n  // cleared for the new style, a started design keeps its saved project, and\n  // switching back restores what was chosen there (the stash already carries\n  // the template). Off keeps the 2026-09-09 behavior byte for byte.\n  function isTemplateStyleGuardEnabled(store) {\n    return getExperimentalPresentationSettings(store, 'intentFirst').templateStyleGuard !== false;\n  }\n\n  // S3/S4 (2026-09-16, Steve's go): a template picked ON the page (no\n  // collection handoff, no saved design) is a selected design for this\n  // layout: the design heading hides, and the size the template was picked\n  // for shows as a summary whose Change opens the size sheet. A different\n  // size drops the template and reopens the template picker at the new size;\n  // the same size keeps it. No template families. Option-value templates\n  // keep their own lane and the contextual lanes keep their non-destructive\n  // recovery. Intent First only: the guided layouts are unchanged.\n  function getIntentFirstInPageTemplate(store) {\n    if (!store || !store.state || getProductFormPresentation(store) !== 'intent_first') return null;\n    var template = store.state.template;\n    if (!template || template.optionTemplate) return null;\n    if (store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid) return null;\n    if (store.savedProjectResumeAuthoritativelyValidated === true) return null;\n    if (text(store.state.project && store.state.project.projectId)) return null;\n    return template;\n  }\n\n  function getIntentFirstTemplateSizeHolder(store) {\n    if (!getIntentFirstInPageTemplate(store)) return null;\n    var sync = getProductCommerceEditorSync(store);\n    return findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n  }\n\n  function findHolderById(store, holderId) {\n    return (Array.isArray(store && store.holders) ? store.holders : []).find(function (entry) {\n      return getHolderId(entry) === text(holderId);\n    }) || null;\n  }\n\n  function buildIntentFirstTemplateSizeSummaryMarkup(store, row) {\n    var parts = getDesignFirstRowValueParts(store, row);\n    return '<button type=\"button\" data-bg-intent-first-template-size-change=\"' + escapeHtml(row.key) + '\" aria-label=\"Change ' + escapeHtml(row.label) + '\"><span>' + escapeHtml(row.label) + '</span><strong>' + escapeHtml(parts.lead) + '</strong><small>A new size picks a new template</small><em aria-hidden=\"true\">Change</em></button>';\n  }\n\n  function didIntentFirstTemplateSizeChange(store, pending) {\n    var holder = findHolderById(store, pending && pending.holderId);\n    var selected = holder ? getSelectedOption(store, holder) : null;\n    return !!getIntentFirstInPageTemplate(store) && text(selected && selected.hvId) !== text(pending && pending.previousHvid);\n  }\n\n  function releaseIntentFirstTemplateForNewSize(store, pending) {\n    var template = store.state.template;\n    if (template) store.mobileArtworkTemplateDetached = true;\n    store.guidedArtworkTemplateSelectionCache = null;\n    store.templateModalActiveId = '';\n    // The finish question reopens with the template: the customer picks a\n    // template again, at the new size, before choosing how to finish it.\n    commitArtworkConfiguration(store, { template: null, artworkMode: '' }, { source: 'availability', reset: true });\n    emitStorefrontEvent(store, 'template_released_for_size_change', 'artwork', {\n      holderId: text(pending && pending.holderId),\n      fromHvid: text(pending && pending.previousHvid),\n      toHvid: text(store.state.selections[text(pending && pending.holderId)]),\n      templateLookup: text(template && (template.templateLookup || template.designId))\n    }, 'normal');\n    syncFormState(store);\n    render(store);\n    store.templateModalMode = 'templatebrowse';\n    openChangeTemplateChooser(store);\n  }\n\n  function isTemplateEngagedForStyleLock(store) {\n    if (!store || !store.state || !isTemplateStyleGuardEnabled(store)) return false;\n    var template = store.state.template;\n    if (!template || template.optionTemplate) return false;\n    // Contextual lanes keep their own non-destructive compatibility recovery.\n    if (store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid) return false;\n    if (store.savedProjectResumeAuthoritativelyValidated === true) return false;\n    return true;\n  }\n\n  function isArtworkEngagedForStyleLock(store) {\n    if (!store || !store.state) return false;\n    if (isTemplateEngagedForStyleLock(store)) return true;\n    if (text(store.state.project && store.state.project.projectId)) return true;\n    if (text(store.state.canvaUrl)) return true;\n    var uploads = store.state.uploads && typeof store.state.uploads === 'object' ? store.state.uploads : {};\n    // A detail file (a mailing list) is not design work: it stays with the\n    // page through a style switch (UPLOAD-CARRY-2b), so it locks nothing.\n    return Object.keys(uploads).some(function (fieldId) {\n      return Array.isArray(uploads[fieldId]) && uploads[fieldId].length > 0 && !findDetailUploadField(store, fieldId);\n    });\n  }\n\n  function isStyleLockCollapsed(store) {\n    return !!getStyleLockHolder(store)\n      && isArtworkEngagedForStyleLock(store)\n      && !store.styleLockChangeArmed\n      && !store.selectedDesignCompatibilityConflict;\n  }\n\n  function getStyleStashStorageKey(store) {\n    return 'bg-style-stash-v1:' + (text(store && store.config && store.config.productId)\n      || core.slugify(text(store && store.root && store.root.id) || 'product'));\n  }\n\n  function readStyleStashRecord(store) {\n    try {\n      var parsed = JSON.parse(window.sessionStorage.getItem(getStyleStashStorageKey(store)) || 'null');\n      return parsed && typeof parsed === 'object' ? parsed : {};\n    } catch (error) {\n      return {};\n    }\n  }\n\n  function writeStyleStashRecord(store, record) {\n    try {\n      window.sessionStorage.setItem(getStyleStashStorageKey(store), JSON.stringify(record || {}));\n    } catch (error) {\n      /* per-tab convenience only */\n    }\n  }\n\n  function cloneStyleStashValue(value) {\n    try {\n      return JSON.parse(JSON.stringify(value));\n    } catch (error) {\n      return null;\n    }\n  }\n\n  function stashStyleState(store, hvid) {\n    if (!text(hvid)) return;\n    var record = readStyleStashRecord(store);\n    record[text(hvid)] = {\n      artworkQuote: captureArtworkQuote(store),\n      template: store.state.template ? cloneStyleStashValue(store.state.template) : null,\n      artworkMode: text(store.state.artworkMode),\n      selections: Object.assign({}, store.state.selections),\n      quantity: store.state.quantity,\n      project: cloneStyleStashValue(store.state.project),\n      canvaUrl: text(store.state.canvaUrl),\n      // Upload POINTERS only: switching styles detaches them from the build;\n      // the uploaded files themselves are never deleted.\n      uploads: cloneStyleStashValue(store.state.uploads) || {}\n    };\n    writeStyleStashRecord(store, record);\n  }\n\n  function hasStyleStash(store, hvid) {\n    var snapshot = readStyleStashRecord(store)[text(hvid)];\n    return !!(snapshot && typeof snapshot === 'object');\n  }\n\n  function restoreStyleStash(store, hvid, holderId) {\n    var record = readStyleStashRecord(store);\n    var snapshot = record[text(hvid)];\n    if (!snapshot || typeof snapshot !== 'object') return false;\n    var staged = Object.assign({}, snapshot, { selections: Object.assign({}, snapshot.selections) });\n    delete staged.uploads;\n    staged.selections[holderId] = text(hvid);\n    var restored = restoreArtworkSnapshot(store, staged);\n    if (restored.status === 'refused') return false;\n    store.state.canvaUrl = text(snapshot.canvaUrl);\n    // The style's own artwork files come back; a detail file keeps its current state.\n    replaceArtworkUploads(store, snapshot.uploads);\n    if (snapshot.project && text(snapshot.project.projectId)) {\n      store.state.project = snapshot.project;\n    } else {\n      clearProjectState(store);\n    }\n    recalculate(store);\n    return true;\n  }\n\n  function resetArtworkForFreshStyle(store) {\n    // Detach only: the outgoing style's pointers were just stashed; files\n    // and projects survive untouched for a later switch back.\n    commitArtworkConfiguration(store, { template: null, artworkMode: '' }, { source: 'availability', reset: true });\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n    recalculate(store);\n  }\n\n  // Bug-4 fix: a template whose family the current choices exclude must not\n  // survive a style switch (the chooser re-filters correctly, but the stuck\n  // selection kept the old main image and launch state).\n  function enforceStyleTemplateValidity(store) {\n    var template = store.state.template;\n    if (!template) return false;\n    if (templateMatchesOptionSourceRules(store, template)) return false;\n    store.mobileArtworkTemplateDetached = true;\n    var losesFinish = store.state.artworkMode === 'designonline' || store.state.artworkMode === 'editservice';\n    commitArtworkConfiguration(store, { template: null, artworkMode: losesFinish ? '' : store.state.artworkMode }, { source: 'availability', reset: losesFinish });\n    recalculate(store);\n    return true;\n  }\n\n  function confirmStyleLockChange(store, holder) {\n    var operation = captureArtworkOperation(store);\n    var noun = (text(holder && holder.displayName) || 'style').toLowerCase();\n    return openStorefrontConfirmDialog({\n      title: 'Change your ' + noun + '?',\n      body: ['The design work for your current ' + noun + ' is kept for this visit and comes back if you switch back.'],\n      confirmLabel: 'Change ' + noun,\n      cancelLabel: 'Keep my ' + noun\n    }).then(function (accepted) { return isArtworkOperationFresh(store, operation) && accepted; });\n  }\n\n  // ===== Copy and convert (2026-09-09). With a STARTED design (a saved\n  // project on this page) a style switch first offers to copy the design and\n  // convert the copy to the new style in the editor \u2014 one ink color when the\n  // target value's typed print process is spot color, otherwise a refit to the\n  // new style's shape/size. The original design stays untouched; the editor\n  // makes the copy and applies the priced configuration transitions the\n  // product configuration offers (launchContext.metadata.styleConversion).\n  // Everything is derived from the value's typed semantics; no product words.\n  function describeStyleConversion(store, holder, hvid) {\n    var target = getVisibleOptions(store, holder).find(function (option) {\n      return text(option && option.hvId) === text(hvid);\n    });\n    if (!target) return null;\n    var current = getSelectedOption(store, holder);\n    var toProcess = text(target.printProcess).toLowerCase();\n    var fromProcess = text(current && current.printProcess).toLowerCase();\n    return {\n      targetLabel: getOptionDisplayLabel(store, holder, target),\n      currentLabel: current ? getOptionDisplayLabel(store, holder, current) : '',\n      oneColor: toProcess === 'spot_color' && fromProcess !== 'spot_color',\n      fullColor: toProcess === 'full_color' && fromProcess === 'spot_color'\n    };\n  }\n\n  function canOfferStyleConversion(store) {\n    return getLaunchProvider(store) === 'self-hosted'\n      && !!text(store && store.state && store.state.project && store.state.project.projectId);\n  }\n\n  // Resolves to 'convert' | 'fresh' | 'keep'.\n  function decideStyleLockChange(store, holder, hvid) {\n    var operation = captureArtworkOperation(store);\n    var noun = (text(holder && holder.displayName) || 'style').toLowerCase();\n    var info = canOfferStyleConversion(store) ? describeStyleConversion(store, holder, hvid) : null;\n    if (!info) {\n      return confirmStyleLockChange(store, holder).then(function (accepted) { return accepted ? 'fresh' : 'keep'; });\n    }\n    var body = ['Your ' + (info.currentLabel ? info.currentLabel + ' ' : '') + 'design stays saved exactly as it is.'];\n    if (info.oneColor) body.push('We copy it and convert the copy to print in one ink color. Photos and colors convert automatically, and you can adjust the copy before you order.');\n    else if (info.fullColor) body.push('We copy it and the copy goes back to full color. You can adjust the copy before you order.');\n    else body.push('We copy it and fit the copy to ' + info.targetLabel + ' so you can adjust it before you order.');\n    return openStorefrontConfirmDialog({\n      title: 'Convert your design to ' + info.targetLabel + '?',\n      body: body,\n      confirmLabel: 'Copy and convert',\n      cancelLabel: 'No, thanks'\n    }).then(function (convert) {\n      if (!isArtworkOperationFresh(store, operation)) return 'keep';\n      if (convert) return 'convert';\n      return confirmStyleLockChange(store, holder).then(function (accepted) { return accepted ? 'fresh' : 'keep'; });\n    });\n  }\n\n  function performStyleConversion(store, holder, hvid) {\n    var holderId = getHolderId(holder);\n    var current = getSelectedOption(store, holder);\n    var info = describeStyleConversion(store, holder, hvid) || {};\n    store.styleLockChangeArmed = false;\n    store.pendingStyleConversion = {\n      sourceProjectId: text(store.state.project && store.state.project.projectId),\n      holderId: holderId,\n      fromValueId: text(current && current.hvId),\n      toValueId: text(hvid),\n      fromLabel: text(info.currentLabel),\n      toLabel: text(info.targetLabel),\n      oneColor: info.oneColor === true,\n      awaitingShape: false\n    };\n    // The project pointer stays: the editor makes the copy. The design\n    // deliberately mismatches the new style (that is the conversion), so the\n    // contextual \"keep or change the design\" recovery must not fire: commit\n    // the selection directly. Only a template the new style excludes\n    // detaches; the converted copy takes over from it.\n    writeArtworkSelection(store, holderId, text(hvid), 'reconcile');\n    // S1b: a conversion is a fresh entry into the new style, so its switch\n    // rules apply; the sentence settles after the closing recalculate.\n    applyStyleSwitchRules(store, holderId, text(hvid));\n    store.selectedDesignCompatibilityConflict = null;\n    recalculate(store);\n    enforceStyleTemplateValidity(store);\n    finalizeStyleSwitchNotice(store);\n    emitStorefrontEvent(store, 'style_conversion_requested', 'options', {\n      holderId: holderId,\n      hvid: text(hvid),\n      oneColor: info.oneColor === true\n    }, 'low');\n    // Shape ask: when the new style exposes a size/shape choice with more\n    // than one value, let the customer pick it first; the editor launch\n    // follows when the choice sheet closes (closeDesignFirstChoiceSheet).\n    var shapeHolder = findPresentationHolder(store, ['shape', 'size']);\n    if (shapeHolder && getVisibleOptions(store, shapeHolder).length > 1 && getHolderId(shapeHolder) !== holderId) {\n      store.pendingStyleConversion.awaitingShape = true;\n      render(store);\n      openDesignFirstChoiceSheet(store, getHolderId(shapeHolder), null);\n      return;\n    }\n    render(store);\n    void launchDesigner(store, { showPreloader: true, authPrompt: '' });\n  }\n\n  function buildStyleConversionLaunchContext(store) {\n    var pending = store && store.pendingStyleConversion;\n    if (!pending || !text(pending.sourceProjectId) || text(pending.sourceProjectId) !== text(store.state.project && store.state.project.projectId)) return null;\n    var targetSelections = buildCurrentOptionSelections(store).map(function (selection) {\n      return { holderId: text(selection && selection.holderId), valueId: text(selection && (selection.hvid || selection.valueId || selection.variationId)) };\n    }).filter(function (entry) { return entry.holderId && entry.valueId; });\n    return {\n      version: 1,\n      sourceProjectId: text(pending.sourceProjectId),\n      holderId: text(pending.holderId),\n      fromValueId: text(pending.fromValueId),\n      toValueId: text(pending.toValueId),\n      fromLabel: text(pending.fromLabel).slice(0, 120),\n      toLabel: text(pending.toLabel).slice(0, 120),\n      targetSelections: targetSelections.slice(0, 24)\n    };\n  }\n\n  function performStyleLockChange(store, holder, hvid) {\n    var holderId = getHolderId(holder);\n    var current = getSelectedOption(store, holder);\n    if (current) stashStyleState(store, text(current.hvId));\n    store.styleLockChangeArmed = false;\n    // S1b: a stash for the incoming style is the customer's own earlier\n    // configuration of it and wins over the switch rules; a fresh entry\n    // applies them, with the sentence settled after this path's closing\n    // recalculate rather than the commit's.\n    var restoring = hasStyleStash(store, hvid);\n    commitContextualOptionSelection(store, holderId, hvid, { styleSwitchRules: !restoring, deferStyleSwitchNotice: true });\n    if (store.selectedDesignCompatibilityConflict) {\n      // Contextual designs keep their existing non-destructive recovery.\n      finalizeStyleSwitchNotice(store);\n      return;\n    }\n    if (!restoreStyleStash(store, hvid, holderId)) {\n      resetArtworkForFreshStyle(store);\n    }\n    enforceStyleTemplateValidity(store);\n    finalizeStyleSwitchNotice(store);\n    emitStorefrontEvent(store, 'style_lock_style_changed', 'options', {\n      holderId: holderId,\n      hvid: hvid\n    }, 'low');\n  }\n\n  // Returns true when the activation was handled here (locked-change confirm\n  // + stash/restore); false hands it to the ordinary commit path.\n  function interceptStyleLockedSelection(store, holderId, hvid) {\n    var operation = captureArtworkOperation(store);\n    var holder = getStyleLockHolder(store);\n    if (!holder || getHolderId(holder) !== text(holderId)) return false;\n    // Contextual designs (collection handoffs, validated saved-project\n    // resumes, an active conflict) keep their existing non-destructive\n    // compatibility recovery \u2014 the lock never fights that lane.\n    if (store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid) return false;\n    if (store.savedProjectResumeAuthoritativelyValidated === true) return false;\n    if (store.selectedDesignCompatibilityConflict) return false;\n    var selected = getSelectedOption(store, holder);\n    if (selected && text(selected.hvId) === text(hvid)) return false;\n    var engaged = isArtworkEngagedForStyleLock(store);\n    var hasStash = Object.keys(readStyleStashRecord(store)).length > 0;\n    if (!engaged && !hasStash) return false;\n    if (engaged && !store.styleLockChangeArmed) {\n      void decideStyleLockChange(store, holder, hvid).then(function (choice) {\n        if (choice === 'keep') return;\n        if (choice === 'convert') {\n          performStyleConversion(store, holder, hvid);\n          return;\n        }\n        performStyleLockChange(store, holder, hvid);\n        render(store);\n      });\n      return true;\n    }\n    if (engaged && store.styleLockChangeArmed && canOfferStyleConversion(store)) {\n      // Armed through the \"Change <style>\" link: the conversion offer still\n      // applies to a started design; declining starts the style fresh.\n      var info = describeStyleConversion(store, holder, hvid);\n      if (info) {\n        void openStorefrontConfirmDialog({\n          title: 'Convert your design to ' + info.targetLabel + '?',\n          body: [info.oneColor\n            ? 'We copy your design and convert the copy to print in one ink color. Your original stays saved.'\n            : 'We copy your design and fit the copy to ' + info.targetLabel + '. Your original stays saved.'],\n          confirmLabel: 'Copy and convert',\n          cancelLabel: 'Start fresh instead'\n        }).then(function (convert) {\n          if (!isArtworkOperationFresh(store, operation)) return;\n          if (convert) {\n            performStyleConversion(store, holder, hvid);\n            return;\n          }\n          performStyleLockChange(store, holder, hvid);\n          render(store);\n        });\n        return true;\n      }\n    }\n    performStyleLockChange(store, holder, hvid);\n    return true;\n  }\n\n  // PDP-STYLE-01: the featured image-cards selector. A prominent full-width\n  // product decision above the commerce card, projected from the CANONICAL\n  // option holder \u2014 every activation forwards to the native holder control,\n  // so pricing, rules, media, and compatibility recovery all run through the\n  // existing owners with no parallel state.\n  function renderIntentFirstFeaturedOptionCards(store, hero, holder) {\n    var host = hero.querySelector('[data-bg-intent-first-featured]');\n    if (!host) return false;\n    if (!holder) {\n      host.hidden = true;\n      host.innerHTML = '';\n      return false;\n    }\n    var label = text(holder.displayName) || 'Choice';\n    var selected = getSelectedOption(store, holder);\n    // Style lock (2026-09-09 ruling): with real design work the card grid\n    // stays intact \u2014 every style remains visible and tappable \u2014 and a quiet\n    // \"Change <style>\" link plus the switch prompt guard the work.\n    var lockCollapsed = isStyleLockCollapsed(store);\n    // SF-4 (2026-09-13, guard on): the engaged lock collapses the whole\n    // style area to the selected style's summary row with Change; the grid\n    // returns once Change is confirmed (styleLockChangeArmed).\n    if (lockCollapsed && isTemplateStyleGuardEnabled(store) && selected) {\n      var summaryEntry = getOptionPresentationEntry(store, getHolderId(holder));\n      var summaryImage = text(selected.imageUrl || selected.image) || text(selected.overrideProductImage);\n      var summaryFlavor = getOptionFlavorText(selected);\n      host.innerHTML = (summaryEntry && summaryEntry.showFeaturedHeading === false ? '' : '<div class=\"bg-intent-first__featured-head\"><span>' + escapeHtml(label) + '</span></div>') +\n        '<div class=\"bg-intent-first__featured-summary\" data-bg-intent-first-featured-summary data-bg-style-lock-engaged=\"true\">' +\n          '<span class=\"bg-intent-first__featured-media\">' + (summaryImage ? '<img src=\"' + escapeHtml(summaryImage) + '\" alt=\"\" loading=\"lazy\" decoding=\"async\">' : '<span aria-hidden=\"true\"></span>') + '</span>' +\n          '<span class=\"bg-intent-first__featured-copy\"><strong>' + escapeHtml(getOptionDisplayLabel(store, holder, selected)) + '</strong>' + (summaryFlavor ? '<small>' + escapeHtml(summaryFlavor) + '</small>' : '') + '</span>' +\n          '<button type=\"button\" class=\"bg-intent-first__compare-link bg-intent-first__featured-change\" data-bg-style-lock-change>Change ' + escapeHtml(label.toLowerCase()) + '</button>' +\n        '</div>';\n      host.hidden = false;\n      return true;\n    }\n    var cards = getVisibleOptions(store, holder).map(function (option) {\n      var optionId = text(option && option.hvId);\n      var active = !!(selected && text(selected.hvId) === optionId);\n      var disabled = !!(option && option.outOfStock) || isOptionDisabledByRules(store, option);\n      var imageUrl = text(option && (option.imageUrl || option.image)) || text(option && option.overrideProductImage);\n      var flavor = getOptionFlavorText(option);\n      var priceSuffix = buildAddonPriceLabelMarkup(store, holder, option);\n      // Slice 4: real price differences on the featured cards when the\n      // product's price-change labels are on (blank when unpriceable).\n      var deltaMarkup = buildIntentPriceChangeLabelMarkup(store, holder, option, active);\n      var priceLine = priceSuffix || deltaMarkup || isHolderPriceChangeLabelEnabled(store, getHolderId(holder))\n        ? '<span class=\"bg-designer-storefront__option-price bg-designer-storefront__option-price--reserved\">' + (priceSuffix || '') + (deltaMarkup || '') + '</span>'\n        : '';\n      return '<button type=\"button\" class=\"bg-intent-first__featured-card' + (active ? ' is-selected' : '') + '\" role=\"radio\" aria-checked=\"' + (active ? 'true' : 'false') + '\" data-bg-intent-first-featured-hvid=\"' + escapeHtml(optionId) + '\" tabindex=\"' + (active ? '0' : '-1') + '\"' + (disabled ? ' disabled aria-disabled=\"true\"' : '') + '>' +\n        '<span class=\"bg-intent-first__featured-radio\" aria-hidden=\"true\"></span>' +\n        '<span class=\"bg-intent-first__featured-media\">' + (imageUrl ? '<img src=\"' + escapeHtml(imageUrl) + '\" alt=\"\" loading=\"lazy\" decoding=\"async\">' : '<span aria-hidden=\"true\"></span>') + '</span>' +\n        '<span class=\"bg-intent-first__featured-copy\"><strong>' + escapeHtml(getOptionDisplayLabel(store, holder, option)) + '</strong>' + priceLine + (flavor ? '<small>' + escapeHtml(flavor) + '</small>' : '') + '</span>' +\n      '</button>';\n    }).join('');\n    // PDP-COMPARE-01: the quiet compare link renders only when at least one\n    // visible value carries configured comparison content.\n    var compareEntry = getOptionPresentationEntry(store, getHolderId(holder)) || {};\n    var compareLink = compareEntry.showCompare !== false && getIntentFirstCompareContent(store, holder).length\n      ? '<button type=\"button\" class=\"bg-intent-first__compare-link\" data-bg-intent-first-compare-open>' + escapeHtml(text(compareEntry.compareTitle) || 'Compare ' + getIntentFirstComparePluralLabel(holder)) + '</button>'\n      : '';\n    var changeStyleLink = lockCollapsed\n      ? '<button type=\"button\" class=\"bg-intent-first__compare-link\" data-bg-style-lock-change>Change ' + escapeHtml(label.toLowerCase()) + '</button>'\n      : '';\n    // The heading is operator-editable per featured holder; the default keeps\n    // the built-in \"Choose your <holder>\" copy.\n    var featuredEntry = getOptionPresentationEntry(store, getHolderId(holder));\n    var featuredHeading = text(featuredEntry && featuredEntry.featuredHeading) || ('Choose your ' + label.toLowerCase());\n    host.innerHTML = (featuredEntry && featuredEntry.showFeaturedHeading === false ? '' : '<div class=\"bg-intent-first__featured-head\"><span>' + escapeHtml(label) + '</span><h2>' + escapeHtml(featuredHeading) + '</h2></div>') +\n      '<div class=\"bg-intent-first__featured-grid\" role=\"radiogroup\" aria-label=\"' + escapeHtml(label) + '\" data-bg-intent-first-featured-group' + (lockCollapsed ? ' data-bg-style-lock-engaged=\"true\"' : '') + '>' + cards + '</div>' +\n      changeStyleLink +\n      compareLink;\n    host.hidden = false;\n    return true;\n  }\n\n  function ensureIntentFirstProductFormChrome(store) {\n    if (!store || !store.root || applyProductFormPresentationMode(store) !== 'intent_first') return null;\n    restoreExperimentalPresentationDisplayTitle(store.root.closest('product-info') || store.root);\n    var root = store.root;\n    var optionsBlock = root.querySelector('[data-bg-designer-block=\"options\"]');\n    var artworkBlock = root.querySelector('[data-bg-designer-block=\"artwork\"]');\n    if (!optionsBlock || !artworkBlock) return null;\n    var artworkSectionEnabled = !isArtworkSectionAdminDisabled(store);\n    var hero = root.querySelector('[data-bg-intent-first-hero]');\n    if (!hero) {\n      hero = document.createElement('section');\n      hero.className = 'bg-intent-first__hero';\n      hero.setAttribute('data-bg-intent-first-hero', '');\n      hero.innerHTML = '' +\n        '<div data-bg-intent-first-selected-context hidden></div>' +\n        '<section class=\"bg-intent-first__featured\" data-bg-intent-first-featured hidden></section>' +\n        '<section class=\"bg-intent-first__commerce\" aria-label=\"Your product build\">' +\n          '<div class=\"bg-intent-first__price\" aria-live=\"polite\" aria-atomic=\"true\"><span data-bg-intent-first-price-label>Price</span><div><s data-bg-intent-first-compare hidden></s><strong data-bg-intent-first-total></strong></div><small data-bg-intent-first-unit></small></div>' +\n          '<div class=\"bg-intent-first__build\" data-bg-intent-first-build></div>' +\n          '<div class=\"bg-intent-first__quantity-region\" data-bg-intent-first-quantity-host hidden></div>' +\n          buildIntentFirstArtworkRegionMarkup() +\n          '<div class=\"bg-intent-first__purchase-row\"><div class=\"bg-intent-first__readiness\"><strong data-bg-intent-first-readiness-title></strong><span data-bg-intent-first-readiness-copy></span></div><button type=\"button\" class=\"bg-intent-first__purchase\" data-bg-presentation-purchase></button></div>' +\n          '<div class=\"bg-intent-first__shop-pay\" data-bg-intent-first-shop-pay hidden></div>' +\n          '<p class=\"bg-intent-first__later\" data-bg-intent-first-later hidden><span data-bg-intent-first-turnaround></span></p>' +\n        '</section>' +\n        '<div class=\"bg-intent-first__trust\" data-bg-intent-first-trust>' + INTENT_FIRST_TRUST_DEFAULT_MARKUP + '</div>';\n      root.insertBefore(hero, optionsBlock);\n    }\n    // Admin input is the truth: with the artwork section disabled the hero\n    // renders no artwork region at all \u2014 no heading and no empty hosts. The\n    // region is reconciled every pass so a config change re-renders correctly\n    // without a page rebuild.\n    var artworkRegion = hero.querySelector('[data-bg-intent-first-artwork-region]');\n    if (!artworkSectionEnabled) {\n      if (artworkRegion) {\n        restoreIntentFirstArtworkBlock(store);\n        if (artworkRegion.parentNode) artworkRegion.parentNode.removeChild(artworkRegion);\n      }\n    } else if (!artworkRegion) {\n      var commerce = hero.querySelector('.bg-intent-first__commerce');\n      var purchaseRow = commerce && commerce.querySelector('.bg-intent-first__purchase-row');\n      if (commerce && purchaseRow) {\n        var regionScratch = document.createElement('div');\n        regionScratch.innerHTML = buildIntentFirstArtworkRegionMarkup();\n        commerce.insertBefore(regionScratch.firstElementChild, purchaseRow);\n      }\n    }\n    if (!hero.querySelector('[data-bg-intent-first-selected-context]')) {\n      var selectedContext = document.createElement('div');\n      selectedContext.setAttribute('data-bg-intent-first-selected-context', '');\n      selectedContext.hidden = true;\n      hero.insertBefore(selectedContext, hero.firstChild);\n    }\n    if (!hero.querySelector('[data-bg-intent-first-featured]')) {\n      var featuredSection = document.createElement('section');\n      featuredSection.className = 'bg-intent-first__featured';\n      featuredSection.setAttribute('data-bg-intent-first-featured', '');\n      featuredSection.hidden = true;\n      var featuredAnchor = hero.querySelector('.bg-intent-first__commerce');\n      hero.insertBefore(featuredSection, featuredAnchor || hero.firstChild);\n    }\n    if (!artworkSectionEnabled) {\n      return { hero: hero, artworkBlock: artworkBlock, artworkSectionEnabled: false };\n    }\n    var artworkHost = hero.querySelector('[data-bg-intent-first-artwork-host]');\n    if (!artworkHost) return null;\n    if (!artworkHost.contains(artworkBlock)) {\n      if (!store.intentFirstArtworkRestore) {\n        store.intentFirstArtworkRestore = {\n          parent: artworkBlock.parentNode,\n          nextSibling: artworkBlock.nextSibling\n        };\n      }\n      artworkHost.appendChild(artworkBlock);\n    }\n    return { hero: hero, artworkBlock: artworkBlock, artworkSectionEnabled: true };\n  }\n\n  function restoreIntentFirstArtworkBlock(store) {\n    var restore = store && store.intentFirstArtworkRestore;\n    if (!restore || !restore.parent) return;\n    var artworkBlock = store.root && store.root.querySelector('[data-bg-designer-block=\"artwork\"]');\n    if (artworkBlock) {\n      if (restore.nextSibling && restore.nextSibling.parentNode === restore.parent) {\n        restore.parent.insertBefore(artworkBlock, restore.nextSibling);\n      } else {\n        restore.parent.appendChild(artworkBlock);\n      }\n    }\n    store.intentFirstArtworkRestore = null;\n  }\n\n  // Quantity merge: the intent-first page feeds quantity presentation from\n  // the Pricing quantity field. 'compact_tile' (intent-first only) keeps the\n  // tile in the build row; every other resolved field type relocates the\n  // canonical quantity block \u2014 table, slider, buttons, ranges, apparel\n  // matrix, EDDM \u2014 into the hero so its full behavior (sale strike-through,\n  // conditional settings, bindings) carries over unchanged. An unresolved\n  // field type keeps the tile so legacy bundles render exactly as before.\n  function shouldUseCanonicalIntentFirstQuantity(store) {\n    if (store && store.productData && store.productData.hideQty === true) return false;\n    var fieldType = getConfiguredQuantityFieldType(store);\n    return !!fieldType && fieldType !== 'compact_tile';\n  }\n\n  function syncIntentFirstQuantityHost(store, hero, useCanonicalQuantity) {\n    var host = hero && hero.querySelector('[data-bg-intent-first-quantity-host]');\n    if (!host) return;\n    if (!useCanonicalQuantity) {\n      restoreIntentFirstQuantityBlock(store);\n      host.hidden = true;\n      return;\n    }\n    var quantityBlock = store.root && store.root.querySelector('[data-bg-designer-block=\"quantity\"]');\n    if (quantityBlock && !host.contains(quantityBlock)) {\n      if (!store.intentFirstQuantityRestore) {\n        store.intentFirstQuantityRestore = {\n          parent: quantityBlock.parentNode,\n          nextSibling: quantityBlock.nextSibling\n        };\n      }\n      host.appendChild(quantityBlock);\n    }\n    host.hidden = !quantityBlock;\n  }\n\n  function restoreIntentFirstQuantityBlock(store) {\n    var restore = store && store.intentFirstQuantityRestore;\n    if (!restore || !restore.parent) return;\n    var quantityBlock = store.root && store.root.querySelector('[data-bg-designer-block=\"quantity\"]');\n    if (quantityBlock) {\n      if (restore.nextSibling && restore.nextSibling.parentNode === restore.parent) {\n        restore.parent.insertBefore(quantityBlock, restore.nextSibling);\n      } else {\n        restore.parent.appendChild(quantityBlock);\n      }\n    }\n    store.intentFirstQuantityRestore = null;\n  }\n\n  // Presentation describes a purchased unit. It never changes cart quantity.\n  function getQuantityPresentation(store) {\n    var source = plainObject(getQuantityProductConfig(store).quantityPresentation) || {};\n    var result = {};\n    [['soldUnitSingular', 80], ['soldUnitPlural', 80], ['contentsLabel', 120], ['note', 1000]].forEach(function (entry) {\n      if (typeof source[entry[0]] === 'string' && source[entry[0]].trim().length <= entry[1]) {\n        result[entry[0]] = source[entry[0]].trim();\n      }\n    });\n    if (Number.isSafeInteger(source.packCount) && source.packCount > 0) result.packCount = source.packCount;\n    result.showRangeTable = source.showRangeTable !== false;\n    result.showSoldBy = source.showSoldBy === true;\n    result.showNote = source.showNote === true;\n    return result;\n  }\n\n  function getQuantitySoldUnits(store) {\n    var presentation = getQuantityPresentation(store);\n    var data = plainObject(store && store.productData) || {};\n    var legacy = text(data.quantityUnitLabel || data.unitLabel);\n    var known = {\n      box: ['box', 'boxes'], boxes: ['box', 'boxes'], pack: ['pack', 'packs'], packs: ['pack', 'packs'],\n      each: ['each', 'each'], unit: ['unit', 'units'], units: ['unit', 'units'],\n      piece: ['piece', 'pieces'], pieces: ['piece', 'pieces'], set: ['set', 'sets'], sets: ['set', 'sets'],\n      sign: ['sign', 'signs'], signs: ['sign', 'signs'], card: ['card', 'cards'], cards: ['card', 'cards'],\n      banner: ['banner', 'banners'], banners: ['banner', 'banners'], shirt: ['shirt', 'shirts'], shirts: ['shirt', 'shirts'],\n      bag: ['bag', 'bags'], bags: ['bag', 'bags']\n    };\n    var shopifyLabel = text(store && store.config && store.config.shopifySoldBy).toLowerCase();\n    var shopify = ['box', 'pack', 'each', 'unit', 'piece'].indexOf(shopifyLabel) >= 0 ? known[shopifyLabel] : null;\n    var legacyPair = Object.prototype.hasOwnProperty.call(known, legacy.toLowerCase()) ? known[legacy.toLowerCase()] : null;\n    var fallback = shopify || legacyPair || (legacy ? [legacy, legacy] : ['piece', 'pieces']);\n    var singular = presentation.soldUnitSingular || fallback[0];\n    var explicitPair = Object.prototype.hasOwnProperty.call(known, singular.toLowerCase()) ? known[singular.toLowerCase()] : null;\n    var plural = presentation.soldUnitPlural || (presentation.soldUnitSingular ? (explicitPair ? explicitPair[1] : singular) : fallback[1]);\n    var shopifyCount = Number(store && store.config && store.config.shopifySoldByQty);\n    var packCount = presentation.packCount || (shopify && Number.isSafeInteger(shopifyCount) && shopifyCount > 1 ? shopifyCount : 0);\n    var contents = presentation.contentsLabel || (shopify && legacy ? legacy : 'pieces');\n    return { singular: singular, plural: plural, suffix: packCount ? ' of ' + packCount.toLocaleString() + ' ' + contents : '' };\n  }\n\n  function getIntentFirstUnitNoun(store, quantity) {\n    var units = getQuantitySoldUnits(store);\n    return (Number(quantity) === 1 ? units.singular : units.plural) + units.suffix;\n  }\n\n  function getQuantityPerUnitLabel(store) {\n    var data = plainObject(store && store.productData) || {};\n    var presentation = getQuantityPresentation(store);\n    if (!presentation.soldUnitSingular && !text(data.quantityUnitLabel || data.unitLabel)\n      && !text(store && store.config && store.config.shopifySoldBy)) {\n      return getProductFormPresentation(store) === 'intent_first' ? 'piece' : 'unit';\n    }\n    return getQuantitySoldUnits(store).singular;\n  }\n\n  // perUnit is a shownPrice figure.\n  function buildQuantityUnitLine(store, quantity, perUnit) {\n    return Number(quantity).toLocaleString() + ' ' + getIntentFirstUnitNoun(store, quantity)\n      + ' \u2022 ' + formatShownMoney(perUnit) + ' per ' + getQuantityPerUnitLabel(store);\n  }\n\n  function buildQuantityPresentationCopy(store) {\n    if (getConfiguredQuantityFieldType(store) === 'hidden' || getQuantityMode(store) === 'hidden'\n      || (store && store.productData && store.productData.hideQty === true)) return null;\n    var presentation = getQuantityPresentation(store);\n    if (!presentation.showSoldBy && !(presentation.showNote && presentation.note)) return null;\n    var copy = document.createElement('div');\n    copy.className = 'bg-designer-storefront__quantity-presentation-copy';\n    if (presentation.showSoldBy) {\n      var sentence = document.createElement('p');\n      sentence.className = 'bg-designer-storefront__quantity-note';\n      sentence.setAttribute('data-bg-quantity-sold-by', '');\n      sentence.textContent = 'This product is sold as ' + getIntentFirstUnitNoun(store, 2) + '.';\n      copy.appendChild(sentence);\n    }\n    if (presentation.showNote && presentation.note) {\n      var note = document.createElement('p');\n      note.className = 'bg-designer-storefront__quantity-note';\n      note.setAttribute('data-bg-quantity-manual-note', '');\n      note.textContent = presentation.note;\n      copy.appendChild(note);\n    }\n    return copy;\n  }\n\n  function renderQuantityPresentationCopy(store, block) {\n    if (!block) return;\n    var copy = buildQuantityPresentationCopy(store);\n    if (!copy) return;\n    var field = block.querySelector('.bg-designer-storefront__quantity-range-row');\n    var parent = field ? field.parentNode : block.querySelector('[data-bg-quantity-group]');\n    if (parent) parent.insertBefore(copy, field ? field.nextSibling : null);\n  }\n\n  function buildIntentFirstConfigurationSummary(store) {\n    var parts = buildCompactConfigurationParts(store);\n    if (!parts.length) return '';\n    var quantity = Math.max(1, Math.round(numberValue(store && store.state && store.state.quantity, 1)));\n    parts[0] = quantity.toLocaleString() + ' ' + getIntentFirstUnitNoun(store, quantity);\n    return parts.join(' \u00B7 ');\n  }\n\n  function renderIntentFirstProductFormPresentation(store) {\n    if (!store || applyProductFormPresentationMode(store) !== 'intent_first') return;\n    // Revoke readiness before every render. A stale successful render must not\n    // keep canonical owners hidden if pricing or another adapter step fails on\n    // a later pass.\n    store.intentFirstPresentationReady = false;\n    store.root.removeAttribute('data-bg-intent-first-ready');\n    var readinessProductInfo = store.root.closest('product-info');\n    if (readinessProductInfo) readinessProductInfo.removeAttribute('data-bg-intent-first-ready');\n    var chrome = ensureIntentFirstProductFormChrome(store);\n    if (!chrome) return;\n    var hero = chrome.hero;\n    var settings = getExperimentalPresentationSettings(store, 'intentFirst');\n    var presentation = shownPrice(getPricePresentation(store));\n    var total = numberValue(presentation && presentation.total, NaN);\n    var compareTotal = numberValue(presentation && presentation.compareTotal, NaN);\n    var currentPerPiece = numberValue(presentation && presentation.currentPerPiece, NaN);\n    var quantity = Math.max(1, Math.round(numberValue(presentation && presentation.quantity, numberValue(store.state.quantity, 1))));\n    var totalNode = hero.querySelector('[data-bg-intent-first-total]');\n    var compareNode = hero.querySelector('[data-bg-intent-first-compare]');\n    var unitNode = hero.querySelector('[data-bg-intent-first-unit]');\n    // BD-NO-ROW-ZERO-PRICE: a choice no price row prices is not a price (an\n    // add-on total alone never reads as one); the page falls back to the\n    // standard layout, whose price box says the sentence.\n    var hasPrice = Number.isFinite(total) && total > 0 && Number.isFinite(currentPerPiece) && !showsNoPriceRow(store);\n    hero.classList.toggle('is-loading', !hasPrice);\n    setGuidedText(totalNode, hasPrice ? formatShownMoney(total) : 'Loading price\u2026');\n    if (compareNode) {\n      compareNode.hidden = !(hasPrice && hasShownComparePrice(compareTotal, total));\n      setGuidedText(compareNode, compareNode.hidden ? '' : formatShownMoney(compareTotal));\n    }\n    if (hasPrice && isPageConvertingCurrency()) {\n      var largestOffered = getLargestOfferedShownPrice(store);\n      reserveShownPriceWidth(totalNode, [formatShownMoney(total), largestOffered ? formatShownMoney(largestOffered.total) : '']);\n      reserveShownPriceWidth(compareNode, [formatShownMoney(compareTotal), largestOffered ? formatShownMoney(largestOffered.compareTotal) : '']);\n      // The pair may then be wider than a narrow phone's price column: the\n      // stylesheet lets the crossed-out price take its own line above the\n      // total there (the same line on every pick, both widths are fixed).\n      if (totalNode && totalNode.parentNode && !totalNode.parentNode.hasAttribute('data-bg-price-steady')) {\n        totalNode.parentNode.setAttribute('data-bg-price-steady', '');\n      }\n    }\n    setGuidedText(unitNode, hasPrice ? buildQuantityUnitLine(store, quantity, currentPerPiece) : 'Pricing this build');\n    syncIntentFirstSaleNote(unitNode, hasPrice ? getSalePendingNote(store) : '');\n    var featuredHolder = getFeaturedImageCardsHolder(store);\n    var featuredRendered = renderIntentFirstFeaturedOptionCards(store, hero, featuredHolder);\n    var build = hero.querySelector('[data-bg-intent-first-build]');\n    var rows = getDesignFirstPresentationRows(store, featuredRendered ? { excludeHolderId: getHolderId(featuredHolder) } : {});\n    var useCanonicalQuantity = shouldUseCanonicalIntentFirstQuantity(store);\n    if (useCanonicalQuantity) {\n      rows = rows.filter(function (row) { return row.key !== 'quantity'; });\n    }\n    renderIntentFirstBuildArea(store, build, rows);\n    syncIntentFirstQuantityHost(store, hero, useCanonicalQuantity);\n    var artworkSectionEnabled = chrome.artworkSectionEnabled !== false;\n    var contextualSelectedDesign = renderIntentFirstSelectedDesignContext(store, hero, artworkSectionEnabled ? chrome.artworkBlock : null);\n    var artworkRequirement = getGuidedArtworkStepRequirement(store);\n    var contextualMode = text(store.state && store.state.artworkMode).toLowerCase();\n    // RE3: no \"Your selected design\" heading in ANY contextual state\n    // (including genuine reorders) \u2014 the ARTWORK eyebrow stays the section\n    // label and the design content speaks for itself.\n    // SF-10 (2026-09-13): the ready state (\"Your design\") renders no heading\n    // unless the product authored designReadyHeading copy \u2014 the DESIGN eyebrow\n    // and the summary row already say it. The question-state heading stays\n    // and both honor the Admin \"Show design heading\" switch.\n    // S4 (2026-09-16): a template picked on the page answers the question\n    // too, so the heading hides with it (the Admin switch still governs).\n    var inPageTemplateSelected = !!getIntentFirstInPageTemplate(store);\n    var artworkTitleNode = hero.querySelector('[data-bg-intent-first-artwork-title]');\n    var artworkHeadingText = contextualSelectedDesign || inPageTemplateSelected\n      ? ''\n      : (artworkRequirement ? text(settings.designHeading) || 'How do you want to handle the design?' : text(settings.designReadyHeading));\n    if (artworkTitleNode) artworkTitleNode.hidden = !!contextualSelectedDesign || inPageTemplateSelected || settings.showDesignHeading === false || !artworkHeadingText;\n    setGuidedText(hero.querySelector('[data-bg-intent-first-design-label]'), text(settings.designLabel) || 'Design');\n    setGuidedText(hero.querySelector('[data-bg-intent-first-price-label]'), text(settings.priceLabel) || 'Price');\n    if (unitNode) unitNode.hidden = settings.showUnitPrice === false;\n    setGuidedText(artworkTitleNode, artworkHeadingText);\n    var readiness = hero.querySelector('.bg-intent-first__readiness');\n    if (readiness) readiness.hidden = settings.showReadiness === false;\n    var readyCopy = plainObject(settings.readinessCopy) || {};\n    // ED-R1 / ED-R2 (2026-09-17): a saved design without artwork is never\n    // \"Ready to order\" in either branch (selected-design chrome or the\n    // canonical artwork section); the sentence names the ways forward the\n    // purchase control actually offers. The gate itself is unchanged.\n    // STOREFRONT-SAVED-EMPTY: a design not read yet says \"Loading\", one that\n    // could not be read says so; only a read empty document says \"empty\".\n    var savedDesignReadiness = buildSavedDesignReadiness(store);\n    setGuidedText(hero.querySelector('[data-bg-intent-first-readiness-title]'), savedDesignReadiness\n      ? savedDesignReadiness.title\n      : (contextualSelectedDesign\n        ? (!contextualMode ? text(readyCopy.chooseFinish) || 'Choose a finish to continue' : (contextualMode === 'designonline' && !text(store.state.project && store.state.project.projectId) ? text(readyCopy.customize) || 'Ready to customize' : text(readyCopy.ready) || 'Ready to order'))\n        : (artworkRequirement ? text(readyCopy.chooseDesign) || 'Choose a design path to finish' : text(readyCopy.ready) || 'Ready to order')));\n    // RE3 lane-aware ready-to-order copy: the design-online lane carries no\n    // staff-proof claim \u2014 the customer approves the design in the editor.\n    var readinessProofCopy = savedDesignReadiness ? savedDesignReadiness.copy : (isDesignOnlineNoProofLane(store)\n      ? (text(store.state.project && store.state.project.projectId)\n        ? text(readyCopy.approved) || 'Your design prints exactly as you approved it.'\n        : text(readyCopy.reviewInEditor) || 'You review and approve your design in the editor.')\n      : text(readyCopy.proof) || 'Nothing prints without your approved proof.');\n    setGuidedText(hero.querySelector('[data-bg-intent-first-readiness-copy]'), contextualSelectedDesign\n      ? (store.selectedDesignCompatibilityConflict ? text(readyCopy.mismatch) || 'Resolve the design and size mismatch before continuing.' : readinessProofCopy)\n      : (artworkRequirement || savedDesignReadiness ? readinessProofCopy : buildIntentFirstConfigurationSummary(store)));\n    var priceRecord = getCurrentPriceRecord(store);\n    var turnaround = text(priceRecord && priceRecord.estTurnaround);\n    var turnaroundNode = hero.querySelector('[data-bg-intent-first-turnaround]');\n    if (turnaroundNode) {\n      turnaroundNode.hidden = !turnaround;\n      setGuidedText(turnaroundNode, turnaround ? 'Estimated turnaround: ' + turnaround + '. Timing starts after ' + (isDesignOnlineNoProofLane(store) ? 'checkout.' : 'proof approval.') : '');\n    }\n    var later = hero.querySelector('[data-bg-intent-first-later]');\n    if (later) later.hidden = !turnaround || settings.showTurnaround === false;\n    var shopPay = hero.querySelector('[data-bg-intent-first-shop-pay]');\n    if (shopPay) {\n      var shopPayTotal = numberValue(shownPrice(getPricePresentation(store)).total, 0);\n      var shopPayEligible = isShopPayInstallmentsEligibleTotal(shopPayTotal);\n      shopPay.hidden = !shopPayEligible || settings.showInstallments === false;\n      shopPay.innerHTML = shopPayEligible ? buildShopPayInlineMarkup(shopPayTotal) : '';\n    }\n    var trust = hero.querySelector('[data-bg-intent-first-trust]');\n    syncConfiguredTrustSignals(store, trust, {\n      defaultMarkup: INTENT_FIRST_TRUST_DEFAULT_MARKUP,\n      turnaroundAttribute: 'data-bg-intent-first-trust-turnaround',\n    });\n    var trustTurnaround = hero.querySelector('[data-bg-intent-first-trust-turnaround]');\n    var trustTurnaroundValue = hero.querySelector('[data-bg-intent-first-trust-turnaround-value]');\n    if (trustTurnaround) trustTurnaround.hidden = !turnaround;\n    setGuidedText(trustTurnaroundValue, turnaround);\n    if (trust) trust.hidden = settings.showTrustSignals === false;\n    store.root.setAttribute('data-bg-intent-first-prominent-mobile-bar', settings.prominentMobilePurchaseBar === false ? 'false' : 'true');\n    syncPresentationPurchaseButton(store, hero.querySelector('[data-bg-presentation-purchase]'));\n    syncIntentFirstProductPageNotices(store);\n    bindIntentFirstHero(store, hero, settings);\n    renderIntentFirstSelectedDesignLiveMockup(store);\n    renderDesignFirstChoiceSheet(store);\n    // Admin input is the truth (OP-03): with the artwork section disabled the\n    // intent experience needs no artwork path \u2014 the direct Add to cart is the\n    // canonical purchase route, so the hero remains the single surface.\n    var hasActionablePath = contextualSelectedDesign\n      ? !!hero.querySelector('[data-bg-contextual-finish], [data-bg-contextual-customize], [data-bg-contextual-resume], [data-bg-contextual-reorder], [data-bg-contextual-recovery], [data-bg-contextual-change], [data-bg-contextual-change-artwork]')\n      : (!artworkSectionEnabled\n        || !!(chrome.artworkBlock && chrome.artworkBlock.querySelector('[data-bg-artwork-action], [data-bg-artwork-primary], [data-bg-canva-link-card], [data-bg-designer-upload-input]')));\n    var canUseIntentFirst = hasPrice && hasActionablePath;\n    hero.hidden = !canUseIntentFirst;\n    store.intentFirstPresentationReady = canUseIntentFirst;\n    if (!canUseIntentFirst) {\n      restoreIntentFirstArtworkBlock(store);\n      restoreIntentFirstQuantityBlock(store);\n      return;\n    }\n    // Commit readiness last. If any canonical price/options/artwork work above\n    // fails, the mounted native owners stay visible and the page fails open.\n    store.root.setAttribute('data-bg-intent-first-ready', 'true');\n    var productInfo = store.root.closest('product-info');\n    if (productInfo) productInfo.setAttribute('data-bg-intent-first-ready', 'true');\n  }\n\n  function hasCanonicalNumericQuantityControl(store) {\n    return getConfiguredQuantityFieldType(store) === 'numeric_input' && getQuantityMode(store) === 'rangeInput';\n  }\n\n  function renderExperimentalProductFormPresentations(store) {\n    var mode = getProductFormPresentation(store);\n    var productScope = store && store.root && (store.root.closest('product-info') || store.root);\n    if (mode !== 'intent_first') {\n      restoreIntentFirstArtworkBlock(store);\n      restoreIntentFirstQuantityBlock(store);\n      var intentFirstHero = store && store.root && store.root.querySelector('[data-bg-intent-first-hero]');\n      if (intentFirstHero && intentFirstHero.parentNode) intentFirstHero.parentNode.removeChild(intentFirstHero);\n      var intentFirstProductInfo = store && store.root && store.root.closest('product-info');\n      Array.prototype.slice.call(intentFirstProductInfo ? intentFirstProductInfo.querySelectorAll(\n        '[data-bg-intent-first-title-eyebrow], [data-bg-intent-first-title-tagline]'\n      ) : []).forEach(function (node) {\n        if (node.parentNode) node.parentNode.removeChild(node);\n      });\n      if (store && store.designFirstSheetState) closeDesignFirstChoiceSheet(store);\n      if (store && store.root) {\n        store.intentFirstActiveIntent = '';\n        store.intentFirstPresentationReady = false;\n        store.root.removeAttribute('data-bg-intent-first-ready');\n        store.root.removeAttribute('data-bg-intent-first-prominent-mobile-bar');\n        store.root.removeAttribute('data-bg-intent-first-native-artwork-details');\n      }\n      if (intentFirstProductInfo) intentFirstProductInfo.removeAttribute('data-bg-intent-first-media-ready');\n      if (intentFirstProductInfo) intentFirstProductInfo.removeAttribute('data-bg-intent-first-ready');\n    }\n    if (!isPrototypeProductFormPresentation(mode)) {\n      restoreExperimentalPresentationDisplayTitle(productScope);\n      var nativeButton = getSubmitButton(store);\n      if (nativeButton) nativeButton.removeAttribute('data-bg-presentation-proxy-source');\n      enforceNativeSubmitVisibility(store);\n    }\n    if (mode === 'intent_first') renderIntentFirstProductFormPresentation(store);\n  }\n\n  function buildSummaryMoneyMarkup(currentAmount, compareAmount, formatAmount) {\n    var format = typeof formatAmount === 'function' ? formatAmount : core.formatMoney;\n    var current = roundMoney(numberValue(currentAmount, 0));\n    var compare = roundMoney(numberValue(compareAmount, NaN));\n    var currentMarkup = escapeHtml(format(current));\n    if (hasShownComparePrice(compare, current)) {\n      return '<s class=\"bg-designer-storefront__money-compare\">' + escapeHtml(format(compare)) + '</s> ' +\n        '<span class=\"bg-designer-storefront__money-current\">' + currentMarkup + '</span>';\n    }\n    return '<span class=\"bg-designer-storefront__money-current\">' + currentMarkup + '</span>';\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE: a pair of shownPrice figures.\n  function buildShownSummaryMoneyMarkup(currentAmount, compareAmount) {\n    return buildSummaryMoneyMarkup(currentAmount, compareAmount, formatShownMoney);\n  }\n\n  function getArtworkAvailability(modes) {\n    var normalized = Array.isArray(modes) ? modes.map(function (entry) {\n      return text(entry).toLowerCase();\n    }) : [];\n    return {\n      designonline: normalized.indexOf('designonline') !== -1,\n      editservice: normalized.indexOf('editservice') !== -1,\n      uploadfiles: normalized.indexOf('uploadfiles') !== -1,\n      uploadcanva: normalized.indexOf('uploadcanva') !== -1,\n      youhaveart: normalized.indexOf('youhaveart') !== -1,\n      customdesign: normalized.indexOf('customdesign') !== -1,\n      reorder: normalized.indexOf('reorder') !== -1,\n      recreate: normalized.indexOf('recreate') !== -1 || normalized.indexOf('recreatedesign') !== -1,\n      freesetup: normalized.indexOf('freesetup') !== -1 || normalized.indexOf('free-setup') !== -1\n    };\n  }\n\n  function applyArtworkSectionConfigToAvailability(availability, config, options) {\n    var next = Object.assign({}, availability || {});\n    var settings = config || DEFAULT_ARTWORK_SECTION_CONFIG;\n    // Boguna pages retired the legacy macro-gates (Need design / Have\n    // artwork): visibility is one per-option toggle each. PitchPrint Hybrid\n    // pages keep the macro gates, but the product-level template-service\n    // toggles (customize online / personalize) are retired everywhere:\n    // per-template designOnlineAvailable/editServiceAvailable decide the\n    // offered finishes once Use a template is on.\n    var boguna = !!(options && options.boguna);\n    var editorless = !!(options && (options.editorless || options.editorlessCommerce));\n    var configuredFlags = settings._methodAvailabilityConfigured || {};\n    if (editorless) {\n      // Editor-independent products use the artwork switches as their source\n      // of truth. This includes legacy-option products without a Product\n      // Commerce bundle: their editor mapping is still explicitly `none`, so\n      // the retired Have/Need macro gates must not hide enabled methods.\n      // Edit-service templates stay offered when Use a template is explicitly\n      // on: editor `none` disables the EDITOR, not the template catalog.\n      next.designonline = false;\n      next.editservice = configuredFlags.useTemplate ? !!settings.showUseTemplate : false;\n      next.uploadcanva = configuredFlags.shareCanva ? !!settings.showShareCanva : true;\n      next.uploadfiles = configuredFlags.uploadFiles ? !!settings.showUploadFiles : true;\n      next.youhaveart = configuredFlags.sendLater ? !!settings.showSendLater : true;\n      next.customdesign = configuredFlags.customDesign ? !!settings.showCustomDesign : false;\n      next.reorder = configuredFlags.reorder ? !!settings.showReorder : false;\n      next.recreate = configuredFlags.recreate ? !!settings.showRecreateDesign : false;\n      next.freesetup = configuredFlags.freeSetup ? !!settings.showFreeSetup : false;\n      return next;\n    }\n    if (!boguna && !settings.showNeedDesign) {\n      next.designonline = false;\n      next.editservice = false;\n      next.customdesign = false;\n    }\n    if (!settings.showUseTemplate) {\n      next.designonline = false;\n      next.editservice = false;\n    }\n    // Boguna: an explicitly saved Professional Custom Design toggle is\n    // the whole story (on shows the card even with no charge configured);\n    // unset keeps the legacy charge-derived availability.\n    if (boguna && configuredFlags.customDesign) {\n      next.customdesign = !!settings.showCustomDesign;\n    } else if (!settings.showCustomDesign) {\n      next.customdesign = false;\n    }\n    next.reorder = !!settings.showReorder;\n    next.recreate = !!settings.showRecreateDesign;\n    next.freesetup = !!settings.showFreeSetup;\n    if (!boguna && !settings.showHaveDesign) {\n      next.uploadfiles = false;\n      next.uploadcanva = false;\n    }\n    if (!settings.showShareCanva) {\n      next.uploadcanva = false;\n    }\n    if (!settings.showUploadFiles) {\n      next.uploadfiles = false;\n    }\n    if (!settings.showSendLater) {\n      next.youhaveart = false;\n    }\n    return next;\n  }\n\n  function formatCompactMoneyLabel(value) {\n    var amount = roundMoney(numberValue(value, 0));\n    if (!(amount > 0)) return '';\n    return text(core.formatMoney(amount)).replace(/\\.00\\b/, '');\n  }\n\n  // Sale-aware \"+$N\" suffix for artwork-method labels. When the product carries\n  // a sale rate (custom.product_discount, resolved into config by the host\n  // shell), the charge renders as the struck list price followed by what\n  // checkout will actually apply. With no sale the familiar plain suffix stays.\n  function buildArtworkPriceSuffixMarkup(store, cost) {\n    var amount = roundMoney(numberValue(cost, 0));\n    if (!(amount > 0)) return '';\n    var discountPct = getShownSalePercentage(store);\n    var saleAmount = applyDisplayDiscount(amount, discountPct);\n    if (!(discountPct > 0) || !(saleAmount < amount - 0.005)) {\n      return escapeHtml(' +' + formatCompactMoneyLabel(amount));\n    }\n    return ' <span class=\"bg-guided-artwork__price\">' +\n      '<s class=\"calc-qty-original-price\">+' + escapeHtml(formatCompactMoneyLabel(amount)) + '</s>' +\n      '<span class=\"calc-qty-sale-price\">+' + escapeHtml(formatCompactMoneyLabel(saleAmount)) + '</span>' +\n    '</span>';\n  }\n\n  // Mapped charges are already projected through the calculator, including\n  // discount eligibility. Never run that amount through the raw-fee suffix.\n  function buildMappedArtworkPriceMarkup(price) {\n    if (!price) return '';\n    return ' <span class=\"bg-guided-artwork__price\">' +\n      (price.originalDisplay ? '<s class=\"calc-qty-original-price\">' + escapeHtml(price.originalDisplay) + '</s>' : '') +\n      '<span class=\"calc-qty-sale-price\">' + escapeHtml(price.display) + '</span></span>';\n  }\n\n  function buildArtworkMethodPriceSuffixMarkup(store, mode, cost, template) {\n    if (mode === 'template') return ''; // Browsing does not choose a finish.\n    if (resolveArtworkMethodOption(store, mode).status === 'eligible') {\n      var original = mode === 'editservice' && template ? getTemplateEditServicePriceMeta(template).originalCost : Math.max(0, numberValue(cost, 0));\n      var price = mappedArtworkPrice(store, mode, template || null, original, 0);\n      return price && (price.amount !== 0 || price.originalDisplay) ? buildMappedArtworkPriceMarkup(price) : '';\n    }\n    return buildArtworkPriceSuffixMarkup(store, cost);\n  }\n\n  function getTemplateModeAvailability(availability, template) {\n    var source = template && typeof template === 'object' ? template : null;\n    var isStartBlank = !!(source && isStartBlankTemplate(source));\n    return {\n      designonline: !!(availability && availability.designonline && (!source || !!source.designOnlineAvailable)),\n      editservice: !isStartBlank && !!(availability && availability.editservice && (!source || !!source.editServiceAvailable))\n    };\n  }\n\n  function applyOptionTemplateArtworkAvailability(store, availability) {\n    var next = Object.assign({}, availability || {});\n    if (isEditorlessProductCommercePage(store)) return next;\n    if (isOptionTemplateArtworkFlow(store)) {\n      next.editservice = true;\n    }\n    return next;\n  }\n\n  // PX-04 previous-design chooser context: WCR self-hosted designer pages\n  // offer \"Your designs\" (saved + previously ordered) as an artwork source.\n  // Editorless and PitchPrint-mini pages keep the legacy behavior. RE1: full\n  // PitchPrint-HYBRID pages (e.g. live yard-signs, door-hangers) now get the\n  // chooser too \u2014 the native saved-project resume contract already works on\n  // them (the My Designs \"order again\" lane lands there today), and the\n  // always-present \"I don't see my design\" fallback absorbs customers whose\n  // past designs are not in the native system, which is exactly the hybrid\n  // population. The auto-enable heuristic below stays on the narrower\n  // pre-RE1 predicate so no unset product's row visibility changes.\n  function isReorderChooserContext(store) {\n    if (!store || !store.config) return false;\n    // The shared runtime stays brand-neutral: gate by exclusion (the My\n    // Designs worker lane is not enabled for Boguna) and fail closed when the\n    // host shell provided no store identity at all.\n    var storeKey = text(store.config.storeKey || store.config.storefront);\n    if (!storeKey || storeKey === 'boguna') return false;\n    if (getCartDesignEditor(store) === 'pitchprint-mini') return false;\n    if (isEditorlessArtworkPage(store)) return false;\n    return true;\n  }\n\n  function isReorderChooserPresentation(store) {\n    // On chooser-context pages the chooser IS the reorder presentation; the\n    // staff showReorder toggle governs visibility only (explicit false still\n    // hides the row). The legacy manual-reorder card remains for pages the\n    // chooser cannot serve (hybrid, editorless, Boguna).\n    return isReorderChooserContext(store);\n  }\n\n  function applyArtworkMethodOptionAvailability(store, availability) {\n    var next = Object.assign({}, availability || {});\n    if (isEditorlessProductCommercePage(store)) return next;\n    var settings = getArtworkSectionConfig(store);\n    var configured = settings._methodAvailabilityConfigured || {};\n    if (!configured.useTemplate && hasArtworkMethodOption(store, 'editservice')) next.editservice = true;\n    if (settings.showCustomDesign && hasArtworkMethodOption(store, 'customdesign')) next.customdesign = true;\n    if (!configured.reorder && hasArtworkMethodOption(store, 'reorder')) next.reorder = true;\n    // Auto-enable keeps the pre-RE1 narrow scope (non-hybrid pages only):\n    // widening the chooser PRESENTATION to hybrid pages must not flip the\n    // reorder ROW on for products whose staff never configured it.\n    if (!configured.reorder && !next.reorder && isReorderChooserContext(store)\n      && !isPitchPrintLaunchProvider(store)\n      && (next.designonline || next.editservice)) next.reorder = true;\n    if (!configured.recreate && hasArtworkMethodOption(store, 'recreate')) next.recreate = true;\n    if (!configured.freeSetup && hasArtworkMethodOption(store, 'freesetup')) next.freesetup = true;\n    return next;\n  }\n\n  // Option-source rule with hideTemplateChoice (e.g. a fully custom contour\n  // style with no templates): while a matching choice is selected, the\n  // template-driven artwork paths disappear from the chooser entirely.\n  function applyOptionSourceRuleArtworkAvailability(store, availability) {\n    var next = Object.assign({}, availability || {});\n    var rules = getTemplateOptionSourceRules(store);\n    if (!rules.length) return next;\n    var selectedKeys = getSelectedOptionValueKeysForSourceRules(store);\n    if (!selectedKeys.length) return next;\n    var hideTemplates = rules.some(function (rule) {\n      var ruleRecord = plainObject(rule) || {};\n      if (ruleRecord.hideTemplateChoice !== true) return false;\n      var optionValues = normalizeStringList(ruleRecord.optionValues).map(normalizeSearchValue).filter(Boolean);\n      return optionValues.some(function (value) { return selectedKeys.indexOf(value) !== -1; });\n    });\n    if (hideTemplates) {\n      next.editservice = false;\n      next.designonline = false;\n    }\n    return next;\n  }\n\n  function getStoreArtworkAvailability(store) {\n    var availability = applyOptionSourceRuleArtworkAvailability(store, applyArtworkMethodOptionAvailability(store, applyOptionTemplateArtworkAvailability(store, applyArtworkSectionConfigToAvailability(\n      getArtworkAvailability(normalizeArtworkModes(store.binding, store.templates, store.productData)),\n      getArtworkSectionConfig(store),\n      {\n        boguna: isBogunaArtworkPage(store),\n        editorless: isEditorlessArtworkPage(store)\n      }\n    ))));\n    if (hasChannelDesignIncluded(store)) availability.customdesign = true;\n    return availability;\n  }\n\n  function normalizeArtworkMethodKey(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s_]+/g, '-');\n    if (!normalized) return '';\n    if (normalized === 'upload' || normalized === 'upload-artwork-file' || normalized === 'upload-artwork-files') return 'uploadfiles';\n    if (normalized === 'canva' || normalized === 'share-canva' || normalized === 'share-canva-design') return 'uploadcanva';\n    if (normalized === 'template' || normalized === 'use-template' || normalized === 'use-a-template' || normalized === 'editservice') return 'editservice';\n    if (normalized === 'custom-design' || normalized === 'have-us-design-it' || normalized === 'pro-design') return 'customdesign';\n    if (normalized === 'sendlater' || normalized === 'send-later' || normalized === 'later' || normalized === 'youhaveart' || normalized === 'send-artwork-after-checkout' || normalized === 'order-now-send-artwork-later') return 'youhaveart';\n    if (normalized === 'free-setup' || normalized === 'freesetup') return 'freesetup';\n    if (normalized === 'recreate-design' || normalized === 'recreate-a-design' || normalized === 're-create-design') return 'recreate';\n    return normalized;\n  }\n\n  // Maps any staff/legacy artwork-method spelling to the chooser ITEM key the\n  // action list renders with ('upload-files', 'share-canva', ...). Shared by\n  // the artworkMethodOrder rank sort and the recommendedArtworkMethod badge so\n  // both settings accept the same aliases.\n  function normalizeArtworkChooserItemKey(value) {\n    var key = normalizeArtworkMethodKey(value);\n    if (key === 'editservice') return 'use-template';\n    if (key === 'customdesign') return 'custom-design';\n    if (key === 'uploadfiles') return 'upload-files';\n    if (key === 'uploadcanva') return 'share-canva';\n    if (key === 'recreate') return 'recreate-design';\n    if (key === 'freesetup') return 'free-setup';\n    if (key === 'youhaveart') return 'send-later';\n    return key;\n  }\n\n  function normalizeDefaultArtworkMode(mode) {\n    var normalized = normalizeArtworkMethodKey(mode);\n    if (normalized === 'upload') return 'uploadfiles';\n    if (normalized === 'canva') return 'uploadcanva';\n    if (normalized === 'template') return 'editservice';\n    if (normalized === 'sendlater' || normalized === 'send-later' || normalized === 'later') return 'youhaveart';\n    return normalized;\n  }\n\n  function isDefaultArtworkModeAllowed(store, availability, templateAvailability, mode) {\n    var normalized = normalizeDefaultArtworkMode(mode);\n    if (normalized === 'uploadfiles') return !!(availability && availability.uploadfiles);\n    if (normalized === 'uploadcanva') return !!(availability && availability.uploadcanva);\n    if (normalized === 'customdesign') return !!(availability && availability.customdesign);\n    if (normalized === 'reorder') return !!(availability && availability.reorder);\n    if (normalized === 'recreate') return !!(availability && availability.recreate);\n    if (normalized === 'freesetup') return !!(availability && availability.freesetup);\n    if (normalized === 'youhaveart') return !!(availability && availability.youhaveart);\n    if (normalized === 'designonline') {\n      return !!(templateAvailability && templateAvailability.designonline && (store.state.template || text(store.state.project && store.state.project.projectId)));\n    }\n    if (normalized === 'editservice') {\n      // Availability alone is the gate. Requiring store.state.template here\n      // made a \"Use a template\" default unapplyable: ensureDefaultArtworkChoice\n      // only runs while no template is selected yet, and the Browse-templates\n      // empty state exists exactly to serve that pre-selection moment.\n      return !!(templateAvailability && templateAvailability.editservice);\n    }\n    return false;\n  }\n\n  function applyArtworkModeChoice(store, mode, source) {\n    var normalized = normalizeDefaultArtworkMode(mode);\n    if (!normalized || !applyArtworkMethodOption(store, normalized, source || 'customer')) return false;\n    if (normalized === 'uploadfiles') {\n      setArtworkChoice(store, 'have-design', 'upload-files', 'uploadfiles', source || 'customer');\n      return true;\n    }\n    if (normalized === 'uploadcanva') {\n      setArtworkChoice(store, 'have-design', 'share-canva', 'uploadcanva', source || 'customer');\n      return true;\n    }\n    if (normalized === 'customdesign') {\n      setArtworkChoice(store, 'need-design', 'custom-design', 'customdesign', source || 'customer');\n      return true;\n    }\n    if (normalized === 'reorder') {\n      setArtworkChoice(store, 'have-design', 'reorder', 'reorder', source || 'customer');\n      return true;\n    }\n    if (normalized === 'recreate') {\n      setArtworkChoice(store, 'service', 'recreate', 'recreate', source || 'customer');\n      return true;\n    }\n    if (normalized === 'freesetup') {\n      setArtworkChoice(store, 'service', 'freesetup', 'freesetup', source || 'customer');\n      return true;\n    }\n    if (normalized === 'youhaveart') {\n      setArtworkChoice(store, 'send-later', '', 'youhaveart', source || 'customer');\n      return true;\n    }\n    if (normalized === 'designonline' || normalized === 'editservice') {\n      // A template-picker trigger that staff did not name as the artwork\n      // group keeps its pre-SB-09 template-arrival selection.\n      if (normalized === 'designonline' && !getConfiguredArtworkMethodHolder(store)) selectArtworkMethodOption(store, 'editservice');\n      setArtworkChoice(store, 'need-design', 'use-template', normalized, source || 'customer');\n      return true;\n    }\n    return false;\n  }\n\n  function ensureDefaultArtworkChoice(store, availability, templateAvailability) {\n    if (!store || !store.state || store.artworkChoiceNotice) return false;\n    if (text(store.state.artworkMode) || text(store.state.artworkPrimaryChoice) || text(store.state.artworkSecondaryChoice)) return false;\n    if (artworkOwners.has(store) && artworkOwners.get(store).explicit) {\n      // After a deliberate clear no method comes back by itself. The Guided\n      // help tab is navigation, not a choice, so it opens again as before.\n      if (getProductFormPresentation(store) !== 'guided' || isPrototypeProductFormPresentation(getProductFormPresentation(store))) return false;\n      setArtworkIntent(store, 'need-design', '');\n      if (store.root) store.root.setAttribute('data-bg-guided-artwork-intent', 'help');\n      return true;\n    }\n    if (store.state.template || text(store.state.project && store.state.project.projectId)) return false;\n    var uploadIds = Object.keys(store.state.uploads || {});\n    // A detail file (a mailing list) is not an artwork choice (UPLOAD-CARRY-2b).\n    var hasUploadState = uploadIds.some(function (key) {\n      return (store.state.uploads[key] || []).length && !findDetailUploadField(store, key);\n    });\n    if (text(store.state.canvaUrl) || hasUploadState) return false;\n    var sectionDefault = normalizeDefaultArtworkMode(getArtworkSectionConfig(store).defaultArtworkMode);\n    var bindingDefault = normalizeDefaultArtworkMode(store.binding && store.binding.defaultArtworkMode);\n    // SF-3 (2026-09-13): a page that arrived through a template handoff\n    // (?artwork=editservice&designnum=\u2026) may only default to a template\n    // finish. An upload / Canva / after-checkout product default must never\n    // open on its own because the handoff template failed to resolve.\n    if (store.urlStateTemplateHandoff) {\n      var isTemplateFinish = function (mode) { return mode === 'editservice' || mode === 'designonline'; };\n      if (sectionDefault && !isTemplateFinish(sectionDefault)) sectionDefault = '';\n      if (bindingDefault && !isTemplateFinish(bindingDefault)) bindingDefault = '';\n      if (!sectionDefault && !bindingDefault) return false;\n    }\n    if (sectionDefault && isDefaultArtworkModeAllowed(store, availability, templateAvailability, sectionDefault)) {\n      return applyArtworkModeChoice(store, sectionDefault, 'default');\n    }\n    if (bindingDefault && isDefaultArtworkModeAllowed(store, availability, templateAvailability, bindingDefault)) {\n      return applyArtworkModeChoice(store, bindingDefault, 'default');\n    }\n    var presentation = getProductFormPresentation(store);\n    // Without an explicit product default, prototypes deliberately\n    // start with artwork unresolved. Their real submit gate can still offer\n    // Handle Artwork Later; the adapter must not preselect it on first paint.\n    if (isPrototypeProductFormPresentation(presentation)) return false;\n    // Guided starts with the recommended design-help path. \"Buy now, design\n    // later\" remains one click away, but it must not silently become the\n    // default merely because the catalog supports the frictionless fallback.\n    if (getProductFormPresentation(store) === 'guided') {\n      setArtworkIntent(store, 'need-design', '');\n      store.uiState = store.uiState || {};\n      store.uiState.guidedArtworkIntent = 'help';\n      if (store.root) store.root.setAttribute('data-bg-guided-artwork-intent', 'help');\n      return true;\n    }\n    if (availability && availability.youhaveart) {\n      return applyArtworkModeChoice(store, 'youhaveart', 'default');\n    }\n    if (isOptionTemplateArtworkFlow(store)) {\n      var selectedOptionTemplate = getSelectedOptionTemplateEntry(store);\n      if (selectedOptionTemplate) {\n        return applyArtworkMethodOption(store, 'editservice', 'default', selectedOptionTemplate);\n      }\n    }\n    return false;\n  }\n\n  function prepareArtworkChoiceForRender(store) {\n    var availability = getStoreArtworkAvailability(store);\n    syncArtworkUiState(store, availability);\n    ensureDefaultArtworkChoice(store, availability, getTemplateModeAvailability(availability, store.state.template));\n  }\n\n  function getTemplateAccessNote(template) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source) return '';\n    if (source.optionTemplate) return '';\n    var designOnline = !!source.designOnlineAvailable;\n    var editService = !!source.editServiceAvailable;\n    var canDownload = !!source.downloadAvailable;\n    var isLegacy = !!source.legacyTemplate || !designOnline;\n    if (isLegacy) {\n      var parts = [];\n      if (editService) parts.push('Edit service');\n      if (canDownload) parts.push('Download');\n      if (!parts.length) return 'Legacy template - not available online';\n      return 'Legacy template - ' + (parts.length > 1 ? parts.join(' or ') : parts[0]) + ' only';\n    }\n    if (designOnline && !editService) return 'Customize online only';\n    if (!designOnline && !editService) return 'Template unavailable';\n    return '';\n  }\n\n  function syncArtworkUiState(store, availability) {\n    reconcileArtworkChoice(store);\n  }\n\n  // ARTWORK-OWNER-BEGIN\n  var artworkOwners = new WeakMap();\n  var artworkDrafts = new WeakSet();\n  var artworkLossNotice = 'Your artwork choice is no longer available with these options. Choose how to provide your artwork again.';\n  var artworkRefusalMessage = 'This configuration requires a design service. Your current choice is unchanged.';\n  var artworkChoiceFields = {\n    designonline: ['need-design', 'use-template'], editservice: ['need-design', 'use-template'],\n    customdesign: ['need-design', 'custom-design'], reorder: ['have-design', 'reorder'],\n    recreate: ['service', 'recreate'], freesetup: ['service', 'freesetup'],\n    uploadcanva: ['have-design', 'share-canva'], uploadfiles: ['have-design', 'upload-files'], youhaveart: ['send-later', '']\n  };\n\n  function initializeArtworkOwner(store) {\n    if (artworkOwners.has(store)) return artworkOwners.get(store);\n    var owner = { decision: Object.freeze({ method: '', mode: '', holder: '', option: '', amount: 0,\n      currency: text(window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'USD', source: 'default', generation: 0 }), notice: '', explicit: false,\n      recovery: false, operation: null, latest: null, transport: null, landed: null, sequence: 0, consumed: new WeakSet(), dispatched: new WeakSet(), handed: new WeakSet() };\n    artworkOwners.set(store, owner);\n    // The documented re-init recipe boots the runtime again on the same form:\n    // the newest owner rebinds the form's read-only purchase views: the current\n    // purchase, and the latest one begun (kept after it ends).\n    try {\n      Object.defineProperty(store.form, '__bgDesignerArtworkDispatch', { configurable: true, get: function () { return owner.operation; } });\n      Object.defineProperty(store.form, '__bgDesignerArtworkLatest', { configurable: true, get: function () { return owner.latest; } });\n    } catch (_) { /* a form that refuses the view leaves product-form without an operation: its guard refuses the add */ }\n    ['artworkMode', 'artworkPrimaryChoice', 'artworkSecondaryChoice'].forEach(function (key, index) {\n      Object.defineProperty(store.state, key, { enumerable: true, configurable: false,\n        get: function () {\n          if (!index) return owner.decision.mode;\n          var fields = artworkChoiceFields[owner.decision.mode];\n          return fields ? fields[index - 1] : text(store.uiState && store.uiState[index === 1 ? 'artworkPrimaryIntent' : 'artworkSecondaryIntent']);\n        }, set: function () {} });\n    });\n    Object.defineProperty(store, 'artworkChoiceNotice', { enumerable: true, configurable: false,\n      get: function () { return owner.notice; }, set: function () {} });\n    return owner;\n  }\n\n  function setArtworkIntent(store, primary, secondary) {\n    store.uiState = store.uiState || {};\n    store.uiState.artworkPrimaryIntent = text(primary);\n    store.uiState.artworkSecondaryIntent = text(secondary);\n    var intent = primary === 'have-design' ? 'have' : (primary === 'send-later' ? 'later' : (primary ? 'help' : ''));\n    if (intent) {\n      store.uiState.guidedArtworkIntent = intent;\n      if (store.root && !artworkDrafts.has(store)) store.root.setAttribute('data-bg-guided-artwork-intent', intent);\n    }\n  }\n\n  function artworkConfigurationDraft(store, proposal, deferRepair) {\n    var draft = Object.assign({}, store, { state: Object.assign({}, store.state, proposal || {}, {\n      selections: Object.assign({}, proposal && proposal.selections || store.state.selections)\n    }), uiState: Object.assign({}, store.uiState), artworkPriceMemo: null });\n    ['project', 'eddm', 'apparelSizes', 'approvals', 'extraInputs', 'customerInputs', 'completion', 'uploads'].forEach(function (key) {\n      draft.state[key] = Object.assign({}, draft.state[key]);\n    });\n    artworkDrafts.add(draft);\n    draft.uiState = Object.assign({}, draft.uiState, buildUiStateFromRules(draft));\n    draft.artworkCompatibilityAdjustments = deferRepair ? [] : ensureValidSelections(draft);\n    return draft;\n  }\n\n  function getArtworkMethodOffer(store, mode, template) {\n    mode = normalizeDefaultArtworkMode(mode);\n    var availability = getStoreArtworkAvailability(store);\n    var available = mode === 'designonline' || mode === 'editservice'\n      ? getTemplateModeAvailability(availability, template === undefined ? (mode === 'designonline' && text(store.state.project && store.state.project.projectId) ? null : store.state.template) : template)[mode] : availability[mode];\n    var resolved = resolveArtworkMethodOption(store, mode);\n    if (!available || resolved.status === 'ineligible' || (resolved.status === 'missing' && !resolved.option)) return { offered: false, resolved: resolved };\n    var price = resolved.status === 'eligible' ? mappedArtworkPrice(store, mode, template || null, 0, 0) : null;\n    var addon = resolved.option && buildAddonMetadataForOption(store, resolved.option, resolved.holder);\n    if (addon && !addon.excludeFromCart && !addon.isPostage && Math.abs(numberValue(addon.addonBasePrice, 0)) > 0 && !price) return { offered: false, resolved: resolved };\n    return { offered: true, resolved: resolved, price: price };\n  }\n\n  function getOfferedTemplateAvailability(store, template) {\n    return { designonline: getArtworkMethodOffer(store, 'designonline', template).offered,\n      editservice: getArtworkMethodOffer(store, 'editservice', template).offered };\n  }\n\n  function hasArtworkRecovery(store) {\n    return Object.keys(artworkChoiceFields).some(function (mode) { return getArtworkMethodOffer(store, mode).offered; });\n  }\n\n  // Validate options, template and method on an isolated draft. No live\n  // selections or template are published until the entire proposal settles.\n  function commitArtworkConfiguration(store, proposal, options) {\n    var settings = options || {}, source = settings.source || 'reconcile';\n    if (artworkDrafts.has(store) || !artworkOwners.has(store)) {\n      Object.keys(proposal || {}).forEach(function (key) { store.state[key] = proposal[key]; });\n      if (settings.validate && !settings.validate(store)) return { status: 'refused', reason: artworkRefusalMessage };\n      return { status: 'applied' };\n    }\n    var owner = artworkOwners.get(store), before = owner.decision;\n    if (settings.token && !isArtworkOperationFresh(store, settings.token)) return { status: 'refused', reason: 'stale' };\n    if (source === 'default' && (owner.explicit || owner.notice)) return { status: 'refused', reason: 'choice-required' };\n    var draft = artworkConfigurationDraft(store, proposal);\n    var hasMode = Object.prototype.hasOwnProperty.call(proposal || {}, 'artworkMode');\n    var mode = hasMode ? normalizeDefaultArtworkMode(proposal.artworkMode) : before.mode;\n    var reset = settings.reset === true, offer = mode ? getArtworkMethodOffer(draft, mode) : null;\n    if (mode && hasMode && (!offer.offered || settings.quoted && (text(settings.quoted.option) !== text(offer.resolved.option && offer.resolved.option.hvId)\n        || (settings.quoted.amount != null && Number(settings.quoted.amount) !== Number(offer.price ? offer.price.amount : 0))\n        || (settings.quoted.currency && settings.quoted.currency !== before.currency)))) {\n      if (source === 'customer' || source === 'fallback' || source === 'default' || source === 'channel-offer' || source === 'url') {\n        // A hidden Artwork section whose default cannot apply from the first\n        // paint shows its priced choices (purchase stays blocked until one).\n        if (source === 'default' && !getArtworkSectionConfig(store).showArtworkSection && hasArtworkRecovery(draft)) owner.recovery = true;\n        return { status: 'refused', reason: artworkRefusalMessage };\n      }\n      reset = true;\n    }\n    if (mode && !hasMode) {\n      var resolved = offer.resolved;\n      if (!offer.offered || (resolved.status !== 'no-holder' && text(draft.state.selections[getHolderId(resolved.holder)]) !== text(resolved.option && resolved.option.hvId))) reset = true;\n    }\n    if (settings.directArtwork) reset = true;\n    if (reset) mode = '';\n    if (mode && offer.resolved.option) draft.state.selections[getHolderId(offer.resolved.holder)] = text(offer.resolved.option.hvId);\n    if (!mode && hasMode && !reset) {\n      var holder = getConfiguredArtworkMethodHolder(draft), free = holder && findFreeArtworkMethodOption(draft, holder);\n      if (free) draft.state.selections[getHolderId(holder)] = text(free.hvId);\n    }\n    draft.state.artworkMode = mode;\n    draft.uiState = Object.assign({}, draft.uiState, buildUiStateFromRules(draft));\n    if (mode && !getArtworkMethodOffer(draft, mode).offered) return { status: 'refused', reason: artworkRefusalMessage };\n    if (settings.validate && !settings.validate(draft)) return { status: 'refused', reason: artworkRefusalMessage };\n    if (reset && !getArtworkSectionConfig(store).showArtworkSection && !hasArtworkRecovery(draft) && JSON.stringify(draft.state.selections) !== JSON.stringify(store.state.selections)) {\n      setMessage(store, artworkRefusalMessage, 'error');\n      return { status: 'refused', reason: artworkRefusalMessage };\n    }\n    var notice = reset ? (settings.notice || artworkLossNotice) : owner.notice;\n    if (mode && (source === 'customer' || source === 'fallback')) notice = '';\n    var next = { method: mode, mode: mode, holder: mode && offer.resolved.holder ? getHolderId(offer.resolved.holder) : '',\n      option: mode && offer.resolved.option ? text(offer.resolved.option.hvId) : '',\n      amount: mode && offer.price ? offer.price.amount : 0, currency: text(window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'USD', source: source, generation: before.generation };\n    var changed = JSON.stringify(store.state.selections) !== JSON.stringify(draft.state.selections)\n      || store.state.template !== draft.state.template || before.mode !== mode || before.option !== next.option\n      || before.amount !== next.amount || before.currency !== next.currency || owner.notice !== notice;\n    if (changed) next.generation += 1;\n    else next.source = before.source;\n    store.state.selections = draft.state.selections;\n    if (proposal && Object.prototype.hasOwnProperty.call(proposal, 'template')) store.state.template = draft.state.template;\n    Object.keys(proposal || {}).forEach(function (key) {\n      if (['selections', 'template', 'artworkMode', 'artworkPrimaryChoice', 'artworkSecondaryChoice'].indexOf(key) === -1) store.state[key] = draft.state[key];\n    });\n    var compatibility = buildCompatibilityAdjustmentNotice(draft.artworkCompatibilityAdjustments);\n    if (compatibility) store.pendingCompatibilityNotice = compatibility;\n    owner.decision = Object.freeze(next);\n    owner.notice = notice;\n    if (source === 'customer' || source === 'clear' || source === 'fallback' || reset) owner.explicit = true;\n    if (reset) {\n      owner.recovery = true;\n      setArtworkIntent(store, '', '');\n      if (before.mode === 'uploadfiles') {\n        clearUploadState(store);\n        getArtworkMethodUploadFields(store).forEach(function (field) { store.uploadClearedFieldIds[field.id] = true; });\n        store.mobileArtworkUploadReplacements = {};\n      }\n      clearCanvaState(store);\n      if (before.mode !== 'designonline' && !settings.preserveProject) clearProjectState(store);\n      clearArtworkAuxiliaryState(store);\n      clearCompletionState(store);\n      store.guidedArtworkTemplateSelectionCache = null;\n      clearGuidedArtworkMethodRestore(store);\n      // A saved design belongs to the customer even when its method expires.\n      if (!text(store.state.project && store.state.project.projectId) && before.mode) {\n        disarmGuidedFill(store);\n        store.state.guidedFillProjectId = '';\n      }\n      // The reset notice, beside any purchase notice (an add still on its way keeps saying so).\n      showPurchaseNotice(store);\n    } else if (mode) {\n      var fields = artworkChoiceFields[mode];\n      setArtworkIntent(store, fields[0], fields[1]);\n      // A render that changes nothing keeps a refusal sentence that lives only in the message block; a real change or a\n      // customer choice ends it and any reset notice (an earlier choice still on its way to the cart keeps its sentence).\n      if (!notice && (changed || source === 'customer' || source === 'fallback')) {\n        showPurchaseNotice(store, owner.transport && store.purchaseFailureMessage === artworkTransportMessage ? artworkTransportMessage : '');\n      }\n    }\n    releaseStaleArtworkPurchase(store);\n    return reset ? { status: 'reset', notice: notice } : { status: 'applied', option: next.option };\n  }\n\n  function commitArtworkChoice(store, proposal) {\n    var choice = proposal || {};\n    var configuration = { artworkMode: choice.mode };\n    if (Object.prototype.hasOwnProperty.call(choice, 'template')) configuration.template = choice.template;\n    return commitArtworkConfiguration(store, configuration, choice);\n  }\n\n  function writeArtworkTemplate(store, template, source) {\n    return commitArtworkConfiguration(store, { template: template }, { source: source || 'reconcile' }).status !== 'refused';\n  }\n\n  function setArtworkChoice(store, primary, secondary, mode, source) {\n    var result = commitArtworkChoice(store, { mode: mode, source: source || (mode ? 'customer' : 'clear') });\n    if (result.status === 'refused') { setMessage(store, result.reason, 'error'); return false; }\n    setArtworkIntent(store, primary, secondary);\n    return true;\n  }\n\n  function writeArtworkSelection(store, holderId, value, source) {\n    if (!artworkOwners.has(store)) { store.state.selections[holderId] = value; return true; }\n    if (text(store.state.selections[holderId]) === text(value)) return true;\n    var selections = Object.assign({}, store.state.selections); selections[holderId] = value;\n    var draft = artworkConfigurationDraft(store, { selections: selections }, true);\n    if (source === 'customer') applyStyleSwitchRules(draft, holderId, value);\n    var holder = getConfiguredArtworkMethodHolder(store);\n    var result = commitArtworkConfiguration(store, { selections: draft.state.selections }, { source: source || 'reconcile',\n      directArtwork: source === 'customer' && holder && getHolderId(holder) === holderId });\n    if (result.status === 'refused') return false;\n    if (draft.pendingStyleSwitch) {\n      store.pendingStyleSwitch = draft.pendingStyleSwitch;\n      store.artworkStagedStyleSwitch = { holderId: holderId, hvid: value };\n    }\n    return true;\n  }\n\n  function replaceArtworkSelections(store, selections, source) {\n    return commitArtworkConfiguration(store, { selections: Object.assign({}, selections) }, { source: source || 'restore' });\n  }\n\n  function captureArtworkQuote(store) {\n    var decision = artworkOwners.get(store).decision;\n    return Object.freeze({ method: decision.method, option: decision.option, amount: decision.amount, currency: decision.currency });\n  }\n\n  function restoreArtworkSnapshot(store, snapshot, source) {\n    var proposal = Object.assign({}, snapshot, { selections: Object.assign({}, store.state.selections, snapshot.selections || {}) });\n    delete proposal.artworkQuote;\n    var mode = text(snapshot.artworkMode), resolved = resolveArtworkMethodOption(store, mode);\n    return commitArtworkConfiguration(store, proposal, { source: source || 'restore', preserveProject: true, quoted: snapshot.artworkQuote || (resolved.holder ? {\n      option: text(snapshot.selections && snapshot.selections[getHolderId(resolved.holder)]) } : null) });\n  }\n\n  function reconcileArtworkChoice(store) {\n    if (!artworkOwners.has(store)) return false;\n    return commitArtworkConfiguration(store, {}, { source: 'reconcile' }).status === 'reset';\n  }\n\n  function selectArtworkMethodOption(store, methodKey) {\n    var resolved = resolveArtworkMethodOption(store, methodKey);\n    if (resolved.status !== 'eligible') return false;\n    return writeArtworkSelection(store, getHolderId(resolved.holder), text(resolved.option.hvId));\n  }\n\n  function canApplyArtworkMethod(store, mode) { return getArtworkMethodOffer(store, mode).offered; }\n\n  function applyArtworkMethodOption(store, mode, source, template) {\n    var choice = { mode: mode, source: source || 'customer' };\n    if (arguments.length > 3) choice.template = template;\n    var result = commitArtworkChoice(store, choice);\n    if (result.status === 'refused') setMessage(store, result.reason, 'error');\n    return result.status === 'applied';\n  }\n\n  function acceptArtworkEditorCompletion(store, detail) {\n    var token = store.artworkEditorOperation;\n    if (token && !isArtworkOperationFresh(store, token)) return false;\n    var revision = Number(detail && (detail.revision || detail.projectRevision)) || 0;\n    var current = Number(store.state.project && store.state.project.revision) || 0;\n    if (revision && current && revision < current) return false;\n    if (revision) store.state.project.revision = revision;\n    return true;\n  }\n\n  function artworkOperationKey(store, withoutDocumentRevision) {\n    var state = store.state, project = state.project || {}, owner = artworkOwners.get(store);\n    return JSON.stringify([owner && owner.decision.generation, state.selections, state.quantity, state.typedQuantity, state.apparelSizes,\n      state.template && getTemplateSelectionKey(state.template), state.channelOffer, state.artworkMode,\n      state.canvaUrl, Object.keys(state.uploads || {}).map(function (id) { return [id, (state.uploads[id] || []).map(function (file) {\n        return text(file.clientId) || text(file.uploadRef) || getUploadFilePublicUrl(file); })]; }),\n      project.projectId, withoutDocumentRevision ? 0 : Number(project.revision) || 0,\n      store.config.productId, store.config.handle, store.editingLineKey, store.editingLineFingerprint,\n      getArtworkMethodOptionMap(store), store.holders, store.rules, store.pricingData, getCustomerPricingProfile(store),\n      getShownSalePercentage(store), store.productData && store.productData.customDesignCost, window.Shopify && window.Shopify.currency]);\n  }\n\n  function captureArtworkOperation(store) {\n    var owner = artworkOwners.get(store);\n    var quotedCart = core.buildCartTransformState(buildSerializedState(store));\n    var quotedLine = quotedCart && quotedCart.linePriceEntry && typeof quotedCart.linePriceEntry === 'object'\n      ? Object.freeze(Object.assign({}, quotedCart.linePriceEntry)) : null;\n    // The customer's price tier on this page, the charge quoted for it, and\n    // the total the page shows before any sale (no signed amount may exceed\n    // it).\n    var planTier = artworkPlanTier(getCustomerPricingProfile(store).mode);\n    var shownCents = quotedLine ? artworkQuotedCents(quotedLine, planTier) : NaN;\n    var presentation = getPricePresentation(store);\n    var displayedCents = artworkQuotedCents(presentation, 'rawGrandTotal');\n    return Object.freeze({ linePriceEntry: quotedLine, planTier: planTier, displayedCents: displayedCents,\n      shownCents: Number.isFinite(shownCents) ? shownCents : (quotedLine ? artworkQuotedCents(quotedLine, 'price') : NaN), key: artworkOperationKey(store), generation: owner.decision.generation,\n      amount: owner.decision.amount, currency: owner.decision.currency, sequence: ++owner.sequence,\n      holder: owner.decision.holder, option: owner.decision.option,\n      options: JSON.stringify(core.buildCartTransformState({ optionSelections: buildCurrentOptionSelections(store) }).optionSelections || []), mode: owner.decision.mode, cartQuote: artworkCartQuote(quotedCart), store: store });\n  }\n\n  function recordArtworkEditorOperation(store) {\n    store.artworkEditorOperation = captureArtworkOperation(store);\n    if (store.mobileArtworkLaunch) store.mobileArtworkLaunch.operation = store.artworkEditorOperation;\n  }\n\n  function isArtworkOperationFresh(store, token) {\n    return !!token && token.store === store && token.key === artworkOperationKey(store);\n  }\n\n  function releaseArtworkPurchaseIndicators(store) {\n    store.completionRequestPromise = null;\n    var button = getSubmitButton(store);\n    if (button) {\n      button.classList.remove('loading');\n      button.removeAttribute('aria-disabled');\n      var spinner = button.querySelector('.loading__spinner');\n      if (spinner) spinner.classList.add('hidden');\n    }\n    endPurchaseSubmission(store);\n  }\n\n  function releaseStaleArtworkPurchase(store) {\n    var owner = artworkOwners.get(store);\n    if (owner && owner.operation && !isArtworkOperationFresh(store, owner.operation)) {\n      discardArtworkOperation(store, owner.operation);\n    }\n  }\n\n  var artworkStaleMessage = 'Your options changed. Review your artwork choice and add it again.';\n  var artworkPriceChangedMessage = 'Your artwork price changed. Review your artwork choice and add it again.';\n  var artworkTransportMessage = 'Your earlier choice is being added. Check your cart.';\n\n  // A stale purchase is dropped and the customer is told why (a pending loss\n  // notice already says it). Only the current operation speaks: an older\n  // one never writes over a newer purchase. force: the direct editor add,\n  // whose token is its own before the purchase starts.\n  function discardArtworkOperation(store, token, message, force) {\n    var owner = artworkOwners.get(store);\n    // A purchase already handed to the cart is finished, not stale.\n    var current = !owner.dispatched.has(token) && (owner.operation === token || (force && !owner.operation));\n    if (owner.operation === token) {\n      owner.operation = null;\n      store.commercePrepareInFlight = false;\n      // An add already on its way to the cart keeps its purchase indicators until its outcome, which the product form\n      // reports (a failure, or the cart page); the customer is told once which choice is being added (not after it\n      // landed), in every layout and beside a reset notice.\n      var inTransport = owner.dispatched.has(token);\n      if (inTransport && productFormPreparesDispatchedSubmit(store)) owner.transport = token;\n      else releaseArtworkPurchaseIndicators(store);\n      if (inTransport && message !== false && owner.landed !== token) showPurchaseNotice(store, artworkTransportMessage);\n    }\n    if (current && message !== false) {\n      var sentence = owner.notice || text(message) || artworkStaleMessage;\n      if (!owner.notice) showPurchaseNotice(store, sentence);\n      if (store.activeDirectToCartAdd) store.activeDirectToCartAdd.fail(sentence, { plain: true });\n    }\n    return false;\n  }\n\n  // The signer's line price must equal the line price the page quoted (a\n  // live-priced product is repriced on the server). Compat lines echo it.\n  // The signed money must equal the money the page quoted: the signed\n  // state's line price tiers when it carries them, and the amount inside a\n  // v4 price token (every tier) or a v5 price token (its profile's tier).\n  // Harmless canonical compaction (fewer fields, same money) passes.\n  var artworkLinePriceTiers = ['price', 'priceProPlan', 'priceUltimatePlan', PARTNER_TIER_PRICE_KEY, 'priceBrokerBasic', 'priceBrokerPremium', 'priceFriendsFamily'];\n  function artworkQuotedCents(entry, key) {\n    var value = numberValue(readTierPrice(entry, key), NaN);\n    return Number.isFinite(value) ? Math.round(value * 100) : NaN;\n  }\n  // The price-table tier of each customer pricing profile, in signer slot\n  // order (retail, the two member plans, the four staff-assigned tiers).\n  var artworkPlanBySlot = ['NONE', 'PRO_PLAN', 'ULTIMATE_PLAN', 'PARTNER_TIER', 'BROKER_BASIC', 'BROKER_PREMIUM', 'FRIENDS_FAMILY'];\n  function artworkPlanTier(mode) { return artworkLinePriceTiers[Math.max(0, artworkPlanBySlot.indexOf(mode))]; }\n\n  // Returns '' when the signed money is the money shown, else the refusal\n  // with the store's signed amounts (and the tier its signer read, when the\n  // signer names one).\n  function artworkSignedPriceMessage(token, readProperty) {\n    var quote = token && token.linePriceEntry;\n    if (!quote) return '';\n    var signedTiers = {}, tolerance = {}, charged = [], changed = false, signerPlan = '';\n    function compare(tier, quoted, signedCents, toleranceCents) {\n      if (!Number.isFinite(signedCents)) return;\n      signedTiers[tier] = signedCents;\n      if (toleranceCents) tolerance[tier] = toleranceCents;\n      if (Number.isFinite(quoted) && Math.abs(quoted - signedCents) > (toleranceCents || 0)) changed = true;\n    }\n    // The customer is never charged above the shown total (one cent for rounding). A signed table charges the customer's\n    // own tier when it prices it, else retail (as the Cart Transform reads it): that charged tier, resolved apart from the\n    // signer's customer tier, is the one the ceiling binds.\n    function ceiling(cents) { if (Number.isFinite(cents) && Number.isFinite(token.displayedCents) && cents > token.displayedCents + 1) changed = true; }\n    function chargeTable(table) { var tier = Number.isFinite(table[token.planTier]) ? token.planTier : 'price'; charged.push(tier); ceiling(table[tier]); }\n    var signed = parseJson(readProperty('_bg_cart_transform_state_v1'), null);\n    var line = signed && signed.linePriceEntry;\n    if (line && typeof line === 'object') {\n      var stateTable = {};\n      artworkLinePriceTiers.forEach(function (key) { stateTable[key] = artworkQuotedCents(line, key); compare(key, artworkQuotedCents(quote, key), stateTable[key]); });\n      chargeTable(stateTable);\n    }\n    var v4 = text(readProperty('_bg_pt_v4')).split('.');\n    var v4Fields = v4.length === 4 && v4[0] === 'v4' ? v4[2].split('|') : [];\n    if (v4Fields.length === 7) {\n      var v4Table = {};\n      v4Fields[4].split('~').forEach(function (cents, index) {\n        var key = artworkLinePriceTiers[index];\n        if (/^\\d+$/.test(cents) && key) { v4Table[key] = Number(cents); compare(key, artworkQuotedCents(quote, key), v4Table[key]); }\n      });\n      chargeTable(v4Table);\n    }\n    var v5 = text(readProperty('_bg_pt_v5')).split('.');\n    var v5Fields = v5.length === 4 && v5[0] === 'v5' ? v5[2].split('|') : [];\n    if (v5Fields.length === 11 && /^\\d+$/.test(v5Fields[7])) {\n      // The v5 amount is the store's charge for the customer tier its signer\n      // read now, built from per-component whole cents: it may land one cent\n      // from the page's single rounding (never an artwork value). Any other\n      // tier, staff-assigned ones included, is not the price shown here.\n      var slot = /^[0-6]$/.test(v5Fields[4]) ? Number(v5Fields[4]) : 0;\n      var tier = artworkLinePriceTiers[slot];\n      if (tier !== token.planTier) { signerPlan = artworkPlanBySlot[slot]; changed = true; }\n      compare(tier, tier === token.planTier ? token.shownCents : NaN, Number(v5Fields[7]), 1);\n      if (tier === token.planTier) ceiling(Number(v5Fields[7])); // the charge for the tier its slot names\n    }\n    return changed ? { message: artworkPriceChangedMessage, signerPlan: signerPlan, signed: signedTiers, tolerance: tolerance, charged: charged } : '';\n  }\n\n  // A signed price the customer never saw: refuse it, price the page for the\n  // tier the store's signer read, and clear the artwork choice until the\n  // customer makes a valid priced choice again (THE ONE RULE). When the\n  // page's own prices cannot explain the signed amount, the page re-reads the\n  // store's current component prices and prices them with the normal rules;\n  // it never infers which component changed from a signed total.\n  var artworkPriceUnconfirmedMessage = 'We could not confirm the current price for this choice. Please refresh the page, or contact us if this continues.';\n  function artworkSignedTiersUnexplained(store, refusal) {\n    var quoted = core.buildCartTransformState(buildSerializedState(store));\n    var page = quoted && quoted.linePriceEntry && typeof quoted.linePriceEntry === 'object' ? quoted.linePriceEntry : {};\n    // The page must price the tier the store charges this customer (a signed table without that tier charges retail).\n    var planTier = artworkPlanTier(getCustomerPricingProfile(store).mode), pageCharged = Number.isFinite(artworkQuotedCents(page, planTier)) ? planTier : 'price';\n    if ((refusal && refusal.charged || []).some(function (tier) { return tier !== pageCharged; })) return true;\n    return Object.keys(refusal && refusal.signed || {}).some(function (tier) {\n      var cents = refusal.signed[tier], toleranceCents = refusal.tolerance[tier] || 0, quotedCents = artworkQuotedCents(page, tier);\n      // A tier the page does not price is compared only when the signer\n      // charged it for this customer (retail is its quote then).\n      if (!Number.isFinite(quotedCents)) {\n        if (!toleranceCents) return false;\n        quotedCents = artworkQuotedCents(page, 'price');\n      }\n      return Math.abs(quotedCents - cents) > toleranceCents;\n    });\n  }\n  function refuseArtworkSignedPrice(store, refusal) {\n    var message = typeof refusal === 'string' ? refusal : refusal.message;\n    if (refusal && refusal.signerPlan) store.signerPricingPlan = refusal.signerPlan;\n    var refused = refusal && refusal.signed && artworkSignedTiersUnexplained(store, refusal)\n      ? { artworkMode: store.state.artworkMode, selections: Object.assign({}, store.state.selections), template: store.state.template } : null;\n    commitArtworkConfiguration(store, { artworkMode: '' }, { source: 'reconcile', reset: true, preserveProject: true, notice: message });\n    recalculate(store);\n    render(store);\n    if (refused) {\n      void refreshArtworkComponentPrices(store).then(function () {\n        recalculate(store);\n        render(store);\n        if (!artworkSignedTiersUnexplained(artworkConfigurationDraft(store, refused), refusal)) return;\n        // The notice every layout shows (the phone sheet too); a choice the customer made meanwhile is checked again at its\n        // own add and is not told about the refused one.\n        if (store.state.artworkMode) return;\n        commitArtworkConfiguration(store, { artworkMode: '' }, { source: 'reconcile', reset: true, preserveProject: true, notice: artworkPriceUnconfirmedMessage });\n        render(store);\n        showPurchaseNotice(store, artworkPriceUnconfirmedMessage);\n      });\n    }\n    return message;\n  }\n\n  function artworkCartQuote(cart) {\n    return JSON.stringify(['artworkMode', 'optionSelections', 'selectedAddons', 'addonByKey', 'customDesignAmount',\n      'templatePersonalizationAmount', 'editServiceCost', 'templateLookup', 'templateRevision', 'printQuantity',\n      'typedQty', 'paidPrintQty', 'sizeSurchargeTotal', 'apparelSizes', 'priceEntry', 'linePriceEntry', 'channelOffer']\n      .map(function (key) { return [key, cart[key]]; }));\n  }\n\n  function checkArtworkDispatch(store, formData, token, sent) {\n    // STUDIO-0011: a held return adds nothing until its session read succeeds;\n    // the blocked add retries the read (the phone layouts' Try again).\n    if (store.designerConfigurationHold) {\n      void retryDesignerConfigurationSession(store);\n      return { ok: false, message: designerConfigurationHoldSentence(store) };\n    }\n    var message = store.artworkChoiceNotice;\n    if (!message && token && !isArtworkOperationFresh(store, token)) message = artworkStaleMessage;\n    if (!message && store.state.artworkMode && !artworkChoiceMatchesSelection(store)) message = artworkLossNotice;\n    var holder = getConfiguredArtworkMethodHolder(store);\n    if (!message && (store.state.artworkMode || holder || shouldRenderArtworkSection(store))) {\n      var validity = validateArtworkInputState(store);\n      if (!validity.valid) message = validity.reason;\n    }\n    if (!message && formData) {\n      var cart;\n      try { cart = JSON.parse(text(formData.get('properties[_bg_cart_transform_state_v1]')) || '{}'); } catch (_) { cart = {}; }\n      var expected = token ? token.options : JSON.stringify(core.buildCartTransformState({ optionSelections: buildCurrentOptionSelections(store) }).optionSelections || []);\n      var expectedQuote = token ? token.cartQuote : artworkCartQuote(core.buildCartTransformState(buildSerializedState(store)));\n      if (JSON.stringify(cart.optionSelections || []) !== expected || artworkCartQuote(cart) !== expectedQuote) message = 'Your artwork price changed. Review your choice and add it again.';\n    }\n    // ALLOWED-BLOCKS-AT-MUTATION: approval and EDDM date, last, right before the cart mutation.\n    var allowedBlock = message ? null : checkAllowedBlocks(store, sentEddmDate(token, sent));\n    if (allowedBlock) message = allowedBlock.reason;\n    return message ? { ok: false, message: message } : { ok: true };\n  }\n\n  // A cart-line edit re-reads its line right before the cart mutation: a line\n  // another tab changed since this page opened it is never overwritten.\n  core.checkDesignerArtworkCartLine = function (lineKey, detail) {\n    var roots = document.querySelectorAll('[data-bg-designer-storefront-root]');\n    var store = Array.prototype.map.call(roots, function (root) { return root.__bgDesignerStore; }).find(function (entry) {\n      return entry && (!detail || !detail.form || entry.form === detail.form);\n    });\n    var changed = { ok: false, message: 'This cart item changed in another tab. Open it again from your cart before saving.' };\n    if (!store || text(store.editingLineKey) !== text(lineKey)) return Promise.resolve(changed);\n    if (!store.editingLineFingerprint || typeof core.fetchCartState !== 'function') return Promise.resolve({ ok: true, fingerprint: text(store.editingLineFingerprint) });\n    return core.fetchCartState({ forceFresh: true }).then(function (cart) {\n      var line = (cart && cart.items || []).find(function (item) { return text(item.key) === text(lineKey); });\n      // The fingerprint rides into core's cart update, which compares it with\n      // its own fresh read right before the mutation.\n      return line && artworkCartLineFingerprint(line) === store.editingLineFingerprint\n        ? { ok: true, fingerprint: store.editingLineFingerprint } : changed;\n    }, function () { return changed; });\n  };\n\n  core.checkDesignerArtworkDispatch = function (formData, detail) {\n    var roots = document.querySelectorAll('[data-bg-designer-storefront-root]');\n    var store = Array.prototype.map.call(roots, function (root) { return root.__bgDesignerStore; }).find(function (entry) {\n      return entry && (!detail || !detail.form || entry.form === detail.form) && (!formData.get('properties[_bg_designer_handle]') || text(entry.config.handle) === text(formData.get('properties[_bg_designer_handle]')));\n    });\n    if (!store) return { ok: false, message: 'Review your artwork choice before adding this item.' };\n    var owner = artworkOwners.get(store), token = detail && Object.prototype.hasOwnProperty.call(detail, 'operation') ? detail.operation : owner.operation;\n    if (detail && detail.stage === 'product-form' && Object.prototype.hasOwnProperty.call(detail, 'operation') && !token) {\n      return { ok: false, message: store.artworkChoiceNotice || 'Review your artwork choice and add this item again.' };\n    }\n    var signed = ['_bg_cart_transform_sig_v1', '_bg_pt_v5', '_bg_pt_v4', '_bg_context_id'].some(function (key) {\n      return !!text(formData && formData.get('properties[' + key + ']'));\n    });\n    var result = checkArtworkDispatch(store, signed ? null : formData, token, formData);\n    var repriced = result.ok && signed && artworkSignedPriceMessage(token, function (key) { return text(formData && formData.get('properties[' + key + ']')); });\n    if (repriced) result = { ok: false, message: refuseArtworkSignedPrice(store, repriced) };\n    if (result.ok && token && detail && detail.stage === 'product-form') {\n      if (owner.consumed.has(token)) return { ok: false, message: 'This artwork choice was already submitted. Review your cart before adding it again.' };\n      // A later final check consumes it right before the cart write: core's\n      // beforeMutation for a cart-line update (consume: false), the add\n      // owner's send guard for an add.\n      if (detail.consume === false || (!text(detail.lineKey) && artworkSendGuardActive(store))) return result;\n      owner.consumed.add(token);\n      // product-form sends this line to the cart now.\n      owner.dispatched.add(token);\n    }\n    return result;\n  };\n\n  // The cart add-once owner asks the page right before it sends an add from\n  // this form (after its own awaited cart reads): the purchase must still be\n  // the customer's current, valid artwork choice. It is consumed there.\n  function artworkSendGuardActive(store) {\n    var addOnce = window.BGCartAddOnce;\n    return !!(addOnce && store.artworkSendGuardOwner === addOnce);\n  }\n  function ensureArtworkSendGuard(store) {\n    var addOnce = window.BGCartAddOnce;\n    if (!store.form || !addOnce || addOnce.acceptsSendGuard !== true || typeof addOnce.setSendGuard !== 'function') return false;\n    if (store.artworkSendGuardOwner === addOnce) return true;\n    addOnce.setSendGuard(store.form, function (form, detail) { return artworkSendGuard(store, form, detail); });\n    store.artworkSendGuardOwner = addOnce;\n    return true;\n  }\n  // detail.operation: the purchase this add was prepared for (product-form\n  // relays it). A form submission the owner bridges carries none and is the\n  // page's current purchase.\n  function artworkSendGuard(store, form, detail) {\n    var owner = artworkOwners.get(store);\n    // undefined: nothing relayed; null: the add's purchase was already dropped.\n    var relayed = !!(detail && typeof detail === 'object' && detail.operation !== undefined);\n    var token = relayed ? detail.operation : owner.operation;\n    var designerAdd = !!(form && typeof form.querySelector === 'function' && form.querySelector('[name=\"properties[_bg_designer_version]\"]'));\n    var stale = { ok: false, message: store.artworkChoiceNotice || artworkStaleMessage };\n    // A designer add whose purchase was dropped (the customer changed it), or\n    // that a newer purchase replaced, is never sent in its place.\n    if (!token) return designerAdd ? stale : { ok: true };\n    if (token !== owner.operation) return stale;\n    if (owner.dispatched.has(token)) return { ok: false, message: 'This artwork choice was already submitted. Review your cart before adding it again.' };\n    var check = checkArtworkDispatch(store, null, token);\n    if (!check.ok) {\n      discardArtworkOperation(store, token, check.message);\n      return { ok: false, message: check.message };\n    }\n    owner.consumed.add(token);\n    owner.dispatched.add(token);\n    return { ok: true };\n  }\n  // ARTWORK-OWNER-END\n\n\n  function keepDetailUploadEntries(store, entries) {\n    var kept = {};\n    Object.keys(entries && typeof entries === 'object' ? entries : {}).forEach(function (fieldId) {\n      if (findDetailUploadField(store, fieldId)) kept[fieldId] = entries[fieldId];\n    });\n    return kept;\n  }\n\n  function replaceArtworkUploads(store, artworkUploads) {\n    var next = keepDetailUploadEntries(store, store.state.uploads);\n    Object.keys(artworkUploads && typeof artworkUploads === 'object' ? artworkUploads : {}).forEach(function (fieldId) {\n      if (!findDetailUploadField(store, fieldId)) next[fieldId] = artworkUploads[fieldId];\n    });\n    store.state.uploads = next;\n  }\n\n  function clearUploadState(store) {\n    replaceArtworkUploads(store, {});\n    store.uploadValidationAttempted = keepDetailUploadEntries(store, store.uploadValidationAttempted);\n    store.uploadReplaceFieldId = findDetailUploadField(store, store.uploadReplaceFieldId) ? text(store.uploadReplaceFieldId) : '';\n    store.uploadClearedFieldIds = keepDetailUploadEntries(store, store.uploadClearedFieldIds);\n  }\n\n  // A restored cart line brings its whole file set, detail files included.\n  function clearEveryUploadState(store) {\n    store.state.uploads = {};\n    store.uploadValidationAttempted = {};\n    store.uploadReplaceFieldId = '';\n    store.uploadClearedFieldIds = {};\n  }\n\n  function clearCanvaState(store) {\n    store.state.canvaUrl = '';\n    store.canvaValidationAttempted = false;\n    store.canvaEditingLink = false;\n  }\n\n  function clearArtworkAuxiliaryState(store) {\n    store.state.approvals.designReviewApproved = false;\n    store.state.approvals.customDesignApproved = false;\n    store.state.extraInputs.qrCodeLink = '';\n    store.state.extraInputs.imprintInformation = '';\n  }\n\n  function hoistGlobalUiLayers() {\n    if (!document.body) return;\n    var previewEl = document.getElementById('swatchHoverPreview');\n    if (previewEl && previewEl.parentElement !== document.body) {\n      document.body.appendChild(previewEl);\n    }\n    var modal = document.querySelector('[data-bg-designer-template-modal]');\n    if (modal && modal.parentElement !== document.body) {\n      document.body.appendChild(modal);\n    }\n  }\n\n  function findNativeOrderFormShell(store) {\n    if (!store || !store.root) return;\n    var formShell = store.root.nextElementSibling;\n    var guard = 0;\n    while (formShell && guard < 12) {\n      if (formShell.querySelector && formShell.querySelector('product-form.product-form')) break;\n      formShell = formShell.nextElementSibling;\n      guard += 1;\n    }\n    if (formShell && formShell.querySelector && formShell.querySelector('product-form.product-form')) {\n      return formShell;\n    }\n    return null;\n  }\n\n  function enforceNativeSubmitVisibility(store) {\n    var formShell = findNativeOrderFormShell(store);\n    if (!formShell || !formShell.querySelectorAll) return false;\n    var changed = false;\n    var presentationProxy = store.root.querySelector('[data-bg-presentation-purchase]');\n    Array.prototype.slice.call(formShell.querySelectorAll('button.product-form__submit, button[name=\"add\"], input[type=\"submit\"][name=\"add\"]')).forEach(function (button) {\n      if (!button || button.closest('#bgStickyPurchaseBar')) return;\n      // The Mini Editor owns a stricter purchase gate: its native Add to cart\n      // control remains absent until PitchPrint writes a confirmed project ID.\n      // Do not let the general visibility repair fight that deliberate state.\n      if (button.getAttribute('data-bg-pitchprint-mini-confirmation') === 'pending') return;\n      if (presentationProxy) {\n        button.setAttribute('data-bg-presentation-proxy-source', '');\n        if (button.style) {\n          button.style.removeProperty('display');\n          button.style.removeProperty('visibility');\n        }\n        return;\n      }\n      button.removeAttribute('data-bg-presentation-proxy-source');\n      if (button.hidden) {\n        button.hidden = false;\n        changed = true;\n      }\n      if (button.style && text(button.style.getPropertyValue('display')).toLowerCase() === 'none') {\n        button.style.removeProperty('display');\n        changed = true;\n      }\n      if (button.style && text(button.style.getPropertyValue('visibility')).toLowerCase() === 'hidden') {\n        button.style.removeProperty('visibility');\n        changed = true;\n      }\n      try {\n        if (window.getComputedStyle(button).display === 'none') {\n          button.style.setProperty('display', 'flex', 'important');\n          changed = true;\n        }\n      } catch (_) {}\n    });\n    return changed;\n  }\n\n  function bindNativeSubmitVisibilityGuard(store) {\n    if (!store || store.nativeSubmitVisibilityGuardBound) return;\n    store.nativeSubmitVisibilityGuardBound = true;\n    var scheduled = false;\n    function scheduleEnforce() {\n      if (scheduled) return;\n      scheduled = true;\n      window.requestAnimationFrame(function () {\n        scheduled = false;\n        enforceNativeSubmitVisibility(store);\n      });\n    }\n    enforceNativeSubmitVisibility(store);\n    [60, 250, 700, 1500, 3000].forEach(function (delayMs) {\n      window.setTimeout(scheduleEnforce, delayMs);\n    });\n    if (window.MutationObserver) {\n      var observerTarget = findNativeOrderFormShell(store) || (store.root && store.root.closest && store.root.closest('product-info')) || document.body;\n      if (observerTarget) {\n        var observer = new MutationObserver(scheduleEnforce);\n        observer.observe(observerTarget, {\n          attributes: true,\n          attributeFilter: ['style', 'class', 'hidden'],\n          childList: true,\n          subtree: true\n        });\n        store.nativeSubmitVisibilityObserver = observer;\n      }\n    }\n  }\n\n  function markNativeOrderFormShell(store) {\n    if (!store || !store.root) return;\n    var infoContainer = store.root.closest('[id^=\"ProductInfo-\"]');\n    if (!infoContainer) return;\n\n    var formShell = findNativeOrderFormShell(store);\n    if (formShell && formShell.querySelector) {\n      var nativeForm = formShell.querySelector('product-form.product-form');\n      if (nativeForm) {\n        formShell.classList.add('bg-designer-storefront__native-form-shell');\n        nativeForm.classList.add('bg-designer-storefront__native-form');\n        var summaryBlock = infoContainer.querySelector('[data-bg-designer-block=\"summary\"]');\n        if (summaryBlock && summaryBlock.parentElement !== formShell) {\n          formShell.insertBefore(summaryBlock, nativeForm);\n        } else if (summaryBlock && summaryBlock.nextElementSibling !== nativeForm) {\n          formShell.insertBefore(summaryBlock, nativeForm);\n        }\n        var ctaMetaBlock = infoContainer.querySelector('[data-bg-designer-post-buy-block]');\n        if (ctaMetaBlock) {\n          ctaMetaBlock.classList.add('bg-designer-storefront__native-postbuy');\n          if (ctaMetaBlock.parentElement !== formShell || ctaMetaBlock.nextElementSibling !== nativeForm) {\n            formShell.insertBefore(ctaMetaBlock, nativeForm);\n          }\n        }\n        var shopPayBlock = infoContainer.querySelector('[data-bg-designer-shop-pay-block]');\n        if (shopPayBlock) {\n          shopPayBlock.classList.add('bg-designer-storefront__native-shop-pay');\n          if (shopPayBlock.parentElement !== formShell || nativeForm.nextElementSibling !== shopPayBlock) {\n            formShell.insertBefore(shopPayBlock, nativeForm.nextSibling);\n          }\n        }\n      }\n    }\n\n    var ctaMeta = infoContainer.querySelector('[data-bg-designer-post-buy-block]');\n    if (ctaMeta) {\n      ctaMeta.classList.add('bg-designer-storefront__native-postbuy');\n    }\n  }\n\n  // total is a shownPrice figure (Shop Pay splits the shopper's total).\n  function buildShopPayInlineMarkup(total) {\n    var installmentsCount = total < 50 ? 2 : 4;\n    var installmentAmount = roundMoney(total / installmentsCount);\n    return '<div class=\"shopPay-inline\">Pay in ' + installmentsCount + ' interest-free payments of <strong>' + escapeHtml(formatShownMoney(installmentAmount)) + '</strong> with <img src=\"' + escapeHtml(SHOP_PAY_ICON_URL) + '\" alt=\"Shop Pay\"> <span>Subject to eligibility.</span></div>';\n  }\n\n  function isShopPayInstallmentsEligibleTotal(total) {\n    // Shop Pay eligibility tiers (matches the legacy product-page mimic):\n    // no line under $35, 2 payments for $35-$49.99, 4 payments from $50.\n    return numberValue(total, 0) >= 35;\n  }\n\n  function ensureShopPayAfterNativeForm(store) {\n    if (!store || !store.root) return null;\n    var infoContainer = store.root.closest('[id^=\"ProductInfo-\"]');\n    if (!infoContainer) return null;\n    var formShell = findNativeOrderFormShell(store);\n    var nativeForm = formShell && formShell.querySelector ? formShell.querySelector('product-form.product-form') : null;\n    var shopPayBlock = infoContainer.querySelector('[data-bg-designer-shop-pay-block]');\n    if (!shopPayBlock) {\n      shopPayBlock = document.createElement('div');\n      shopPayBlock.setAttribute('data-bg-designer-shop-pay-block', '');\n      shopPayBlock.hidden = true;\n    }\n    shopPayBlock.classList.add('bg-designer-storefront__native-shop-pay');\n    if (formShell && nativeForm) {\n      if (shopPayBlock.parentElement !== formShell || nativeForm.nextElementSibling !== shopPayBlock) {\n        formShell.insertBefore(shopPayBlock, nativeForm.nextSibling);\n      }\n    }\n    return shopPayBlock;\n  }\n\n  function syncPreviewBarSafeArea(store) {\n    if (!store || !store.root || !store.root.classList) return;\n    var previewBar = document.querySelector('iframe[title=\"Shopify Preview Bar\"], iframe[src*=\"shopifycloud/preview-bar\"]');\n    var height = previewBar ? Math.max(0, Math.ceil(previewBar.getBoundingClientRect().height || 0)) : 0;\n    var visible = height >= 24;\n    // Scene opening can scroll the page. Unlike toggle(token, force), even\n    // remove(absentToken) emits a class mutation on each scheduled sync.\n    if (store.root.classList.contains('bg-designer-storefront--preview-safe') !== visible) {\n      store.root.classList.toggle('bg-designer-storefront--preview-safe', visible);\n    }\n    var nextHeight = visible ? Math.max(56, Math.min(height, 72)) + 'px' : '';\n    if (store.root.style.getPropertyValue('--bg-preview-bar-height') !== nextHeight) {\n      if (nextHeight) store.root.style.setProperty('--bg-preview-bar-height', nextHeight);\n      else store.root.style.removeProperty('--bg-preview-bar-height');\n    }\n  }\n\n  function bindPreviewBarSafeArea(store) {\n    if (!store || !store.root) return;\n    var scheduled = false;\n    function scheduleSync() {\n      if (scheduled) return;\n      scheduled = true;\n      window.requestAnimationFrame(function () {\n        scheduled = false;\n        syncPreviewBarSafeArea(store);\n      });\n    }\n    scheduleSync();\n    window.addEventListener('resize', scheduleSync);\n    window.addEventListener('scroll', scheduleSync, { passive: true });\n    if (window.MutationObserver && document.body) {\n      var observer = new MutationObserver(scheduleSync);\n      observer.observe(document.body, {\n        childList: true,\n        subtree: false,\n        attributes: true,\n        attributeFilter: ['style', 'class']\n      });\n    }\n    window.setTimeout(scheduleSync, 300);\n    window.setTimeout(scheduleSync, 1200);\n  }\n\n  function buildDefaultEddmState() {\n    return {\n      provider: '',\n      dataVersion: '',\n      targetOrigin: '',\n      routeGroupUuid: '',\n      targetInMailboxDate: '',\n      routesSelected: false,\n      selectedRouteCount: 0,\n      residentialAddresses: 0,\n      businessAddresses: 0,\n      totalAddresses: 0,\n      residentialOnly: false,\n      politicalMailer: false,\n      routeDetails: '',\n      selectedRoutes: [],\n      launchStatus: '',\n      launchError: ''\n    };\n  }\n\n  function createStore(root) {\n    var config = core.readConfig(root);\n    if (!config || !text(config.handle)) return null;\n\n    return {\n      root: root,\n      config: config,\n      form: document.getElementById(text(config.formId)),\n      hiddenInputs: null,\n      optionLayout: null,\n      productCatalog: null,\n      productData: null,\n      pricingData: null,\n      rules: [],\n      templates: [],\n      templateLookupMap: {\n        byLegacyDesignId: {},\n        byDesignNumber: {}\n      },\n      holders: [],\n      binding: {},\n      quantityOptions: [],\n      editingLineKey: '',\n      templateModalMode: '',\n      templateModalActiveId: '',\n      templateModalRefreshPromise: null,\n      templateSearchSuggestions: [],\n      templateSearchActiveIndex: -1,\n      templateSearchSuggestionIndex: null,\n      modalBackerSelections: Object.create(null),\n      pitchPrintReuseMode: '',\n      pitchPrintReuseProjectKey: '',\n      suppressProjectRestoreOnce: false,\n      pitchPrintPreviewRefreshPromise: null,\n      pitchPrintPreviewRefreshProjectId: '',\n      pitchPrintPreviewRefreshCounter: 0,\n      pitchPrintLaunchPreloaderTimer: null,\n      eddmModal: null,\n      eddmMessageHandler: null,\n      eddmWelcomeDismissed: false,\n      eddmSessionMapEventData: null,\n      urlStateApplying: false,\n      urlStateSyncTimer: null,\n      urlStateLastSyncedUrl: '',\n      urlStateForceParams: false,\n      urlStateTemplateHandoff: null,\n      urlStateTemplateAction: '',\n      templateUrlActionAutoHandled: false,\n      accountSwitchResumeReopenArmed: false,\n      collectionTemplateHandoff: null,\n      styleSwitchReturnPath: '',\n      styleArrivalConsumed: null,\n      savedProjectResumeAuthoritativelyValidated: false,\n      selectedDesignCompatibilityConflict: null,\n      state: {\n        selections: {},\n        quantity: 0,\n        quantityMode: '',\n        typedQuantity: 0,\n        paidPrintQuantity: 0,\n        priceBracketQuantity: 0,\n        apparelSizesInitialized: false,\n        apparelTallSizesExpanded: false,\n        apparelTallSizesUserToggled: false,\n        quantityDropdownOpen: false,\n        quantityRowsExpanded: false,\n        artworkMode: '',\n        artworkPrimaryChoice: '',\n        artworkSecondaryChoice: '',\n        canvaUrl: '',\n        guidedFillArmed: false,\n        guidedFillProjectId: '',\n        template: null,\n        project: {\n          projectId: '',\n          designId: '',\n          designNumber: '',\n          title: '',\n          updatedAt: '',\n          previewUrl: '',\n          previews: [],\n          numPages: 0,\n          refreshToken: ''\n        },\n        eddm: buildDefaultEddmState(),\n        approvals: {\n          designReviewApproved: false,\n          customDesignApproved: false\n        },\n        completion: {\n          allowed: false,\n          decision: '',\n          reason: '',\n          message: '',\n          checkedAt: '',\n          hardBlockCount: 0,\n          confirmationRequiredCount: 0,\n          confirmation: {\n            accepted: false,\n            acceptedAt: '',\n            documentFingerprint: '',\n            issueCodes: []\n          },\n          review: {\n            operatorReviewRequired: false,\n            customerConfirmationRequired: false,\n            issueCodes: [],\n            notes: []\n          }\n        },\n        extraInputs: {\n          qrCodeLink: '',\n          imprintInformation: ''\n        },\n        customerInputs: {},\n        customerInputTouched: {},\n        uploads: {},\n        apparelSizes: {},\n        sizeSurchargeTotal: 0,\n        finalSku: '',\n        price: 0,\n        priceExtras: 0\n      },\n      templateModalState: {\n        page: 1,\n        pageSize: 48,\n        visibleLimit: 48,\n        sortMode: DEFAULT_TEMPLATE_MODAL_SORT_MODE,\n        activeConfigurationKey: '',\n        selectedFilters: {},\n        filtersOpen: false\n      },\n      editorShell: null,\n      completionSubmitBypass: false,\n      purchaseSubmissionInFlight: false,\n      completionRequestPromise: null,\n      completionRequestKey: '',\n      completionModalState: null,\n      idleEditorPrewarmScheduled: false,\n      idleEditorPrewarmComplete: false,\n      mediaState: {\n        defaultImages: null,\n        appliedKey: ''\n      },\n      appliedRuleSurfaceAttributes: Object.create(null),\n      uiState: createEmptyUiState(null)\n    };\n  }\n\n  function readBlocks(store) {\n    var infoContainer = store.root.closest('[id^=\"ProductInfo-\"]');\n    return {\n      accolades: store.root.querySelector('[data-bg-designer-accolades]'),\n      options: store.root.querySelector('[data-bg-designer-block=\"options\"]'),\n      quantity: store.root.querySelector('[data-bg-designer-block=\"quantity\"]'),\n      summary: store.root.querySelector('[data-bg-designer-block=\"summary\"]') ||\n        (infoContainer ? infoContainer.querySelector('[data-bg-designer-block=\"summary\"]') : null),\n      artwork: store.root.querySelector('[data-bg-designer-block=\"artwork\"]'),\n      customerInputs: store.root.querySelector('[data-bg-designer-block=\"customer-inputs\"]'),\n      uploads: store.root.querySelector('[data-bg-designer-block=\"uploads\"]'),\n      message: store.root.querySelector('[data-bg-designer-block=\"message\"]'),\n      ctaMeta: infoContainer ? infoContainer.querySelector('[data-bg-designer-post-buy-block]') : null\n    };\n  }\n\n  function clearInitialOptionsLoader(blocks) {\n    var optionsBlock = blocks && blocks.options;\n    if (!optionsBlock) return;\n    var productInfo = optionsBlock.closest ? optionsBlock.closest('product-info') : null;\n    var holdRoot = optionsBlock.closest ? optionsBlock.closest('[data-bg-designer-storefront-root]') : null;\n    var endsLoading = !!(productInfo && productInfo.getAttribute('data-bg-ds-hydration') === 'loading');\n    var heldBeforeHydration = endsLoading && holdRoot && holdRoot.__bgRegionHold ? holdRoot.getBoundingClientRect().height : 0;\n    if (productInfo) productInfo.removeAttribute('data-bg-ds-hydration');\n    if (endsLoading) settleRegionHoldAfterHydration(holdRoot, heldBeforeHydration);\n    optionsBlock.removeAttribute('aria-busy');\n    optionsBlock.removeAttribute('data-bg-designer-options-loading');\n    var loader = optionsBlock.querySelector('[data-bg-designer-initial-loader]');\n    if (loader && loader.parentNode) {\n      loader.parentNode.removeChild(loader);\n    }\n  }\n\n  function hideGlobalSwatchPreview() {\n    var previewEl = document.getElementById('swatchHoverPreview');\n    if (!previewEl) return;\n    previewEl.classList.remove('is-visible');\n    previewEl.style.backgroundImage = 'none';\n    previewEl.setAttribute('aria-hidden', 'true');\n    previewEl.dataset.bgPlacement = '';\n  }\n\n  function setupSwatchPreviewRuntime() {\n    var previewEl = document.getElementById('swatchHoverPreview');\n    if (!previewEl) return;\n    if (previewEl.dataset.bgDesignerSwatchPreviewInit === '1') return;\n    previewEl.dataset.bgDesignerSwatchPreviewInit = '1';\n    previewEl.setAttribute('aria-hidden', 'true');\n    previewEl.setAttribute('role', 'presentation');\n    var hoverMediaQuery = window.matchMedia\n      ? window.matchMedia('(hover: hover) and (pointer: fine)')\n      : null;\n\n    var SHOW_DELAY_MS = 120;\n    var HIDE_DELAY_MS = 90;\n    var DEFAULT_PREVIEW_SIZE = 220;\n    var EDGE_PAD = 8;\n    var SWATCH_GAP = 12;\n    var activeSwatch = null;\n    var activeUrl = '';\n    var showTimer = null;\n    var hideTimer = null;\n    var imageCache = new Map();\n\n    function clearShowTimer() {\n      if (!showTimer) return;\n      window.clearTimeout(showTimer);\n      showTimer = null;\n    }\n\n    function clearHideTimer() {\n      if (!hideTimer) return;\n      window.clearTimeout(hideTimer);\n      hideTimer = null;\n    }\n\n    function canShowPreview() {\n      return !hoverMediaQuery || !!hoverMediaQuery.matches;\n    }\n\n    function getSwatchChoiceFromEventTarget(target) {\n      if (!target || !target.closest) return null;\n      var choice = target.closest('.bg-designer-storefront .bg-designer-storefront__swatch-choice');\n      return choice && choice.matches && choice.matches('.bg-designer-storefront .bg-designer-storefront__swatch-choice') ? choice : null;\n    }\n\n    function getSwatchPreviewFromChoice(choice) {\n      return choice && choice.querySelector\n        ? choice.querySelector('.bg-designer-storefront__swatch-preview')\n        : null;\n    }\n\n    function getSwatchFromEventTarget(target) {\n      return getSwatchPreviewFromChoice(getSwatchChoiceFromEventTarget(target));\n    }\n\n    function getSwatchChoiceFromPreview(swatch) {\n      return swatch && swatch.closest\n        ? swatch.closest('.bg-designer-storefront__swatch-choice')\n        : null;\n    }\n\n    function getSectionBlockers(swatch) {\n      var blockers = [];\n      var productHeading = document.querySelector('product-info[data-bg-ds-section-revision] .product__title h1, .product__title h1');\n      if (productHeading) blockers.push(productHeading.getBoundingClientRect());\n      var section = swatch && swatch.closest\n        ? swatch.closest('.bg-designer-storefront__option-section')\n        : null;\n      if (section) {\n        var sectionHead = section.querySelector('.bg-designer-storefront__section-head');\n        if (sectionHead) blockers.push(sectionHead.getBoundingClientRect());\n      }\n      return blockers;\n    }\n\n    function getSwatchGridBlockers(swatch) {\n      var choice = getSwatchChoiceFromPreview(swatch);\n      var grid = choice && choice.closest\n        ? choice.closest('.bg-designer-storefront__swatch-grid')\n        : null;\n      if (!grid) return [];\n      return Array.prototype.slice.call(grid.querySelectorAll('.bg-designer-storefront__swatch-choice')).filter(function (entry) {\n        return entry && entry !== choice;\n      }).map(function (entry) {\n        return entry.getBoundingClientRect();\n      });\n    }\n\n    function doesRectOverlap(a, b) {\n      if (!a || !b) return false;\n      return !(a.right <= b.left || a.left >= b.right || a.bottom <= b.top || a.top >= b.bottom);\n    }\n\n    function overlapsAnyBlocker(previewRect, blockers) {\n      if (!previewRect || !Array.isArray(blockers) || blockers.length === 0) return false;\n      return blockers.some(function (blocker) {\n        return doesRectOverlap(previewRect, blocker);\n      });\n    }\n\n    function parseCssUrl(value) {\n      var raw = String(value || '').trim();\n      if (!raw || raw === 'none') return '';\n      var match = raw.match(/^url\\((.*)\\)$/i);\n      if (!match || !match[1]) return '';\n      return match[1].trim().replace(/^[\"']|[\"']$/g, '').trim();\n    }\n\n    function hasUsablePreviewUrl(url) {\n      var normalized = String(url || '').trim().toLowerCase();\n      if (!normalized || normalized === 'none') return false;\n      if (normalized.indexOf('placeholder') !== -1 || normalized.indexOf('spacer') !== -1) return false;\n      return normalized.indexOf('data:image/svg+xml') !== 0;\n    }\n\n    function getPreviewSize(swatch) {\n      var size = Number(text(swatch && swatch.getAttribute('data-bg-preview-size')));\n      if (!Number.isFinite(size) || size <= 0) {\n        size = DEFAULT_PREVIEW_SIZE;\n      }\n      return Math.max(160, size);\n    }\n\n    function resolveSwatchPreviewUrl(swatch) {\n      if (!swatch) return '';\n      if (text(swatch.getAttribute('data-bg-hover-preview')) !== '1') return '';\n      var url = text(swatch.getAttribute('data-preview-src') || swatch.getAttribute('data-bg-preview-src'));\n      if (!url) {\n        url = parseCssUrl(window.getComputedStyle(swatch).getPropertyValue('background-image'));\n      }\n      if (!url) {\n        var img = swatch.querySelector && swatch.querySelector('img');\n        if (img) url = text(img.currentSrc || img.src);\n      }\n      return hasUsablePreviewUrl(url) ? url : '';\n    }\n\n    function preloadPreview(url) {\n      if (!url) return Promise.resolve(false);\n      var cached = imageCache.get(url);\n      if (cached === true || cached === false) return Promise.resolve(cached);\n      if (cached && typeof cached.then === 'function') return cached;\n      var loader = new Promise(function (resolve) {\n        var image = new Image();\n        image.onload = function () {\n          imageCache.set(url, true);\n          resolve(true);\n        };\n        image.onerror = function () {\n          imageCache.set(url, false);\n          resolve(false);\n        };\n        image.src = url;\n      });\n      imageCache.set(url, loader);\n      return loader;\n    }\n\n    function clamp(value, minValue, maxValue) {\n      return Math.min(Math.max(value, minValue), maxValue);\n    }\n\n    function buildPreviewCandidates(rect, previewSize) {\n      var centerY = rect.top + (rect.height / 2) - (previewSize / 2);\n      var centerX = rect.left + (rect.width / 2) - (previewSize / 2);\n      return [\n        { placement: 'above', left: centerX, top: rect.top - previewSize - SWATCH_GAP },\n        { placement: 'below', left: centerX, top: rect.bottom + SWATCH_GAP },\n        { placement: 'right', left: rect.right + SWATCH_GAP, top: centerY },\n        { placement: 'left', left: rect.left - previewSize - SWATCH_GAP, top: centerY }\n      ];\n    }\n\n    function evaluatePreviewCandidate(candidate, viewportW, viewportH, previewSize, blockers, gridBlockers) {\n      var minLeft = EDGE_PAD;\n      var minTop = EDGE_PAD;\n      var maxLeft = Math.max(minLeft, viewportW - previewSize - EDGE_PAD);\n      var maxTop = Math.max(minTop, viewportH - previewSize - EDGE_PAD);\n      var left = clamp(candidate.left, minLeft, maxLeft);\n      var top = clamp(candidate.top, minTop, maxTop);\n      var rawFits = candidate.left >= minLeft &&\n        candidate.top >= minTop &&\n        (candidate.left + previewSize) <= (viewportW - EDGE_PAD) &&\n        (candidate.top + previewSize) <= (viewportH - EDGE_PAD);\n      var previewRect = {\n        left: left,\n        top: top,\n        right: left + previewSize,\n        bottom: top + previewSize\n      };\n      return {\n        placement: candidate.placement,\n        left: left,\n        top: top,\n        rawFits: rawFits,\n        overlapsBlocker: overlapsAnyBlocker(previewRect, blockers),\n        overlapsGrid: overlapsAnyBlocker(previewRect, gridBlockers)\n      };\n    }\n\n    function choosePreviewPlacement(rect, previewSize, blockers, gridBlockers) {\n      var viewportW = window.innerWidth || document.documentElement.clientWidth || previewSize;\n      var viewportH = window.innerHeight || document.documentElement.clientHeight || previewSize;\n      var evaluated = buildPreviewCandidates(rect, previewSize).map(function (candidate) {\n        return evaluatePreviewCandidate(candidate, viewportW, viewportH, previewSize, blockers, gridBlockers);\n      });\n      var preferredVerticalPlacements = rect.top > (viewportH - rect.bottom)\n        ? ['above', 'below']\n        : ['below', 'above'];\n      var vertical = preferredVerticalPlacements.map(function (placement) {\n        return evaluated.find(function (entry) {\n          return entry.placement === placement;\n        });\n      }).filter(Boolean);\n      return vertical.find(function (entry) { return entry.rawFits && !entry.overlapsBlocker && !entry.overlapsGrid; }) ||\n        vertical.find(function (entry) { return !entry.overlapsBlocker && !entry.overlapsGrid; }) ||\n        vertical.find(function (entry) { return entry.rawFits && !entry.overlapsBlocker; }) ||\n        vertical.find(function (entry) { return entry.rawFits; }) ||\n        evaluated.find(function (entry) { return entry.rawFits && !entry.overlapsBlocker && !entry.overlapsGrid; }) ||\n        evaluated.find(function (entry) { return entry.rawFits && !entry.overlapsBlocker; }) ||\n        evaluated.find(function (entry) { return entry.rawFits; }) ||\n        evaluated.find(function (entry) { return !entry.overlapsBlocker && !entry.overlapsGrid; }) ||\n        evaluated.find(function (entry) { return !entry.overlapsBlocker; }) ||\n        evaluated[0] || {\n        left: EDGE_PAD,\n        top: EDGE_PAD,\n        placement: ''\n      };\n    }\n\n    function positionPreview(swatch, previewSize) {\n      if (!swatch) return;\n      var anchor = getSwatchChoiceFromPreview(swatch) || swatch;\n      var rect = anchor.getBoundingClientRect();\n      var placement = choosePreviewPlacement(rect, previewSize, getSectionBlockers(swatch), getSwatchGridBlockers(swatch));\n      previewEl.style.left = Math.round(placement.left) + 'px';\n      previewEl.style.top = Math.round(placement.top) + 'px';\n      previewEl.dataset.bgPlacement = placement.placement || '';\n    }\n\n    function showPreviewNow(swatch, url) {\n      if (!swatch || !url) return;\n      var previewSize = getPreviewSize(swatch);\n      previewEl.style.setProperty('--bg-swatch-hover-size', previewSize + 'px');\n      positionPreview(swatch, previewSize);\n      previewEl.style.backgroundImage = 'url(\"' + url + '\")';\n      previewEl.classList.add('is-visible');\n      previewEl.setAttribute('aria-hidden', 'false');\n    }\n\n    function hidePreviewNow() {\n      clearShowTimer();\n      clearHideTimer();\n      previewEl.classList.remove('is-visible');\n      previewEl.style.backgroundImage = 'none';\n      previewEl.setAttribute('aria-hidden', 'true');\n      previewEl.dataset.bgPlacement = '';\n      activeSwatch = null;\n      activeUrl = '';\n    }\n\n    function scheduleHide() {\n      clearShowTimer();\n      clearHideTimer();\n      hideTimer = window.setTimeout(hidePreviewNow, HIDE_DELAY_MS);\n    }\n\n    function scheduleShow(swatch) {\n      if (!swatch || !canShowPreview()) {\n        hidePreviewNow();\n        return;\n      }\n      var url = resolveSwatchPreviewUrl(swatch);\n      if (!url) {\n        scheduleHide();\n        return;\n      }\n      activeSwatch = swatch;\n      activeUrl = url;\n      clearShowTimer();\n      clearHideTimer();\n      showTimer = window.setTimeout(function () {\n        preloadPreview(url).then(function (ok) {\n          if (!ok) return;\n          if (activeSwatch !== swatch || activeUrl !== url) return;\n          showPreviewNow(swatch, url);\n        });\n      }, SHOW_DELAY_MS);\n    }\n\n    document.addEventListener('mouseover', function (event) {\n      if (!canShowPreview()) return;\n      var choice = getSwatchChoiceFromEventTarget(event.target);\n      var swatch = getSwatchPreviewFromChoice(choice);\n      if (!swatch) return;\n      var from = event.relatedTarget;\n      if (from && choice && choice.contains(from)) return;\n      scheduleShow(swatch);\n    });\n\n    document.addEventListener('mouseout', function (event) {\n      var choice = getSwatchChoiceFromEventTarget(event.target);\n      var swatch = getSwatchPreviewFromChoice(choice);\n      if (!swatch) return;\n      var to = event.relatedTarget;\n      if (to && choice && choice.contains(to)) return;\n      scheduleHide();\n    });\n\n    document.addEventListener('focusin', function (event) {\n      if (!canShowPreview()) return;\n      var input = event.target && event.target.closest\n        ? event.target.closest('.bg-designer-storefront .bg-designer-storefront__swatch-radio')\n        : null;\n      if (!input) return;\n      var holder = input.closest('.bg-designer-storefront__swatch-choice');\n      var swatch = holder ? holder.querySelector('.bg-designer-storefront__swatch-preview') : null;\n      if (!swatch) return;\n      scheduleShow(swatch);\n    });\n\n    document.addEventListener('focusout', function (event) {\n      var input = event.target && event.target.closest\n        ? event.target.closest('.bg-designer-storefront .bg-designer-storefront__swatch-radio')\n        : null;\n      if (!input) return;\n      scheduleHide();\n    });\n\n    window.addEventListener('scroll', function () {\n      if (!activeSwatch || !previewEl.classList.contains('is-visible')) return;\n      positionPreview(activeSwatch, getPreviewSize(activeSwatch));\n    }, { passive: true });\n\n    window.addEventListener('resize', function () {\n      if (!canShowPreview()) {\n        hidePreviewNow();\n        return;\n      }\n      if (!activeSwatch || !previewEl.classList.contains('is-visible')) return;\n      positionPreview(activeSwatch, getPreviewSize(activeSwatch));\n    });\n\n    if (hoverMediaQuery && typeof hoverMediaQuery.addEventListener === 'function') {\n      hoverMediaQuery.addEventListener('change', function () {\n        if (!canShowPreview()) {\n          hidePreviewNow();\n          return;\n        }\n        if (!activeSwatch || !activeUrl) return;\n        showPreviewNow(activeSwatch, activeUrl);\n      });\n    } else if (hoverMediaQuery && typeof hoverMediaQuery.addListener === 'function') {\n      hoverMediaQuery.addListener(function () {\n        if (!canShowPreview()) {\n          hidePreviewNow();\n          return;\n        }\n        if (!activeSwatch || !activeUrl) return;\n        showPreviewNow(activeSwatch, activeUrl);\n      });\n    }\n\n    if (!canShowPreview()) {\n      hidePreviewNow();\n    }\n  }\n\n  function getHolderId(holder) {\n    return text(holder && (holder.id || holder.holderId || holder.htmlID || holder.displayName));\n  }\n\n  function isHolderUnavailableByRules(store, holder) {\n    if (!holder) return true;\n    return isTargetingHidden(store, holder && holder.targetingID)\n      || isHolderHiddenByRuleSurface(store, holder)\n      || isEveryHolderOptionHiddenByRules(store, holder);\n  }\n\n  function getSelectedOption(store, holder) {\n    if (isHolderUnavailableByRules(store, holder)) return null;\n    var holderId = getHolderId(holder);\n    var selectedId = text(store.state.selections[holderId]);\n    var options = getVisibleOptions(store, holder);\n    for (var index = 0; index < options.length; index += 1) {\n      if (text(options[index].hvId) === selectedId) return options[index];\n    }\n    return options[0] || null;\n  }\n\n  function getSelectedOptionFromAllOptions(store, holder) {\n    var holderId = getHolderId(holder);\n    var selectedId = text(store.state.selections[holderId]);\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    for (var index = 0; index < options.length; index += 1) {\n      if (text(options[index].hvId) === selectedId) return options[index];\n    }\n    return options[0] || null;\n  }\n\n  function applyDefaultSelections(store) {\n    var selections = Object.assign({}, store.state.selections);\n    store.holders.forEach(function (holder) {\n      var holderId = getHolderId(holder);\n      var options = getVisibleOptions(store, holder);\n      var selected = (isProductLinkHolder(holder)\n        ? options.find(function (entry) { return isCurrentLinkedProductOption(store, entry); })\n        : null) || options.find(function (entry) { return entry && entry.defaultValue; }) || options[0] || null;\n      if (!selected) return;\n      selections[holderId] = text(selected.hvId);\n    });\n    replaceArtworkSelections(store, selections, 'default');\n  }\n\n  function normalizeRuleAction(action) {\n    var source = action && typeof action === 'object' ? action : null;\n    if (!source) return null;\n    return Object.assign({}, source, {\n      uiFlag: text(source.uiFlag),\n      uiBucket: text(source.uiBucket) || 'rootFlags'\n    });\n  }\n\n  function normalizeStorefrontRule(rule) {\n    var source = rule && typeof rule === 'object' ? rule : null;\n    if (!source) return null;\n    return Object.assign({}, source, {\n      blocks: Array.isArray(source.blocks) ? source.blocks.map(normalizeStorefrontRule).filter(Boolean) : [],\n      trueActions: Array.isArray(source.trueActions) ? source.trueActions.map(normalizeRuleAction).filter(Boolean) : [],\n      falseActions: Array.isArray(source.falseActions) ? source.falseActions.map(normalizeRuleAction).filter(Boolean) : []\n    });\n  }\n\n  function normalizeStorefrontRules(rawRules) {\n    return Array.isArray(rawRules) ? rawRules.map(normalizeStorefrontRule).filter(Boolean) : [];\n  }\n\n  function isRuleRelevantForHandle(rule, handle) {\n    var productHandles = Array.isArray(rule && rule.productHandles) ? rule.productHandles.map(text).filter(Boolean) : [];\n    if (!productHandles.length) return true;\n    return productHandles.indexOf(text(handle)) !== -1;\n  }\n\n  function isTargetingHidden(store, targetingId) {\n    var key = normalizeTargetingIdKey(targetingId);\n    return !!(key && store && store.uiState && store.uiState.hiddenTargetingIds && store.uiState.hiddenTargetingIds[key]);\n  }\n\n  function isTargetingDisabled(store, targetingId) {\n    var key = normalizeTargetingIdKey(targetingId);\n    return !!(key && store && store.uiState && store.uiState.disabledTargetingIds && store.uiState.disabledTargetingIds[key]);\n  }\n\n  function getTargetingDisabledReason(store, targetingId) {\n    var key = normalizeTargetingIdKey(targetingId);\n    var reasons = store && store.uiState && store.uiState.disabledReasons;\n    return text(key && reasons && reasons[key]);\n  }\n\n  function getOptionRuleTargetKeys(option) {\n    var source = option && typeof option === 'object' ? option : {};\n    var keys = [\n      source.targetingID,\n      source.targetingId,\n      source.hvId,\n      source.id,\n      source.valueId\n    ].map(normalizeTargetingIdKey).filter(Boolean);\n    return keys.filter(function (key, index) {\n      return keys.indexOf(key) === index;\n    });\n  }\n\n  function isOptionHiddenByRules(store, option) {\n    return getOptionRuleTargetKeys(option).some(function (key) {\n      return isTargetingHidden(store, key);\n    });\n  }\n\n  function isOptionDisabledByRules(store, option) {\n    return getOptionRuleTargetKeys(option).some(function (key) {\n      return isTargetingDisabled(store, key);\n    });\n  }\n\n  function getOptionDisabledCause(store, option) {\n    var keys = getOptionRuleTargetKeys(option);\n    for (var index = 0; index < keys.length; index += 1) {\n      var cause = getTargetingDisabledReason(store, keys[index]);\n      if (cause) return cause;\n    }\n    return '';\n  }\n\n  function buildOptionDisabledExplanation(store, holder, option) {\n    var optionLabel = getOptionDisplayLabel(store, holder, option) || 'This option';\n    var cause = getOptionDisabledCause(store, option);\n    return cause\n      ? optionLabel + ' is disabled because of the selection: ' + cause + '.'\n      : optionLabel + ' is unavailable with the current product selections.';\n  }\n\n  function getVisibleOptions(store, holder) {\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    return options.filter(function (option) {\n      return !isOptionHiddenByRules(store, option);\n    });\n  }\n\n  // BD-PC-ALL-HIDDEN-FALLBACK: an option whose every choice the rules hide is\n  // a hidden option, exactly as if a rule hid the option (and as the classic\n  // page, which unchecks a hidden choice): not shown, no price-code segment, no\n  // line selection, never required; its stored choice returns when a choice is\n  // visible again. The quote engine and the compile read the same decision\n  // (contracts resolveProductCommerceRuleHiddenChoices). Before, the page fell\n  // back to showing every choice and priced a row the rules meant to remove.\n  function isEveryHolderOptionHiddenByRules(store, holder) {\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    if (!options.length) return false;\n    return options.every(function (option) {\n      return isOptionHiddenByRules(store, option);\n    });\n  }\n\n  function matchesConfigToken(value, candidates) {\n    var clean = text(value);\n    if (!clean) return false;\n    var normalized = clean.toLowerCase();\n    return (Array.isArray(candidates) ? candidates : []).some(function (candidate) {\n      return text(candidate).toLowerCase() === normalized;\n    });\n  }\n\n  function holderMatchesConfiguredReference(holder, references) {\n    var tokens = [\n      getHolderId(holder),\n      holder && holder.id,\n      holder && holder.htmlID,\n      holder && holder.displayName,\n      holder && holder.backendName,\n      holder && holder.targetingID\n    ];\n    return tokens.some(function (token) {\n      return matchesConfigToken(token, references);\n    });\n  }\n\n  function findHolderByConfiguredReference(store, references) {\n    var holderRefs = normalizeStringList(references);\n    if (!holderRefs.length) return null;\n    return (store && Array.isArray(store.holders) ? store.holders : []).find(function (holder) {\n      return holderMatchesConfiguredReference(holder, holderRefs);\n    }) || null;\n  }\n\n  function getOptionTemplateHolder(store) {\n    var config = getOptionTemplateModalConfig(store);\n    if (!config.enabled) return null;\n    return findHolderByConfiguredReference(store, [\n      config.templateHolderId,\n      config.templateHolderHtmlId,\n      config.templateHolderTargetingId,\n      config.templateHolderName\n    ]);\n  }\n\n  function getOptionTemplateTriggerHolder(store) {\n    var config = getOptionTemplateModalConfig(store);\n    if (!config.enabled) return null;\n    return findHolderByConfiguredReference(store, [\n      config.triggerHolderId,\n      config.triggerHolderHtmlId,\n      config.triggerHolderTargetingId,\n      config.triggerHolderName\n    ]);\n  }\n\n  function isOptionTemplateHolder(store, holder) {\n    var templateHolder = getOptionTemplateHolder(store);\n    return !!(templateHolder && holder && getHolderId(templateHolder) === getHolderId(holder));\n  }\n\n  function isOptionTemplateTriggerValue(store, holder, option) {\n    var config = getOptionTemplateModalConfig(store);\n    if (!config.enabled || !holder || !option) return false;\n    var triggerHolder = getOptionTemplateTriggerHolder(store);\n    if (!triggerHolder || getHolderId(triggerHolder) !== getHolderId(holder)) return false;\n    return matchesConfigToken(option.hvId, config.triggerValueIds)\n      || matchesConfigToken(option.targetingID, config.triggerValueTargetingIds)\n      || matchesConfigToken(getOptionLabel(option), config.triggerValueLabels);\n  }\n\n  function getSelectedOptionTemplateTrigger(store) {\n    var holder = getOptionTemplateTriggerHolder(store);\n    if (!holder) return null;\n    var option = getSelectedOptionFromAllOptions(store, holder);\n    return isOptionTemplateTriggerValue(store, holder, option) ? { holder: holder, option: option } : null;\n  }\n\n  // The option group staff named as the artwork method group in Admin.\n  function getConfiguredArtworkMethodHolder(store) {\n    var config = getArtworkSectionConfig(store);\n    return findHolderByConfiguredReference(store, [\n      config.artworkMethodHolderId,\n      config.artworkMethodHolderHtmlId,\n      config.artworkMethodHolderTargetingId,\n      config.artworkMethodHolderName,\n      config.methodHolderId,\n      config.methodHolderHtmlId,\n      config.methodHolderTargetingId,\n      config.methodHolderName\n    ]);\n  }\n\n  function getArtworkMethodHolder(store) {\n    return getConfiguredArtworkMethodHolder(store) || getOptionTemplateTriggerHolder(store);\n  }\n\n  function isArtworkMethodHolder(store, holder) {\n    var methodHolder = getArtworkMethodHolder(store);\n    return !!(methodHolder && holder && getHolderId(methodHolder) === getHolderId(holder));\n  }\n\n  function getArtworkMethodOptionMap(store) {\n    var config = getArtworkSectionConfig(store);\n    var map = config.artworkMethodOptionMap || config.methodOptionMap || config.methodValueMap;\n    return map && typeof map === 'object' && !Array.isArray(map) ? map : {};\n  }\n\n  function getArtworkMethodAliases(methodKey) {\n    var canonical = normalizeArtworkMethodKey(methodKey);\n    var aliases = [canonical];\n    if (canonical === 'editservice') aliases = aliases.concat(['use-template', 'template', 'use-a-template']);\n    if (canonical === 'customdesign') aliases = aliases.concat(['custom-design', 'custom', 'have-us-design-it']);\n    if (canonical === 'youhaveart') aliases = aliases.concat(['send-later', 'send-artwork-after-checkout', 'artwork-later']);\n    if (canonical === 'recreate') aliases = aliases.concat(['recreate-design', 'recreate-a-design']);\n    if (canonical === 'freesetup') aliases = aliases.concat(['free-setup']);\n    return aliases.filter(function (entry, index, source) {\n      return entry && source.indexOf(entry) === index;\n    });\n  }\n\n  function getArtworkMethodFallbackLabels(methodKey) {\n    var canonical = normalizeArtworkMethodKey(methodKey);\n    if (canonical === 'editservice') return ['Use a Template', 'Use Template', 'Template'];\n    if (canonical === 'customdesign') return ['Professional Custom Design', 'Custom Design', 'Have us design it', 'Have Us Design It', 'Pro Design'];\n    if (canonical === 'reorder') return ['Reorder', 'Re-order', 'Repeat Order'];\n    if (canonical === 'recreate') return ['Recreate a Design', 'Recreate Design', 'Re-create Design', 'Recreate Existing Design'];\n    if (canonical === 'freesetup') return ['Free Setup', 'Free Proof Setup', 'Setup Included'];\n    if (canonical === 'youhaveart') return ['Send artwork after checkout', 'Order now, send artwork later', 'Send artwork later', 'Upload art later', 'You have my art'];\n    return [];\n  }\n\n  function normalizeArtworkMethodOptionEntry(entry) {\n    if (!entry) return null;\n    if (typeof entry === 'string') {\n      return {\n        valueIds: [entry],\n        valueTargetingIds: [entry],\n        valueLabels: [entry]\n      };\n    }\n    if (Array.isArray(entry)) {\n      return {\n        valueIds: normalizeStringList(entry),\n        valueTargetingIds: normalizeStringList(entry),\n        valueLabels: normalizeStringList(entry)\n      };\n    }\n    if (typeof entry !== 'object') return null;\n    return {\n      valueIds: normalizeStringList(entry.valueIds || entry.hvIds || entry.hvids || entry.valueId || entry.hvId || entry.hvid),\n      valueTargetingIds: normalizeStringList(entry.valueTargetingIds || entry.targetingIds || entry.valueTargetingId || entry.targetingId),\n      valueLabels: normalizeStringList(entry.valueLabels || entry.labels || entry.valueLabel || entry.label)\n    };\n  }\n\n  function getArtworkMethodOptionEntry(store, methodKey) {\n    var map = getArtworkMethodOptionMap(store);\n    var aliases = getArtworkMethodAliases(methodKey);\n    for (var index = 0; index < aliases.length; index += 1) {\n      var alias = aliases[index];\n      if (Object.prototype.hasOwnProperty.call(map, alias)) {\n        return normalizeArtworkMethodOptionEntry(map[alias]);\n      }\n    }\n    var matchedKey = Object.keys(map).find(function (key) {\n      return aliases.indexOf(normalizeArtworkMethodKey(key)) !== -1;\n    });\n    if (matchedKey) return normalizeArtworkMethodOptionEntry(map[matchedKey]);\n    return null;\n  }\n\n  function normalizeBogunaEditorType(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s-]+/g, '_');\n    if (\n      normalized === 'boguna_studio'\n    ) return 'boguna_studio';\n    if (normalized === 'pitchprint') return 'pitchprint_hybrid';\n    return normalized;\n  }\n\n  function isBogunaArtworkPage(store) {\n    var mapping = store && store.config && store.config.editorMapping && typeof store.config.editorMapping === 'object'\n      ? store.config.editorMapping\n      : null;\n    return normalizeBogunaEditorType(mapping && mapping.editorType) === 'boguna_studio';\n  }\n\n  function isEditorlessArtworkPage(store) {\n    var mapping = store && store.config && store.config.editorMapping && typeof store.config.editorMapping === 'object'\n      ? store.config.editorMapping\n      : null;\n    return normalizeBogunaEditorType(mapping && mapping.editorType) === 'none';\n  }\n\n  function isEditorlessProductCommercePage(store) {\n    return !!(store && store.config && store.config.productCommerceRuntime)\n      && isEditorlessArtworkPage(store);\n  }\n\n  function getArtworkMethodOptionEntryRawRecord(store, methodKey) {\n    var map = getArtworkMethodOptionMap(store);\n    var aliases = getArtworkMethodAliases(methodKey);\n    for (var index = 0; index < aliases.length; index += 1) {\n      var alias = aliases[index];\n      if (Object.prototype.hasOwnProperty.call(map, alias)) {\n        var direct = map[alias];\n        if (direct && typeof direct === 'object' && !Array.isArray(direct)) return direct;\n      }\n    }\n    var matchedKey = Object.keys(map).find(function (key) {\n      return aliases.indexOf(normalizeArtworkMethodKey(key)) !== -1;\n    });\n    var matched = matchedKey ? map[matchedKey] : null;\n    return matched && typeof matched === 'object' && !Array.isArray(matched) ? matched : null;\n  }\n\n  // Per-option display config authored in Admin Design Options. Label and\n  // description overrides apply on every designer product page (Boguna and\n  // PitchPrint Hybrid share the Artwork Options panel); the editor-launch and\n  // supporting-upload behaviors stay Boguna Studio-only.\n  function getArtworkMethodDisplayConfig(store, methodKey) {\n    var entry = getArtworkMethodOptionEntryRawRecord(store, methodKey);\n    if (!entry) return null;\n    var boguna = isBogunaArtworkPage(store);\n    return {\n      label: text(entry.customerLabel),\n      description: text(entry.customerDescription),\n      uploadInEditor: boguna && (entry.uploadInEditor === true || text(entry.uploadInEditor).toLowerCase() === 'true'),\n      // S5: the canvas note above Upload Design (per product, Admin Design\n      // Options); blank keeps the built-in sentence, showEditorNote false hides it.\n      editorNote: text(entry.editorNote),\n      showEditorNote: !(entry.showEditorNote === false || text(entry.showEditorNote).toLowerCase() === 'false'),\n      offerSupportingUpload: boguna && (entry.offerSupportingUpload === true || text(entry.offerSupportingUpload).toLowerCase() === 'true')\n    };\n  }\n\n  var DEFAULT_UPLOAD_EDITOR_NOTE = 'Place your file on the canvas to proof it with bleed before checkout.';\n\n  function getArtworkUploadEditorNote(store) {\n    var display = getArtworkMethodDisplayConfig(store, 'uploadfiles') || {};\n    if (display.showEditorNote === false) return '';\n    return text(display.editorNote) || DEFAULT_UPLOAD_EDITOR_NOTE;\n  }\n\n  function shouldLaunchEditorForArtworkUpload(store) {\n    var display = getArtworkMethodDisplayConfig(store, 'uploadfiles');\n    return !!(display && display.uploadInEditor);\n  }\n\n  // Upload-in-editor lane: the customer's file lives in the saved project,\n  // never in store.state.uploads. Every reader that decides whether the\n  // upload method is complete (step header, purchase label, wizard gate,\n  // cart validation) must agree on this one check.\n  // EDITOR-LANES-EMPTY-SAVE-01: a saved project id is not artwork. The saved\n  // document must hold at least one placed object; core.fetchProjectPreview\n  // derives that from the project record after every save, close and\n  // credentialed restore, the durable preview cache replays it on cold\n  // returns, and the serialized page state carries it. Unknown (no read yet)\n  // stays incomplete. The legacy PitchPrint provider has no document read and\n  // keeps its project-id behavior.\n  function hasSavedProjectArtwork(store) {\n    var project = store && store.state && store.state.project;\n    if (!text(project && project.projectId)) return false;\n    if (isPitchPrintLaunchProvider(store)) return true;\n    return project.hasArtwork === true;\n  }\n\n  function hasEditorUploadedArtwork(store) {\n    return shouldLaunchEditorForArtworkUpload(store) && hasSavedProjectArtwork(store);\n  }\n\n  // ED-R1 / ED-R2 (2026-09-17): the readiness sentence follows the purchase\n  // gate's truth. A saved editor project without artwork (the record read\n  // found no printable object, or no read has answered yet) is never\n  // \"Ready to order\". A genuine reorder keeps its proof sentence; a legacy\n  // PitchPrint project has no document read and keeps its project-id\n  // behavior inside hasSavedProjectArtwork; when the artwork section does not\n  // render (the gate's own predicate) there is no design flow on the page.\n  // STOREFRONT-SAVED-EMPTY (2026-09-25): only a record read says \"empty\"\n  // (no printable object, or no document at all). A design not read yet is\n  // \"loading\", and a read that ended without an answer (no access, network)\n  // is \"unavailable\". The purchase gate is unchanged: it stays closed in all\n  // three states.\n  function getSavedDesignReadinessState(store) {\n    if (!store || !store.state) return '';\n    var project = store.state.project || {};\n    var projectId = text(project.projectId);\n    if (!projectId) return '';\n    if (!shouldRenderArtworkSection(store)) return '';\n    if (getContextualReorderOrigin(store)) return '';\n    if (hasSavedProjectArtwork(store)) return '';\n    if (project.hasArtwork === false) return 'empty';\n    var read = store.savedDesignRead && store.savedDesignRead.projectId === projectId ? store.savedDesignRead.state : '';\n    if (read === 'failed') return 'unavailable';\n    return read === 'read' ? 'empty' : 'loading';\n  }\n\n  function setSavedDesignReadState(store, projectId, state) {\n    store.savedDesignRead = { projectId: text(projectId), state: state };\n  }\n\n  var LOADING_SAVED_DESIGN_READINESS_TITLE = 'Loading your design\u2026';\n  var UNAVAILABLE_SAVED_DESIGN_READINESS_TITLE = 'We could not load your saved design';\n  var UNAVAILABLE_SAVED_DESIGN_READINESS_COPY = 'Refresh this page to try again.';\n  var UNAVAILABLE_SAVED_DESIGN_SIGNED_OUT_COPY = 'Sign in to see it, or refresh this page to try again.';\n  var EMPTY_SAVED_DESIGN_READINESS_TITLE = 'Your saved design is empty';\n  var EMPTY_SAVED_DESIGN_ADD_ARTWORK_COPY = 'Add your artwork in the editor, then save.';\n  var EMPTY_SAVED_DESIGN_ARTWORK_LATER_COPY = 'Add artwork in the editor, or send it after checkout.';\n\n  // The second way forward is named only when the purchase control itself\n  // would route the add to \"artwork after checkout\" (the same validation and\n  // fallback rule the submit handler uses), so the sentence and the button\n  // agree by construction.\n  function buildEmptySavedDesignReadinessCopy(store) {\n    var validation = validateArtworkInputState(store);\n    return validation && !validation.valid && canUseArtworkLaterFallback(store, validation)\n      ? EMPTY_SAVED_DESIGN_ARTWORK_LATER_COPY\n      : EMPTY_SAVED_DESIGN_ADD_ARTWORK_COPY;\n  }\n\n  // The readiness title and sentence for a saved design that is not ready to\n  // order yet (null when the design is ready or there is none).\n  function buildSavedDesignReadiness(store) {\n    var state = getSavedDesignReadinessState(store);\n    if (state === 'empty') return { title: EMPTY_SAVED_DESIGN_READINESS_TITLE, copy: buildEmptySavedDesignReadinessCopy(store) };\n    // A design saved to an account opens only for that account, so a\n    // signed-out visitor is told to sign in first.\n    if (state === 'unavailable') {\n      return {\n        title: UNAVAILABLE_SAVED_DESIGN_READINESS_TITLE,\n        copy: isCustomerLoggedIn(store) ? UNAVAILABLE_SAVED_DESIGN_READINESS_COPY : UNAVAILABLE_SAVED_DESIGN_SIGNED_OUT_COPY\n      };\n    }\n    if (state === 'loading') return { title: LOADING_SAVED_DESIGN_READINESS_TITLE, copy: '' };\n    return null;\n  }\n\n  function isArtworkUploadProvided(store) {\n    return getPrimaryArtworkUploadFiles(store).length > 0 || hasEditorUploadedArtwork(store);\n  }\n\n  var ARTWORK_OPTION_SUPPORTING_UPLOAD_FIELD_ID = 'artwork_option_files';\n\n  // Optional supporting-files upload offered on the Free Setup / Recreate a\n  // Design options (Boguna only). Not tied to the editor: the files ride\n  // the normal storefront upload lane into the cart properties.\n  function getArtworkOptionSupportingUploadField(store, methodKey) {\n    var canonical = normalizeArtworkMethodKey(methodKey);\n    if (canonical !== 'freesetup' && canonical !== 'recreate') return null;\n    var display = getArtworkMethodDisplayConfig(store, canonical);\n    if (!display || !display.offerSupportingUpload) return null;\n    return {\n      id: ARTWORK_OPTION_SUPPORTING_UPLOAD_FIELD_ID,\n      label: 'Upload files (optional)',\n      kind: 'file',\n      required: false,\n      accept: 'image/*,.svg,.pdf,application/pdf,.ai,.eps,.zip,.doc,.docx',\n      multiple: true,\n      surface: 'option-supporting'\n    };\n  }\n\n  // The artwork upload fields that are live for the CURRENT artwork mode: the\n  // binding upload fields when uploading artwork files, or the per-option\n  // supporting field when that option offers one.\n  function getArtworkMethodUploadFields(store) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    if (mode === 'uploadfiles') {\n      return normalizeUploadFields(store.binding);\n    }\n    if (mode === 'designonline' && isGuidedFillArmed(store)) {\n      // Guided slot fill rides the standard upload machinery (immediate\n      // drains, pending checks, restore) with template-slot synthetic fields.\n      return getGuidedFillUploadFields(store);\n    }\n    var supportingField = getArtworkOptionSupportingUploadField(store, mode);\n    return supportingField ? [supportingField] : [];\n  }\n\n  // UPLOAD-SURFACES-NEVER-SENT-01: the uploads block draws file fields of its\n  // own, shown by the product's rules whatever the artwork method is (a QR\n  // code file, a mailing list). The artwork block owns the primary and the\n  // supporting surface, so the uploads block never draws those two.\n  function isDetailUploadField(field) {\n    var surface = text(field && field.surface);\n    return !!surface && surface !== 'primary' && surface !== 'supporting';\n  }\n\n  // What the product's rules say about the detail fields. A rule shows one by\n  // showing its surface, and makes it required by setting the `required`\n  // class on that surface (a page rule's addClass, or an Admin rule's\n  // legacy_ui_class). Hidden and not required by default, and never read from\n  // a product name or id.\n  function getDetailUploadRuleState(store) {\n    return {\n      showQrUpload: getUiSurfaceVisibility(store, '.qrUpload', false),\n      showMailingListUpload: getUiSurfaceVisibility(store, '.mailingListUpload', false),\n      requireQrUpload: getUiSurfaceClassFlag(store, '.qrUpload', 'required', false),\n      requireMailingListUpload: getUiSurfaceClassFlag(store, '.mailingListUpload', 'required', false)\n    };\n  }\n\n  // The detail fields this page draws right now. renderUploads draws exactly\n  // this list, so a field the customer can pick a file in is always a field\n  // the upload path sends. A product whose uploads are off draws none: the\n  // upload service would refuse every file (the same gate as guided slot fill).\n  function getDetailUploadFields(store) {\n    if (!store || !store.root || !store.root.querySelector('[data-bg-designer-block=\"uploads\"]')) return [];\n    if (store.bindingUploadEnabled !== true) return [];\n    return getRenderedUploadFields(store, getDetailUploadRuleState(store)).filter(isDetailUploadField);\n  }\n\n  // Every detail field the runtime knows, shown or not, in drawn order: a\n  // file restored from a cart line keeps its field, and its label, when\n  // today's rules hide it.\n  var EVERY_DETAIL_UPLOAD_SURFACE = { showQrUpload: true, showMailingListUpload: true };\n\n  function getEveryDetailUploadField(store) {\n    return getRenderedUploadFields(store, EVERY_DETAIL_UPLOAD_SURFACE).filter(isDetailUploadField);\n  }\n\n  function findDetailUploadField(store, fieldId) {\n    var cleanId = text(fieldId);\n    if (!cleanId) return null;\n    // An Admin upload field that reuses a detail id is the artwork field.\n    if (normalizeUploadFields(store.binding).some(function (field) { return field.id === cleanId; })) return null;\n    return getEveryDetailUploadField(store).find(function (field) {\n      return field.id === cleanId;\n    }) || null;\n  }\n\n  // CARTLINE-RESTORE-UPLOADS-01 carries a file of the edited cart line where\n  // this page cannot draw its field. A detail field this page view has drawn\n  // is one the customer can see, so its file follows the field from then on:\n  // it leaves the line when the customer's own option change hides the field,\n  // and comes back with it.\n  function isCarriedCartLineUpload(store, fieldId, file) {\n    if (!file || file.cartLineUpload !== true) return false;\n    return !(store.detailUploadFieldsDrawn && store.detailUploadFieldsDrawn[text(fieldId)]);\n  }\n\n  // Every upload field that is live right now: the artwork method's fields\n  // and the detail fields the uploads block draws. Upload state restore,\n  // pending-upload drains, and cart property assembly all key off this list.\n  function getActiveArtworkUploadFields(store) {\n    var fields = getArtworkMethodUploadFields(store).slice();\n    getDetailUploadFields(store).forEach(function (detailField) {\n      var known = fields.some(function (field) {\n        return text(field && field.id) === detailField.id;\n      });\n      if (!known) fields.push(detailField);\n    });\n    return fields;\n  }\n\n  function optionMatchesArtworkMethodEntry(option, entry) {\n    if (!option || !entry) return false;\n    return matchesConfigToken(option.hvId, entry.valueIds)\n      || matchesConfigToken(option.targetingID, entry.valueTargetingIds)\n      || matchesConfigToken(getOptionLabel(option), entry.valueLabels);\n  }\n\n  function findArtworkMethodOption(store, methodKey) {\n    var holder = getArtworkMethodHolder(store);\n    if (!holder) return null;\n    var entry = getArtworkMethodOptionEntry(store, methodKey);\n    var options = holder.values || [];\n    if (entry) {\n      var mapped = options.find(function (option) {\n        return optionMatchesArtworkMethodEntry(option, entry);\n      });\n      if (mapped) return { holder: holder, option: mapped };\n    }\n    var canonical = normalizeArtworkMethodKey(methodKey);\n    if (canonical === 'editservice') {\n      var templateTrigger = options.find(function (option) {\n        return isOptionTemplateTriggerValue(store, holder, option);\n      });\n      if (templateTrigger) return { holder: holder, option: templateTrigger };\n    }\n    var fallbackLabels = getArtworkMethodFallbackLabels(canonical);\n    var fallback = options.find(function (option) {\n      var optionLabel = text(getOptionLabel(option)).toLowerCase();\n      var labelMatch = fallbackLabels.some(function (label) {\n        var normalizedLabel = text(label).toLowerCase();\n        return optionLabel === normalizedLabel || (normalizedLabel && optionLabel.indexOf(normalizedLabel) !== -1);\n      });\n      return labelMatch || matchesConfigToken(getOptionLabel(option), fallbackLabels) || matchesConfigToken(option.targetingID, getArtworkMethodAliases(canonical));\n    });\n    return fallback ? { holder: holder, option: fallback } : null;\n  }\n\n  function hasArtworkMethodOption(store, methodKey) {\n    return !!findArtworkMethodOption(store, methodKey);\n  }\n\n  function isArtworkMethodOptionEligible(store, option) {\n    return !!option && !option.outOfStock && !isOptionHiddenByRules(store, option) && !isOptionDisabledByRules(store, option);\n  }\n\n  function findFreeArtworkMethodOption(store, holder) {\n    var free = getVisibleOptions(store, holder).filter(function (option) {\n      var addon = buildAddonMetadataForOption(store, option, holder);\n      return isArtworkMethodOptionEligible(store, option) && (!addon || addon.addonBasePrice === 0);\n    });\n    var map = getArtworkMethodOptionMap(store);\n    return free.find(function (option) {\n      return !Object.keys(map).some(function (key) {\n        return optionMatchesArtworkMethodEntry(option, normalizeArtworkMethodOptionEntry(map[key]));\n      });\n    }) || free[0] || null;\n  }\n\n  // An ineligible mapping is different from a missing mapping: only the\n  // latter may fall back to an eligible uncharged value. Planning and writes\n  // share this resolution, including configurations with a hidden holder.\n  function resolveArtworkMethodOption(store, mode) {\n    var holder = getArtworkMethodHolder(store);\n    if (!holder) return { status: 'no-holder' };\n    var match = findArtworkMethodOption(store, mode);\n    if (match) return { status: isArtworkMethodOptionEligible(store, match.option) ? 'eligible' : 'ineligible', holder: holder, option: match.option };\n    // An option-template trigger that staff did not name as the artwork\n    // method group (for example a Style group whose value opens the template\n    // picker) stays the customer's own option: a method it does not map\n    // leaves it alone, never moves it to a free value, never resets a choice.\n    if (!getConfiguredArtworkMethodHolder(store)) return { status: 'no-holder' };\n    return { status: 'missing', holder: holder, option: findFreeArtworkMethodOption(store, holder) };\n  }\n\n  function artworkChoiceMatchesSelection(store) {\n    var mode = text(store.state.artworkMode);\n    var resolved = resolveArtworkMethodOption(store, mode);\n    if (resolved.status === 'no-holder') return true;\n    return !!mode && resolved.status !== 'ineligible' && !!resolved.option\n      && text(store.state.selections[getHolderId(resolved.holder)]) === text(resolved.option.hvId);\n  }\n\n\n\n\n\n  function selectedArtworkMethodOptionHasAddon(store, methodKey) {\n    var match = findArtworkMethodOption(store, methodKey);\n    if (!match || !match.holder || !match.option) return false;\n    if (text(store && store.state && store.state.selections && store.state.selections[getHolderId(match.holder)]) !== text(match.option.hvId)) return false;\n    return Math.abs(numberValue(match.option.addonPrice, 0)) > 0.01;\n  }\n\n  function shouldHideArtworkMethodHolder(store, holder) {\n    var config = getArtworkSectionConfig(store);\n    return !!(config.hideArtworkMethodHolder && isArtworkMethodHolder(store, holder));\n  }\n\n  function shouldHideOptionTemplateHolder(store, holder) {\n    var config = getOptionTemplateModalConfig(store);\n    return !!(\n      (config.enabled && config.hideTemplateHolder && isOptionTemplateHolder(store, holder)) ||\n      (config.enabled && config.hideTriggerHolder && isArtworkMethodHolder(store, holder)) ||\n      shouldHideArtworkMethodHolder(store, holder)\n    );\n  }\n\n  function shouldSuppressOptionTemplateSelection(store, holder) {\n    var config = getOptionTemplateModalConfig(store);\n    return !!(\n      config.enabled &&\n      config.suppressTemplateSelectionUnlessTriggerSelected &&\n      isOptionTemplateHolder(store, holder) &&\n      !getSelectedOptionTemplateTrigger(store)\n    );\n  }\n\n  function normalizeOptionTemplateEntry(store, holder, option) {\n    if (!holder || !option) return null;\n    var holderId = getHolderId(holder);\n    var optionId = text(option.hvId);\n    var label = getOptionLabel(option);\n    var previewUrl = getOptionPreviewUrlInContext(store, holder, option);\n    var badges = getOptionBadges(option);\n    var raw = {\n      template_name: label,\n      product: text(store && store.productData && store.productData.productName),\n      category: text(holder.displayName),\n      tags: badges,\n      groupLabel: text(option.groupLabel),\n      option_targeting_id: text(option.targetingID),\n      option_hvid: optionId\n    };\n    if (text(option.groupLabel)) raw.styles_themes = [text(option.groupLabel)];\n    return {\n      raw: raw,\n      optionTemplate: true,\n      optionHolderId: holderId,\n      optionHvid: optionId,\n      sourceDesignId: 'option-template:' + holderId + ':' + optionId,\n      sourceId: 'option-template:' + holderId + ':' + optionId,\n      designId: 'option-template:' + holderId + ':' + optionId,\n      selectionKey: 'option-template:' + holderId + ':' + optionId,\n      designNumber: '',\n      templateLookup: '',\n      templatePublicId: '',\n      title: label,\n      description: text(option.htmlDescription || option.tooltip || option.flavorText),\n      previewUrl: previewUrl,\n      previews: previewUrl ? [previewUrl] : [],\n      backers: [],\n      defaultBackerId: '',\n      orientation: '',\n      designOnlineAvailable: false,\n      editServiceAvailable: true,\n      legacyTemplate: false,\n      downloadAvailable: false,\n      editServiceCost: 0,\n      editServiceOriginalCost: 0,\n      editServiceIsFree: true,\n      pricingDisclaimer: '',\n      categoryTitle: text(holder.displayName),\n      previewCount: previewUrl ? 1 : 0,\n      createdAt: '',\n      popularity: 0\n    };\n  }\n\n  function getOptionTemplateModalTemplates(store) {\n    var holder = getOptionTemplateHolder(store);\n    if (!holder) return [];\n    return getVisibleOptions(store, holder).map(function (option) {\n      return normalizeOptionTemplateEntry(store, holder, option);\n    }).filter(Boolean);\n  }\n\n  function getSelectedOptionTemplateEntry(store) {\n    var holder = getOptionTemplateHolder(store);\n    if (!holder) return null;\n    return normalizeOptionTemplateEntry(store, holder, getSelectedOptionFromAllOptions(store, holder));\n  }\n\n  function chooseOptionTemplateEntry(store, template) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source || !source.optionTemplate) return;\n    var holderId = text(source.optionHolderId);\n    var hvid = text(source.optionHvid);\n    if (!holderId || !hvid) return;\n    var selections = Object.assign({}, store.state.selections);\n    selections[holderId] = hvid;\n    var trigger = getOptionTemplateTriggerHolder(store);\n    if (trigger) {\n      var triggerOption = (trigger.values || []).find(function (option) {\n        return isOptionTemplateTriggerValue(store, trigger, option);\n      }) || null;\n      if (triggerOption) selections[getHolderId(trigger)] = text(triggerOption.hvId);\n    }\n    var result = commitArtworkConfiguration(store, { selections: selections, template: source, artworkMode: 'editservice' }, { source: 'customer' });\n    if (result.status !== 'applied') { setMessage(store, result.reason, 'error'); return false; }\n    clearProjectState(store);\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n\n    store.templateModalActiveId = getTemplateSelectionKey(source);\n    closeTemplateModal(store, { skipRender: true });\n    recalculate(store);\n    render(store);\n    scheduleMobileArtworkCardsDetailScroll(store);\n    return true;\n  }\n\n  function openOptionTemplateModal(store) {\n    var selectedTemplate = getSelectedOptionTemplateEntry(store);\n    store.templateModalMode = OPTION_TEMPLATE_MODAL_MODE;\n    store.templateModalActiveId = selectedTemplate ? getTemplateSelectionKey(selectedTemplate) : '';\n    openTemplateModal(store, OPTION_TEMPLATE_MODAL_MODE);\n  }\n\n  function getSyntheticSelectedTargetingIds(store) {\n    var keys = Object.create(null);\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var projectId = text(store && store.state && store.state.project && store.state.project.projectId);\n    keys[projectId ? 'art-loaded-yes' : 'art-loaded-no'] = true;\n    if (mode === 'designonline' && projectId) {\n      keys['art-loaded-yes'] = true;\n      delete keys['art-loaded-no'];\n    }\n    if (mode === 'editservice') {\n      keys['art-buttons-edit-service'] = true;\n    } else if (mode === 'uploadcanva') {\n      keys['art-buttons-share-canva-link'] = true;\n    } else if (mode === 'customdesign') {\n      keys['art-buttons-custom-design'] = true;\n    } else if (mode === 'reorder') {\n      keys['art-buttons-reorder'] = true;\n    } else if (mode === 'recreate') {\n      keys['art-buttons-recreate-design'] = true;\n    } else if (mode === 'freesetup') {\n      keys['art-buttons-free-setup'] = true;\n    } else if (mode === 'uploadfiles') {\n      keys['art-buttons-upload-files-now'] = true;\n    } else if (mode === 'youhaveart') {\n      keys['art-buttons-you-have-my-art'] = true;\n      keys['art-buttons-upload-files-later'] = true;\n    }\n    return keys;\n  }\n\n  // SF-11 (2026-09-13): deterministic carry-over when a chosen value stops\n  // being available (a style switch hides or disables it). Every still-valid\n  // choice is kept; for a holder whose value is gone the nearest equivalent\n  // in the same family wins before the holder default / first option: another\n  // enabled hardware option before \"none\" when hardware was chosen, the\n  // nearest-area size before the first size. Everything is derived from the\n  // holder label family and the value labels \u2014 no product words. FIXED\n  // DIFFERENTLY from the operator's ask: the durable control (an Admin\n  // per-style default rule) is a named follow-up, not this heuristic.\n  function isDeclineOptionLabel(option) {\n    var label = text(option && (option.label || option.valueLabel)).toLowerCase();\n    return /(?:^|\\s)(?:no|none|without)(?:\\s|$)/.test(label);\n  }\n\n  function isHardwareFamilyHolder(holder) {\n    var label = text(holder && holder.displayName).toLowerCase();\n    return ['stake', 'stand', 'frame', 'hardware', 'mount', 'grommet'].some(function (family) {\n      return label.indexOf(family) !== -1;\n    });\n  }\n\n  function parseOptionAreaFromLabel(option) {\n    var label = text(option && (option.label || option.valueLabel));\n    var match = label.match(/(\\d+(?:\\.\\d+)?)\\s*(?:\"|\u201D|in\\b|inch(?:es)?)?\\s*[x\u00D7]\\s*(\\d+(?:\\.\\d+)?)/i);\n    if (!match) return NaN;\n    var area = Number(match[1]) * Number(match[2]);\n    return Number.isFinite(area) && area > 0 ? area : NaN;\n  }\n\n  function findCarryOverOption(store, holder, previouslySelected, options) {\n    if (!previouslySelected || !Array.isArray(options) || !options.length) return null;\n    if (isHardwareFamilyHolder(holder) && !isDeclineOptionLabel(previouslySelected)) {\n      var withHardware = options.filter(function (option) { return !isDeclineOptionLabel(option); });\n      if (!withHardware.length) return null;\n      return withHardware.find(function (option) { return option && option.defaultValue; }) || withHardware[0];\n    }\n    var previousArea = parseOptionAreaFromLabel(previouslySelected);\n    if (!Number.isFinite(previousArea)) return null;\n    var nearest = null;\n    var nearestDistance = Infinity;\n    options.forEach(function (option) {\n      var area = parseOptionAreaFromLabel(option);\n      if (!Number.isFinite(area)) return;\n      var distance = Math.abs(area - previousArea);\n      // Ties go to the larger size (a print never gets smaller by accident).\n      if (distance < nearestDistance || (distance === nearestDistance && nearest && area > parseOptionAreaFromLabel(nearest))) {\n        nearest = option;\n        nearestDistance = distance;\n      }\n    });\n    return nearest;\n  }\n\n  function ensureValidSelections(store) {\n    var adjustments = [];\n    var pass = 0;\n    // A carried-over choice can change what the rules hide or disable for a\n    // later holder (a size decides which hardware fits), so the pass repeats\n    // on fresh rule state until nothing moves (bounded).\n    while (pass < 3) {\n      var passAdjustments = ensureValidSelectionsPass(store);\n      adjustments = adjustments.concat(passAdjustments);\n      pass += 1;\n      if (!passAdjustments.length || typeof buildUiStateFromRules !== 'function' || !store || !store.uiState) break;\n      var keptChooserExpanded = store.uiState.artworkChooserExpanded;\n      var keptGuidedIntent = store.uiState.guidedArtworkIntent;\n      store.uiState = buildUiStateFromRules(store);\n      store.uiState.artworkChooserExpanded = keptChooserExpanded;\n      if (keptGuidedIntent === 'have' || keptGuidedIntent === 'help') store.uiState.guidedArtworkIntent = keptGuidedIntent;\n    }\n    return adjustments;\n  }\n\n  function ensureValidSelectionsPass(store) {\n    var adjustments = [];\n    (store && Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      var holderId = getHolderId(holder);\n      if (!holderId) return;\n      var options = getVisibleOptions(store, holder).filter(function (option) {\n        return !isOptionDisabledByRules(store, option) && !(option && option.outOfStock);\n      });\n      if (!options.length) {\n        options = getVisibleOptions(store, holder);\n      }\n      if (!options.length) return;\n      var selectedId = text(store.state.selections[holderId]);\n      var previouslySelected = (holder && Array.isArray(holder.values) ? holder.values : []).find(function (option) {\n        return text(option && option.hvId) === selectedId;\n      }) || null;\n      var stillValid = options.some(function (option) {\n        return text(option && option.hvId) === selectedId;\n      });\n      if (!stillValid) {\n        var equivalentOption = previouslySelected\n          ? findEquivalentVisibleOption(store, holder, previouslySelected, options)\n          : null;\n        var carryOverOption = equivalentOption || findCarryOverOption(store, holder, previouslySelected, options);\n        var nextSelected = carryOverOption || options.find(function (entry) { return entry && entry.defaultValue; }) || options[0];\n        if (nextSelected) {\n          writeArtworkSelection(store, holderId, text(nextSelected.hvId), 'reconcile');\n          if (!equivalentOption && selectedId && previouslySelected && text(previouslySelected.hvId) !== text(nextSelected.hvId)) {\n            adjustments.push({\n              artworkMethod: shouldHideArtworkMethodHolder(store, holder),\n              holderLabel: text(holder.displayName || holder.label || holder.name) || 'Option',\n              fromLabel: getOptionDisplayLabel(store, holder, previouslySelected) || 'the previous choice',\n              toLabel: getOptionDisplayLabel(store, holder, nextSelected) || 'the compatible choice',\n              cause: getOptionDisabledCause(store, previouslySelected)\n            });\n          }\n        }\n      }\n    });\n    return adjustments;\n  }\n\n  function buildCompatibilityAdjustmentNotice(adjustments) {\n    return (Array.isArray(adjustments) ? adjustments : []).map(function (adjustment) {\n      if (adjustment.artworkMethod) return '';\n      // A style-arrival rule reads \"<Holder> set to <new> for <Style>\"; every\n      // other adjustment keeps the compatibility wording.\n      if (text(adjustment.reasonText)) {\n        return adjustment.holderLabel + ' set to ' + adjustment.toLabel + ' ' + text(adjustment.reasonText) + '.';\n      }\n      var base = adjustment.holderLabel + ' changed from ' + adjustment.fromLabel + ' to ' + adjustment.toLabel;\n      return adjustment.cause\n        ? base + ' because ' + adjustment.cause + ' does not support ' + adjustment.fromLabel + '.'\n        : base + ' to keep this product configuration compatible.';\n    }).join(' ');\n  }\n\n  function getSelectedOptionTargetingIds(store) {\n    var keys = Object.create(null);\n    (store && Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      var option = getSelectedOptionFromAllOptions(store, holder);\n      var key = normalizeTargetingIdKey(option && option.targetingID);\n      if (key) keys[key] = true;\n    });\n    var syntheticKeys = getSyntheticSelectedTargetingIds(store);\n    Object.keys(syntheticKeys).forEach(function (key) {\n      if (key) keys[key] = !!syntheticKeys[key];\n    });\n    return keys;\n  }\n\n  function getSelectedOptionByHolderDisplayName(store, displayName) {\n    var normalized = text(displayName).toLowerCase();\n    if (!normalized) return null;\n    var holder = (store && Array.isArray(store.holders) ? store.holders : []).find(function (candidate) {\n      return text(candidate && candidate.displayName).toLowerCase() === normalized;\n    }) || null;\n    return holder ? getSelectedOptionFromAllOptions(store, holder) : null;\n  }\n\n  function getSelectedTargetingIdByHolderDisplayName(store, displayName) {\n    var option = getSelectedOptionByHolderDisplayName(store, displayName);\n    return normalizeTargetingIdKey(option && option.targetingID);\n  }\n\n  function hasSelectedTargetingIdByHolderDisplayName(store, displayName, targetingId) {\n    var expected = normalizeTargetingIdKey(targetingId);\n    if (!expected) return false;\n    if (getSelectedTargetingIdByHolderDisplayName(store, displayName) === expected) return true;\n    var holderLabel = text(displayName).toLowerCase();\n    return buildCurrentOptionSelections(store).some(function (selection) {\n      return text(selection && selection.holderLabel).toLowerCase() === holderLabel\n        && normalizeTargetingIdKey(selection && selection.targetingId) === expected;\n    });\n  }\n\n  function getProductCommerceBundleMetadata(store) {\n    var bundle = store && store.productCommerceRuntimeBundle && typeof store.productCommerceRuntimeBundle === 'object'\n      ? store.productCommerceRuntimeBundle\n      : null;\n    return bundle && bundle.metadata && typeof bundle.metadata === 'object' ? bundle.metadata : {};\n  }\n\n\n  // Pass-through direct cart (Editor Commerce Contract, Decision A): the API\n  // resolves per-product advancedMetadata.directToCart over the store-wide\n  // designerDefaults.directToCart default and compiles the result into the\n  // runtime bundle metadata. Unset means OFF (classic return-to-product).\n  function isProductCommerceDirectToCart(store) {\n    return getProductCommerceBundleMetadata(store).directToCart === true;\n  }\n\n  // BD-CATALOG-CONTRACT (0012 a): EDDM Full Service, Bulk Mail and the route\n  // launch follow the product's \"EDDM and bulk mailing\" setting\n  // (productPageConfig.mailing.enabled from the served config). A product\n  // handle or the Product Commerce eddmEligible flag never turns them on.\n  function isMailingProduct(store) {\n    var productData = store && store.productEditorConfigProductData && typeof store.productEditorConfigProductData === 'object'\n      ? store.productEditorConfigProductData\n      : null;\n    var pageConfig = plainObject(productData && productData.productPageConfig);\n    var mailing = plainObject(pageConfig && pageConfig.mailing);\n    return !!(mailing && mailing.enabled === true);\n  }\n\n  function isEddmEligibleSelectedSize(store) {\n    var sizeId = getSelectedTargetingIdByHolderDisplayName(store, 'Size');\n    return !!EDDM_ELIGIBLE_SIZE_TARGETING_IDS[sizeId];\n  }\n\n  function isEddmFullServiceActive(store) {\n    return isMailingProduct(store)\n      && isEddmEligibleSelectedSize(store)\n      && hasSelectedTargetingIdByHolderDisplayName(store, 'Service', EDDM_FULL_SERVICE_TARGETING_ID);\n  }\n\n  function isPostcardsBulkMailActive(store) {\n    return isMailingProduct(store)\n      && hasSelectedTargetingIdByHolderDisplayName(store, 'Service', EDDM_BULK_MAIL_TARGETING_ID);\n  }\n\n  function ensureEddmState(store) {\n    if (!store.state.eddm || typeof store.state.eddm !== 'object') {\n      store.state.eddm = buildDefaultEddmState();\n    }\n    return store.state.eddm;\n  }\n\n  function hasEddmRouteSelection(store) {\n    var eddm = ensureEddmState(store);\n    return !!(eddm.routesSelected && Number(eddm.totalAddresses || 0) > 0);\n  }\n\n  // EDDM-ROUTE-STEP (2026-10-02): a quantity that comes from mail routes\n  // (quantity mode eddmRoutes, which the selected option's mailing mode turns\n  // on) is not chosen until the shopper selects routes. Until then the guided\n  // Quantity step, the order summary, the purchase bar and the phone price\n  // line ask for routes, and no installment price shows, instead of\n  // presenting the default quantity, or a price for it, as chosen. Display\n  // only: pricing, the quote, the cart line and the Add to cart block\n  // (validateState) are unchanged.\n  function isEddmRouteQuantityPending(store) {\n    return getQuantityMode(store) === 'eddmRoutes' && !hasEddmRouteSelection(store);\n  }\n\n  function getEddmSelectedAddressCount(store) {\n    return Math.max(0, Number(ensureEddmState(store).totalAddresses || 0) || 0);\n  }\n\n  function getEddmOverlayQuantityRange(store, quantity) {\n    var options = collectQuantityOptionsForMode(store, 'eddmRoutes');\n    options = options.map(function (value) {\n      return normalizePositiveInteger(value, NaN);\n    }).filter(function (value) {\n      return Number.isFinite(value) && value > 0;\n    }).sort(function (a, b) {\n      return a - b;\n    });\n    if (!options.length) {\n      return {\n        label: '-',\n        listingsLeft: 0\n      };\n    }\n    var numericQuantity = Math.max(0, Math.round(numberValue(quantity, 0)));\n    var matchedIndex = 0;\n    options.forEach(function (start, index) {\n      if (numericQuantity >= start) matchedIndex = index;\n    });\n    var startQuantity = options[matchedIndex];\n    var nextQuantity = options[matchedIndex + 1];\n    var endQuantity = nextQuantity ? (nextQuantity - 1) : NaN;\n    return {\n      label: buildQuantityRangeLabel(startQuantity, Number.isFinite(endQuantity) ? endQuantity : NaN),\n      listingsLeft: numericQuantity > 0 && Number.isFinite(endQuantity)\n        ? Math.max(0, endQuantity - numericQuantity)\n        : 0\n    };\n  }\n\n  function getEddmOverlayPriceModel(store) {\n    var selectedQuantity = getEddmSelectedAddressCount(store);\n    if (selectedQuantity <= 0) {\n      return {\n        printAmount: 0,\n        discountAmount: 0,\n        postageAmount: 0,\n        totalAmount: 0\n      };\n    }\n    // FUNCTIONS-CURRENCY-AWARE: shown figures; postage is the amount of one thing.\n    var pricePresentation = shownPrice(getPricePresentation(store));\n    var postageAmount = presentmentFigure(getPostageSummaryTotal(store));\n    // SB-18: the print line is the crossed-out price when the page shows one\n    // (the shared whole-cent rule, so a one-cent saving counts), the discount\n    // is that line minus the sale price, and the total is the sale price plus\n    // postage: the saving is never taken off twice.\n    var saleTotal = roundMoney(numberValue(pricePresentation && pricePresentation.total, 0));\n    var compareTotal = numberValue(pricePresentation && pricePresentation.compareTotal, NaN);\n    var printAmount = hasShownComparePrice(compareTotal, saleTotal) ? roundMoney(compareTotal) : saleTotal;\n    return {\n      printAmount: printAmount,\n      discountAmount: roundMoney(printAmount - saleTotal),\n      postageAmount: postageAmount,\n      totalAmount: roundMoney(saleTotal + postageAmount)\n    };\n  }\n\n  function setEddmModalText(modal, key, value) {\n    if (!modal) return;\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-eddm-overlay-value=\"' + key + '\"]')).forEach(function (node) {\n      node.textContent = value;\n    });\n  }\n\n  function syncEddmModalPresentation(store) {\n    var modal = store && store.eddmModal ? store.eddmModal : null;\n    if (!modal || !modal.isConnected) return;\n    var eddm = ensureEddmState(store);\n    var selectedQuantity = getEddmSelectedAddressCount(store);\n    var range = getEddmOverlayQuantityRange(store, selectedQuantity);\n    var pricing = getEddmOverlayPriceModel(store);\n    setEddmModalText(modal, 'routes', String(eddm.selectedRouteCount || 0));\n    setEddmModalText(modal, 'businesses', String(eddm.businessAddresses || 0));\n    setEddmModalText(modal, 'residential', String(eddm.residentialAddresses || 0));\n    setEddmModalText(modal, 'totalAddresses', String(selectedQuantity || 0));\n    setEddmModalText(modal, 'totalSelected', String(selectedQuantity || 0));\n    setEddmModalText(modal, 'priceTier', range.label);\n    setEddmModalText(modal, 'listingsLeft', String(range.listingsLeft || 0));\n    setEddmModalText(modal, 'overlayProductPrice', formatShownMoney(pricing.printAmount));\n    setEddmModalText(modal, 'overlayDiscount', '-' + formatShownMoney(pricing.discountAmount));\n    setEddmModalText(modal, 'overlayPostage', formatShownMoney(pricing.postageAmount));\n    setEddmModalText(modal, 'overlayTotalPrice', formatShownMoney(pricing.totalAmount));\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-eddm-overlay-flag=\"residentialOnly\"]')).forEach(function (input) {\n      input.checked = !!eddm.residentialOnly;\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-eddm-overlay-flag=\"politicalMailer\"]')).forEach(function (input) {\n      input.checked = !!eddm.politicalMailer;\n    });\n  }\n\n  function setEddmWelcomeVisible(store, visible) {\n    var modal = store && store.eddmModal ? store.eddmModal : null;\n    var welcome = modal ? modal.querySelector('[data-bg-eddm-welcome]') : null;\n    if (!welcome) return;\n    welcome.hidden = !visible;\n    welcome.setAttribute('aria-hidden', visible ? 'false' : 'true');\n  }\n\n  function dismissEddmWelcome(store) {\n    if (store) store.eddmWelcomeDismissed = true;\n    setEddmWelcomeVisible(store, false);\n  }\n\n  function updateEddmFlagState(store, flag, checked) {\n    var current = ensureEddmState(store);\n    if (flag === 'residentialOnly') {\n      current.residentialOnly = !!checked;\n    } else if (flag === 'politicalMailer') {\n      current.politicalMailer = !!checked;\n    } else {\n      return;\n    }\n    if (store.eddmSessionMapEventData) {\n      applyEddmMapEventData(store, store.eddmSessionMapEventData, {\n        finalize: current.routesSelected,\n        residentialOnly: current.residentialOnly,\n        politicalMailer: current.politicalMailer\n      });\n    }\n    refreshEddmProductSurface(store);\n  }\n\n  function clearInactiveEddmTransientState(store) {\n    var eddm = store && store.state ? store.state.eddm : null;\n    if (!eddm || typeof eddm !== 'object') return;\n    eddm.targetOrigin = '';\n    eddm.launchStatus = '';\n    eddm.launchError = '';\n  }\n\n  function syncEddmStateForSelections(store) {\n    if (!isMailingProduct(store)) return;\n    if (!isEddmFullServiceActive(store)) {\n      clearInactiveEddmTransientState(store);\n      return;\n    }\n    var eddm = ensureEddmState(store);\n    var minimumDate = getEddmMinimumTargetDate();\n    if (!eddm.targetInMailboxDate || !isDateOnOrAfter(eddm.targetInMailboxDate, minimumDate)) {\n      if (eddm.targetInMailboxDate) store.eddmDateMoved = { from: eddm.targetInMailboxDate, to: minimumDate }; // ALLOWED-BLOCKS-AT-MUTATION\n      eddm.targetInMailboxDate = minimumDate;\n    }\n  }\n\n  function formatDateInputValue(date) {\n    return [\n      date.getFullYear(),\n      String(date.getMonth() + 1).padStart(2, '0'),\n      String(date.getDate()).padStart(2, '0')\n    ].join('-');\n  }\n\n  function observedHolidayKey(date) {\n    return formatDateInputValue(date);\n  }\n\n  function nthWeekdayOfMonth(year, monthIndex, weekday, occurrence) {\n    var date = new Date(year, monthIndex, 1);\n    var offset = (weekday - date.getDay() + 7) % 7;\n    date.setDate(1 + offset + ((occurrence - 1) * 7));\n    return date;\n  }\n\n  function lastWeekdayOfMonth(year, monthIndex, weekday) {\n    var date = new Date(year, monthIndex + 1, 0);\n    var offset = (date.getDay() - weekday + 7) % 7;\n    date.setDate(date.getDate() - offset);\n    return date;\n  }\n\n  function addObservedHoliday(holidays, year, monthIndex, day) {\n    var date = new Date(year, monthIndex, day);\n    var observed = new Date(date.getTime());\n    if (date.getDay() === 0) {\n      observed.setDate(date.getDate() + 1);\n    } else if (date.getDay() === 6) {\n      observed.setDate(date.getDate() - 1);\n    }\n    holidays[observedHolidayKey(observed)] = true;\n  }\n\n  function buildPostalHolidayMap(year) {\n    var holidays = Object.create(null);\n    addObservedHoliday(holidays, year, 0, 1);\n    holidays[observedHolidayKey(nthWeekdayOfMonth(year, 0, 1, 3))] = true; // MLK Day\n    holidays[observedHolidayKey(nthWeekdayOfMonth(year, 1, 1, 3))] = true; // Presidents Day\n    holidays[observedHolidayKey(lastWeekdayOfMonth(year, 4, 1))] = true; // Memorial Day\n    addObservedHoliday(holidays, year, 5, 19);\n    addObservedHoliday(holidays, year, 6, 4);\n    holidays[observedHolidayKey(nthWeekdayOfMonth(year, 8, 1, 1))] = true; // Labor Day\n    holidays[observedHolidayKey(nthWeekdayOfMonth(year, 9, 1, 2))] = true; // Columbus Day\n    addObservedHoliday(holidays, year, 10, 11);\n    holidays[observedHolidayKey(nthWeekdayOfMonth(year, 10, 4, 4))] = true; // Thanksgiving\n    addObservedHoliday(holidays, year, 11, 25);\n    return holidays;\n  }\n\n  function isEddmBusinessDay(date) {\n    var day = date.getDay();\n    if (day === 0 || day === 6) return false;\n    var holidays = buildPostalHolidayMap(date.getFullYear());\n    return !holidays[formatDateInputValue(date)];\n  }\n\n  function getEddmMinimumTargetDate(baseDate) {\n    var date = baseDate ? new Date(baseDate.getTime()) : new Date();\n    var businessDays = 0;\n    while (businessDays < 10) {\n      date.setDate(date.getDate() + 1);\n      if (isEddmBusinessDay(date)) businessDays += 1;\n    }\n    return formatDateInputValue(date);\n  }\n\n  function isDateOnOrAfter(value, minimum) {\n    var cleanValue = text(value);\n    var cleanMinimum = text(minimum);\n    return !!(cleanValue && cleanMinimum && cleanValue >= cleanMinimum);\n  }\n\n  function evaluateRuleCondition(store, condition, selectedTargetingIds) {\n    var type = text(condition && condition.type).toLowerCase();\n    var negate = !!(condition && condition.negate);\n    var result = false;\n    if (type === 'alwaystrue') {\n      result = true;\n    } else if (type === 'product') {\n      result = getLegacyProductSourceHandle(store) === text(condition && condition.value);\n    } else if (type === 'radio' || type === 'select') {\n      var targetingIdKey = normalizeTargetingIdKey(condition && condition.targetingid);\n      if (targetingIdKey) {\n        result = !!selectedTargetingIds[targetingIdKey];\n      } else {\n        var matchValue = text(condition && condition.value).toLowerCase();\n        if (matchValue) {\n          result = (store && Array.isArray(store.holders) ? store.holders : []).some(function (holder) {\n            var option = getSelectedOptionFromAllOptions(store, holder);\n            return text(option && (option.label || option.valueLabel || option.value)).toLowerCase() === matchValue;\n          });\n        }\n      }\n    }\n    return negate ? !result : result;\n  }\n\n  function evaluateRuleNode(store, rule, selectedTargetingIds) {\n    if (!rule || typeof rule !== 'object') return false;\n    var operator = text(rule.operator).toUpperCase() === 'OR' ? 'OR' : 'AND';\n    var checks = [];\n    if (Array.isArray(rule.blocks) && rule.blocks.length) {\n      checks = rule.blocks.map(function (child) {\n        return evaluateRuleNode(store, child, selectedTargetingIds);\n      });\n    } else if (Array.isArray(rule.conditions) && rule.conditions.length) {\n      checks = rule.conditions.map(function (condition) {\n        return evaluateRuleCondition(store, condition, selectedTargetingIds);\n      });\n    }\n    if (!checks.length) return false;\n    return operator === 'OR'\n      ? checks.some(Boolean)\n      : checks.every(Boolean);\n  }\n\n  function buildSelectedOptionRuleCause(store, holder, option) {\n    if (!holder || !option) return '';\n    var holderLabel = text(holder.displayName || holder.label || holder.name);\n    var optionLabel = getOptionDisplayLabel(store, holder, option);\n    return holderLabel && optionLabel ? holderLabel + ': ' + optionLabel : '';\n  }\n\n  function findSelectedOptionRuleCauseByTargetingId(store, targetingId) {\n    var expected = normalizeTargetingIdKey(targetingId);\n    if (!expected) return '';\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    for (var index = 0; index < holders.length; index += 1) {\n      var holder = holders[index];\n      var option = getSelectedOptionFromAllOptions(store, holder);\n      if (normalizeTargetingIdKey(option && option.targetingID) === expected) {\n        return buildSelectedOptionRuleCause(store, holder, option);\n      }\n    }\n    return '';\n  }\n\n  function collectLegacyRuleConditions(rule) {\n    if (!rule || typeof rule !== 'object') return [];\n    if (Array.isArray(rule.blocks) && rule.blocks.length) {\n      return rule.blocks.reduce(function (conditions, child) {\n        return conditions.concat(collectLegacyRuleConditions(child));\n      }, []);\n    }\n    return Array.isArray(rule.conditions) ? rule.conditions : [];\n  }\n\n  function getLegacyRuleDisableCause(store, rule, selectedTargetingIds) {\n    var causes = collectLegacyRuleConditions(rule).filter(function (condition) {\n      var type = text(condition && condition.type).toLowerCase();\n      return (type === 'radio' || type === 'select')\n        && !condition.negate\n        && evaluateRuleCondition(store, condition, selectedTargetingIds);\n    }).map(function (condition) {\n      return findSelectedOptionRuleCauseByTargetingId(store, condition && condition.targetingid);\n    }).filter(Boolean);\n    return causes.filter(function (cause, index) {\n      return causes.indexOf(cause) === index;\n    }).slice(0, 2).join(' and ');\n  }\n\n  function setDisabledReason(nextUiState, targetingId, cause, disabled) {\n    var key = normalizeTargetingIdKey(targetingId);\n    if (!key || !nextUiState || !nextUiState.disabledReasons) return;\n    if (disabled && cause) {\n      nextUiState.disabledReasons[key] = cause;\n    } else {\n      delete nextUiState.disabledReasons[key];\n    }\n  }\n\n  function applyRuleActionToState(store, nextUiState, action, rule, isMatched, selectedTargetingIds) {\n    var type = text(action && action.type).toLowerCase();\n    var targetingIdKey = normalizeTargetingIdKey(action && action.targetingid);\n    var selectorKey = normalizeRuleSelectorKey(action && action.selector);\n    if (targetingIdKey) {\n      if (type === 'show') {\n        delete nextUiState.hiddenTargetingIds[targetingIdKey];\n      } else if (type === 'hide') {\n        nextUiState.hiddenTargetingIds[targetingIdKey] = true;\n      } else if (type === 'disable') {\n        nextUiState.disabledTargetingIds[targetingIdKey] = true;\n        setDisabledReason(nextUiState, targetingIdKey, getLegacyRuleDisableCause(store, rule, selectedTargetingIds), true);\n      } else if (type === 'enable') {\n        delete nextUiState.disabledTargetingIds[targetingIdKey];\n        setDisabledReason(nextUiState, targetingIdKey, '', false);\n      }\n      return;\n    }\n    if (selectorKey && (type === 'show' || type === 'hide')) {\n      nextUiState.surfaceVisibility[selectorKey] = type === 'show';\n    }\n    if (selectorKey && (type === 'disable' || type === 'enable')) {\n      nextUiState.surfaceDisabled[selectorKey] = type === 'disable';\n    }\n    var uiFlag = text(action && action.uiFlag);\n    var uiBucket = text(action && action.uiBucket) || 'rootFlags';\n    if (uiFlag === 'descriptionPane' || uiFlag === 'artworkDescriptionPane') {\n      uiFlag = '';\n    }\n    if (type === 'addclass' || type === 'removeclass') {\n      if (selectorKey) {\n        var classKey = buildRuleSurfaceClassKey(selectorKey, action && action.className);\n        if (classKey) {\n          nextUiState.surfaceClasses[classKey] = type === 'addclass';\n        }\n      }\n      if (uiFlag && nextUiState[uiBucket] && typeof nextUiState[uiBucket] === 'object') {\n        nextUiState[uiBucket][uiFlag] = type === 'addclass';\n      }\n    }\n    if (selectorKey && type === 'addattribute') {\n      var attributeKey = buildRuleSurfaceAttributeKey(selectorKey, action && action.attributeName);\n      if (attributeKey) {\n        nextUiState.surfaceAttributes[attributeKey] = {\n          selector: selectorKey,\n          name: text(action && action.attributeName),\n          value: action && action.attributeValue != null ? String(action.attributeValue) : '',\n          onlyOnce: !!(action && action.onlyOnce)\n        };\n      }\n    }\n  }\n\n  function getProductCommerceRuntimeRules(store) {\n    var bundle = store && store.productCommerceRuntimeBundle && typeof store.productCommerceRuntimeBundle === 'object'\n      ? store.productCommerceRuntimeBundle\n      : {};\n    return Array.isArray(bundle.rules) ? bundle.rules : [];\n  }\n\n  function findProductCommerceRuleHolder(store, holderId) {\n    var cleanId = text(holderId);\n    if (!cleanId) return null;\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    return holders.find(function (holder) {\n      return holderMatchesId(holder, cleanId);\n    }) || null;\n  }\n\n  function productCommerceValueMatches(value, matcher) {\n    var cleanMatcher = text(matcher);\n    if (!value || !cleanMatcher) return false;\n    return [\n      value.hvId,\n      value.id,\n      value.valueId,\n      value.targetingID,\n      value.targetingId,\n      value.friendlySku,\n      value.numericSku,\n      value.productCommerceNumericSku,\n      value.pricingSkuSegment,\n      value.label,\n      value.valueLabel,\n      value.value\n    ].some(function (entry) {\n      return text(entry) === cleanMatcher;\n    });\n  }\n\n  function findProductCommerceRuleValue(holder, valueId) {\n    var cleanValueId = text(valueId);\n    if (!cleanValueId) return null;\n    var values = holder && Array.isArray(holder.values) ? holder.values : [];\n    return values.find(function (value) {\n      return productCommerceValueMatches(value, cleanValueId);\n    }) || null;\n  }\n\n  function getProductCommerceHolderRuleTargetKeys(holder) {\n    var source = holder && typeof holder === 'object' ? holder : {};\n    var keys = [\n      getHolderId(source),\n      source.id,\n      source.holderId,\n      source.targetingID,\n      source.targetingId,\n      source.htmlID\n    ].map(normalizeTargetingIdKey).filter(Boolean);\n    return keys.filter(function (key, index) {\n      return keys.indexOf(key) === index;\n    });\n  }\n\n  function setProductCommerceUiStateKeys(nextUiState, keys, bucket, enabled) {\n    var targetBucket = nextUiState && nextUiState[bucket] && typeof nextUiState[bucket] === 'object'\n      ? nextUiState[bucket]\n      : null;\n    if (!targetBucket) return;\n    keys.forEach(function (key) {\n      var normalizedKey = normalizeTargetingIdKey(key);\n      if (!normalizedKey) return;\n      if (enabled) {\n        targetBucket[normalizedKey] = true;\n      } else {\n        delete targetBucket[normalizedKey];\n      }\n    });\n  }\n\n  function getProductCommerceActionMessage(action, fallback) {\n    var value = action && action.value;\n    if (value && typeof value === 'object') {\n      return text(value.message || value.reason || value.label) || fallback;\n    }\n    return text(value) || text(action && action.message) || fallback;\n  }\n\n  function addProductCommerceCheckoutBlocker(nextUiState, action) {\n    if (!nextUiState) return;\n    var blockers = Array.isArray(nextUiState.checkoutBlockers) ? nextUiState.checkoutBlockers : [];\n    blockers.push({\n      message: getProductCommerceActionMessage(\n        action,\n        'This product configuration needs review before checkout.'\n      )\n    });\n    nextUiState.checkoutBlockers = blockers;\n  }\n\n  function isHolderRequiredByProductCommerceRules(store, holder) {\n    var requiredTargetingIds = store && store.uiState && store.uiState.requiredTargetingIds;\n    if (!requiredTargetingIds || !holder) return false;\n    return getProductCommerceHolderRuleTargetKeys(holder).some(function (key) {\n      return !!requiredTargetingIds[normalizeTargetingIdKey(key)];\n    });\n  }\n\n  function getProductCommerceCheckoutBlocker(store) {\n    var blockers = store && store.uiState && Array.isArray(store.uiState.checkoutBlockers)\n      ? store.uiState.checkoutBlockers\n      : [];\n    for (var index = 0; index < blockers.length; index += 1) {\n      var message = text(blockers[index] && blockers[index].message);\n      if (message) return message;\n    }\n    return '';\n  }\n\n  function validateProductCommerceRequiredHolders(store) {\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    for (var index = 0; index < holders.length; index += 1) {\n      var holder = holders[index];\n      if (isHolderUnavailableByRules(store, holder)) continue;\n      if (shouldHideOptionTemplateHolder(store, holder)) continue;\n      var semantics = getHolderUiConfig(holder);\n      if (!semantics.isRequired && !isHolderRequiredByProductCommerceRules(store, holder)) continue;\n      var selected = getSelectedOption(store, holder);\n      if (selected) continue;\n      var label = text(holder && (holder.displayName || holder.label || holder.name)) || 'the required option';\n      return {\n        valid: false,\n        reason: 'Choose ' + label + ' before adding this item.',\n        code: 'missing-required-option'\n      };\n    }\n    return { valid: true, reason: '' };\n  }\n\n  function compareProductCommerceNumbers(left, operator, right) {\n    var leftNumber = numberValue(left, NaN);\n    var rightNumber = numberValue(right, NaN);\n    if (!Number.isFinite(leftNumber) || !Number.isFinite(rightNumber)) return false;\n    var cleanOperator = text(operator).toLowerCase();\n    if (cleanOperator === 'lt') return leftNumber < rightNumber;\n    if (cleanOperator === 'lte') return leftNumber <= rightNumber;\n    if (cleanOperator === 'gt') return leftNumber > rightNumber;\n    if (cleanOperator === 'gte') return leftNumber >= rightNumber;\n    if (cleanOperator === 'is_not') return leftNumber !== rightNumber;\n    return leftNumber === rightNumber;\n  }\n\n  function getProductCommerceConditionQuantity(store, condition) {\n    var type = text(condition && condition.type).toLowerCase();\n    if (type === 'editor_page_count') {\n      return numberValue(store && store.state && store.state.project && store.state.project.numPages, 0);\n    }\n    return numberValue(\n      store && store.state && (\n        store.state.quantity\n        || store.state.typedQuantity\n        || store.state.paidPrintQuantity\n      ),\n      NaN\n    );\n  }\n\n  function getProductCommerceConditionValues(condition) {\n    return condition && Array.isArray(condition.values) ? condition.values : [];\n  }\n\n  function evaluateProductCommerceCondition(store, condition) {\n    var type = text(condition && condition.type).toLowerCase();\n    var operator = text(condition && condition.operator).toLowerCase() || 'is';\n    if (type === 'always') return true;\n    if (type === 'holder_value') {\n      var holder = findProductCommerceRuleHolder(store, condition && condition.holderId);\n      if (!holder) return false;\n      var selected = getSelectedOptionFromAllOptions(store, holder);\n      if (operator === 'in' || operator === 'not_in') {\n        var anyValueMatch = getProductCommerceConditionValues(condition).some(function (entry) {\n          return productCommerceValueMatches(selected, text(entry));\n        });\n        return operator === 'not_in' ? !anyValueMatch : anyValueMatch;\n      }\n      var matcher = text(condition && condition.valueId) || text(condition && condition.value);\n      var matched = productCommerceValueMatches(selected, matcher);\n      return operator === 'is_not' ? !matched : matched;\n    }\n    if (type === 'quantity' || type === 'editor_page_count') {\n      var quantity = getProductCommerceConditionQuantity(store, condition);\n      if (operator === 'in' || operator === 'not_in') {\n        var anyNumberMatch = getProductCommerceConditionValues(condition).some(function (entry) {\n          return compareProductCommerceNumbers(quantity, 'is', entry);\n        });\n        return operator === 'not_in' ? !anyNumberMatch : anyNumberMatch;\n      }\n      return compareProductCommerceNumbers(quantity, operator, condition && condition.value);\n    }\n    return false;\n  }\n\n  function evaluateProductCommerceConditionList(store, conditions, operator) {\n    if (!conditions.length) return false;\n    var checks = conditions.map(function (condition) {\n      return evaluateProductCommerceCondition(store, condition);\n    });\n    return operator === 'or' ? checks.some(Boolean) : checks.every(Boolean);\n  }\n\n  function evaluateProductCommerceRule(store, rule) {\n    if (!rule || typeof rule !== 'object') return false;\n    var ruleOperator = text(rule.operator).toLowerCase();\n    var groups = Array.isArray(rule.conditionGroups) ? rule.conditionGroups : [];\n    if (groups.length) {\n      var groupChecks = groups.map(function (group) {\n        return evaluateProductCommerceConditionList(\n          store,\n          group && Array.isArray(group.conditions) ? group.conditions : [],\n          text(group && group.operator).toLowerCase()\n        );\n      });\n      return ruleOperator === 'or' ? groupChecks.some(Boolean) : groupChecks.every(Boolean);\n    }\n    return evaluateProductCommerceConditionList(\n      store,\n      Array.isArray(rule.conditions) ? rule.conditions : [],\n      ruleOperator\n    );\n  }\n\n  function collectProductCommerceRuleConditions(rule) {\n    var conditions = Array.isArray(rule && rule.conditions) ? rule.conditions.slice() : [];\n    (Array.isArray(rule && rule.conditionGroups) ? rule.conditionGroups : []).forEach(function (group) {\n      conditions = conditions.concat(group && Array.isArray(group.conditions) ? group.conditions : []);\n    });\n    return conditions;\n  }\n\n  function getProductCommerceRuleDisableCause(store, rule, targetHolderId) {\n    var targetId = text(targetHolderId);\n    var causes = collectProductCommerceRuleConditions(rule).filter(function (condition) {\n      return text(condition && condition.type).toLowerCase() === 'holder_value'\n        && text(condition && condition.holderId) !== targetId\n        && evaluateProductCommerceCondition(store, condition);\n    }).map(function (condition) {\n      var holder = findProductCommerceRuleHolder(store, condition && condition.holderId);\n      return buildSelectedOptionRuleCause(store, holder, holder ? getSelectedOptionFromAllOptions(store, holder) : null);\n    }).filter(Boolean);\n    return causes.filter(function (cause, index) {\n      return causes.indexOf(cause) === index;\n    }).slice(0, 2).join(' and ');\n  }\n\n  function setProductCommerceDisabledReasons(nextUiState, keys, cause, disabled) {\n    (Array.isArray(keys) ? keys : []).forEach(function (key) {\n      setDisabledReason(nextUiState, key, cause, disabled);\n    });\n  }\n\n  function applyProductCommerceRuleActionToState(store, nextUiState, action, rule) {\n    var type = text(action && action.type).toLowerCase();\n    if (type === 'block_checkout') {\n      addProductCommerceCheckoutBlocker(nextUiState, action);\n      return;\n    }\n    if (type === 'set_quantity_model') {\n      applyProductCommerceQuantityModelActionToState(nextUiState, action);\n      return;\n    }\n    if (type === 'legacy_ui_class') {\n      var legacyClassConfig = action && action.value && typeof action.value === 'object' && !Array.isArray(action.value)\n        ? action.value\n        : {};\n      var legacyClassSelector = text(legacyClassConfig.selector || (action && action.holderId));\n      var legacyClassName = text(legacyClassConfig.className || (typeof action.value === 'string' ? action.value : ''));\n      var legacyClassKey = buildRuleSurfaceClassKey(legacyClassSelector, legacyClassName);\n      if (legacyClassKey) {\n        nextUiState.surfaceClasses[legacyClassKey] = legacyClassConfig.add !== false;\n      }\n      return;\n    }\n    if (type === 'set_sides_policy') return;\n    var holder = findProductCommerceRuleHolder(store, action && action.holderId);\n    if (!holder) return;\n    var holderKeys = getProductCommerceHolderRuleTargetKeys(holder);\n    var disabledCause = getProductCommerceRuleDisableCause(store, rule, action && action.holderId);\n    if (type === 'show_holder') {\n      setProductCommerceUiStateKeys(nextUiState, holderKeys, 'hiddenTargetingIds', false);\n    } else if (type === 'hide_holder') {\n      setProductCommerceUiStateKeys(nextUiState, holderKeys, 'hiddenTargetingIds', true);\n    } else if (type === 'enable_holder') {\n      setProductCommerceUiStateKeys(nextUiState, holderKeys, 'disabledTargetingIds', false);\n      setProductCommerceDisabledReasons(nextUiState, holderKeys, '', false);\n    } else if (type === 'disable_holder') {\n      setProductCommerceUiStateKeys(nextUiState, holderKeys, 'disabledTargetingIds', true);\n      setProductCommerceDisabledReasons(nextUiState, holderKeys, disabledCause, true);\n    } else if (type === 'require_holder') {\n      setProductCommerceUiStateKeys(nextUiState, holderKeys, 'requiredTargetingIds', true);\n    } else if (type === 'show_value' || type === 'hide_value' || type === 'enable_value' || type === 'disable_value') {\n      var value = findProductCommerceRuleValue(holder, action && action.valueId);\n      if (!value) return;\n      var valueKeys = getOptionRuleTargetKeys(value);\n      if (type === 'show_value') {\n        setProductCommerceUiStateKeys(nextUiState, valueKeys, 'hiddenTargetingIds', false);\n      } else if (type === 'hide_value') {\n        setProductCommerceUiStateKeys(nextUiState, valueKeys, 'hiddenTargetingIds', true);\n      } else if (type === 'enable_value') {\n        setProductCommerceUiStateKeys(nextUiState, valueKeys, 'disabledTargetingIds', false);\n        setProductCommerceDisabledReasons(nextUiState, valueKeys, '', false);\n      } else if (type === 'disable_value') {\n        setProductCommerceUiStateKeys(nextUiState, valueKeys, 'disabledTargetingIds', true);\n        setProductCommerceDisabledReasons(nextUiState, valueKeys, disabledCause, true);\n      }\n    }\n  }\n\n  function normalizeProductCommerceRuleQuantityFieldType(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s-]+/g, '_');\n    if (normalized === 'dropdown' || normalized === 'slider' || normalized === 'numeric_input' || normalized === 'generated_table' || normalized === 'pricing_table' || normalized === 'range_table' || normalized === 'buttons' || normalized === 'size_quantity_inputs' || normalized === 'hidden' || normalized === 'compact_tile') {\n      return normalized;\n    }\n    return '';\n  }\n\n  function applyProductCommerceQuantityModelActionToState(nextUiState, action) {\n    if (!nextUiState) return;\n    var source = action && action.value;\n    var value = source && typeof source === 'object' && !Array.isArray(source)\n      ? source\n      : { fieldType: source };\n    var nextModel = Object.assign({}, nextUiState.quantityModel || {});\n    var fieldType = normalizeProductCommerceRuleQuantityFieldType(value.fieldType || value.quantityFieldType || value.mode);\n    if (fieldType) nextModel.fieldType = fieldType;\n    ['rangeBased', 'calculateOnTypedQty', 'roundUp'].forEach(function (propertyName) {\n      if (Object.prototype.hasOwnProperty.call(value, propertyName)) {\n        nextModel[propertyName] = !!value[propertyName];\n      }\n    });\n    nextUiState.quantityModel = nextModel;\n  }\n\n  function applyProductCommerceRulesToState(store, nextUiState) {\n    // Admin rule-list order is priority: apply bottom-up so a higher rule's\n    // actions land last and win whenever two rules write the same UI key.\n    getProductCommerceRuntimeRules(store).slice().reverse().forEach(function (rule) {\n      var isMatched = evaluateProductCommerceRule(store, rule);\n      (Array.isArray(rule && rule.actions) ? rule.actions : []).forEach(function (action) {\n        var branch = text(action && action.branch).toLowerCase() || 'true';\n        if ((branch === 'false') === !!isMatched) return;\n        applyProductCommerceRuleActionToState(store, nextUiState, action, rule);\n      });\n    });\n  }\n\n  function isLegacyRuleActionOnCommerceOwnedSurface(store, action) {\n    // Admin authority (operator ruling 2026-08-27): once a product's commerce\n    // bundle applied, its option holders and choices are authored in the\n    // Admin, so imported page-logic may not show/hide/disable them \u2014 the\n    // Admin's own rules are the only rules that act on options there. Global\n    // page chrome (artwork methods, disclaimers, root style flags) has no\n    // Admin authoring surface yet, so those imported writes keep filling the\n    // gap.\n    if (!(store && store.config && store.config.productCommerceRuntime)) return false;\n    if (normalizeTargetingIdKey(action && action.targetingid)) return true;\n    var selectorKey = normalizeRuleSelectorKey(action && action.selector);\n    if (!selectorKey) return false;\n    var holders = Array.isArray(store.holders) ? store.holders : [];\n    return holders.some(function (holder) {\n      return getHolderRuleSelectorKeys(holder).indexOf(selectorKey) !== -1;\n    });\n  }\n\n  function buildUiStateFromRules(store) {\n    var nextUiState = createEmptyUiState(store);\n    var selectedTargetingIds = getSelectedOptionTargetingIds(store);\n    (store && Array.isArray(store.rules) ? store.rules : []).forEach(function (rule) {\n      if (!isRuleRelevantForHandle(rule, getLegacyProductSourceHandle(store))) return;\n      var isMatched = evaluateRuleNode(store, rule, selectedTargetingIds);\n      var actions = isMatched\n        ? (Array.isArray(rule.trueActions) ? rule.trueActions : [])\n        : (Array.isArray(rule.falseActions) ? rule.falseActions : []);\n      actions.forEach(function (action) {\n        if (isLegacyRuleActionOnCommerceOwnedSurface(store, action)) return;\n        applyRuleActionToState(store, nextUiState, action, rule, isMatched, selectedTargetingIds);\n      });\n    });\n    applyProductCommerceRulesToState(store, nextUiState);\n    return nextUiState;\n  }\n\n  function syncRootUiState(store) {\n    if (!store || !store.root) return;\n    var flags = store.uiState && store.uiState.rootFlags ? store.uiState.rootFlags : {};\n    var classes = {\n      'bg-designer-storefront--description-pane': !!flags.descriptionPane,\n      'bg-designer-storefront--tight-options': !!flags.tightenOptions,\n      'bg-designer-storefront--artwork-description-pane': !!flags.artworkDescriptionPane,\n      'bg-designer-storefront--new-style': getUiSurfaceClassFlag(store, '.product-custom-option', 'newStyle', false),\n      'bg-designer-storefront--art-bottom-tight': getUiSurfaceClassFlag(store, '.htmlBottomSection', 'artBlockMarginBottomTighten', false),\n      'bg-designer-storefront--upload-bottom-tight': getUiSurfaceClassFlag(store, '.fileUpload1', 'uploadBlockMarginBottomTighten', false) ||\n        getUiSurfaceClassFlag(store, '.fileUpload2', 'uploadBlockMarginBottomTighten', false),\n      'bg-designer-storefront--static-options-hidden': getUiSurfaceClassFlag(store, '#htmlStaticOptionsSection', 'hide', false)\n    };\n    Object.keys(classes).forEach(function (name) {\n      // Read the actual state so another owner resetting the root, or a\n      // replacement root, cannot leave cached flags ahead of the DOM.\n      if (store.root.classList.contains(name) !== !!classes[name]) store.root.classList.toggle(name, !!classes[name]);\n    });\n  }\n\n  // BD-NO-ROW-ZERO-PRICE: the root names the no-row state so the quantity\n  // control shows no money for that choice (bg-designer-storefront.css); the\n  // class is written only when the state changes.\n  function syncNoPriceRowRootClass(store) {\n    if (!store || !store.root || !store.root.classList) return;\n    var noPriceRow = showsNoPriceRow(store);\n    if (store.root.classList.contains('bg-designer-storefront--no-price-row') !== noPriceRow) {\n      store.root.classList.toggle('bg-designer-storefront--no-price-row', noPriceRow);\n    }\n  }\n\n  function getHolderRuleSelectorKeys(holder) {\n    var keys = [];\n    var htmlId = text(holder && holder.htmlID).toLowerCase();\n    var targetingId = normalizeTargetingIdKey(holder && holder.targetingID);\n    if (htmlId) {\n      keys.push('#' + htmlId);\n      keys.push('.optionholder#' + htmlId);\n    }\n    if (targetingId) {\n      keys.push('#' + targetingId);\n    }\n    (Array.isArray(holder && holder.classes) ? holder.classes : []).map(function (entry) {\n      return normalizeRuleSelectorKey('.' + text(entry));\n    }).filter(Boolean).forEach(function (entry) {\n      if (keys.indexOf(entry) === -1) keys.push(entry);\n    });\n    return keys;\n  }\n\n  function isHolderHiddenByRuleSurface(store, holder) {\n    var visibility = store && store.uiState && store.uiState.surfaceVisibility;\n    if (!visibility) return false;\n    var keys = getHolderRuleSelectorKeys(holder);\n    var matched = false;\n    var isVisible = true;\n    keys.forEach(function (entry) {\n      if (!entry || !Object.prototype.hasOwnProperty.call(visibility, entry)) return;\n      matched = true;\n      isVisible = !!visibility[entry];\n    });\n    return matched ? !isVisible : false;\n  }\n\n  function isHolderDisabledByRuleSurface(store, holder) {\n    var surfaceDisabled = store && store.uiState && store.uiState.surfaceDisabled;\n    if (!surfaceDisabled) return false;\n    var keys = getHolderRuleSelectorKeys(holder);\n    return keys.some(function (entry) {\n      return !!(entry && Object.prototype.hasOwnProperty.call(surfaceDisabled, entry) && surfaceDisabled[entry]);\n    });\n  }\n\n  function hasNativeEditorReviewedDesign(store) {\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    return text(project.projectId).indexOf('shp_') === 0;\n  }\n\n  function shouldShowPitchPrintDesignApproval(store, artworkRuleState) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    if (!text(store.state && store.state.project && store.state.project.projectId)) return false;\n    // Staff personalization is proofed after checkout. Storefront approval is\n    // only for customer-edited PitchPrint projects that are saved to print.\n    if (text(store.state && store.state.artworkMode).toLowerCase() === 'editservice') return false;\n    var ruleState = artworkRuleState || getArtworkRuleState(store);\n    return !!(ruleState.showDesignApprovalBox || ruleState.showDesignApprovalChoice);\n  }\n\n  function isPitchPrintDesignApprovalPending(store, artworkRuleState) {\n    var ruleState = artworkRuleState || getArtworkRuleState(store);\n    return shouldShowPitchPrintDesignApproval(store, ruleState)\n      && !!ruleState.showDesignApprovalChoice\n      && !store.state.approvals.designReviewApproved;\n  }\n\n  function getArtworkRuleState(store) {\n    // Native Boguna Studio designs are reviewed and approved inside the\n    // editor's own Review & Approve step (recorded as the server-side\n    // signoff), so the page-level \"Design approval\" panel only applies to\n    // PitchPrint hybrid lanes that have no in-editor review.\n    var nativeReviewedDesign = hasNativeEditorReviewedDesign(store);\n    var artworkSectionActive = shouldRenderArtworkSection(store, getArtworkSectionConfig(store));\n    var showLegacyDesignApproval = artworkSectionActive\n      && !nativeReviewedDesign\n      && !isEditorlessProductCommercePage(store);\n    var detailUploadRuleState = getDetailUploadRuleState(store);\n    return {\n      showSelectionButtons: getUiSurfaceVisibility(store, '#artworkSelectionButtons', true),\n      showArtworkDetails: getUiSurfaceVisibility(store, '.artworkDetails', true),\n      showEditButtons: getUiSurfaceVisibility(store, '#pitchEditArtworkButtons', false),\n      showDesignApprovalBox: showLegacyDesignApproval && getUiSurfaceVisibility(store, '#disclaimerApprovalBox', false),\n      showDesignApprovalChoice: showLegacyDesignApproval && getUiSurfaceVisibility(store, '#disclaimerApproval', false),\n      showCustomDesignApprovalBox: artworkSectionActive && getUiSurfaceVisibility(store, '#customDesignPrintDisclaimer', false),\n      showCustomDesignApprovalChoice: artworkSectionActive && getUiSurfaceVisibility(store, '#customDesignPrintDisclaimerRadio', false),\n      showCanvaInstructions: getUiSurfaceVisibility(store, '#canvaInstructions', false),\n      showCanvaLink: getUiSurfaceVisibility(store, '#canvaLink', text(store && store.state && store.state.artworkMode).toLowerCase() === 'uploadcanva'),\n      showCustomDesignInfo: getUiSurfaceVisibility(store, '#customDesignDisclaimer', false),\n      showUploadInfo: getUiSurfaceVisibility(store, '#artworkUploadDisclaimer', text(store && store.state && store.state.artworkMode).toLowerCase() === 'uploadfiles'),\n      showSendLaterInfo: getUiSurfaceVisibility(store, '#autoCancellationDisclaimer', false),\n      showArtworkLaterInfo: getUiSurfaceVisibility(store, '#youHaveMyArtDisclaimer', false),\n      showFreeSetupInfo: getUiSurfaceVisibility(store, '#freeSetupDisclaimer', false),\n      showNewDesignInfo: getUiSurfaceVisibility(store, '#newDesignDisclaimer', false),\n      showEditServiceBlock: getUiSurfaceVisibility(store, '.edit-service-design-block', false),\n      showFreeEditServiceRow: getUiSurfaceVisibility(store, '.free-edit-service-row', false),\n      showEditServiceInfo: getUiSurfaceVisibility(store, '.editServiceInformationTextBox', false),\n      showPrimaryUpload: getUiSurfaceVisibility(store, '.fileUpload1', text(store && store.state && store.state.artworkMode).toLowerCase() === 'uploadfiles'),\n      showSupportingUpload: getUiSurfaceVisibility(store, '.fileUploadSupportingFiles', false),\n      showQrLink: getUiSurfaceVisibility(store, '#shareQRCodeLink', false),\n      showQrUpload: detailUploadRuleState.showQrUpload,\n      showMailingListUpload: detailUploadRuleState.showMailingListUpload,\n      requireQrUpload: detailUploadRuleState.requireQrUpload,\n      requireMailingListUpload: detailUploadRuleState.requireMailingListUpload,\n      showImprintInfo: getUiSurfaceVisibility(store, '.imprintInformationTextBox', false)\n    };\n  }\n\n  function resolveTemplatePreview(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    if (Array.isArray(source.backers) && source.backers.length && text(source.backer)) {\n      var matched = source.backers.find(function (entry) {\n        return text(entry && entry.id) === text(source.backer);\n      });\n      if (matched && text(matched.thumb) && !isDirectPitchPrintDesignUrl(matched.thumb)) return text(matched.thumb);\n      if (matched && Array.isArray(matched.previews) && matched.previews.length) {\n        var matchedPreview = firstSafePreviewUrl(matched.previews);\n        if (matchedPreview) return matchedPreview;\n      }\n    }\n    return firstSafePreviewUrl([\n      source.previewUrl,\n      getPreferredTemplatePreview(source),\n      Array.isArray(source.previews) && source.previews[0]\n    ]);\n  }\n\n  function getTemplateFrontPreview(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var previews = Array.isArray(source.previews) ? source.previews.map(text).filter(Boolean) : [];\n    return firstSafePreviewUrl([previews[0], source.previewUrl, getPreferredTemplatePreview(source)]);\n  }\n\n  function getBackerPreviewUrl(backer) {\n    var previews = Array.isArray(backer && backer.previews) ? backer.previews.map(text).filter(Boolean) : [];\n    return text(previews[1] || (backer && backer.thumb) || previews[0] || '');\n  }\n\n  function getBackerThumbUrl(backer) {\n    var previews = Array.isArray(backer && backer.previews) ? backer.previews.map(text).filter(Boolean) : [];\n    return text((backer && backer.thumb) || previews[1] || previews[0] || '');\n  }\n\n  function getTemplateByDesignId(store, designId) {\n    var cleanId = text(designId);\n    if (!cleanId) return null;\n    return store.templates.find(function (template) {\n      return text(template.designId) === cleanId;\n    }) || null;\n  }\n\n  function getTemplateBySelectionKey(store, selectionKey) {\n    var cleanKey = text(selectionKey);\n    if (!cleanKey) return null;\n    return store.templates.find(function (template) {\n      return getTemplateSelectionKey(template) === cleanKey;\n    }) || getOptionTemplateModalTemplates(store).find(function (template) {\n      return getTemplateSelectionKey(template) === cleanKey;\n    }) || null;\n  }\n\n  function getTemplateByLookup(store, templateLookup) {\n    var cleanLookup = text(templateLookup);\n    if (!cleanLookup) return null;\n    return store.templates.find(function (template) {\n      return text(template.templateLookup || template.templatePublicId) === cleanLookup;\n    }) || null;\n  }\n\n  function getOrientation(store) {\n    var templateOrientation = text(store.state.template && store.state.template.orientation);\n    if (templateOrientation) return templateOrientation;\n    var bindingOrientation = text(store.binding && store.binding.orientationPolicy && store.binding.orientationPolicy.default);\n    return bindingOrientation || '';\n  }\n\n  function getProductCommerceEditorSync(store) {\n    var bundle = store && store.productCommerceRuntimeBundle && typeof store.productCommerceRuntimeBundle === 'object'\n      ? store.productCommerceRuntimeBundle\n      : {};\n    return plainObject(bundle.editorSync);\n  }\n\n  function holderMatchesId(holder, holderId) {\n    var cleanId = text(holderId);\n    if (!holder || !cleanId) return false;\n    return text(getHolderId(holder)) === cleanId\n      || text(holder.id) === cleanId\n      || text(holder.holderId) === cleanId\n      || text(holder.htmlID) === cleanId\n      || text(holder.targetingID) === cleanId;\n  }\n\n  function findSyncedOptionHolder(store, holderId, role, fallbackDisplayName) {\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    var cleanRole = text(role).toLowerCase();\n    var cleanDisplayName = text(fallbackDisplayName).toLowerCase();\n    if (text(holderId)) {\n      var matchedById = holders.find(function (holder) {\n        return holderMatchesId(holder, holderId);\n      });\n      if (matchedById) return matchedById;\n    }\n    if (cleanRole) {\n      var matchedByRole = holders.find(function (holder) {\n        return text(holder && holder.productCommerceRole).toLowerCase() === cleanRole;\n      });\n      if (matchedByRole) return matchedByRole;\n    }\n    if (cleanDisplayName) {\n      return holders.find(function (holder) {\n        return text(holder && holder.displayName).toLowerCase() === cleanDisplayName;\n      }) || null;\n    }\n    return null;\n  }\n\n  function valueMatchesAny(sourceValue, matchers) {\n    var cleanSource = text(sourceValue);\n    if (!cleanSource) return false;\n    return matchers.some(function (matcher) {\n      return text(matcher) === cleanSource;\n    });\n  }\n\n  function findProductCommerceSizeValue(store, holder, option) {\n    var sync = getProductCommerceEditorSync(store);\n    var sizeValues = Array.isArray(sync.sizeValues) ? sync.sizeValues : [];\n    if (!option || !sizeValues.length) return null;\n    var optionMatchers = [\n      option.hvId,\n      option.id,\n      option.valueId,\n      option.targetingID,\n      option.targetingId,\n      option.friendlySku,\n      option.numericSku,\n      option.pricingSkuSegment\n    ].map(text).filter(Boolean);\n    var matched = sizeValues.find(function (entry) {\n      var source = plainObject(entry);\n      var holderId = text(source.holderId || source.optionHolderId);\n      if (holderId && !holderMatchesId(holder, holderId)) return false;\n      return valueMatchesAny(source.valueId, optionMatchers)\n        || valueMatchesAny(source.id, optionMatchers)\n        || valueMatchesAny(source.variationId, optionMatchers)\n        || valueMatchesAny(source.targetingId || source.targetingID, optionMatchers);\n    });\n    if (matched) return plainObject(matched);\n    if (sizeValues.length === 1) {\n      var only = plainObject(sizeValues[0]);\n      var onlyHolderId = text(only.holderId || only.optionHolderId);\n      if (!onlyHolderId || holderMatchesId(holder, onlyHolderId)) return only;\n    }\n    return null;\n  }\n\n  function positiveNumberOrBlank(value) {\n    var parsed = numberValue(value, NaN);\n    return Number.isFinite(parsed) && parsed > 0 ? String(parsed) : '';\n  }\n\n  function parseOptionSizeToken(option, fallbackLabel) {\n    var candidates = [\n      option && option.label,\n      option && option.flavorText,\n      fallbackLabel\n    ];\n    for (var index = 0; index < candidates.length; index += 1) {\n      var parsed = parseSizeInInches(text(candidates[index]));\n      if (parsed && Number(parsed[0]) > 0 && Number(parsed[1]) > 0) {\n        return { width: parsed[0], height: parsed[1], unit: 'inches' };\n      }\n    }\n    return null;\n  }\n\n  function buildSelectedSizePayload(store) {\n    var sync = getProductCommerceEditorSync(store);\n    var sizeHolder = findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n    var option = sizeHolder ? getSelectedOption(store, sizeHolder) : null;\n    var syncedSizeValue = findProductCommerceSizeValue(store, sizeHolder, option);\n    var parsed = parseOptionSizeToken(option, syncedSizeValue && syncedSizeValue.label);\n    var syncedWidth = positiveNumberOrBlank(syncedSizeValue && syncedSizeValue.width);\n    var syncedHeight = positiveNumberOrBlank(syncedSizeValue && syncedSizeValue.height);\n    return {\n      selectedSizeId: text(\n        syncedSizeValue && (syncedSizeValue.valueId || syncedSizeValue.id || syncedSizeValue.variationId)\n        || option && (option.hvId || option.valueId || option.id || option.targetingID)\n      ),\n      selectedSizeLabel: buildDisplayLabel(option) || text(syncedSizeValue && syncedSizeValue.label),\n      selectedWidth: syncedWidth || (parsed && parsed.width ? String(parsed.width) : ''),\n      selectedHeight: syncedHeight || (parsed && parsed.height ? String(parsed.height) : ''),\n      selectedUnit: text(syncedSizeValue && syncedSizeValue.unit) || (parsed && parsed.unit ? parsed.unit : 'inches'),\n      selectedOrientation: getOrientation(store)\n    };\n  }\n\n  function findSizeOptionForTemplateSwitch(store, holder, detail) {\n    var options = getVisibleOptions(store, holder);\n    var wantedId = text(detail.selectedSizeId);\n    var wantedLabel = text(detail.selectedSizeLabel).toLowerCase();\n    var wantedWidth = numberValue(detail.selectedWidth, NaN);\n    var wantedHeight = numberValue(detail.selectedHeight, NaN);\n    var hasWantedDimensions = Number.isFinite(wantedWidth) && wantedWidth > 0\n      && Number.isFinite(wantedHeight) && wantedHeight > 0;\n    var byId = null;\n    var byLabel = null;\n    var byDimensions = null;\n    options.forEach(function (option) {\n      if (!option) return;\n      var matchers = [\n        option.hvId,\n        option.id,\n        option.valueId,\n        option.targetingID,\n        option.targetingId\n      ].map(text).filter(Boolean);\n      var syncedValue = findProductCommerceSizeValue(store, holder, option);\n      if (syncedValue) {\n        [syncedValue.valueId, syncedValue.id, syncedValue.variationId].map(text).filter(Boolean).forEach(function (id) {\n          matchers.push(id);\n        });\n      }\n      if (!byId && wantedId && matchers.indexOf(wantedId) !== -1) {\n        byId = option;\n        return;\n      }\n      if (!byLabel && wantedLabel) {\n        var label = text(buildDisplayLabel(option)).toLowerCase();\n        var syncedLabel = text(syncedValue && syncedValue.label).toLowerCase();\n        if (label === wantedLabel || (syncedLabel && syncedLabel === wantedLabel)) byLabel = option;\n      }\n      if (!byDimensions && hasWantedDimensions) {\n        var width = numberValue(syncedValue && syncedValue.width, NaN);\n        var height = numberValue(syncedValue && syncedValue.height, NaN);\n        if (!Number.isFinite(width) || !Number.isFinite(height)) {\n          var parsed = parseOptionSizeToken(option, syncedValue && syncedValue.label);\n          width = numberValue(parsed && parsed.width, NaN);\n          height = numberValue(parsed && parsed.height, NaN);\n        }\n        if (Number.isFinite(width) && Number.isFinite(height)) {\n          var same = Math.abs(width - wantedWidth) < 0.01 && Math.abs(height - wantedHeight) < 0.01;\n          var rotated = Math.abs(width - wantedHeight) < 0.01 && Math.abs(height - wantedWidth) < 0.01;\n          if (same || rotated) byDimensions = option;\n        }\n      }\n    });\n    return byId || byLabel || byDimensions || null;\n  }\n\n  function applyEditorTemplateSwitch(store, detail) {\n    var payload = plainObject(detail);\n    var templateLookup = text(payload.templateLookup);\n    var proposal = {};\n    if (templateLookup && store.state.template && typeof store.state.template === 'object') {\n      proposal.template = Object.assign({}, store.state.template, {\n        templateLookup: templateLookup,\n        templatePublicId: templateLookup,\n        name: text(payload.templateTitle) || text(store.state.template.name)\n      });\n    }\n    var sync = getProductCommerceEditorSync(store);\n    var holder = findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n    var option = holder && findSizeOptionForTemplateSwitch(store, holder, payload);\n    if (option) {\n      proposal.selections = Object.assign({}, store.state.selections);\n      proposal.selections[getHolderId(holder)] = text(option.hvId);\n    }\n    if (!Object.keys(proposal).length || commitArtworkConfiguration(store, proposal, { source: 'restore' }).status === 'refused') return;\n    recalculate(store);\n    render(store);\n  }\n\n  function getOptionStableValueId(option) {\n    return text(\n      option && (\n        option.hvId\n        || option.valueId\n        || option.id\n        || option.targetingID\n        || option.targetingId\n      )\n    );\n  }\n\n  function getOptionStableTargetingId(option) {\n    return text(option && (option.targetingID || option.targetingId));\n  }\n\n  function buildSyncedEditorOptionPayload(store, holderId, role, fallbackDisplayName) {\n    var holder = findSyncedOptionHolder(store, holderId, role, fallbackDisplayName);\n    var option = holder ? getSelectedOption(store, holder) : null;\n    if (!holder || !option) return null;\n    return {\n      holderId: getHolderId(holder),\n      holderLabel: text(holder.customLabel || holder.displayName || holder.label || fallbackDisplayName),\n      valueId: getOptionStableValueId(option),\n      valueLabel: getOptionDisplayLabel(store, holder, option) || buildDisplayLabel(option),\n      targetingId: getOptionStableTargetingId(option)\n    };\n  }\n\n  function normalizeSidesPolicyMode(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s-]+/g, '_');\n    if (\n      normalized === 'single'\n      || normalized === 'double_same'\n      || normalized === 'double_different'\n      || normalized === 'locations'\n      || normalized === 'custom'\n    ) return normalized;\n    return '';\n  }\n\n  function normalizeSidesPolicy(policy) {\n    var source = plainObject(policy);\n    var mode = normalizeSidesPolicyMode(source.mode);\n    var pageCount = normalizePositiveInteger(source.requiredPageCount, mode === 'single' ? 1 : 0);\n    var normalized = {\n      holderId: text(source.holderId || source.optionHolderId),\n      valueId: text(source.valueId || source.id || source.variationId),\n      mode: mode || 'single',\n      requiredPageCount: pageCount > 0 ? pageCount : 1,\n      allowExtraDraftPages: source.allowExtraDraftPages !== false,\n      requirePageSelectionAtPreflight: source.requirePageSelectionAtPreflight === true\n    };\n    if (!normalized.holderId) delete normalized.holderId;\n    if (!normalized.valueId) delete normalized.valueId;\n    return normalized;\n  }\n\n  function findProductCommerceSidesPolicy(store, sidesChoice) {\n    var sync = getProductCommerceEditorSync(store);\n    var policies = Array.isArray(sync.sidesPolicies) ? sync.sidesPolicies : [];\n    var choiceMatchers = [\n      sidesChoice && sidesChoice.valueId,\n      sidesChoice && sidesChoice.targetingId,\n      sidesChoice && sidesChoice.valueLabel\n    ].map(text).filter(Boolean);\n    var holderId = text(sidesChoice && sidesChoice.holderId);\n    var matched = policies.find(function (entry) {\n      var source = plainObject(entry);\n      var policyHolderId = text(source.holderId || source.optionHolderId);\n      if (policyHolderId && holderId && policyHolderId !== holderId) return false;\n      return valueMatchesAny(source.valueId, choiceMatchers)\n        || valueMatchesAny(source.id, choiceMatchers)\n        || valueMatchesAny(source.variationId, choiceMatchers)\n        || valueMatchesAny(source.targetingId || source.targetingID, choiceMatchers);\n    });\n    if (matched) return normalizeSidesPolicy(matched);\n    var fallback = plainObject(sync.defaultSidesPolicy);\n    if (Object.keys(fallback).length) return normalizeSidesPolicy(fallback);\n    return null;\n  }\n\n  function buildEditorSelectionSyncPayload(store) {\n    var sync = getProductCommerceEditorSync(store);\n    var sidesChoice = buildSyncedEditorOptionPayload(store, sync.sidesHolderId, 'sides', 'Sides');\n    var printingChoice = buildSyncedEditorOptionPayload(store, sync.printingHolderId, 'printing', 'Printing');\n    var sidesPolicy = findProductCommerceSidesPolicy(store, sidesChoice);\n    var payload = {};\n    if (sidesChoice) {\n      payload.selectedSidesId = text(sidesChoice.valueId);\n      payload.selectedSidesLabel = text(sidesChoice.valueLabel);\n      payload.selectedSidesTargetingId = text(sidesChoice.targetingId);\n      payload.sidesHolderId = text(sidesChoice.holderId);\n      payload.sidesHolderLabel = text(sidesChoice.holderLabel);\n    }\n    if (printingChoice) {\n      payload.selectedPrintingId = text(printingChoice.valueId);\n      payload.selectedPrintingLabel = text(printingChoice.valueLabel);\n      payload.selectedPrintingTargetingId = text(printingChoice.targetingId);\n      payload.printingHolderId = text(printingChoice.holderId);\n      payload.printingHolderLabel = text(printingChoice.holderLabel);\n    }\n    if (sidesPolicy) {\n      payload.sidesPolicy = sidesPolicy;\n    }\n    return payload;\n  }\n\n  function buildCurrentOptionSelections(store) {\n    // With no artwork choice (a reset, or none made yet) the artwork group adds\n    // no charge the customer did not choose: a priced value it holds until a\n    // new choice stays out of every total, quote and summary row.\n    var unchosenArtworkHolder = !text(store.state && store.state.artworkMode) ? getConfiguredArtworkMethodHolder(store) : null;\n    return store.holders.map(function (holder, index) {\n      if (isHolderUnavailableByRules(store, holder)) return null;\n      if (shouldSuppressOptionTemplateSelection(store, holder)) return null;\n      // Set only on the isolated artwork price projection, never live state\n      // or cart data. No configured/visible free value is needed for a base.\n      if (store.suppressArtworkMethodPricePreview && isArtworkMethodHolder(store, holder)) return null;\n      var option = getSelectedOption(store, holder);\n      if (!option) return null;\n      var selection = Object.assign(core.buildOptionSelection(holder, option, index + 1), { flavorText: '' }); // CART-SIZE-LABEL-BADGE-LEAK: badge/helper text is page copy, never a cart row\n      var addonMeta = buildAddonMetadataForOption(store, option, holder);\n      if (unchosenArtworkHolder && getHolderId(unchosenArtworkHolder) === getHolderId(holder)\n        && addonMeta && Math.abs(numberValue(addonMeta.addonBasePrice, 0)) > 0.005) return null;\n      return addonMeta ? Object.assign(selection, addonMeta) : selection;\n    }).filter(Boolean);\n  }\n\n  function applyStoredOptionSelections(store, optionSelections, options) {\n    var draft = artworkConfigurationDraft(store, {});\n    var result = collectStoredOptionSelections(draft, optionSelections, options);\n    if (result.invalidSelections.length) return result;\n    var committed = commitArtworkConfiguration(store, { selections: draft.state.selections }, { source: 'restore' });\n    if (committed.status === 'refused') { result.invalidSelections = optionSelections.slice(); result.appliedCount = 0; }\n    return result;\n  }\n\n  function collectStoredOptionSelections(store, optionSelections, options) {\n    var selections = Array.isArray(optionSelections) ? optionSelections : [];\n    var settings = options && typeof options === 'object' ? options : {};\n    var result = {\n      appliedCount: 0,\n      invalidSelections: []\n    };\n    if (settings.strictIdentity === true) {\n      var pendingSelections = [];\n      var seenHolderIds = Object.create(null);\n      selections.forEach(function (selection) {\n        var suppliedHolderId = text(selection && selection.holderId);\n        var suppliedHolderHtmlId = text(selection && selection.holderHtmlId);\n        var holderById = suppliedHolderId ? store.holders.find(function (entry) {\n          return suppliedHolderId === getHolderId(entry);\n        }) : null;\n        var holderByHtmlId = suppliedHolderHtmlId ? store.holders.find(function (entry) {\n          return suppliedHolderHtmlId === text(entry.htmlID);\n        }) : null;\n        var holderIdentitiesConflict = !!(\n          suppliedHolderId && !holderById\n          || suppliedHolderHtmlId && !holderByHtmlId\n          || holderById && holderByHtmlId && getHolderId(holderById) !== getHolderId(holderByHtmlId)\n        );\n        var holder = holderIdentitiesConflict ? null : (holderById || holderByHtmlId);\n        if (!holder) {\n          result.invalidSelections.push(selection);\n          return;\n        }\n        var holderId = getHolderId(holder);\n        if (seenHolderIds[holderId]) {\n          result.invalidSelections.push(selection);\n          return;\n        }\n        seenHolderIds[holderId] = true;\n        var matched = findValueByMatchers(holder, selection, { strictIdentity: true });\n        if (!matched) {\n          result.invalidSelections.push(selection);\n          return;\n        }\n        pendingSelections.push({\n          holderId: holderId,\n          hvid: text(matched.hvId)\n        });\n      });\n      if (result.invalidSelections.length) return result;\n      pendingSelections.forEach(function (entry) {\n        writeArtworkSelection(store, entry.holderId, entry.hvid, 'restore');\n        result.appliedCount += 1;\n      });\n      return result;\n    }\n    store.holders.forEach(function (holder) {\n      var selection = selections.find(function (entry) {\n        return text(entry && entry.holderId) === getHolderId(holder)\n          || text(entry && entry.holderHtmlId) === text(holder.htmlID);\n      });\n      if (!selection) return;\n      var matched = findValueByMatchers(holder, selection);\n      if (matched) {\n        writeArtworkSelection(store, getHolderId(holder), text(matched.hvId), 'restore');\n        result.appliedCount += 1;\n      }\n    });\n    return result;\n  }\n\n  function shouldIncludeInSku(holder, option) {\n    if (holder && holder.dontUseInSKU) return false;\n    if (isProductLinkHolder(holder)) return false;\n    if (option && option.dontUseInSKU) return false;\n    var numericSku = numberValue(option && option.numericSku, NaN);\n    if (!Number.isFinite(numericSku) || numericSku <= 0) return false;\n    var signals = [\n      text(holder && holder.htmlID).toLowerCase(),\n      text(holder && holder.targetingID).toLowerCase(),\n      text(holder && holder.displayName).toLowerCase(),\n      text(option && option.targetingID).toLowerCase()\n    ].join('|');\n    if (signals.indexOf('addon') !== -1) return false;\n    return true;\n  }\n\n  function buildSkuPrefix(store) {\n    var productCode = text(store.productData && store.productData.productCode);\n    if (!productCode) return '';\n    var segments = [];\n    var skuHolders = store.holders;\n    var skuHolderOrder = Array.isArray(store && store.productCommerceSkuHolderOrder)\n      ? store.productCommerceSkuHolderOrder.map(text).filter(Boolean)\n      : [];\n    if (skuHolderOrder.length && Array.isArray(store.holders)) {\n      var holdersById = {};\n      store.holders.forEach(function (holder) {\n        holdersById[getHolderId(holder)] = holder;\n      });\n      skuHolders = skuHolderOrder.map(function (holderId) {\n        return holdersById[holderId] || null;\n      }).filter(Boolean);\n    }\n    skuHolders.forEach(function (holder) {\n      if (isHolderUnavailableByRules(store, holder)) return;\n      var option = getSelectedOption(store, holder);\n      if (!shouldIncludeInSku(holder, option)) return;\n      segments.push(String(Number(option.numericSku)));\n    });\n    if (!segments.length) return productCode + '-q';\n    return productCode + '-' + segments.join('-') + '-q';\n  }\n\n  function getPricingMap(store) {\n    return store && store.pricingData && store.pricingData.pricing && typeof store.pricingData.pricing === 'object'\n      ? store.pricingData.pricing\n      : {};\n  }\n\n  function pricingPrefixHasMatches(pricing, skuPrefix) {\n    var prefix = text(skuPrefix);\n    if (!prefix) return false;\n    return Object.keys(pricing && typeof pricing === 'object' ? pricing : {}).some(function (key) {\n      return key.indexOf(prefix) === 0;\n    });\n  }\n\n  function collectProductPricingPrefixes(pricing, productCode) {\n    var code = text(productCode);\n    if (!code) return [];\n    var seen = {};\n    Object.keys(pricing && typeof pricing === 'object' ? pricing : {}).forEach(function (key) {\n      if (key.indexOf(code + '-') !== 0) return;\n      var match = key.match(/^(.*-q)\\d+$/i);\n      if (!match || !match[1]) return;\n      seen[match[1]] = true;\n    });\n    return Object.keys(seen).sort();\n  }\n\n  function resolveSkuPrefix(store) {\n    var commercePrefix = text(store && store.productCommercePricingSkuPrefix);\n    var pricing = getPricingMap(store);\n    if (pricingPrefixHasMatches(pricing, commercePrefix)) return commercePrefix;\n    var preferred = buildSkuPrefix(store);\n    if (pricingPrefixHasMatches(pricing, preferred)) return preferred;\n    // Admin-authored Product Commerce rows resolve by the selected option-value\n    // ids; the reconstructed-SKU lane above stays first so legacy numeric SKU\n    // products keep byte-identical cart SKUs.\n    var selectionPrefix = resolveProductCommerceSelectionPrefix(store);\n    if (pricingPrefixHasMatches(pricing, selectionPrefix)) return selectionPrefix;\n    var productCode = text(store && store.productData && store.productData.productCode);\n    var legacyPrefixes = collectProductPricingPrefixes(pricing, productCode);\n    if (legacyPrefixes.length === 1) return legacyPrefixes[0];\n    return preferred;\n  }\n\n  function getQuantityProductConfig(store) {\n    var sourceHandle = getLegacyProductSourceHandle(store);\n    return Object.assign(\n      {},\n      getProductCatalogEntry(store, sourceHandle) || {},\n      getProductCatalogEntry(store, store && store.config && store.config.handle) || {},\n      getOptionLayoutProductEntry(store, sourceHandle) || {},\n      getOptionLayoutProductEntry(store, store && store.config && store.config.handle) || {},\n      store && store.productData && typeof store.productData === 'object' ? store.productData : {}\n    );\n  }\n\n  function getQuantitySurfaceFlag(store, className, fallback) {\n    return getUiSurfaceClassFlag(store, QUANTITY_RULE_SELECTOR, className, fallback);\n  }\n\n  function getConfiguredQuantityFieldType(store) {\n    var productConfig = getQuantityProductConfig(store);\n    var ruleQuantityModel = store && store.uiState && store.uiState.quantityModel && typeof store.uiState.quantityModel === 'object'\n      ? store.uiState.quantityModel\n      : {};\n    return normalizeProductCommerceRuleQuantityFieldType(\n      ruleQuantityModel.fieldType || ruleQuantityModel.quantityFieldType || ruleQuantityModel.mode\n    ) || normalizeProductCommerceRuleQuantityFieldType(productConfig.quantityFieldType || productConfig.fieldType);\n  }\n\n  function getQuantityMode(store) {\n    var productConfig = getQuantityProductConfig(store);\n    if (isEddmFullServiceActive(store)) {\n      return 'eddmRoutes';\n    }\n    var ruleQuantityModel = store && store.uiState && store.uiState.quantityModel && typeof store.uiState.quantityModel === 'object'\n      ? store.uiState.quantityModel\n      : {};\n    var ruleFieldType = normalizeProductCommerceRuleQuantityFieldType(ruleQuantityModel.fieldType || ruleQuantityModel.quantityFieldType || ruleQuantityModel.mode);\n    if (ruleFieldType === 'range_table' || ruleFieldType === 'numeric_input' || ruleQuantityModel.rangeBased || ruleQuantityModel.calculateOnTypedQty) {\n      return 'rangeInput';\n    }\n    if (ruleFieldType === 'slider') return 'promoSlider';\n    if (ruleFieldType === 'dropdown' || ruleFieldType === 'generated_table' || ruleFieldType === 'pricing_table' || ruleFieldType === 'buttons') return 'dropdown';\n    var productFieldType = normalizeProductCommerceRuleQuantityFieldType(productConfig.quantityFieldType || productConfig.fieldType);\n    if (productFieldType === 'range_table' || productFieldType === 'numeric_input' || productConfig.rangeBased || productConfig.calculateOnTypedQty) {\n      return 'rangeInput';\n    }\n    if (productFieldType === 'slider') return 'promoSlider';\n    if (productFieldType === 'dropdown' || productFieldType === 'generated_table' || productFieldType === 'pricing_table' || productFieldType === 'buttons') return 'dropdown';\n    var apparelConfig = productConfig && productConfig.apparelConfig && typeof productConfig.apparelConfig === 'object'\n      ? productConfig.apparelConfig\n      : null;\n    if (apparelConfig && apparelConfig.enableSizingMatrix) {\n      return 'apparelMatrix';\n    }\n    if (isPostcardsBulkMailActive(store)) {\n      return 'rangeInput';\n    }\n    if (getQuantitySurfaceFlag(store, 'promoSlider', !!productConfig.isPromoItem)) {\n      return 'promoSlider';\n    }\n    return 'dropdown';\n  }\n\n  function getApparelConfig(store) {\n    var productConfig = getQuantityProductConfig(store);\n    var apparelConfig = productConfig && productConfig.apparelConfig && typeof productConfig.apparelConfig === 'object'\n      ? productConfig.apparelConfig\n      : null;\n    return apparelConfig && apparelConfig.enableSizingMatrix ? apparelConfig : null;\n  }\n\n  function normalizePositiveInteger(value, fallback) {\n    var parsed = parseInt(value, 10);\n    if (Number.isFinite(parsed) && parsed > 0) return parsed;\n    var fallbackParsed = parseInt(fallback, 10);\n    if (Number.isFinite(fallbackParsed) && fallbackParsed > 0) return fallbackParsed;\n    return 1;\n  }\n\n  function normalizeApparelSizesState(value, apparelConfig) {\n    var normalized = core.normalizeApparelSizes ? core.normalizeApparelSizes(value) : {};\n    var availableSizes = Array.isArray(apparelConfig && apparelConfig.availableSizes)\n      ? apparelConfig.availableSizes.map(text).filter(Boolean)\n      : Object.keys(normalized || {});\n    var next = {};\n    availableSizes.forEach(function (size) {\n      var quantity = parseInt(normalized && normalized[size], 10);\n      if (Number.isFinite(quantity) && quantity > 0) {\n        next[size] = quantity;\n      }\n    });\n    return next;\n  }\n\n  function sumApparelSizes(apparelSizes) {\n    return Object.keys(apparelSizes && typeof apparelSizes === 'object' ? apparelSizes : {}).reduce(function (sum, size) {\n      return sum + normalizePositiveInteger(apparelSizes[size], 0);\n    }, 0);\n  }\n\n  function isTallApparelSize(size) {\n    var normalized = text(size).toUpperCase().replace(/\\s+/g, '-');\n    return /(?:^|-)TALL$/.test(normalized);\n  }\n\n  function calculateApparelSizeSurchargeTotal(apparelConfig, apparelSizes) {\n    if (!apparelConfig || !apparelConfig.sizeSurcharges) return 0;\n    return roundMoney(Object.keys(apparelSizes && typeof apparelSizes === 'object' ? apparelSizes : {}).reduce(function (sum, size) {\n      var quantity = normalizePositiveInteger(apparelSizes[size], 0);\n      var surcharge = numberValue(apparelConfig.sizeSurcharges[size], 0);\n      return sum + (quantity > 0 && surcharge > 0 ? (quantity * surcharge) : 0);\n    }, 0));\n  }\n\n  function buildDefaultApparelSizes(apparelConfig, fallbackQuantity) {\n    var next = {};\n    var defaultSize = text(apparelConfig && apparelConfig.defaultSize);\n    var fallback = normalizePositiveInteger(\n      fallbackQuantity,\n      numberValue(apparelConfig && apparelConfig.defaultQty, numberValue(apparelConfig && apparelConfig.minQty, 1))\n    );\n    if (defaultSize && fallback > 0) {\n      next[defaultSize] = fallback;\n    }\n    return next;\n  }\n\n  function resolveQuantityBounds(store, options) {\n    var quantityOptions = Array.isArray(options) ? options : [];\n    var productConfig = getQuantityProductConfig(store);\n    var sliderConfig = productConfig && productConfig.sliderConfig && typeof productConfig.sliderConfig === 'object'\n      ? productConfig.sliderConfig\n      : {};\n    var bracketMin = quantityOptions.length ? quantityOptions[0] : 1;\n    var bracketMax = quantityOptions.length ? quantityOptions[quantityOptions.length - 1] : bracketMin;\n    var minQty = normalizePositiveInteger(\n      numberValue(sliderConfig.min, numberValue(productConfig && productConfig.minQty, bracketMin)),\n      bracketMin\n    );\n    if (quantityOptions.length && bracketMin > minQty) {\n      minQty = bracketMin;\n    }\n    var maxQty = normalizePositiveInteger(\n      numberValue(sliderConfig.max, bracketMax),\n      Math.max(minQty, bracketMax)\n    );\n    var stepQty = normalizePositiveInteger(numberValue(sliderConfig.step, 1), 1);\n    if (maxQty < minQty) maxQty = minQty;\n    return {\n      min: minQty,\n      max: maxQty,\n      step: stepQty\n    };\n  }\n\n  function clampQuantityToBounds(value, bounds) {\n    var minQty = normalizePositiveInteger(bounds && bounds.min, 1);\n    var maxQty = normalizePositiveInteger(bounds && bounds.max, minQty);\n    var stepQty = normalizePositiveInteger(bounds && bounds.step, 1);\n    var quantity = normalizePositiveInteger(value, minQty);\n    if (quantity < minQty) quantity = minQty;\n    if (stepQty > 1) maxQty = minQty + Math.floor((maxQty - minQty) / stepQty) * stepQty;\n    if (quantity > maxQty) quantity = maxQty;\n    if (stepQty > 1) {\n      quantity = minQty + (Math.round((quantity - minQty) / stepQty) * stepQty);\n      if (quantity < minQty) quantity = minQty;\n      if (quantity > maxQty) quantity = maxQty;\n    }\n    return quantity;\n  }\n\n  // EDDM-ROUTE-MIN-ALIGN (2026-10-03): the product's configured minimum\n  // quantity, the value the quote engine refuses to go below\n  // (foundation-authoritative-commerce-quote.ts resolveQuantity): a Product\n  // Commerce product's \"Minimum quantity\" as authored, else a legacy product's\n  // own minQty; 0 when none is set. Unlike resolveQuantityBounds it is never\n  // raised to the first price row.\n  function readConfiguredQuantityMinimum(value) {\n    var minimum = parseInt(value, 10);\n    return Number.isFinite(minimum) && minimum > 0 ? minimum : 0;\n  }\n\n  function getConfiguredQuantityMinimum(store) {\n    var productConfig = getQuantityProductConfig(store);\n    return readConfiguredQuantityMinimum(productConfig.productCommerceRuntime === true\n      ? productConfig.quantityConfiguredMinimum\n      : productConfig.minQty);\n  }\n\n  // BD-APPAREL-OVER-MAX (2026-10-04): the product's configured maximum\n  // quantity, the value the quote engine refuses to go above (it enforces\n  // quantity.max only when set): a Product Commerce product's \"Maximum\n  // quantity\" as authored, else a legacy product's own slider maximum or\n  // maxQty; 0 when none is set. Unlike resolveQuantityBounds it never falls\n  // back to the last price row, so a size matrix without one is unbounded.\n  function readConfiguredQuantityMaximum(value) {\n    var maximum = parseInt(value, 10);\n    return Number.isFinite(maximum) && maximum > 0 ? maximum : 0;\n  }\n\n  function getConfiguredQuantityMaximum(store) {\n    var productConfig = getQuantityProductConfig(store);\n    if (productConfig.productCommerceRuntime === true) {\n      return readConfiguredQuantityMaximum(productConfig.quantityConfiguredMaximum);\n    }\n    var sliderConfig = productConfig.sliderConfig && typeof productConfig.sliderConfig === 'object' ? productConfig.sliderConfig : {};\n    return readConfiguredQuantityMaximum(sliderConfig.max) || readConfiguredQuantityMaximum(productConfig.maxQty);\n  }\n\n  // The size matrix sentence: below the minimum, or above a set maximum.\n  // Empty when the allocation can be added to the cart.\n  function getApparelQuantityWarningText(store, totalPieces, minQty) {\n    if (totalPieces < minQty) {\n      return 'Allocate at least ' + String(minQty) + ' total pieces. Currently allocated ' + String(totalPieces) + '.';\n    }\n    var maxQty = getConfiguredQuantityMaximum(store);\n    if (maxQty && totalPieces > maxQty) {\n      return 'Allocate at most ' + String(maxQty) + ' total pieces. Currently allocated ' + String(totalPieces) + '.';\n    }\n    return '';\n  }\n\n  // A route mailing prices at least that minimum: for fewer addresses the page\n  // shows, prices and builds the minimum (the addresses stay on the line), so\n  // the page, its line and the quote agree at every count. A count that is one\n  // of the selection's price quantities on a product locked to its price table\n  // keeps its count, as in the quote engine.\n  function resolveRouteQuantity(store, addressCount, quantityOptions) {\n    var minimum = getConfiguredQuantityMinimum(store);\n    if (!minimum || addressCount >= minimum) return addressCount;\n    if (isQuantityLockedToPricingTable(store) && quantityOptions.indexOf(addressCount) !== -1) return addressCount;\n    return minimum;\n  }\n\n  function normalizeQuantityOptionList(value) {\n    return (Array.isArray(value) ? value : []).map(function (entry) {\n      return normalizePositiveInteger(entry, 0);\n    }).filter(function (entry, index, source) {\n      return entry > 0 && source.indexOf(entry) === index;\n    }).sort(function (left, right) {\n      return left - right;\n    });\n  }\n\n  function isQuantityLockedToPricingTable(store) {\n    var productConfig = getQuantityProductConfig(store);\n    return productConfig && productConfig.quantityLockedToPricingTable === true;\n  }\n\n  function shouldLockQuantityToPricingOptions(store, quantityMode) {\n    var mode = text(quantityMode || getQuantityMode(store));\n    return isQuantityLockedToPricingTable(store) && mode === 'dropdown';\n  }\n\n  function snapQuantityToPriceOption(options, quantity) {\n    var quantityOptions = normalizeQuantityOptionList(options);\n    if (!quantityOptions.length) return normalizePositiveInteger(quantity, 1);\n    var requestedQuantity = normalizePositiveInteger(quantity, quantityOptions[0]);\n    if (quantityOptions.indexOf(requestedQuantity) !== -1) return requestedQuantity;\n    var best = quantityOptions[0];\n    quantityOptions.forEach(function (optionQuantity) {\n      var bestDistance = Math.abs(best - requestedQuantity);\n      var optionDistance = Math.abs(optionQuantity - requestedQuantity);\n      if (optionDistance < bestDistance || (optionDistance === bestDistance && optionQuantity > best)) {\n        best = optionQuantity;\n      }\n    });\n    return best;\n  }\n\n  function getAdjacentQuantityOption(options, currentQuantity, direction) {\n    var quantityOptions = normalizeQuantityOptionList(options);\n    if (!quantityOptions.length) return 0;\n    var current = snapQuantityToPriceOption(quantityOptions, currentQuantity);\n    if (direction < 0) {\n      for (var down = quantityOptions.length - 1; down >= 0; down -= 1) {\n        if (quantityOptions[down] < current) return quantityOptions[down];\n      }\n      return quantityOptions[0];\n    }\n    for (var up = 0; up < quantityOptions.length; up += 1) {\n      if (quantityOptions[up] > current) return quantityOptions[up];\n    }\n    return quantityOptions[quantityOptions.length - 1];\n  }\n\n  function resolvePriceBracketQuantity(quantityOptions, quantity, roundUp) {\n    var options = Array.isArray(quantityOptions) ? quantityOptions : [];\n    var targetQuantity = normalizePositiveInteger(quantity, options[0] || 1);\n    if (!options.length) return targetQuantity;\n    if (options.indexOf(targetQuantity) !== -1) return targetQuantity;\n    if (roundUp) {\n      for (var index = 0; index < options.length; index += 1) {\n        if (options[index] >= targetQuantity) return options[index];\n      }\n      return options[options.length - 1];\n    }\n    var matched = options[0];\n    options.forEach(function (optionQuantity) {\n      if (optionQuantity <= targetQuantity) matched = optionQuantity;\n    });\n    return matched;\n  }\n\n  // EXACT-CENTS-CATALOG (2026-10-03, owner decision \"Use the exact cents rule\n  // for every product.\"): every line is priced with the quote engine's\n  // arithmetic (core.scaleMoney: the row as authored, one half-up division by\n  // the bracket, cents half up, add-ons in cents), on the page and in the\n  // page-built cart line. The page writes the EDDM-ROUTE-CENT per-line marker\n  // (quoteArithmetic + the row as authored) on every line, so a page served\n  // with an older core still builds the line it shows, and a saved line from\n  // older bytes keeps its line until it is edited. The bundle flag is no longer\n  // read. A core from before EDDM-ROUTE-CENT (no scaleMoney) keeps its own.\n  function usesQuoteArithmetic() {\n    return typeof core.scaleMoney === 'function';\n  }\n\n  // The pricing map's compact row: the row as authored in half-up cents, the\n  // quote engine's cents for an exact quantity (toFixed rounds 135.795 down).\n  function roundAuthoredRowMoney(amount) {\n    var cents = usesQuoteArithmetic() ? core.scaleMoney(amount, 1, 1) : NaN;\n    return Number.isFinite(cents) ? cents : roundMoney(amount);\n  }\n\n  // The row as authored, else the row itself (legacy theme pricing rows are\n  // used as authored). An absent authored value never reads as zero.\n  function readAuthoredPrice(priceRecord, column) {\n    var authored = priceRecord && priceRecord.authored && typeof priceRecord.authored === 'object' ? priceRecord.authored : null;\n    var raw = authored ? readTierPrice(authored, column) : undefined;\n    var amount = raw === null || raw === undefined || raw === '' ? NaN : Number(raw);\n    return Number.isFinite(amount) ? amount : numberValue(readTierPrice(priceRecord, column), NaN);\n  }\n\n  function buildQuantityPricingContext(store, requestedQuantity) {\n    var quantityMode = getQuantityMode(store);\n    var quantityOptions = collectQuantityOptionsForMode(store, quantityMode);\n    var lockedToPricingOptions = shouldLockQuantityToPricingOptions(store, quantityMode);\n    var usesTypedPricing = !lockedToPricingOptions && (\n      getQuantitySurfaceFlag(store, 'calculateOnTypedQty', false)\n      || getQuantitySurfaceFlag(store, 'rangeBased', false)\n      || quantityMode === 'promoSlider'\n      || quantityMode === 'rangeInput'\n      || quantityMode === 'eddmRoutes'\n      || quantityMode === 'apparelMatrix'\n    );\n    var roundUp = getQuantitySurfaceFlag(store, 'roundUp', false);\n    var bounds = resolveQuantityBounds(store, quantityOptions);\n    var productConfig = getQuantityProductConfig(store);\n    var apparelConfig = getApparelConfig(store);\n    var displayQuantity = 0;\n    var typedQuantity = 0;\n    var paidPrintQuantity = 0;\n    var priceBracketQuantity = 0;\n    var apparelSizes = {};\n    var sizeSurchargeTotal = 0;\n\n    var channelOffer = getConfirmedChannelOffer(store);\n    var deferChannelSizes = canDeferChannelSizes(store, requestedQuantity)\n      && !sumApparelSizes(store.state.apparelSizes || {});\n    if (quantityMode === 'apparelMatrix' && apparelConfig && deferChannelSizes) {\n      displayQuantity = clampQuantityToBounds(Number(requestedQuantity || channelOffer.packageQuantity), bounds);\n      typedQuantity = displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = resolvePriceBracketQuantity(quantityOptions, displayQuantity, roundUp);\n    } else if (quantityMode === 'apparelMatrix' && apparelConfig) {\n      var previousApparelMode = text(store && store.state && store.state.quantityMode) === 'apparelMatrix';\n      var apparelSizesInitialized = !!(store && store.state && store.state.apparelSizesInitialized);\n      var requestedApparelQuantity = parseInt(requestedQuantity, 10);\n      apparelSizes = normalizeApparelSizesState(store && store.state && store.state.apparelSizes, apparelConfig);\n      if (!sumApparelSizes(apparelSizes)) {\n        if (!previousApparelMode || !apparelSizesInitialized) {\n          var restoredQuantity = Number.isFinite(requestedApparelQuantity) && requestedApparelQuantity > 0\n            ? requestedApparelQuantity\n            : numberValue(store && store.state && store.state.quantity, 0);\n          apparelSizes = buildDefaultApparelSizes(apparelConfig, restoredQuantity);\n          apparelSizesInitialized = sumApparelSizes(apparelSizes) > 0;\n        }\n      }\n      displayQuantity = sumApparelSizes(apparelSizes);\n      if (!displayQuantity) {\n        if (!previousApparelMode || !apparelSizesInitialized) {\n          apparelSizes = buildDefaultApparelSizes(apparelConfig);\n          displayQuantity = sumApparelSizes(apparelSizes);\n          apparelSizesInitialized = displayQuantity > 0;\n        }\n      }\n      // BD-APPAREL-OVER-MAX: the pieces the customer allocated are the count.\n      // bounds.max falls back to the last price row, so clamping here priced\n      // 20 pieces as 12 while every size kept its count. Above the top row the\n      // count prices at the last bracket rate (as the quote engine does); a\n      // set maximum is refused in validateState, never clamped.\n      typedQuantity = displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = usesTypedPricing\n        ? resolvePriceBracketQuantity(quantityOptions, displayQuantity, roundUp)\n        : displayQuantity;\n      sizeSurchargeTotal = canDeferChannelSizes(store, displayQuantity) ? 0 : calculateApparelSizeSurchargeTotal(apparelConfig, apparelSizes);\n    } else if (quantityMode === 'eddmRoutes') {\n      var selectedEddmQuantity = getEddmSelectedAddressCount(store);\n      var eddmDefaultQty = numberValue(\n        selectedEddmQuantity,\n        numberValue(store && store.state && store.state.typedQuantity, numberValue(store && store.state && store.state.quantity, bounds.min))\n      );\n      displayQuantity = selectedEddmQuantity > 0\n        ? resolveRouteQuantity(store, selectedEddmQuantity, quantityOptions)\n        : clampQuantityToBounds(eddmDefaultQty, bounds);\n      // The addresses are the typed quantity: add-ons configured to count it\n      // (postage on every mailing product) count what is mailed, while the\n      // print price and every other add-on count the priced quantity.\n      typedQuantity = selectedEddmQuantity > 0 ? selectedEddmQuantity : displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = usesTypedPricing\n        ? resolvePriceBracketQuantity(quantityOptions, displayQuantity, roundUp)\n        : displayQuantity;\n    } else if (quantityMode === 'rangeInput') {\n      var rangeDefaultQty = numberValue(productConfig && productConfig.defaultQty, bounds.min);\n      var rangeStoredQty = normalizePositiveInteger(\n        store && store.state && store.state.typedQuantity,\n        normalizePositiveInteger(store && store.state && store.state.quantity, rangeDefaultQty)\n      );\n      displayQuantity = clampQuantityToBounds(\n        normalizePositiveInteger(requestedQuantity, rangeStoredQty),\n        bounds\n      );\n      if (lockedToPricingOptions) displayQuantity = snapQuantityToPriceOption(quantityOptions, displayQuantity);\n      typedQuantity = displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = usesTypedPricing\n        ? resolvePriceBracketQuantity(quantityOptions, displayQuantity, roundUp)\n        : displayQuantity;\n    } else if (quantityMode === 'promoSlider') {\n      var promoDefaultQty = numberValue(productConfig && productConfig.defaultQty, NaN);\n      var promoStoredQty = normalizePositiveInteger(\n        store && store.state && store.state.typedQuantity,\n        normalizePositiveInteger(store && store.state && store.state.quantity, promoDefaultQty)\n      );\n      displayQuantity = clampQuantityToBounds(\n        normalizePositiveInteger(requestedQuantity, promoStoredQty),\n        bounds\n      );\n      if (lockedToPricingOptions) displayQuantity = snapQuantityToPriceOption(quantityOptions, displayQuantity);\n      typedQuantity = displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = usesTypedPricing\n        ? resolvePriceBracketQuantity(quantityOptions, displayQuantity, roundUp)\n        : displayQuantity;\n    } else {\n      var requestedDiscreteQuantity = normalizePositiveInteger(requestedQuantity, NaN);\n      if (quantityOptions.indexOf(requestedDiscreteQuantity) !== -1) {\n        displayQuantity = requestedDiscreteQuantity;\n      } else {\n        displayQuantity = resolveDefaultQuantity(store, quantityOptions);\n      }\n      typedQuantity = displayQuantity;\n      paidPrintQuantity = displayQuantity;\n      priceBracketQuantity = displayQuantity;\n    }\n\n    var finalSku = '';\n    var basePrice = 0;\n    var priceRecord = null;\n    var skuPrefix = resolveSkuPrefix(store);\n    var pricing = getPricingMap(store);\n    if (skuPrefix && priceBracketQuantity > 0 && paidPrintQuantity > 0) {\n      finalSku = skuPrefix + String(priceBracketQuantity);\n      priceRecord = pricing[finalSku] || null;\n      if (!priceRecord) {\n        finalSku = '';\n      }\n    }\n    var quoteArithmetic = !!priceRecord && usesQuoteArithmetic();\n    if (priceRecord) {\n      var bracketPrice = numberValue(priceRecord.price, 0);\n      if (quoteArithmetic) {\n        var authoredPrice = numberValue(readAuthoredPrice(priceRecord, 'price'), 0);\n        basePrice = usesTypedPricing && priceBracketQuantity > 0 && paidPrintQuantity > 0\n          ? core.scaleMoney(authoredPrice, paidPrintQuantity, priceBracketQuantity)\n          : core.scaleMoney(authoredPrice, 1, 1);\n      } else if (usesTypedPricing && priceBracketQuantity > 0 && paidPrintQuantity > 0) {\n        basePrice = roundMoney(bracketPrice * (paidPrintQuantity / priceBracketQuantity));\n      } else {\n        basePrice = roundMoney(bracketPrice);\n      }\n    }\n\n    return {\n      quantityMode: quantityMode,\n      quantityOptions: quantityOptions.slice(),\n      usesTypedPricing: usesTypedPricing,\n      roundUp: roundUp,\n      bounds: bounds,\n      displayQuantity: displayQuantity,\n      typedQuantity: typedQuantity,\n      paidPrintQuantity: paidPrintQuantity,\n      priceBracketQuantity: priceBracketQuantity,\n      apparelSizesInitialized: quantityMode === 'apparelMatrix'\n        ? (!!(store && store.state && store.state.apparelSizesInitialized) || sumApparelSizes(apparelSizes) > 0)\n        : false,\n      apparelSizes: apparelSizes,\n      sizeSurchargeTotal: sizeSurchargeTotal,\n      finalSku: finalSku,\n      basePrice: basePrice,\n      priceRecord: priceRecord,\n      quoteArithmetic: quoteArithmetic\n    };\n  }\n\n  function collectQuantityOptions(store) {\n    var productConfig = getQuantityProductConfig(store);\n    if (productConfig && productConfig.quantityLockedToPricingTable === true) {\n      var configuredOptions = normalizeQuantityOptionList(productConfig.quantityPriceQuantities || productConfig.priceQuantities);\n      if (configuredOptions.length) return configuredOptions;\n    }\n    return collectPricingPrefixQuantityOptions(store);\n  }\n\n  function collectPricingPrefixQuantityOptions(store) {\n    var skuPrefix = resolveSkuPrefix(store);\n    if (!skuPrefix) return [];\n    var pricing = getPricingMap(store);\n    return Object.keys(pricing).filter(function (key) {\n      return key.indexOf(skuPrefix) === 0;\n    }).map(function (key) {\n      var suffix = key.slice(skuPrefix.length);\n      return /^\\d+$/.test(suffix) ? Number(suffix) : NaN;\n    }).filter(function (value, index, source) {\n      return Number.isFinite(value) && source.indexOf(value) === index;\n    }).sort(function (a, b) {\n      return a - b;\n    });\n  }\n\n  function collectQuantityOptionsForMode(store, quantityMode) {\n    var mode = text(quantityMode || getQuantityMode(store));\n    var prefixOptions = collectPricingPrefixQuantityOptions(store);\n    if (mode === 'rangeInput' || mode === 'eddmRoutes') {\n      if (prefixOptions.length) return prefixOptions;\n    }\n    if (\n      prefixOptions.length\n      && store\n      && store.productCommerceRuntimeBundle\n      && typeof store.productCommerceRuntimeBundle === 'object'\n      && shouldLockQuantityToPricingOptions(store, mode)\n    ) {\n      return prefixOptions;\n    }\n    return Array.isArray(store && store.quantityOptions) && store.quantityOptions.length\n      ? store.quantityOptions.slice()\n      : collectQuantityOptions(store);\n  }\n\n  function resolveDefaultQuantity(store, options) {\n    var quantityOptions = Array.isArray(options) ? options : [];\n    if (!quantityOptions.length) return 0;\n    var current = Number(store.state.quantity);\n    if (quantityOptions.indexOf(current) !== -1) return current;\n    var editQuantity = Number(store.state.project && store.state.project.printQuantity);\n    if (quantityOptions.indexOf(editQuantity) !== -1) return editQuantity;\n    var configuredDefault = Number(numberValue(store.productData && store.productData.defaultQty, NaN));\n    if (quantityOptions.indexOf(configuredDefault) !== -1) return configuredDefault;\n    var minQty = Number(numberValue(store.productData && store.productData.minQty, NaN));\n    if (quantityOptions.indexOf(minQty) !== -1) return minQty;\n    return quantityOptions[0];\n  }\n\n  // BD-NO-ROW-ZERO-PRICE (2026-10-05): a choice of options that no price row\n  // prices is a named state, never a price of 0. It holds exactly when the\n  // pricing context finds no row for a quantity it prices: the record the\n  // line would carry as its price entry, so a priced choice is never in it.\n  // The price box says one sentence, no money shows for the choice, Add to\n  // cart stays disabled through the purchase gate (validateState), and a\n  // press or the editor's direct add sends nothing. Outside the state: a page\n  // whose pricing data has not loaded, the setup-data failure (its own\n  // sentence) and a native package (its variant carries the price).\n  var NO_PRICE_ROW_MESSAGE = 'This combination has no price yet. Choose another option or contact us.';\n\n  // A quantity of 0 is a missing row only when the price code has no row at\n  // any quantity; with rows it waits for a quantity (apparel pieces not\n  // allocated yet keep their own sentence).\n  function isNoPriceRowContext(store, context) {\n    if (!store || !store.state || !store.pricingData || store.setupDataLoadFailed) return false;\n    if (!context || context.priceRecord) return false;\n    var hasQuantity = context.paidPrintQuantity > 0 && context.priceBracketQuantity > 0;\n    if (!hasQuantity && pricingPrefixHasMatches(getPricingMap(store), resolveSkuPrefix(store))) return false;\n    return getChannelPurchase(store).pricingMode !== 'native';\n  }\n\n  // The purchase gate (validateState, submitProductForm) reads the state fresh.\n  function isNoPriceRowState(store) {\n    if (!store || !store.state || !store.pricingData || store.setupDataLoadFailed) return false;\n    return isNoPriceRowContext(store, buildQuantityPricingContext(store, store.state.quantity));\n  }\n\n  // The page's displays read what recalculate recorded from its own pricing\n  // context (one pricing pass per render, none per option hint).\n  function showsNoPriceRow(store) {\n    return !!(store && store.state && store.state.priceRowMissing === true);\n  }\n\n  // One event per page view, price code and quantity, from a render (never\n  // from a price projection): the price code tells staff which row is missing.\n  function reportNoPriceRow(store) {\n    if (!showsNoPriceRow(store)) return;\n    var skuPrefix = resolveSkuPrefix(store);\n    var priceQuantity = buildQuantityPricingContext(store, store.state.quantity).priceBracketQuantity;\n    var reported = store.noPriceRowReported || (store.noPriceRowReported = {});\n    var key = skuPrefix + '|' + String(priceQuantity);\n    if (reported[key]) return;\n    reported[key] = true;\n    emitStorefrontEvent(store, 'price_row_missing', 'pricing', { skuPrefix: skuPrefix, priceQuantity: priceQuantity }, 'normal');\n  }\n\n  function getCurrentPriceRecord(store) {\n    var finalSku = text(store.state.finalSku);\n    var pricing = store.pricingData && store.pricingData.pricing && typeof store.pricingData.pricing === 'object'\n      ? store.pricingData.pricing\n      : {};\n    return finalSku ? pricing[finalSku] || null : null;\n  }\n\n  function canonicalizeMediaUrl(url) {\n    var clean = text(url).trim();\n    if (!clean) return '';\n    clean = clean.replace(/^https?:/, '');\n    clean = clean.replace(/([?&])width=\\d+/gi, '$1').replace(/[?&]$/, '');\n    return clean;\n  }\n\n  function getMediaContext(store) {\n    var host = store.root ? (store.root.closest('product-info') || document) : document;\n    var galleryViewer = host.querySelector('[id^=\"GalleryViewer-\"]');\n    var galleryList = host.querySelector('.product__media-list');\n    var thumbnailList = host.querySelector('.thumbnail-list');\n    if (!galleryViewer || !galleryList) return null;\n    return {\n      host: host,\n      galleryViewer: galleryViewer,\n      galleryList: galleryList,\n      thumbnailList: thumbnailList,\n      themePrefix: text(galleryViewer.id).replace('GalleryViewer-', '')\n    };\n  }\n\n  function removeDynamicThumbnailSlider(context) {\n    if (!context || !context.host) return;\n    var dynamicSlider = context.host.querySelector('[data-bg-designer-dynamic-thumbnails]');\n    if (dynamicSlider && dynamicSlider.parentElement) {\n      dynamicSlider.parentElement.removeChild(dynamicSlider);\n    }\n    if (context.thumbnailList && context.thumbnailList.closest('[data-bg-designer-dynamic-thumbnails]')) {\n      context.thumbnailList = null;\n    }\n  }\n\n  function ensureGalleryThumbnailList(context, imageCount) {\n    if (!context) return null;\n    var count = Number(imageCount || 0);\n    if (count <= 1) {\n      removeDynamicThumbnailSlider(context);\n      return context.thumbnailList && !context.thumbnailList.closest('[data-bg-designer-dynamic-thumbnails]')\n        ? context.thumbnailList\n        : null;\n    }\n    if (context.thumbnailList) return context.thumbnailList;\n    var slider = document.createElement('slider-component');\n    slider.id = 'GalleryThumbnails-' + context.themePrefix + '-dynamic';\n    slider.className = 'thumbnail-slider slider-mobile-gutter quick-add-hidden';\n    slider.setAttribute('data-bg-designer-dynamic-thumbnails', '1');\n    slider.innerHTML = '' +\n      '<ul id=\"Slider-Thumbnails-' + escapeHtml(context.themePrefix) + '-dynamic\" class=\"thumbnail-list list-unstyled slider slider--mobile\"></ul>';\n    if (context.galleryViewer.parentNode) {\n      context.galleryViewer.parentNode.insertBefore(slider, context.galleryViewer.nextSibling);\n    }\n    context.thumbnailList = slider.querySelector('.thumbnail-list');\n    return context.thumbnailList;\n  }\n\n  function syncDynamicThumbnailSliderState(context) {\n    if (!context || !context.thumbnailList) return;\n    var slider = context.thumbnailList.closest('[data-bg-designer-dynamic-thumbnails]');\n    if (!slider) return;\n    // A dynamically created custom element upgrades before its children are\n    // appended, so Dawn's SliderComponent constructor caches `slider = null`.\n    // Rehydrate the two constructor-owned references before media-gallery's\n    // debounced thumbnail visibility check calls isSlideVisible().\n    slider.slider = context.thumbnailList;\n    slider.sliderItems = slider.querySelectorAll('[id^=\"Slide-\"]');\n  }\n\n  function captureDefaultMediaItems(store) {\n    if (store.mediaState.defaultImages && store.mediaState.defaultImages.length) {\n      return store.mediaState.defaultImages;\n    }\n    var context = getMediaContext(store);\n    if (!context) return [];\n    var slides = Array.prototype.slice.call(context.galleryList.querySelectorAll('li.product__media-item'));\n    store.mediaState.defaultImages = slides.map(function (slide, index) {\n      var img = slide.querySelector('.product__media img');\n      if (!img) return null;\n      return {\n        url: text(img.currentSrc || img.src),\n        alt: text(img.alt),\n        idSuffix: 'default-' + index,\n        mediaFit: 'cover'\n      };\n    }).filter(Boolean);\n    return store.mediaState.defaultImages;\n  }\n\n  function updateGalleryCounter(context, activeIndex, total) {\n    if (!context || !context.host) return;\n    var currentNode = context.host.querySelector('.slider-counter--current');\n    var totalNode = context.host.querySelector('.slider-counter--total');\n    if (currentNode) currentNode.textContent = String(Math.max(1, Number(activeIndex || 0) + 1));\n    if (totalNode) totalNode.textContent = String(Math.max(1, Number(total || 0)));\n  }\n\n  function syncDesignerMediaSideToggleState(context, activeIndex) {\n    if (!context || !context.galleryList) return;\n    Array.prototype.slice.call(context.galleryList.querySelectorAll('[data-bg-designer-media-side-toggle]')).forEach(function (toggle) {\n      Array.prototype.slice.call(toggle.querySelectorAll('[data-bg-designer-media-side-index]')).forEach(function (button) {\n        var isActive = Number(button.getAttribute('data-bg-designer-media-side-index')) === Number(activeIndex);\n        button.classList.toggle('is-active', isActive);\n        button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n      });\n    });\n  }\n\n  function isMobileGalleryV2Enabled(store) {\n    var productData = plainObject(store && store.productData);\n    var productPageConfig = plainObject(productData.productPageConfig);\n    var gallery = plainObject(productPageConfig.gallery);\n    return gallery.useMobileSliderV2 === true;\n  }\n\n  function removeMobileGalleryV2(context) {\n    if (!context || !context.host) return;\n    var gallery = context.host.querySelector('media-gallery');\n    if (gallery) gallery.removeAttribute('data-bg-mobile-slider-v2');\n    Array.prototype.slice.call(context.host.querySelectorAll('[data-bg-mobile-slider-v2-ui]')).forEach(function (element) {\n      if (element.parentElement) element.parentElement.removeChild(element);\n    });\n  }\n\n  function getGallerySlides(context) {\n    if (!context || !context.galleryList) return [];\n    return Array.prototype.slice.call(context.galleryList.querySelectorAll('li.product__media-item'));\n  }\n\n  function getActiveGalleryIndex(context) {\n    var slides = getGallerySlides(context);\n    if (!slides.length) return 0;\n    var activeIndex = slides.findIndex(function (slide) {\n      return slide.classList.contains('is-active');\n    });\n    return activeIndex >= 0 ? activeIndex : 0;\n  }\n\n  function syncMobileGalleryV2MediaBox(context, activeIndex) {\n    if (!context || !context.host || !context.galleryViewer) return;\n    var gallery = context.host.querySelector('media-gallery[data-bg-mobile-slider-v2=\"true\"]');\n    if (!gallery || !gallery.style) return;\n    var slides = getGallerySlides(context);\n    var safeIndex = Math.max(0, Math.min(slides.length - 1, Number(activeIndex) || 0));\n    var activeSlide = slides[safeIndex] || slides[0];\n    var media = activeSlide && activeSlide.querySelector ? activeSlide.querySelector('.product__media') : null;\n    var positionRoot = context.galleryViewer.parentElement;\n    if (!media || !positionRoot || typeof media.getBoundingClientRect !== 'function' || typeof positionRoot.getBoundingClientRect !== 'function') {\n      gallery.style.removeProperty('--bg-gallery-v2-media-top');\n      gallery.style.removeProperty('--bg-gallery-v2-media-height');\n      return;\n    }\n    var mediaRect = media.getBoundingClientRect();\n    var rootRect = positionRoot.getBoundingClientRect();\n    var mediaTop = mediaRect.top - rootRect.top;\n    gallery.style.setProperty('--bg-gallery-v2-media-top', Math.max(0, mediaTop).toFixed(2) + 'px');\n    gallery.style.setProperty('--bg-gallery-v2-media-height', Math.max(1, mediaRect.height).toFixed(2) + 'px');\n  }\n\n  function resolveGallerySlideChangedIndex(context, event) {\n    var slides = getGallerySlides(context);\n    if (!slides.length) return 0;\n    var detail = event && event.detail && typeof event.detail === 'object' ? event.detail : {};\n    var elementIndex = slides.indexOf(detail.currentElement);\n    if (elementIndex >= 0) return elementIndex;\n    var currentPage = Number(detail.currentPage);\n    if (Number.isFinite(currentPage) && currentPage >= 1 && currentPage <= slides.length) {\n      return Math.floor(currentPage) - 1;\n    }\n    var scrollLeft = Number(context.galleryList.scrollLeft);\n    if (Number.isFinite(scrollLeft) && scrollLeft > 0) {\n      var closestIndex = 0;\n      var closestDistance = Infinity;\n      slides.forEach(function (slide, index) {\n        var distance = Math.abs(Number(slide.offsetLeft || 0) - scrollLeft);\n        if (distance < closestDistance) {\n          closestDistance = distance;\n          closestIndex = index;\n        }\n      });\n      if (closestDistance < Infinity) return closestIndex;\n    }\n    return getActiveGalleryIndex(context);\n  }\n\n  function scrollGalleryToIndex(context, activeIndex) {\n    var slides = getGallerySlides(context);\n    var activeSlide = slides[activeIndex] || slides[0];\n    if (!activeSlide || !context || !context.galleryList) return;\n    var left = Number(activeSlide.offsetLeft || 0);\n    if (typeof context.galleryList.scrollTo === 'function') {\n      context.galleryList.scrollTo({ left: left });\n    } else {\n      context.galleryList.scrollLeft = left;\n    }\n  }\n\n  function syncMobileGalleryV2State(context, activeIndex) {\n    if (!context || !context.host) return;\n    var gallery = context.host.querySelector('media-gallery[data-bg-mobile-slider-v2=\"true\"]');\n    if (!gallery) return;\n    var slides = getGallerySlides(context);\n    var safeIndex = Math.max(0, Math.min(slides.length - 1, Number(activeIndex) || 0));\n    var previous = gallery.querySelector('[data-bg-mobile-slider-v2-direction=\"previous\"]');\n    var next = gallery.querySelector('[data-bg-mobile-slider-v2-direction=\"next\"]');\n    if (previous) previous.hidden = safeIndex <= 0;\n    if (next) next.hidden = !slides.length || safeIndex >= slides.length - 1;\n    Array.prototype.slice.call(gallery.querySelectorAll('[data-bg-mobile-slider-v2-index]')).forEach(function (button) {\n      var isActive = Number(button.getAttribute('data-bg-mobile-slider-v2-index')) === safeIndex;\n      button.classList.toggle('is-active', isActive);\n      if (isActive) button.setAttribute('aria-current', 'true');\n      else button.removeAttribute('aria-current');\n    });\n    Array.prototype.slice.call(gallery.querySelectorAll('[data-bg-mobile-slider-v2-side-index]')).forEach(function (button) {\n      var isActive = Number(button.getAttribute('data-bg-mobile-slider-v2-side-index')) === safeIndex;\n      button.classList.toggle('is-active', isActive);\n      button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n    });\n    syncMobileGalleryV2MediaBox(context, safeIndex);\n  }\n\n  function buildMobileGalleryV2Arrow(direction, label) {\n    var button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'bg-mobile-slider-v2__arrow bg-mobile-slider-v2__arrow--' + direction;\n    button.setAttribute('data-bg-mobile-slider-v2-ui', '');\n    button.setAttribute('data-bg-mobile-slider-v2-direction', direction);\n    button.setAttribute('aria-label', label);\n    button.innerHTML = '<span aria-hidden=\"true\">' + (direction === 'previous' ? '&#8249;' : '&#8250;') + '</span>';\n    return button;\n  }\n\n  function syncMobileGalleryV2(store) {\n    var context = getMediaContext(store);\n    if (!context || !context.host) return;\n    var gallery = context.host.querySelector('media-gallery');\n    if (!gallery) return;\n    if (!isMobileGalleryV2Enabled(store)) {\n      removeMobileGalleryV2(context);\n      return;\n    }\n\n    gallery.setAttribute('data-bg-mobile-slider-v2', 'true');\n    if (!gallery.__bgMobileSliderV2MediaResizeBound) {\n      gallery.__bgMobileSliderV2MediaResizeBound = true;\n      window.addEventListener('resize', function () {\n        var freshContext = getMediaContext(store);\n        if (!freshContext) return;\n        syncMobileGalleryV2MediaBox(freshContext, getActiveGalleryIndex(freshContext));\n      });\n    }\n    var slides = Array.prototype.slice.call(context.galleryList.querySelectorAll('li.product__media-item'));\n    var previewIndexes = [];\n    slides.forEach(function (slide, index) {\n      if (text(slide.getAttribute('data-bg-designer-media-kind')) === 'designer-preview') previewIndexes.push(index);\n    });\n    var sourceAction = gallery.querySelector(\n      '[data-bg-designer-template-overlay] .bg-designer-storefront__media-overlay-change, ' +\n      '[data-bg-designer-saved-design-overlay] .bg-designer-storefront__media-overlay-change'\n    );\n    var signature = slides.map(function (slide) {\n      return text(slide.getAttribute('data-media-id'));\n    }).join('|') + '::' + previewIndexes.slice(0, 2).join('|') + '::' + text(sourceAction && sourceAction.textContent);\n    var existingControls = gallery.querySelector('[data-bg-mobile-slider-v2-controls]');\n    if (existingControls && existingControls.getAttribute('data-bg-mobile-slider-v2-signature') === signature) {\n      var currentExistingIndex = getActiveGalleryIndex(context);\n      syncMobileGalleryV2State(context, currentExistingIndex);\n      return;\n    }\n\n    removeMobileGalleryV2(context);\n    gallery.setAttribute('data-bg-mobile-slider-v2', 'true');\n\n    var previous = buildMobileGalleryV2Arrow('previous', 'Previous image');\n    var next = buildMobileGalleryV2Arrow('next', 'Next image');\n    context.galleryViewer.appendChild(previous);\n    context.galleryViewer.appendChild(next);\n\n    var controls = document.createElement('div');\n    controls.className = 'bg-mobile-slider-v2__controls';\n    controls.setAttribute('data-bg-mobile-slider-v2-ui', '');\n    controls.setAttribute('data-bg-mobile-slider-v2-controls', '');\n    controls.setAttribute('data-bg-mobile-slider-v2-signature', signature);\n\n    var dots = document.createElement('div');\n    dots.className = 'bg-mobile-slider-v2__dots';\n    dots.setAttribute('role', 'group');\n    dots.setAttribute('aria-label', 'Choose product image');\n    slides.forEach(function (_slide, index) {\n      var dot = document.createElement('button');\n      dot.type = 'button';\n      dot.className = 'bg-mobile-slider-v2__dot';\n      dot.setAttribute('data-bg-mobile-slider-v2-index', String(index));\n      dot.setAttribute('aria-label', 'Show image ' + String(index + 1) + ' of ' + String(slides.length));\n      dots.appendChild(dot);\n    });\n    controls.appendChild(dots);\n\n    if (previewIndexes.length >= 2) {\n      var sides = document.createElement('div');\n      sides.className = 'bg-mobile-slider-v2__sides';\n      sides.setAttribute('role', 'group');\n      sides.setAttribute('aria-label', 'Design preview side');\n      [\n        { label: 'Front', index: previewIndexes[0] },\n        { label: 'Back', index: previewIndexes[1] }\n      ].forEach(function (side) {\n        var sideButton = document.createElement('button');\n        sideButton.type = 'button';\n        sideButton.textContent = side.label;\n        sideButton.setAttribute('data-bg-mobile-slider-v2-side-index', String(side.index));\n        sideButton.setAttribute('aria-pressed', 'false');\n        sides.appendChild(sideButton);\n      });\n      controls.appendChild(sides);\n    }\n\n    if (sourceAction) {\n      var action = document.createElement('button');\n      action.type = 'button';\n      action.className = 'bg-mobile-slider-v2__preview-action';\n      action.textContent = text(sourceAction.textContent);\n      action.setAttribute('data-bg-mobile-slider-v2-preview-action', '');\n      controls.appendChild(action);\n    }\n\n    if (context.galleryViewer.parentElement) {\n      context.galleryViewer.insertAdjacentElement('afterend', controls);\n    }\n\n    function activateRequestedIndex(index) {\n      var freshContext = getMediaContext(store);\n      if (!freshContext) return;\n      activateGalleryIndex(freshContext, index, { allowThemeActivation: true });\n      syncMobileGalleryV2State(freshContext, index);\n    }\n\n    previous.addEventListener('click', function () {\n      var freshContext = getMediaContext(store);\n      if (!freshContext) return;\n      var currentIndex = getActiveGalleryIndex(freshContext);\n      activateRequestedIndex(Math.max(0, currentIndex - 1));\n    });\n    next.addEventListener('click', function () {\n      var freshContext = getMediaContext(store);\n      if (!freshContext) return;\n      var freshSlides = getGallerySlides(freshContext);\n      var currentIndex = getActiveGalleryIndex(freshContext);\n      activateRequestedIndex(Math.min(freshSlides.length - 1, currentIndex + 1));\n    });\n    controls.addEventListener('click', function (event) {\n      var target = event.target && event.target.closest ? event.target.closest('button') : null;\n      if (!target) return;\n      if (target.hasAttribute('data-bg-mobile-slider-v2-index')) {\n        activateRequestedIndex(Number(target.getAttribute('data-bg-mobile-slider-v2-index')));\n        return;\n      }\n      if (target.hasAttribute('data-bg-mobile-slider-v2-side-index')) {\n        activateRequestedIndex(Number(target.getAttribute('data-bg-mobile-slider-v2-side-index')));\n        return;\n      }\n      if (target.hasAttribute('data-bg-mobile-slider-v2-preview-action')) {\n        var currentSourceAction = gallery.querySelector(\n          '[data-bg-designer-template-overlay] .bg-designer-storefront__media-overlay-change, ' +\n          '[data-bg-designer-saved-design-overlay] .bg-designer-storefront__media-overlay-change'\n        );\n        if (currentSourceAction) currentSourceAction.click();\n      }\n    });\n\n    if (!context.galleryViewer.__bgMobileSliderV2Bound) {\n      context.galleryViewer.__bgMobileSliderV2Bound = true;\n      context.galleryViewer.addEventListener('slideChanged', function (event) {\n        var freshContext = getMediaContext(store);\n        if (!freshContext) return;\n        var freshSlides = getGallerySlides(freshContext);\n        var currentIndex = resolveGallerySlideChangedIndex(freshContext, event);\n        freshSlides.forEach(function (slide, index) {\n          slide.classList.toggle('is-active', index === currentIndex);\n        });\n        syncDesignerMediaSideToggleState(freshContext, currentIndex);\n        syncMobileGalleryV2State(freshContext, currentIndex);\n      });\n    }\n\n    var currentIndex = getActiveGalleryIndex(context);\n    syncMobileGalleryV2State(context, currentIndex);\n  }\n\n  function buildDesignerMediaSideToggle(context, frontIndex, backIndex) {\n    var toggle = document.createElement('div');\n    toggle.className = 'bg-designer-storefront-preview-modal__toggle bg-designer-storefront__media-side-toggle';\n    toggle.setAttribute('data-bg-designer-media-side-toggle', '');\n    toggle.setAttribute('role', 'group');\n    toggle.setAttribute('aria-label', 'Design preview side');\n    [\n      { label: 'Front', index: frontIndex },\n      { label: 'Back', index: backIndex }\n    ].forEach(function (side) {\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.textContent = side.label;\n      button.setAttribute('data-bg-designer-media-side-index', String(side.index));\n      button.setAttribute('aria-pressed', 'false');\n      button.addEventListener('click', function () {\n        activateGalleryIndex(context, side.index, { allowThemeActivation: true });\n      });\n      toggle.appendChild(button);\n    });\n    return toggle;\n  }\n\n  function activateGalleryIndex(context, activeIndex, options) {\n    if (!context) return;\n    var settings = options && typeof options === 'object' ? options : {};\n    var slides = getGallerySlides(context);\n    var thumbs = context.thumbnailList\n      ? Array.prototype.slice.call(context.thumbnailList.querySelectorAll('li.thumbnail-list__item'))\n      : [];\n    var safeIndex = Math.max(0, Math.min(slides.length - 1, Number(activeIndex) || 0));\n    var activeSlide = slides[safeIndex] || slides[0];\n    syncDesignerMediaSideToggleState(context, safeIndex);\n    var mediaGallery = context.host && context.host.querySelector ? context.host.querySelector('media-gallery') : null;\n    if (settings.allowThemeActivation && activeSlide && mediaGallery && typeof mediaGallery.setActiveMedia === 'function') {\n      try {\n        mediaGallery.setActiveMedia(text(activeSlide.getAttribute('data-media-id')), false);\n        updateGalleryCounter(context, safeIndex, slides.length);\n        syncMobileGalleryV2State(context, safeIndex);\n        return;\n      } catch (_) {}\n    }\n    slides.forEach(function (slide, index) {\n      slide.classList.toggle('is-active', index === safeIndex);\n    });\n    thumbs.forEach(function (thumb, index) {\n      var button = thumb.querySelector('button');\n      if (!button) return;\n      if (index === safeIndex) {\n        button.setAttribute('aria-current', 'true');\n      } else {\n        button.removeAttribute('aria-current');\n      }\n    });\n    updateGalleryCounter(context, safeIndex, slides.length);\n    if (settings.forceScroll === true) scrollGalleryToIndex(context, safeIndex);\n    syncMobileGalleryV2State(context, safeIndex);\n  }\n\n  function buildTemplatePlaceholderOverlay(store) {\n    var overlay = document.createElement('div');\n    overlay.className = 'bg-designer-storefront__media-overlay';\n    overlay.setAttribute('data-bg-designer-template-overlay', '1');\n    var badge = document.createElement('span');\n    badge.className = 'bg-designer-storefront__media-overlay-badge';\n    badge.textContent = 'Selected Template';\n    overlay.appendChild(badge);\n    var change = document.createElement('button');\n    change.type = 'button';\n    change.className = 'bg-designer-storefront__text-action bg-designer-storefront__media-overlay-change';\n    change.textContent = 'Change template';\n    change.addEventListener('click', function (event) {\n      event.preventDefault();\n      event.stopPropagation();\n      openChangeTemplateChooser(store);\n    });\n    overlay.appendChild(change);\n    return overlay;\n  }\n\n  function buildSavedDesignOverlay(store) {\n    var overlay = document.createElement('div');\n    overlay.className = 'bg-designer-storefront__media-overlay';\n    overlay.setAttribute('data-bg-designer-saved-design-overlay', '1');\n    var edit = document.createElement('button');\n    edit.type = 'button';\n    edit.className = 'bg-designer-storefront__text-action bg-designer-storefront__media-overlay-change';\n    edit.textContent = 'Edit Design';\n    edit.addEventListener('click', function (event) {\n      event.preventDefault();\n      event.stopPropagation();\n      handleArtworkAction(store, readBlocks(store), 'edit-existing-art');\n    });\n    overlay.appendChild(edit);\n    return overlay;\n  }\n\n  function rebuildGalleryWithImages(store, images, activeIndex, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var context = getMediaContext(store);\n    if (!context) return;\n    var imageArray = Array.isArray(images) ? images : [];\n    if (!imageArray.length) return;\n    var frontPreviewIndex = imageArray.findIndex(function (item) {\n      return text(item && item.previewSide) === 'front';\n    });\n    var backPreviewIndex = imageArray.findIndex(function (item) {\n      return text(item && item.previewSide) === 'back';\n    });\n    var hasFrontBackPreview = frontPreviewIndex >= 0 && backPreviewIndex >= 0;\n\n    context.galleryList.innerHTML = '';\n    context.galleryList.setAttribute('tabindex', '0');\n    context.galleryList.setAttribute('aria-label', 'Product images');\n    if (settings.allowDynamicThumbnails === false && context.thumbnailList && context.thumbnailList.closest('[data-bg-designer-dynamic-thumbnails]')) {\n      removeDynamicThumbnailSlider(context);\n      context.thumbnailList = null;\n    }\n    if (context.thumbnailList || settings.allowDynamicThumbnails !== false) {\n      context.thumbnailList = ensureGalleryThumbnailList(context, imageArray.length);\n    } else {\n      removeDynamicThumbnailSlider(context);\n      context.thumbnailList = null;\n    }\n    if (context.thumbnailList) context.thumbnailList.innerHTML = '';\n\n    imageArray.forEach(function (item, index) {\n      var imageUrl = text(item && item.url);\n      if (!imageUrl) return;\n      var imageAlt = text(item && item.alt);\n      var idSuffix = text(item && item.idSuffix) || String(index);\n      var mediaFit = text(item && item.mediaFit) || 'cover';\n      var dataMediaId = context.themePrefix + '-dynamic-' + idSuffix;\n      var slide = document.createElement('li');\n      slide.id = 'Slide-' + dataMediaId;\n      slide.className = 'product__media-item grid__item slider__slide';\n      slide.setAttribute('data-bg-designer-media-kind', text(item && item.kind) || 'default');\n      slide.setAttribute('data-media-id', dataMediaId);\n      slide.setAttribute('role', 'listitem');\n      slide.innerHTML = '' +\n        '<div class=\"product-media-container media-type-image media-fit-' + escapeHtml(mediaFit) + ' global-media-settings gradient constrain-height\" style=\"--ratio: 1.0; --preview-ratio: 1.0;\">' +\n          '<modal-opener class=\"product__modal-opener product__modal-opener--image\" data-modal=\"#ProductModal-' + escapeHtml(context.themePrefix) + '\">' +\n            '<div class=\"loading__spinner hidden\"></div>' +\n            '<div class=\"product__media media media--transparent\">' +\n              '<img src=\"' + escapeHtml(imageUrl) + '\" alt=\"' + escapeHtml(imageAlt) + '\" class=\"image-magnify-none\" loading=\"' + (index === 0 ? 'eager' : 'lazy') + '\" width=\"1946\" height=\"1946\">' +\n            '</div>' +\n            '<button class=\"product__media-toggle quick-add-hidden product__media-zoom-none\" type=\"button\" aria-haspopup=\"dialog\">' +\n              '<span class=\"visually-hidden\">Open media ' + String(index + 1) + ' in modal</span>' +\n            '</button>' +\n          '</modal-opener>' +\n        '</div>';\n      if (item && item.templatePlaceholder === true) {\n        var mediaContainer = slide.querySelector('.product-media-container');\n        if (mediaContainer) {\n          mediaContainer.appendChild(buildTemplatePlaceholderOverlay(store));\n        }\n      } else if (item && item.savedDesignOverlay === true) {\n        var savedDesignContainer = slide.querySelector('.product-media-container');\n        if (savedDesignContainer) {\n          savedDesignContainer.appendChild(buildSavedDesignOverlay(store));\n        }\n      }\n      if (hasFrontBackPreview && (index === frontPreviewIndex || index === backPreviewIndex)) {\n        var sideToggleContainer = slide.querySelector('.product-media-container');\n        if (sideToggleContainer) {\n          sideToggleContainer.insertAdjacentElement(\n            'afterend',\n            buildDesignerMediaSideToggle(context, frontPreviewIndex, backPreviewIndex)\n          );\n        }\n      }\n      context.galleryList.appendChild(slide);\n\n      if (context.thumbnailList) {\n        var thumb = document.createElement('li');\n        thumb.id = 'Slide-Thumbnails-' + dataMediaId;\n        thumb.className = 'thumbnail-list__item slider__slide';\n        thumb.setAttribute('data-bg-designer-media-kind', text(item && item.kind) || 'default');\n        thumb.setAttribute('data-bg-designer-media-fit', mediaFit);\n        thumb.setAttribute('data-target', dataMediaId);\n        thumb.setAttribute('data-media-position', String(index + 1));\n        thumb.innerHTML = '' +\n          '<button class=\"thumbnail global-media-settings global-media-settings--no-shadow\" aria-label=\"Load image ' + String(index + 1) + '\"' + (index === 0 ? ' aria-current=\"true\"' : '') + '>' +\n            '<img src=\"' + escapeHtml(imageUrl) + '\" alt=\"' + escapeHtml(imageAlt || 'Thumb') + '\" width=\"100\" height=\"100\" class=\"' + (mediaFit === 'contain' ? 'bg-designer-storefront__thumbnail-image--contain' : '') + '\">' +\n          '</button>';\n        thumb.addEventListener('click', function () {\n          activateGalleryIndex(context, index, { allowThemeActivation: true });\n        });\n        context.thumbnailList.appendChild(thumb);\n      }\n    });\n\n    syncDynamicThumbnailSliderState(context);\n\n    if (context.galleryViewer && typeof context.galleryViewer.resetPages === 'function') {\n      context.galleryViewer.resetPages();\n    }\n    activateGalleryIndex(context, Math.max(0, Number(activeIndex) || 0), {\n      allowThemeActivation: false,\n      forceScroll: true\n    });\n  }\n\n  function getSelectedHolderVariationIds(store) {\n    return store.holders.map(function (holder) {\n      var option = getSelectedOption(store, holder);\n      return text(option && option.hvId);\n    }).filter(Boolean).sort();\n  }\n\n  function getMultiVariationOverrideImage(store) {\n    var combos = store.optionLayout && store.optionLayout.multiVariationImages && store.optionLayout.multiVariationImages[getLegacyProductSourceHandle(store)];\n    if (!Array.isArray(combos) || !combos.length) return '';\n    var selectedHvIds = getSelectedHolderVariationIds(store);\n    if (!selectedHvIds.length) return '';\n    var ranked = combos.slice().sort(function (a, b) {\n      return ((b && b.variationHvIds && b.variationHvIds.length) || 0) - ((a && a.variationHvIds && a.variationHvIds.length) || 0);\n    });\n    for (var index = 0; index < ranked.length; index += 1) {\n      var combo = ranked[index] || {};\n      var needed = Array.isArray(combo.variationHvIds) ? combo.variationHvIds.map(text).filter(Boolean) : [];\n      if (!needed.length) continue;\n      var allFound = needed.every(function (hvId) {\n        return selectedHvIds.indexOf(hvId) !== -1;\n      });\n      if (allFound && text(combo.imageUrl)) {\n        return text(combo.imageUrl);\n      }\n    }\n    return '';\n  }\n\n  function getSelectedOptionOverrideImage(store, commerceAuthoredOnly) {\n    for (var index = 0; index < store.holders.length; index += 1) {\n      var holder = store.holders[index];\n      if (commerceAuthoredOnly && typeof (holder && holder.productCommerceRole) !== 'string') continue;\n      var option = getSelectedOption(store, holder);\n      if (!option) continue;\n      // A matched context picture stands in for this choice's product-image\n      // override; otherwise the choice's own override applies.\n      var overrideUrl = resolveOptionContextImageUrl(store, holder, option)\n        || text(option.overrideProductImage);\n      if (overrideUrl) return overrideUrl;\n    }\n    return '';\n  }\n\n  function getCurrentPriceImage(store) {\n    return text(getCurrentPriceRecord(store) && getCurrentPriceRecord(store).imageUrl);\n  }\n\n  function decideHeroOverrideImage(store) {\n    // Admin authority (operator ruling 2026-08-27): a selected choice's\n    // picture authored on a commerce holder outranks imported combo images.\n    // Legacy combos still outrank legacy per-value overrides, so pure-legacy\n    // pages keep their original precedence.\n    return getSelectedOptionOverrideImage(store, true)\n      || getMultiVariationOverrideImage(store)\n      || getSelectedOptionOverrideImage(store, false)\n      || getCurrentPriceImage(store) || '';\n  }\n\n  function buildMediaPreviewKey(source, images) {\n    var imageArray = Array.isArray(images) ? images : [];\n    var keyParts = imageArray.map(function (item) {\n      return canonicalizeMediaUrl(item && item.url);\n    }).filter(Boolean);\n    return text(source) + '|' + keyParts.join('|');\n  }\n\n  function buildDesignerPreviewImages(urls, altPrefix, idPrefix) {\n    var uniqueUrls = core.uniqueStrings((Array.isArray(urls) ? urls : []).map(text).filter(Boolean));\n    var baseAlt = text(altPrefix) || 'Design preview';\n    return uniqueUrls.map(function (url, index) {\n      var sideLabel = index === 0 ? 'front' : (index === 1 ? 'back' : ('side ' + String(index + 1)));\n      return {\n        url: url,\n        alt: baseAlt + ' ' + sideLabel,\n        idSuffix: text(idPrefix || 'designer-preview') + '-' + String(index + 1),\n        mediaFit: 'contain',\n        kind: 'designer-preview',\n        previewSide: index === 0 ? 'front' : (index === 1 ? 'back' : '')\n      };\n    });\n  }\n\n  function mergeDesignerPreviewImagesWithDefaults(previewImages, defaultImages) {\n    var merged = [];\n    var seen = Object.create(null);\n    function add(item) {\n      var imageUrl = text(item && item.url);\n      if (!imageUrl) return;\n      var key = canonicalizeMediaUrl(imageUrl);\n      if (key && seen[key]) return;\n      if (key) seen[key] = true;\n      merged.push(item);\n    }\n    (Array.isArray(previewImages) ? previewImages : []).forEach(add);\n    (Array.isArray(defaultImages) ? defaultImages : []).forEach(add);\n    return merged;\n  }\n\n  function getProjectMediaPreviewUrls(store) {\n    var project = store && store.state && store.state.project && typeof store.state.project === 'object'\n      ? store.state.project\n      : {};\n    var projectId = text(project.projectId);\n    if (!projectId) return [];\n    var previewUrls = readProjectPreviewList(project);\n    if (isPitchPrintLaunchProvider(store)) {\n      previewUrls = getPitchPrintPreviewUrls(projectId, project.previewUrl, previewUrls);\n      var pageCount = Number(project.numPages || project.pages || project.pageCount || project.pageLength || 0);\n      if (Number.isFinite(pageCount) && pageCount > previewUrls.length) {\n        for (var page = previewUrls.length + 1; page <= pageCount; page += 1) {\n          previewUrls.push(buildPitchPrintPreviewFallbackUrl(projectId, page));\n        }\n      }\n    }\n    return core.uniqueStrings(previewUrls.map(function (url) {\n      return appendPreviewRefreshToken(url, project.refreshToken);\n    }).filter(Boolean));\n  }\n\n  function getTemplateMediaPreviewUrls(store) {\n    var template = store && store.state && store.state.template && typeof store.state.template === 'object'\n      ? store.state.template\n      : null;\n    if (!template) return [];\n    var backerId = text(template.backer || getTemplateModalBackerId(store, template));\n    var previewUrls = getTemplatePreviewUrls(template, backerId);\n    return core.uniqueStrings([\n      previewUrls.front,\n      previewUrls.back\n    ].map(text).filter(Boolean));\n  }\n\n  function getDesignerMediaPreviewState(store) {\n    var projectUrls = getProjectMediaPreviewUrls(store);\n    if (projectUrls.length) {\n      return {\n        source: 'project',\n        images: buildDesignerPreviewImages(\n          projectUrls,\n          text(store.state.project && store.state.project.designNumber)\n            ? 'Saved design #' + text(store.state.project.designNumber)\n            : 'Saved design preview',\n          'project'\n        ).map(function (image) {\n          // Saved-project previews keep the direct Edit Design action without\n          // placing a redundant status badge over the customer's artwork.\n          image.savedDesignOverlay = true;\n          return image;\n        })\n      };\n    }\n    if (text(store && store.state && store.state.project && store.state.project.projectId)) {\n      return null;\n    }\n    var templateUrls = getTemplateMediaPreviewUrls(store);\n    if (templateUrls.length) {\n      return {\n        source: 'template',\n        images: buildDesignerPreviewImages(\n          templateUrls,\n          text(store.state.template && store.state.template.title) || 'Template preview',\n          'template'\n        ).map(function (image) {\n          // Selected-template placeholders carry the \"Selected Template\"\n          // overlay; saved-project previews carry their own \"Your Current\n          // Design\" overlay above (the earlier no-overlay decision for saved\n          // designs was reversed by the operator).\n          image.templatePlaceholder = true;\n          return image;\n        })\n      };\n    }\n    return null;\n  }\n\n  function getIntentFirstRealDesignPreview(store) {\n    var preview = getDesignerMediaPreviewState(store);\n    var image = preview && Array.isArray(preview.images) ? preview.images[0] : null;\n    var rawUrl = text(image && image.url);\n    if (!rawUrl) return null;\n    try {\n      var parsed = new URL(rawUrl, window.location.origin);\n      if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return null;\n      return { source: text(preview.source), url: parsed.toString(), alt: text(image.alt) || 'Selected design preview' };\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function supportsIntentFirstSelectedDesignLiveMockup(store) {\n    var productData = store && store.productEditorConfigProductData && typeof store.productEditorConfigProductData === 'object'\n      ? store.productEditorConfigProductData\n      : (store && store.productData && typeof store.productData === 'object' ? store.productData : {});\n    if (productData.selectedDesignLiveMockupSupported === true) return true;\n    // Boguna 3D preview Slice 5 (decision 4.9, staged): a published\n    // interactive Product Preview Profile also makes the product\n    // selected-design-preview capable. Additive only \u2014 the API-side handle\n    // allowlist above stays untouched until the operator-gated parity\n    // replacement; profile-less products see no change.\n    return !!getIntentFirstProductPreviewProjection(store);\n  }\n\n  // A design that exists but whose preview pictures have not arrived yet (an\n  // editor save or return, a saved-design resume, a cart-line restore). The\n  // live preview frame stays mounted in a loading state instead of dropping\n  // back to the product photo and re-mounting once the pictures land.\n  // Design pictures still rendering (editor return, saved-design resume) keep\n  // the preview frame for a bounded time; when they never arrive (a render\n  // failure, a save without captures) the frame falls back exactly as before\n  // this state existed: the product photo, or the 3D lane's own fallback.\n  var DESIGN_PREVIEW_PENDING_TIMEOUT_MS = 90000;\n\n  function isDesignPreviewPending(store) {\n    if (!store || !store.state || !text(store.state.project && store.state.project.projectId)) return false;\n    if (readProjectPreviewList(store.state.project).length > 0) return false;\n    var key = text(store.state.project.projectId) + ':' + text(store.state.project.refreshToken);\n    if (store.designPendingKey !== key) {\n      store.designPendingKey = key;\n      store.designPendingSince = Date.now();\n      if (store.designPendingTimer) window.clearTimeout(store.designPendingTimer);\n      store.designPendingTimer = window.setTimeout(function () {\n        store.designPendingTimer = null;\n        if (store.designPendingKey === key && !store.sectionUnloaded && store.root) render(store);\n      }, DESIGN_PREVIEW_PENDING_TIMEOUT_MS + 50);\n    }\n    return (Date.now() - Number(store.designPendingSince || 0)) < DESIGN_PREVIEW_PENDING_TIMEOUT_MS;\n  }\n\n  function resolveSelectedDesignPreviewMode(store) {\n    var presentation = readProductPresentationConfig(store);\n    var requested = text(presentation && presentation.selectedDesignPreview).toLowerCase();\n    if (requested !== 'standard' && requested !== 'live_mockup') requested = 'auto';\n    var designPreview = getIntentFirstRealDesignPreview(store);\n    var designPending = !designPreview && isDesignPreviewPending(store);\n    var supported = supportsIntentFirstSelectedDesignLiveMockup(store);\n    var projection = getIntentFirstProductPreviewProjection(store);\n    var beforeArtwork = !!(projection && projection.display && projection.display.beforeArtwork);\n    return {\n      requested: requested,\n      resolved: requested !== 'standard' && supported && (designPreview || beforeArtwork || designPending) ? 'live_mockup' : 'standard',\n      supported: supported,\n      beforeArtwork: beforeArtwork,\n      designPreview: designPreview,\n      designPending: designPending\n    };\n  }\n\n  function clearIntentFirstSelectedDesignLiveMockup(store) {\n    // A server-reserved preview frame (page shell previewReserve) holds its\n    // loading state until the product-editor-config payload decides the mode;\n    // an early render pass without the payload must not tear it down and\n    // flash the product photo.\n    var reservedProductInfo = store && store.root && store.root.closest('product-info');\n    var reservedWrapper = reservedProductInfo && reservedProductInfo.querySelector('.product__media-wrapper');\n    if (reservedWrapper && reservedWrapper.querySelector('[data-bg-intent-first-live-mockup][data-bg-preview-reserved]')\n      && !(store && store.productEditorConfigProductData) && !(store && store.productEditorConfigLoadFailed)) return;\n    // Boguna 3D preview Slice 5: removing the live-mockup region must fully\n    // dispose any live viewer first (design handoff \u00A74.7 \u2014 one live WebGL\n    // context per page, nothing survives the owning region).\n    closeIntentFirstProductPreview3d(store, { focus: false });\n    var previewState = store && store.productPreview3d;\n    if (previewState && previewState.tierObserver) {\n      previewState.tierObserver.disconnect();\n      previewState.tierObserver = null;\n    }\n    var productInfo = store && store.root && store.root.closest('product-info');\n    var wrapper = productInfo && productInfo.querySelector('.product__media-wrapper');\n    if (wrapper) {\n      Array.prototype.slice.call(wrapper.querySelectorAll('[data-bg-live-preview-toggle-bound]')).forEach(function (toggle) {\n        if (toggle.__bgIntentFirstLivePreviewToggle) {\n          toggle.removeEventListener('click', toggle.__bgIntentFirstLivePreviewToggle);\n        }\n        if (toggle.__bgIntentFirstLivePreviewAriaLabel === null) toggle.removeAttribute('aria-label');\n        else if (typeof toggle.__bgIntentFirstLivePreviewAriaLabel === 'string') {\n          toggle.setAttribute('aria-label', toggle.__bgIntentFirstLivePreviewAriaLabel);\n        }\n        toggle.removeAttribute('data-bg-live-preview-toggle-bound');\n        delete toggle.__bgIntentFirstLivePreviewToggle;\n        delete toggle.__bgIntentFirstLivePreviewAriaLabel;\n      });\n    }\n    if (wrapper) {\n      Array.prototype.slice.call(wrapper.querySelectorAll('[data-bg-live-preview-thumbnail], [data-bg-live-preview-fallback], .bg-mobile-slider-v2__dots > [data-bg-live-preview-button]')).forEach(function (node) { node.remove(); });\n      if (wrapper.__bgLivePreviewGalleryClick) wrapper.removeEventListener('click', wrapper.__bgLivePreviewGalleryClick, true);\n      delete wrapper.__bgLivePreviewGalleryClick;\n    }\n    var owner = wrapper && wrapper.querySelector('[data-bg-intent-first-live-mockup]');\n    if (owner && owner.parentNode) owner.parentNode.removeChild(owner);\n    if (wrapper) {\n      wrapper.removeAttribute('data-bg-intent-first-live-preview-active');\n      wrapper.removeAttribute('data-bg-intent-first-live-preview-mode');\n    }\n  }\n\n  function renderIntentFirstSelectedDesignLiveMockup(store) {\n    if (!store || getProductFormPresentation(store) !== 'intent_first') {\n      clearIntentFirstSelectedDesignLiveMockup(store);\n      return false;\n    }\n    var mode = resolveSelectedDesignPreviewMode(store);\n    if (mode.resolved !== 'live_mockup') {\n      clearIntentFirstSelectedDesignLiveMockup(store);\n      return false;\n    }\n    var productInfo = store.root && store.root.closest('product-info');\n    var wrapper = productInfo && productInfo.querySelector('.product__media-wrapper');\n    if (!wrapper) return false;\n    var projection = getIntentFirstProductPreviewProjection(store);\n    var artwork = mode.designPreview || {};\n    if (projection && !artwork.url && getIncompatibleProductPreviewSelection(projection, getProductPreviewSelectionPairs(store))) {\n      clearIntentFirstSelectedDesignLiveMockup(store);\n      return false;\n    }\n    var modelFamily = projection && Array.isArray(projection.optionBindings) && projection.optionBindings.some(function (binding) { return binding.action && binding.action.kind === 'model_revision'; });\n    // A family poster depicts only its default assembly. Before artwork,\n    // use the configured product photo when the customer closes 3D.\n    var productPhotoUrl = !text(artwork.url) && modelFamily\n      ? text(decideHeroOverrideImage(store)) || text((captureDefaultMediaItems(store)[0] || {}).url)\n      : '';\n    var flatUrl = text(artwork.url) || productPhotoUrl || (!modelFamily ? text(projection && projection.poster && projection.poster.url) : '');\n    var owner = wrapper.querySelector('[data-bg-intent-first-live-mockup]');\n    // A server-reserved frame (page shell previewReserve) is adopted here:\n    // its loading skeleton is replaced by the runtime's own card markup the\n    // first time the payload resolves the live mockup, in place, so the media\n    // box never flashes the product photo in between.\n    if (owner && owner.hasAttribute('data-bg-preview-reserved')) {\n      owner.removeAttribute('data-bg-preview-reserved');\n      owner.removeAttribute('aria-busy');\n      owner.innerHTML = '';\n    }\n    if (!owner || !owner.querySelector('figure')) {\n      if (!owner) {\n        owner = document.createElement('section');\n        owner.className = 'bg-intent-first-live-mockup';\n        owner.setAttribute('data-bg-intent-first-live-mockup', '');\n      }\n      // The card carries its own 2D | 3D toggle (built with the 3D chrome\n      // below); the Shopify photo gallery stays reachable through the\n      // thumbnails / mobile slider, which flip the wrapper's preview mode.\n      if (projection) {\n        owner.setAttribute('data-bg-model-preview', '');\n        owner.innerHTML = '<figure><div class=\"bg-live-sign__preview-card\"><div class=\"bg-live-sign__preview-scene\"><img class=\"bg-product-preview__flat\" data-bg-product-preview-flat alt=\"Product preview\"></div></div><figcaption></figcaption></figure>';\n      } else {\n        owner.removeAttribute('data-bg-model-preview');\n        owner.innerHTML = '<figure>' + buildLiveSignPreviewMarkup({ designPreviewUrl: artwork.url, designPreviewAlt: artwork.alt, chips: false }) + '<figcaption></figcaption></figure>';\n      }\n      if (!owner.parentNode) wrapper.insertBefore(owner, wrapper.firstChild);\n    }\n    // Design pictures still loading (editor return, saved-design resume): the\n    // frame stays and says so instead of dropping to the product photo.\n    if (mode.designPending) owner.setAttribute('data-bg-design-loading', 'true');\n    else owner.removeAttribute('data-bg-design-loading');\n    // RE3 lane-aware caption: no staff-proof promise for a design the\n    // customer makes online \u2014 the editor's review-and-approve is the approval.\n    // While the 3D preview owns the media box (Slice 5), the caption carries\n    // the illustrative disclaimer instead; the 3D sync below owns it then.\n    var mockupCaption = owner.querySelector('figcaption');\n    if (mockupCaption && !isIntentFirstProductPreview3dOpen(store)) {\n      mockupCaption.textContent = mode.designPending\n        ? getProductPreviewCopy(store, 'designLoading', 'Loading your design\u2026')\n        : !text(artwork.url) ? (productPhotoUrl ? getProductPreviewCopy(store, 'productPhoto', 'Product photo.') : getProductPreviewCopy(store, 'empty', 'Choose your options to preview this product.')) : isDesignOnlineNoProofLane(store)\n        ? getProductPreviewCopy(store, 'design', 'Preview of your design on this product.')\n        : getProductPreviewCopy(store, 'designWithProof', 'Preview of your design on this product. Your formal proof still comes before anything prints.');\n    }\n    var image = owner.querySelector('[data-bg-product-preview-flat], .bg-live-sign__preview-art');\n    if (image) {\n      // While the design pictures load, keep whatever the frame showed last\n      // (the previous design or the product poster) rather than blanking it.\n      if (!(mode.designPending && !flatUrl && image.getAttribute('src'))) {\n        image.hidden = !flatUrl;\n        if (flatUrl) image.src = flatUrl;\n      }\n      image.alt = text(artwork.alt) || 'Product preview';\n      image.onerror = function () {\n        clearIntentFirstSelectedDesignLiveMockup(store);\n      };\n    }\n    wrapper.setAttribute('data-bg-intent-first-live-preview-active', 'true');\n    if (!wrapper.getAttribute('data-bg-intent-first-live-preview-mode')) {\n      wrapper.setAttribute('data-bg-intent-first-live-preview-mode', 'live');\n    }\n    if (!projection) renderLiveSignPreview(store, owner);\n    function setPreviewMode(next) {\n      // Leaving the card for the photo gallery closes a live 3D viewer\n      // first (with disposal): nothing renders under a hidden figure.\n      var previewState = ensureProductPreview3dState(store);\n      if (next === 'flat' && previewState.visibilityObserver) { previewState.visibilityObserver.disconnect(); previewState.visibilityObserver = null; }\n      if (next === 'flat' && isIntentFirstProductPreview3dOpen(store)) {\n        closeIntentFirstProductPreview3d(store, { focus: false });\n      }\n      wrapper.setAttribute('data-bg-intent-first-live-preview-mode', next);\n    }\n    // Live Preview has its own stable first choice. Product photographs keep\n    // their identities and always open photographs, including the first one.\n    var liveLabel = getProductPreviewCopy(store, 'liveLabel', 'Live Preview');\n    var thumbnailList = wrapper.querySelector('.thumbnail-list');\n    if (thumbnailList && !thumbnailList.querySelector('[data-bg-live-preview-thumbnail]')) {\n      var liveItem = document.createElement('li');\n      liveItem.className = 'thumbnail-list__item slider__slide';\n      liveItem.setAttribute('data-bg-live-preview-thumbnail', '');\n      liveItem.innerHTML = '<button type=\"button\" class=\"thumbnail global-media-settings global-media-settings--no-shadow\" data-bg-live-preview-button><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><path d=\"m12 2 9 5v10l-9 5-9-5V7Z M3 7l9 5 9-5 M12 12v10\"/></svg><span></span></button>';\n      thumbnailList.insertBefore(liveItem, thumbnailList.firstChild);\n    }\n    var mobileDots = wrapper.querySelector('.bg-mobile-slider-v2__dots');\n    if (mobileDots && !mobileDots.querySelector('[data-bg-live-preview-button]')) {\n      var liveDot = document.createElement('button');\n      liveDot.type = 'button';\n      liveDot.setAttribute('data-bg-live-preview-button', '');\n      mobileDots.insertBefore(liveDot, mobileDots.firstChild);\n    }\n    if (!thumbnailList && !mobileDots && !wrapper.querySelector('[data-bg-live-preview-fallback]')) {\n      var fallback = document.createElement('div');\n      fallback.className = 'bg-intent-first__preview-choices';\n      fallback.setAttribute('data-bg-live-preview-fallback', '');\n      fallback.innerHTML = '<button type=\"button\" data-bg-live-preview-button></button><button type=\"button\" data-bg-product-photo-button>Product photo</button>';\n      wrapper.appendChild(fallback);\n    }\n    function syncLivePreviewSelection() {\n      var live = wrapper.getAttribute('data-bg-intent-first-live-preview-mode') === 'live';\n      Array.prototype.slice.call(wrapper.querySelectorAll('[data-bg-live-preview-button]')).forEach(function (button) {\n        var label = button.querySelector('span') || button;\n        setGuidedText(label, liveLabel);\n        button.setAttribute('aria-label', liveLabel);\n        if (live) button.setAttribute('aria-current', 'true');\n        else button.removeAttribute('aria-current');\n      });\n      var photoChoice = wrapper.querySelector('[data-bg-product-photo-button]');\n      if (photoChoice) {\n        if (live) photoChoice.removeAttribute('aria-current');\n        else photoChoice.setAttribute('aria-current', 'true');\n      }\n      if (live) Array.prototype.slice.call(wrapper.querySelectorAll('.thumbnail-list button:not([data-bg-live-preview-button]), [data-bg-mobile-slider-v2-index]')).forEach(function (button) {\n        button.removeAttribute('aria-current');\n        button.classList.remove('is-active');\n      });\n    }\n    if (wrapper.__bgLivePreviewGalleryClick) wrapper.removeEventListener('click', wrapper.__bgLivePreviewGalleryClick, true);\n    wrapper.__bgLivePreviewGalleryClick = function (event) {\n      var target = event.target && event.target.closest ? event.target : null;\n      if (!target) return;\n      if (target.closest('[data-bg-live-preview-button]')) {\n        event.preventDefault();\n        setPreviewMode('live');\n        var previewState = ensureProductPreview3dState(store);\n        previewState.autoSuppressed = false;\n        previewState.viewMode = '3d';\n        if (previewState.viewer && typeof previewState.viewer.setViewMode === 'function') previewState.viewer.setViewMode('3d');\n        else if (projection) activateIntentFirstProductPreview3d(store, null);\n        syncLivePreviewSelection();\n      } else if (target.closest('.thumbnail-list button, [data-bg-product-photo-button], [data-bg-mobile-slider-v2-index], [data-bg-mobile-slider-v2-direction], [data-bg-mobile-slider-v2-side-index]')) {\n        setPreviewMode('flat');\n        syncLivePreviewSelection();\n      }\n    };\n    wrapper.addEventListener('click', wrapper.__bgLivePreviewGalleryClick, true);\n    syncLivePreviewSelection();\n    var telemetryKey = text(artwork.source) + '|' + text(artwork.url);\n    if (store.intentFirstLiveMockupTelemetryKey !== telemetryKey) {\n      store.intentFirstLiveMockupTelemetryKey = telemetryKey;\n      emitStorefrontEvent(store, 'live_mockup_shown', 'artwork', {\n        sourceType: artwork.source === 'project' ? 'saved_project' : (artwork.url ? 'template' : 'blank')\n      }, 'normal');\n    }\n    syncIntentFirstProductPreview3d(store, owner, mode);\n    return true;\n  }\n\n  // -------------------------------------------------------------------------\n  // Boguna 3D preview Slice 5 \u2014 PDP personalized preview (design handoff \u00A72).\n  //\n  // Poster-first, on-demand interactive 3D inside the intent-first\n  // live-mockup media box. Eligibility is capability-driven: the compiled\n  // live Product Preview Profile projection riding the product-editor-config\n  // payload (additive; absent for every profile-less product, so the page is\n  // byte-identical without one). The handle allowlist keeps serving the\n  // synthetic 2D mockup unchanged (decision 4.9 stays staged). Zero 3D bytes\n  // load before the customer activates; every failure lands on the designed\n  // 2D error state and never blocks configuration, Add to Cart, or checkout.\n  // -------------------------------------------------------------------------\n\n  function getProductPreviewCopy(store, key, fallback) {\n    var copy = plainObject(readProductPresentationConfig(store).previewCopy) || {};\n    return text(copy[key]) || fallback;\n  }\n\n  // No disclaimer under the preview by default (Steve, 2026-09-25, SB-06).\n  // Admin `presentation.previewCopy.illustrative` / `.illustrativeClear` stay\n  // opt-in overrides: the clear-card \"simulated\" line shows only where Admin\n  // sets it. An empty caption takes no space.\n  var PRODUCT_PREVIEW_3D_DISCLAIMER = '';\n  var PRODUCT_PREVIEW_3D_DISCLAIMER_CLEAR = '';\n  var PRODUCT_PREVIEW_3D_ERROR_COPY = '3D preview is not available right now. You can keep customizing and ordering as usual.';\n  var PRODUCT_PREVIEW_3D_INCOMPATIBLE_COPY = 'This choice does not have a 3D preview yet. Showing the 2D preview.';\n  var PRODUCT_PREVIEW_3D_MOBILE_QUERY = '(max-width: 749px)';\n  // Model + texture bytes load straight from the canonical public asset\n  // domain (OD-059 closed 2026-09-02). STANDING TRAP: the domain sends\n  // access-control-allow-origin ONLY on requests that carry an Origin header\n  // (vary: Origin); the composite/chooser <img> tags load the SAME template\n  // preview URL without one, and the browser then hands that cached no-ACAO\n  // response to the WebGL texture load, which fails. The texture lane carries\n  // a fixed query param the bucket ignores so it owns its own cache entry.\n  var PRODUCT_PREVIEW_3D_TEXTURE_CACHE_KEY = 'texture=webgl';\n\n  function getIntentFirstProductPreviewProjection(store) {\n    var productData = store && store.productEditorConfigProductData && typeof store.productEditorConfigProductData === 'object'\n      ? store.productEditorConfigProductData\n      : (store && store.productData && typeof store.productData === 'object' ? store.productData : {});\n    var projection = plainObject(productData.productPreview);\n    if (!projection) return null;\n    var capabilities = plainObject(projection.capabilities) || {};\n    var model = plainObject(projection.model) || {};\n    var desktopModel = plainObject(model.desktop) || {};\n    if (capabilities.interactive !== true) return null;\n    if (!text(desktopModel.url)) return null;\n    if (!Array.isArray(projection.surfaces) || !projection.surfaces.length) return null;\n    return projection;\n  }\n\n  function buildProductPreview3dTextureUrl(sourceUrl) {\n    var raw = text(sourceUrl);\n    if (!raw || /^(?:data|blob):/i.test(raw)) return raw;\n    return raw + (raw.indexOf('?') === -1 ? '?' : '&') + PRODUCT_PREVIEW_3D_TEXTURE_CACHE_KEY;\n  }\n\n  function previewOrientationSemantic(orientation, width, height) {\n    width = Number(width); height = Number(height);\n    var hasSize = Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0;\n    if (hasSize && Math.abs(width - height) < 0.0001) return 'orientation:square';\n    orientation = String(orientation || '').trim().toLowerCase();\n    if (orientation === 'portrait' || orientation === 'vertical') return 'orientation:vertical';\n    if (orientation === 'landscape' || orientation === 'horizontal') return 'orientation:horizontal';\n    return !orientation && hasSize ? (width > height ? 'orientation:horizontal' : 'orientation:vertical') : '';\n  }\n\n  function getProductPreviewSelectionPairs(store) {\n    var pairs = [];\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    holders.forEach(function (holder) {\n      if (isHolderUnavailableByRules(store, holder)) return;\n      var holderId = getHolderId(holder);\n      var selected = getSelectedOption(store, holder);\n      var valueId = text(selected && selected.hvId);\n      if (!holderId || !valueId) return;\n      var pair = { optionId: holderId, valueId: valueId };\n      var colorHex = text(selected && selected.hexColor);\n      if (colorHex) pair.colorHex = colorHex;\n      pairs.push(pair);\n    });\n    var size = buildSelectedSizePayload(store);\n    // Saved artwork owns its orientation. A template default cannot describe\n    // a page the customer rotated in Studio after choosing that template.\n    var project = store.state.project || {};\n    var projectOrientation = text(project.documentOrientation);\n    // Old browser state hydrates the canonical dimension on its next read.\n    // Until then, leave orientation-bound families unmatched instead of\n    // briefly texturing the template's default assembly with rotated art.\n    var orientation = text(project.projectId) && !projectOrientation ? ''\n      : previewOrientationSemantic(projectOrientation || size.selectedOrientation, size.selectedWidth, size.selectedHeight);\n    if (orientation) pairs.push({ semantic: orientation });\n    return pairs;\n  }\n\n  function getIncompatibleProductPreviewSelection(projection, pairs) {\n    // A holder that participates in preview bindings must have its SELECTED\n    // value bound; an unbound value (e.g. a size the model has no scale for)\n    // would make the 3D claim untruthful, so the surface falls back to 2D\n    // (P-11 / P-20 \"product option incompatibility\").\n    var bindings = projection && Array.isArray(projection.optionBindings) ? projection.optionBindings : [];\n    if (!bindings.length) return null;\n    var modelRules = bindings.filter(function (binding) { return binding.action && binding.action.kind === 'model_revision'; });\n    if (modelRules.length) {\n      var matching = {};\n      modelRules.forEach(function (binding) {\n        var match = binding.match || {};\n        var conditions = Array.isArray(match.all) ? match.all : [match];\n        if (conditions.every(function (condition) { return pairs.some(function (pair) { return condition.semantic ? pair.semantic === condition.semantic : pair.optionId === condition.optionId && pair.valueId === condition.valueId; }); })) matching[binding.action.revisionId] = true;\n      });\n      if (Object.keys(matching).length !== 1) return { optionId: 'configuration', valueId: 'unavailable' };\n    }\n    var boundValuesByOption = {};\n    bindings.forEach(function (binding) {\n      var match = plainObject(binding && binding.match);\n      var optionId = text(match && match.optionId);\n      var valueId = text(match && match.valueId);\n      if (!optionId || !valueId) return;\n      if (!boundValuesByOption[optionId]) boundValuesByOption[optionId] = {};\n      boundValuesByOption[optionId][valueId] = true;\n    });\n    for (var index = 0; index < pairs.length; index += 1) {\n      var bound = boundValuesByOption[pairs[index].optionId];\n      if (bound && !bound[pairs[index].valueId]) return pairs[index];\n    }\n    return null;\n  }\n\n  function ensureProductPreview3dState(store) {\n    if (!store.productPreview3d) {\n      store.productPreview3d = {\n        status: 'inactive',\n        viewer: null,\n        runtimePromise: null,\n        generation: 0,\n        selectionKey: '',\n        textureKey: '',\n        eligibleEmitted: false,\n        sheetHistoryPushed: false,\n        listenersBound: false,\n        side: 'front',\n        viewMode: '3d'\n      };\n    }\n    return store.productPreview3d;\n  }\n\n  function isIntentFirstProductPreview3dOpen(store) {\n    var state = store && store.productPreview3d;\n    return !!state && (state.status === 'loading' || state.status === 'active');\n  }\n\n  function getProductPreview3dChrome(store) {\n    var productInfo = store && store.root && store.root.closest('product-info');\n    var owner = productInfo && productInfo.querySelector('[data-bg-intent-first-live-mockup]');\n    if (!owner) return null;\n    var stage = owner.querySelector('[data-bg-pdp-3d-stage]');\n    if (!stage) return null;\n    var all = function (selector) { return Array.prototype.slice.call(owner.querySelectorAll(selector)); };\n    var sceneControls = owner.querySelector('[data-bg-pdp-preview-scene-controls]');\n    var sheet = owner.querySelector('[data-bg-pdp-scene-sheet]');\n    return {\n      owner: owner,\n      scene: owner.querySelector('.bg-live-sign__preview-scene'),\n      stage: stage,\n      canvasHost: owner.querySelector('[data-bg-pdp-3d-canvas-host]'),\n      flat: owner.querySelector('[data-bg-pdp-flat]'),\n      flatImage: owner.querySelector('[data-bg-pdp-flat-image]'),\n      loading: owner.querySelector('[data-bg-pdp-3d-loading]'),\n      controls: owner.querySelector('[data-bg-pdp-3d-controls]'),\n      controlsRow: owner.querySelector('[data-bg-pdp-preview-controls]'),\n      modes: owner.querySelector('[data-bg-pdp-preview-modes]'),\n      modeButtons: all('[data-bg-pdp-preview-renderer]'),\n      surfaces: owner.querySelector('[data-bg-pdp-3d-surfaces]'),\n      surfaceSelect: owner.querySelector('[data-bg-pdp-3d-surface-select]'),\n      sceneButton: owner.querySelector('[data-bg-pdp-scene-open]'),\n      sceneControls: sceneControls,\n      // The toolbar switch and its Scene-sheet twin carry the same data\n      // attribute: one click handler, one sync, never two state owners.\n      autoRotate: sceneControls ? sceneControls.querySelector('[data-bg-pdp-auto-rotate]') : null,\n      ground: sceneControls ? sceneControls.querySelector('[data-bg-pdp-show-ground]') : null,\n      autoRotates: all('[data-bg-pdp-auto-rotate]'),\n      grounds: all('[data-bg-pdp-show-ground]'),\n      sheet: sheet,\n      sheetClose: sheet ? sheet.querySelector('[data-bg-pdp-scene-close]') : null,\n      sheetBackdrop: owner.querySelector('[data-bg-pdp-scene-backdrop]'),\n      sheetBackdropField: owner.querySelector('[data-bg-pdp-sheet-backdrop-field]'),\n      sheetBackdrops: owner.querySelector('[data-bg-pdp-sheet-backdrops]'),\n      sheetGroundRow: owner.querySelector('[data-bg-pdp-sheet-ground-row]'),\n      sheetRotateRow: owner.querySelector('[data-bg-pdp-sheet-rotate-row]'),\n      updating: owner.querySelector('[data-bg-pdp-preview-updating]'),\n      backdropField: owner.querySelector('[data-bg-pdp-3d-backdrop-field]'),\n      backdropSelect: owner.querySelector('[data-bg-pdp-3d-backdrop-field] [data-bg-pdp-3d-backdrop-select]'),\n      zoomIn: owner.querySelector('[data-bg-pdp-3d-zoom-in]'),\n      zoomOut: owner.querySelector('[data-bg-pdp-3d-zoom-out]'),\n      hint: owner.querySelector('[data-bg-pdp-3d-hint]'),\n      hintText: owner.querySelector('[data-bg-pdp-3d-hint-text]'),\n      hintZoom: owner.querySelector('[data-bg-pdp-3d-hint-zoom]'),\n      empty: owner.querySelector('[data-bg-pdp-3d-empty]'),\n      notice: owner.querySelector('[data-bg-pdp-3d-notice]'),\n      noticeText: owner.querySelector('[data-bg-pdp-3d-notice-text]'),\n      retry: owner.querySelector('[data-bg-pdp-3d-retry]'),\n      liveRegion: owner.querySelector('[data-bg-pdp-3d-live]'),\n      caption: owner.querySelector('figcaption')\n    };\n  }\n\n  function renderProductPreview3dSurfaceButtons(store, projection) {\n    // Built when the live projection arrives: initial render passes can\n    // run before the product-editor-config payload (and its projection)\n    // arrives, so the chrome shell never bakes surface assumptions in.\n    var chrome = getProductPreview3dChrome(store);\n    var group = chrome ? chrome.surfaces : null;\n    if (!group) return;\n    var surfaceSides = listProductPreview3dSides(projection);\n    if (!surfaceSides.length) surfaceSides = ['front'];\n    var sidesKey = JSON.stringify(surfaceSides);\n    if (group.getAttribute('data-bg-pdp-3d-sides-key') === sidesKey) return;\n    group.setAttribute('data-bg-pdp-3d-sides-key', sidesKey);\n    var current = getProductPreview3dSide(store);\n    if (surfaceSides.indexOf(current) === -1) current = surfaceSides[0];\n    ensureProductPreview3dState(store).side = current;\n    var useSelect = surfaceSides.length > 2 || surfaceSides.some(function (side) { return side.length > 10; });\n    group.innerHTML = surfaceSides.map(function (side) {\n      var label = side.charAt(0).toUpperCase() + side.slice(1);\n      return '<button type=\"button\" data-bg-pdp-3d-surface=\"' + escapeHtml(side) + '\" aria-pressed=\"' + (side === current ? 'true' : 'false') + '\"' + (useSelect ? ' hidden' : '') + '>' + escapeHtml(label) + '</button>';\n    }).join('') + (useSelect ? '<span class=\"bg-intent-first-live-mockup__side-field\"><select class=\"bg-intent-first-live-mockup__side-select\" data-bg-pdp-3d-surface-select aria-label=\"3D view side\">' + surfaceSides.map(function (side) {\n      return '<option value=\"' + escapeHtml(side) + '\">' + escapeHtml(side.charAt(0).toUpperCase() + side.slice(1)) + '</option>';\n    }).join('') + '</select></span>' : '');\n    // Shown by the row sync while the stage is up (flat proof or scene), and\n    // only when the model has two sides to switch between.\n    group.setAttribute('data-bg-pdp-3d-sides', String(surfaceSides.length));\n    group.hidden = true;\n  }\n\n  // The model's sides, front first: the Front | Back switch and the flat\n  // proof read the same list.\n  function listProductPreview3dSides(projection) {\n    var sides = [];\n    (Array.isArray(projection && projection.surfaces) ? projection.surfaces : []).forEach(function (mapping) {\n      var side = text(mapping && mapping.board && mapping.board.side);\n      if (side && sides.indexOf(side) === -1) sides.push(side);\n    });\n    sides.sort(function (a, b) {\n      if (a === 'front') return -1;\n      if (b === 'front') return 1;\n      return 0;\n    });\n    return sides;\n  }\n\n  function getProductPreview3dSide(store) {\n    var state = store && store.productPreview3d;\n    return text(state && state.side) || 'front';\n  }\n\n  // Stage glyphs (16px strokes over the canvas); each button's aria-label\n  // carries the name so the floating stack stays compact.\n  var PRODUCT_PREVIEW_3D_RESET_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path><path d=\"M3 3v5h5\"></path></svg>';\n  var PRODUCT_PREVIEW_3D_ZOOM_IN_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 5v14M5 12h14\"></path></svg>';\n  var PRODUCT_PREVIEW_3D_ZOOM_OUT_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12h14\"></path></svg>';\n  // The Scene button (compact modules): three sliders.\n  var PRODUCT_PREVIEW_3D_SCENE_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 6h18M8 12h13M3 18h14\"></path></svg>';\n  // The Scene sheet closes with the option sheets' X (SB-08); its Background\n  // rows carry the same check.\n  var PRODUCT_PREVIEW_3D_CLOSE_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m6 6 12 12M6 18 18 6\"></path></svg>';\n  var PRODUCT_PREVIEW_3D_CHECK_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m5 12 4 4L19 6\"></path></svg>';\n  var PRODUCT_PREVIEW_3D_EMPTY_COPY = 'Pick a template or upload artwork to see it here';\n  // A device without WebGL keeps the flat 2D preview: a truthful notice with\n  // no \"Try again\" and no 3D control that could not work.\n  var PRODUCT_PREVIEW_3D_DEVICE_COPY = '3D isn\u2019t available on this device \u2014 showing the 2D preview.';\n  var PRODUCT_PREVIEW_3D_HINT_DESKTOP = 'Drag to rotate \u00B7 Scroll to zoom';\n  var PRODUCT_PREVIEW_3D_HINT_MOBILE = 'Drag to rotate \u00B7 Pinch to zoom';\n\n  // The module lays out by ITS OWN width (it lives in the product-media\n  // column): one toolbar row and a 16:10 viewport from 900px, a wrapping\n  // toolbar and 4:3 viewport between, and one 44px row with a square\n  // viewport and the Scene sheet at 640px and below.\n  function resolveProductPreview3dTier(width) {\n    return width >= 900 ? 'wide' : width >= 641 ? 'medium' : 'compact';\n  }\n\n  function isProductPreview3dCompact(store) {\n    var state = store && store.productPreview3d;\n    return !!state && state.tier === 'compact';\n  }\n\n  function syncProductPreview3dTier(store, owner, widthInput) {\n    if (!owner) return;\n    var width = numberValue(widthInput, 0);\n    if (!(width > 0)) width = owner.clientWidth || 0;\n    if (!(width > 0) && typeof owner.getBoundingClientRect === 'function') width = owner.getBoundingClientRect().width || 0;\n    // A hidden module (the photo gallery is showing) keeps its last tier.\n    if (!(width > 0)) return;\n    var tier = resolveProductPreview3dTier(width);\n    var state = ensureProductPreview3dState(store);\n    if (state.tier === tier && owner.getAttribute('data-bg-pdp-preview-tier') === tier) return;\n    state.tier = tier;\n    owner.setAttribute('data-bg-pdp-preview-tier', tier);\n    // Growing past the compact tier moves the scene controls back into the\n    // toolbar: the sheet closes and focus lands on those controls.\n    if (state.sheetOpen && tier !== 'compact') closeProductPreview3dSceneSheet(store, { focus: 'controls' });\n    syncProductPreview3dRowControls(store);\n  }\n\n  function focusProductPreview3dElement(element) {\n    if (!element || typeof element.focus !== 'function') return false;\n    // Keyboard focus may reveal a row inside the scrolling Scene sheet.\n    var inSheet = element.closest && element.closest('[data-bg-pdp-scene-sheet]');\n    try { element.focus({ preventScroll: !inSheet }); } catch (_) {\n      try { element.focus(); } catch (__) { return false; }\n    }\n    return true;\n  }\n\n  function listProductPreview3dFocusables(root) {\n    if (!root) return [];\n    return Array.prototype.slice.call(root.querySelectorAll('button:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')).filter(function (element) {\n      return element.tabIndex !== -1 && !element.hidden && !element.closest('[hidden]');\n    });\n  }\n\n  function ensureProductPreview3dChrome(store, owner) {\n    var scene = owner && owner.querySelector('.bg-live-sign__preview-scene');\n    var figure = owner && owner.querySelector('figure');\n    var card = owner && owner.querySelector('.bg-live-sign__preview-card');\n    if (!scene || !figure || !card) return null;\n    if (!owner.querySelector('[data-bg-pdp-3d-stage]')) {\n      // The toolbar ABOVE the viewport, inside the card. Primary group: the\n      // configured sides (3D only), the 2D | 3D segments, and the Scene\n      // button that opens the sheet on compact modules. Scene group (wide\n      // and medium modules): the Background select and the Ground and\n      // Auto-rotate switches. Only the zoom stack and the hint float over\n      // the canvas.\n      var controlsRow = document.createElement('div');\n      controlsRow.className = 'bg-intent-first-live-mockup__controls';\n      controlsRow.setAttribute('data-bg-pdp-preview-controls', '');\n      controlsRow.hidden = true;\n      controlsRow.innerHTML = '' +\n        '<div class=\"bg-intent-first-live-mockup__primary\" data-bg-pdp-preview-primary>' +\n          '<div class=\"bg-intent-first-live-mockup__sides\" data-bg-pdp-3d-surfaces role=\"group\" aria-label=\"3D view side\" hidden></div>' +\n          '<div class=\"bg-intent-first-live-mockup__modes\" data-bg-pdp-preview-modes role=\"group\" aria-label=\"Preview mode\">' +\n            '<button type=\"button\" data-bg-pdp-preview-renderer=\"2d\" aria-pressed=\"true\">2D</button>' +\n            '<button type=\"button\" data-bg-pdp-preview-renderer=\"3d\" aria-pressed=\"false\">3D</button>' +\n          '</div>' +\n          '<button type=\"button\" class=\"bg-intent-first-live-mockup__scene-button\" data-bg-pdp-scene-open aria-haspopup=\"dialog\" aria-expanded=\"false\" aria-label=\"Scene settings\" hidden>' + PRODUCT_PREVIEW_3D_SCENE_ICON + '</button>' +\n        '</div>' +\n        '<div class=\"bg-intent-first-live-mockup__scene-controls\" data-bg-pdp-preview-scene-controls>' +\n          '<label class=\"bg-intent-first-live-mockup__backdrop\" data-bg-pdp-3d-backdrop-field hidden><span>Background</span><select data-bg-pdp-3d-backdrop-select></select></label>' +\n          '<label class=\"bg-intent-first-live-mockup__switch\" data-bg-pdp-switch hidden><span>Ground</span><button type=\"button\" class=\"bg-intent-first-live-mockup__toggle\" role=\"switch\" aria-checked=\"true\" data-bg-pdp-show-ground></button></label>' +\n          '<label class=\"bg-intent-first-live-mockup__switch\" data-bg-pdp-switch hidden><span>Auto-rotate</span><button type=\"button\" class=\"bg-intent-first-live-mockup__toggle\" role=\"switch\" aria-checked=\"false\" data-bg-pdp-auto-rotate></button></label>' +\n        '</div>';\n      card.insertBefore(controlsRow, scene);\n      var stage = document.createElement('div');\n      stage.className = 'bg-intent-first-live-mockup__stage3d';\n      stage.setAttribute('data-bg-pdp-3d-stage', '');\n      stage.hidden = true;\n      // The flat proof (SB-14 / SB-15): the selected side's own artwork in\n      // the same frame. It shows at once while 3D loads, whenever 2D is\n      // chosen, and when 3D is gone. The viewer stays mounted under it.\n      stage.innerHTML = '' +\n        '<div class=\"bg-intent-first-live-mockup__stage3d-canvas\" data-bg-pdp-3d-canvas-host></div>' +\n        '<div class=\"bg-intent-first-live-mockup__flat\" data-bg-pdp-flat hidden><img class=\"bg-intent-first-live-mockup__flat-image\" data-bg-pdp-flat-image alt=\"\" decoding=\"async\" hidden></div>' +\n        '<div class=\"bg-intent-first-live-mockup__stage3d-controls\" data-bg-pdp-3d-controls hidden>' +\n          '<div class=\"bg-intent-first-live-mockup__stage3d-zoom\" role=\"group\" aria-label=\"3D zoom controls\">' +\n            '<button type=\"button\" data-bg-pdp-3d-zoom-in aria-label=\"Zoom in\">' + PRODUCT_PREVIEW_3D_ZOOM_IN_ICON + '</button>' +\n            '<button type=\"button\" data-bg-pdp-3d-zoom-out aria-label=\"Zoom out\">' + PRODUCT_PREVIEW_3D_ZOOM_OUT_ICON + '</button>' +\n            '<button type=\"button\" data-bg-pdp-3d-reset aria-label=\"Reset view\">' + PRODUCT_PREVIEW_3D_RESET_ICON + '</button>' +\n          '</div>' +\n          '<div class=\"bg-intent-first-live-mockup__stage3d-hint\" data-bg-pdp-3d-hint aria-hidden=\"true\" hidden><span data-bg-pdp-3d-hint-text></span><span class=\"bg-intent-first-live-mockup__stage3d-hint-zoom\" data-bg-pdp-3d-hint-zoom hidden></span></div>' +\n        '</div>' +\n        '<span class=\"bg-intent-first-live-mockup__updating\" data-bg-pdp-preview-updating role=\"status\" aria-label=\"Updating preview\" hidden></span>' +\n        // Design loading (pictures still rendering after an editor return) is\n        // the only overlay: a quiet spinner and its copy, no Cancel. A first\n        // 3D load shows the flat proof instead, with an activity cue on the\n        // 3D segment (SB-15).\n        '<div class=\"bg-intent-first-live-mockup__stage3d-loading\" data-bg-pdp-3d-loading hidden>' +\n          '<span class=\"bg-intent-first-live-mockup__stage3d-spinner\" aria-hidden=\"true\"></span>' +\n          '<p></p>' +\n        '</div>' +\n        '<div class=\"bg-intent-first-live-mockup__stage3d-empty\" data-bg-pdp-3d-empty hidden></div>';\n      scene.appendChild(stage);\n      // The Scene sheet rises from the bottom of the screen like the option\n      // sheets, with their header and X; the preview stays visible above it\n      // (SB-08). It lives beside the figure so the viewport's clipping and\n      // stacking never trap it.\n      var sheetBackdrop = document.createElement('div');\n      sheetBackdrop.className = 'bg-intent-first-live-mockup__scene-backdrop';\n      sheetBackdrop.setAttribute('data-bg-pdp-scene-backdrop', '');\n      sheetBackdrop.setAttribute('data-bg-pdp-scene-close', '');\n      sheetBackdrop.hidden = true;\n      owner.appendChild(sheetBackdrop);\n      var sheet = document.createElement('div');\n      sheet.className = 'bg-intent-first-live-mockup__scene-sheet';\n      sheet.setAttribute('data-bg-pdp-scene-sheet', '');\n      sheet.setAttribute('role', 'dialog');\n      sheet.setAttribute('aria-modal', 'true');\n      sheet.setAttribute('aria-label', 'Scene settings');\n      sheet.hidden = true;\n      sheet.innerHTML = '' +\n        '<div class=\"bg-intent-first-live-mockup__scene-head\"><h2 class=\"bg-intent-first-live-mockup__scene-title\">Scene</h2><button type=\"button\" class=\"bg-intent-first-live-mockup__scene-close\" data-bg-pdp-scene-close aria-label=\"Close\">' + PRODUCT_PREVIEW_3D_CLOSE_ICON + '</button></div>' +\n        '<div class=\"bg-intent-first-live-mockup__scene-field\" data-bg-pdp-sheet-backdrop-field hidden><div class=\"bg-intent-first-live-mockup__scene-label\" id=\"' + escapeHtml(productPreview3dSheetLabelId(owner)) + '\">Background</div><div data-bg-pdp-sheet-backdrops></div></div>' +\n        '<label class=\"bg-intent-first-live-mockup__scene-row\" data-bg-pdp-switch data-bg-pdp-sheet-ground-row hidden><span>Show ground</span><button type=\"button\" class=\"bg-intent-first-live-mockup__toggle\" role=\"switch\" aria-checked=\"true\" data-bg-pdp-show-ground></button></label>' +\n        '<label class=\"bg-intent-first-live-mockup__scene-row\" data-bg-pdp-switch data-bg-pdp-sheet-rotate-row hidden><span>Auto-rotate</span><button type=\"button\" class=\"bg-intent-first-live-mockup__toggle\" role=\"switch\" aria-checked=\"false\" data-bg-pdp-auto-rotate></button></label>';\n      owner.appendChild(sheet);\n      var empty = stage.querySelector('[data-bg-pdp-3d-empty]');\n      if (empty) empty.textContent = getProductPreviewCopy(store, 'emptyScene', PRODUCT_PREVIEW_3D_EMPTY_COPY);\n      // The notice floats at the top of the viewport (over the flat preview\n      // after a fallback) with a status dot; the retry link stays for\n      // recoverable errors.\n      var notice = document.createElement('div');\n      notice.className = 'bg-intent-first-live-mockup__3d-notice';\n      notice.setAttribute('data-bg-pdp-3d-notice', '');\n      notice.setAttribute('role', 'status');\n      notice.hidden = true;\n      notice.innerHTML = '<span data-bg-pdp-3d-notice-text></span> <button type=\"button\" data-bg-pdp-3d-retry>Try again</button>';\n      scene.appendChild(notice);\n      var liveRegion = document.createElement('span');\n      liveRegion.className = 'visually-hidden';\n      liveRegion.setAttribute('aria-live', 'polite');\n      liveRegion.setAttribute('data-bg-pdp-3d-live', '');\n      owner.appendChild(liveRegion);\n      bindProductPreview3dChrome(store, owner);\n      // Tier by module width: measured now (no mount layout shift) and on\n      // every resize. A rebuilt card replaces the previous observer.\n      var tierState = ensureProductPreview3dState(store);\n      if (tierState.tierObserver) { try { tierState.tierObserver.disconnect(); } catch (_) {} tierState.tierObserver = null; }\n      syncProductPreview3dTier(store, owner);\n      if (typeof ResizeObserver === 'function') {\n        var tierObserver = new ResizeObserver(function (entries) {\n          if (tierState.tierObserver !== tierObserver || !owner.isConnected) return;\n          var entry = entries[entries.length - 1];\n          syncProductPreview3dTier(store, owner, entry && entry.contentRect ? entry.contentRect.width : 0);\n        });\n        tierState.tierObserver = tierObserver;\n        tierObserver.observe(owner);\n      }\n    }\n    return getProductPreview3dChrome(store);\n  }\n\n  var productPreview3dSheetLabelSerial = 0;\n  function productPreview3dSheetLabelId(owner) {\n    if (!owner.__bgPdpSheetLabelId) owner.__bgPdpSheetLabelId = 'bg-pdp-scene-background-' + (++productPreview3dSheetLabelSerial);\n    return owner.__bgPdpSheetLabelId;\n  }\n\n  // One background action for every chooser (toolbar select, sheet segments\n  // or sheet select): offered backdrops go to setBackdrop; the plain\n  // light/dark presentation of a profile without backdrops goes to\n  // setEnvironmentMode. The viewer stays the only state owner.\n  function applyProductPreview3dBackground(store, kind, value) {\n    var state = store.productPreview3d;\n    var viewer = state && state.viewer;\n    if (!viewer || !text(value)) return;\n    if (kind === 'environment') {\n      if (typeof viewer.setEnvironmentMode === 'function') viewer.setEnvironmentMode(text(value));\n      return;\n    }\n    if (typeof viewer.setBackdrop === 'function') viewer.setBackdrop(text(value));\n  }\n\n  function bindProductPreview3dChrome(store, owner) {\n    owner.addEventListener('click', function (event) {\n      var target = event.target && event.target.closest ? event.target : null;\n      if (!target) return;\n      var renderer = target.closest('[data-bg-pdp-preview-renderer]');\n      if (renderer && owner.contains(renderer)) {\n        // 2D | 3D is a view switch, never a reload: 2D shows the flat proof\n        // over the mounted scene, 3D reveals the scene (loading it the first\n        // time). Focus stays on the button the customer pressed.\n        event.preventDefault();\n        if (renderer.disabled) return;\n        var requestedMode = text(renderer.getAttribute('data-bg-pdp-preview-renderer')) === '2d' ? '2d' : '3d';\n        var modeState = ensureProductPreview3dState(store);\n        if (requestedMode === '3d' && modeState.status !== 'loading' && modeState.status !== 'active') {\n          modeState.viewMode = '3d';\n          activateIntentFirstProductPreview3d(store, renderer);\n          return;\n        }\n        setProductPreview3dViewMode(store, requestedMode);\n        return;\n      }\n      var retry = target.closest('[data-bg-pdp-3d-retry]');\n      if (retry && owner.contains(retry)) {\n        event.preventDefault();\n        ensureProductPreview3dState(store).viewMode = '3d';\n        activateIntentFirstProductPreview3d(store, retry);\n        return;\n      }\n      // The builder captures its Scene trigger through the existing adapter.\n      // Unclaimed clicks open this sheet. X and the backdrop close it.\n      var sceneOpen = target.closest('[data-bg-pdp-scene-open]');\n      if (sceneOpen && owner.contains(sceneOpen)) {\n        event.preventDefault();\n        if (sceneOpen.disabled) return;\n        if (store.productPreview3d && store.productPreview3d.sheetOpen) closeProductPreview3dSceneSheet(store, { focus: 'button' });\n        else openProductPreview3dSceneSheet(store);\n        return;\n      }\n      var sceneClose = target.closest('[data-bg-pdp-scene-close]');\n      if (sceneClose && owner.contains(sceneClose)) {\n        event.preventDefault();\n        closeProductPreview3dSceneSheet(store, { focus: 'button' });\n        return;\n      }\n      var control = target.closest('button, select');\n      if (control && control.disabled) return;\n      // Front | Back switches the flat proof and the scene alike, with or\n      // without a live viewer.\n      var surface = target.closest('[data-bg-pdp-3d-surface]');\n      if (surface && owner.contains(surface)) {\n        event.preventDefault();\n        selectProductPreview3dSide(store, text(surface.getAttribute('data-bg-pdp-3d-surface')));\n        return;\n      }\n      var state = store.productPreview3d;\n      if (!state || !state.viewer) return;\n      // S2 (2026-09-16): the whole Background control opens its list. A\n      // label click only focuses a native select, so the caption and the\n      // label's own padding open the picker directly; a click on the select\n      // itself keeps the browser's behavior.\n      var backdropField = target.closest('[data-bg-pdp-3d-backdrop-field]');\n      if (backdropField && owner.contains(backdropField) && !target.closest('[data-bg-pdp-3d-backdrop-select]')) {\n        event.preventDefault();\n        openProductPreview3dBackgroundSelect(backdropField.querySelector('[data-bg-pdp-3d-backdrop-select]'));\n        return;\n      }\n      if (target.closest('[data-bg-pdp-auto-rotate]')) {\n        event.preventDefault();\n        state.viewer.setAutoRotate({ enabled: !state.viewer.state.autoRotate });\n        return;\n      }\n      if (target.closest('[data-bg-pdp-show-ground]')) {\n        event.preventDefault();\n        state.viewer.setGroundVisible(!state.viewer.state.groundVisible);\n        return;\n      }\n      var backgroundSegment = target.closest('[data-bg-pdp-3d-backdrop]');\n      if (backgroundSegment) {\n        event.preventDefault();\n        applyProductPreview3dBackground(store, text(backgroundSegment.getAttribute('data-bg-pdp-3d-backdrop-kind')), text(backgroundSegment.getAttribute('data-bg-pdp-3d-backdrop')));\n        return;\n      }\n      if (target.closest('[data-bg-pdp-3d-zoom-in]')) {\n        event.preventDefault();\n        state.viewer.zoomIn();\n        return;\n      }\n      if (target.closest('[data-bg-pdp-3d-zoom-out]')) {\n        event.preventDefault();\n        state.viewer.zoomOut();\n        return;\n      }\n      if (target.closest('[data-bg-pdp-3d-reset]')) {\n        event.preventDefault();\n        // Reset = the viewer's own camera reset, and the turntable off so\n        // the authored view stays put.\n        state.viewer.resetView();\n        if (typeof state.viewer.setAutoRotate === 'function') state.viewer.setAutoRotate({ enabled: false });\n        return;\n      }\n    });\n    // Background (the surface behind the product, or the plain light/dark\n    // presentation): one option per choice the product offers; the chosen\n    // option mirrors the viewer. The toolbar select and a sheet select share\n    // this handler.\n    owner.addEventListener('change', function (event) {\n      var sideSelect = event.target && event.target.closest ? event.target.closest('[data-bg-pdp-3d-surface-select]') : null;\n      if (sideSelect && !sideSelect.disabled) {\n        selectProductPreview3dSide(store, text(sideSelect.value));\n        return;\n      }\n      var select = event.target && event.target.closest ? event.target.closest('[data-bg-pdp-3d-backdrop-select]') : null;\n      if (!select || select.disabled) return;\n      applyProductPreview3dBackground(store, text(select.getAttribute('data-bg-pdp-3d-backdrop-kind')), text(select.value));\n    });\n    owner.addEventListener('keydown', function (event) {\n      var state = store.productPreview3d;\n      var sheetOpen = !!state && state.sheetOpen;\n      var radio = event.target && event.target.closest ? event.target.closest('[role=\"radio\"][data-bg-pdp-3d-backdrop]') : null;\n      if (sheetOpen && radio && /^(ArrowLeft|ArrowRight|ArrowUp|ArrowDown|Home|End)$/.test(event.key)) {\n        var radios = Array.prototype.slice.call(radio.parentNode.querySelectorAll('[role=\"radio\"]'));\n        var index = radios.indexOf(radio);\n        var next = event.key === 'Home' ? 0 : event.key === 'End' ? radios.length - 1\n          : (index + (/^(ArrowLeft|ArrowUp)$/.test(event.key) ? -1 : 1) + radios.length) % radios.length;\n        event.preventDefault();\n        radios[next].click();\n        syncProductPreview3dRowControls(store);\n        focusProductPreview3dElement(radios[next]);\n        return;\n      }\n      if (event.key === 'Tab' && sheetOpen) {\n        // Focus stays inside the modal sheet.\n        var chrome = getProductPreview3dChrome(store);\n        var focusables = listProductPreview3dFocusables(chrome && chrome.sheet);\n        if (!focusables.length) { event.preventDefault(); return; }\n        var first = focusables[0];\n        var last = focusables[focusables.length - 1];\n        var current = document.activeElement;\n        if (event.shiftKey && (current === first || !chrome.sheet.contains(current))) { event.preventDefault(); focusProductPreview3dElement(last); }\n        else if (!event.shiftKey && (current === last || !chrome.sheet.contains(current))) { event.preventDefault(); focusProductPreview3dElement(first); }\n        return;\n      }\n      if (event.key !== 'Escape') return;\n      // Escape closes the sheet first; a second Escape shows the flat proof\n      // (the scene stays mounted, like pressing 2D).\n      if (sheetOpen) {\n        event.preventDefault();\n        event.stopPropagation();\n        closeProductPreview3dSceneSheet(store, { focus: 'button' });\n        return;\n      }\n      if (!isIntentFirstProductPreview3dOpen(store) || state.viewMode === '2d') return;\n      event.preventDefault();\n      event.stopPropagation();\n      setProductPreview3dViewMode(store, '2d');\n    });\n    var state = ensureProductPreview3dState(store);\n    if (!state.listenersBound) {\n      state.listenersBound = true;\n      // Browser Back closes an open Scene sheet on phones (its own history\n      // entry, like the option sheets) and never leaves the page for it.\n      window.addEventListener('popstate', function (event) {\n        handleProductPreview3dHistoryTraversal(store, event);\n      }, true);\n      window.addEventListener('resize', function () {\n        if (state.sheetOpen) scrollProductPreview3dAboveSheet(state.sheetChrome);\n      });\n      if (window.visualViewport) window.visualViewport.addEventListener('resize', function () {\n        if (state.sheetOpen) scrollProductPreview3dAboveSheet(state.sheetChrome);\n      });\n      window.addEventListener('pagehide', function () {\n        // fromPopstate here means \"do not touch history\": the page is\n        // unloading, so only disposal matters (a history.back() mid-unload\n        // could fight the navigation itself).\n        closeIntentFirstProductPreview3d(store, { focus: false, fromPopstate: true });\n      });\n    }\n  }\n\n  // \u2500\u2500 View mode, side and the flat proof (SB-14 / SB-15, 2026-09-25) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // 2D is a flat proof of the selected side: the same front/back artwork the\n  // 3D textures load, contained in the scene frame; no scene, ruler, figure,\n  // hint or zoom. The viewer stays mounted underneath, so 2D | 3D and\n  // Front | Back never reload anything. The flat proof also stands in while\n  // 3D loads and stays when 3D is gone. `display.modelView2d` on older\n  // profiles is still read by the schema but no longer changes behaviour.\n  function setProductPreview3dViewMode(store, mode) {\n    var state = ensureProductPreview3dState(store);\n    var next = mode === '2d' ? '2d' : '3d';\n    if (state.viewMode === next) return;\n    state.viewMode = next;\n    syncProductPreview3dRowControls(store);\n    announceProductPreview3d(store, next === '2d' ? 'Showing the flat preview' : 'Showing the 3D preview');\n  }\n\n  function syncProductPreview3dFlatRotation(store) {\n    var state = ensureProductPreview3dState(store);\n    var viewer = state.viewer;\n    if (state.viewMode === '2d') {\n      state.flatViewPaused = true;\n      if (!viewer || typeof viewer.setAutoRotate !== 'function') return;\n      // Capture the preference once per viewer, including a delayed viewer.\n      // Set custody first because setAutoRotate can synchronously emit state.\n      if (state.flatPausedViewer !== viewer) {\n        state.flatPausedViewer = viewer;\n        state.autoRotateBeforeFlat = !!viewer.state.autoRotate;\n      }\n      if (viewer.state.autoRotate) viewer.setAutoRotate({ enabled: false });\n    } else if (state.flatViewPaused) {\n      var restore = state.flatPausedViewer === viewer && state.autoRotateBeforeFlat === true;\n      state.flatViewPaused = false;\n      state.flatPausedViewer = null;\n      state.autoRotateBeforeFlat = false;\n      var reducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      if (restore && !reducedMotion && viewer && typeof viewer.setAutoRotate === 'function') viewer.setAutoRotate({ enabled: true });\n    }\n  }\n\n  function selectProductPreview3dSide(store, side) {\n    var next = text(side);\n    if (!next) return;\n    var state = ensureProductPreview3dState(store);\n    state.side = next;\n    var viewer = state.viewer;\n    if (viewer && typeof viewer.setSurface === 'function') {\n      try { viewer.setSurface(next); } catch (_) {}\n    }\n    syncProductPreview3dFlatProof(store);\n    syncProductPreview3dRowControls(store);\n  }\n\n  // Which picture the flat proof shows for a side: the surface's source\n  // board under the shared sides rule (a \"same image\" back takes the front\n  // board). Flat proofs must work even if the lazy 3D download fails.\n  function resolveProductPreview3dFlatSource(store, projection, side) {\n    var surfaces = Array.isArray(projection && projection.surfaces) ? projection.surfaces : [];\n    var mapping = surfaces.filter(function (entry) { return text(entry && entry.board && entry.board.side) === side; })[0] || null;\n    if (!mapping) return { url: '', resolved: false };\n    var boardIndex = Math.max(0, Math.round(numberValue(mapping.board && mapping.board.boardIndex, 0)));\n    var sourceIndex = resolveProductPreview3dSourceBoardIndex(projection, mapping, boardIndex, getProductPreview3dSidesMode(store));\n    var images = getProductPreview3dImages(store);\n    var hasImages = images.some(function (image) { return !!text(image && image.url); });\n    return { url: sourceIndex === null ? '' : text(images[sourceIndex] && images[sourceIndex].url), resolved: true, hasImages: hasImages };\n  }\n\n  function syncProductPreview3dFlatProof(store, projectionInput) {\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome || !chrome.flat || !chrome.flatImage || chrome.stage.hidden) return;\n    var projection = projectionInput || getIntentFirstProductPreviewProjection(store);\n    if (!projection) return;\n    var side = getProductPreview3dSide(store);\n    var source = resolveProductPreview3dFlatSource(store, projection, side);\n    // An unresolved mapping clears the previous side, never borrows its art.\n    var url = source.resolved ? source.url : '';\n    if (source.resolved && !url && !source.hasImages) {\n      // Before any artwork every side shows what the card shows (the product\n      // photo or the family poster); once pictures exist, a side without its\n      // own picture is truthfully empty.\n      var fallback = chrome.owner.querySelector('[data-bg-product-preview-flat]');\n      if (fallback && !fallback.hidden) url = text(fallback.getAttribute('src'));\n    }\n    if (url) {\n      if (chrome.flatImage.getAttribute('src') !== url) chrome.flatImage.src = url;\n      var alt = side.charAt(0).toUpperCase() + side.slice(1) + ' preview';\n      if (chrome.flatImage.alt !== alt) chrome.flatImage.alt = alt;\n      if (chrome.flatImage.hidden) chrome.flatImage.hidden = false;\n    } else {\n      if (!chrome.flatImage.hidden) chrome.flatImage.hidden = true;\n      if (chrome.flatImage.hasAttribute('src')) chrome.flatImage.removeAttribute('src');\n      if (chrome.flatImage.alt !== '') chrome.flatImage.alt = '';\n    }\n    if (chrome.flat.getAttribute('data-bg-pdp-flat-side') !== side) chrome.flat.setAttribute('data-bg-pdp-flat-side', side);\n    var artwork = url ? 'artwork' : 'none';\n    if (chrome.flat.getAttribute('data-bg-pdp-flat-artwork') !== artwork) chrome.flat.setAttribute('data-bg-pdp-flat-artwork', artwork);\n    syncProductPreview3dRowControls(store);\n  }\n\n  // Scene sheet for compact Intent First product previews.\n  function setProductPreview3dSheetInert(chrome, state, on) {\n    if (!on) {\n      (state.sheetInert || []).forEach(function (node) { node.removeAttribute('inert'); });\n      state.sheetInert = [];\n      return;\n    }\n    var list = [];\n    var node = chrome.sheet;\n    while (node && node !== document.body) {\n      var parent = node.parentNode;\n      if (!parent) break;\n      Array.prototype.slice.call(parent.children).forEach(function (sibling) {\n        if (sibling === node || sibling === chrome.sheetBackdrop || sibling === chrome.liveRegion || /^(?:SCRIPT|STYLE|LINK)$/.test(sibling.tagName)) return;\n        if (sibling.hasAttribute('inert')) return;\n        sibling.setAttribute('inert', '');\n        list.push(sibling);\n      });\n      node = parent;\n    }\n    state.sheetInert = list;\n  }\n\n  // Shared by runtime Scene and the phone layout's sheets/reading views.\n  // True only for the traversal back to the exact entry stamped on opening.\n  // A retained history marker alone never gives this page Scene custody.\n  function isProductPreview3dSceneDismissal(store, event) {\n    var current = store && store.productPreview3d;\n    if (!current || (!current.sheetHistoryPushed && !current.sheetHistoryClosing) || !current.sheetHistoryParent) return false;\n    return !!(event && event.state && event.state.bgPdpSceneParent === current.sheetHistoryParent);\n  }\n\n  function handleProductPreview3dHistoryTraversal(store, event) {\n    // Chromium invokes the URL listener first, WebKit invokes Scene capture\n    // first. Whichever arrives owns the entire traversal, exactly once.\n    if (!store || store.urlStatePopstateEvent === event) return;\n    store.urlStatePopstateEvent = event;\n    var dismissing = isProductPreview3dSceneDismissal(store, event);\n    var current = store.productPreview3d;\n    var owner = current && current.sheetHistoryOwner;\n    if (current) {\n      current.sheetHistoryPushed = false;\n      current.sheetHistoryClosing = false;\n      current.sheetHistoryParent = null;\n      current.sheetHistoryOwner = null;\n    }\n    // Release custody and the departed entry's pending write BEFORE closing\n    // or restoring. Rendering an incompatible choice can dispose the viewer,\n    // but no close caused by this traversal may queue another history.back().\n    var pendingWrite = !!store.urlStateSyncTimer;\n    if (pendingWrite) {\n      window.clearTimeout(store.urlStateSyncTimer);\n      store.urlStateSyncTimer = null;\n    }\n    store.urlStateLastSyncedUrl = '';\n    closeProductPreview3dSceneSheet(store, { focus: dismissing && owner !== 'mobile' ? 'button' : false, fromPopstate: true });\n    if (store.mobileExperience && store.mobileExperience.closeForHistoryTraversal) {\n      store.mobileExperience.closeForHistoryTraversal({ focus: dismissing && owner === 'mobile', fromPopstate: true });\n    }\n    if (dismissing) {\n      event.stopImmediatePropagation();\n      scheduleDesignerUrlStateSync(store, true);\n      return;\n    }\n    var state = readDesignerUrlState(store);\n    if (!hasDesignerUrlStateToApply(state)) {\n      // Nothing to restore (a bare or fragment-only entry): the page keeps\n      // its choices, so a write still pending for them lands here instead.\n      if (pendingWrite) scheduleDesignerUrlStateSync(store);\n      return;\n    }\n    applyDesignerUrlState(store, state);\n    render(store);\n  }\n\n  function openProductPreview3dSceneSheet(store) {\n    var chrome = getProductPreview3dChrome(store);\n    var state = ensureProductPreview3dState(store);\n    if (!chrome || !chrome.sheet || state.sheetOpen || state.sheetHistoryPushed || state.sheetHistoryClosing) return;\n    if (store.mobileExperience && store.mobileExperience.experience === 'quick_build') return;\n    var phase = chrome.stage.hidden ? '' : text(chrome.stage.getAttribute('data-bg-pdp-3d-phase'));\n    if (!state.viewer || state.viewMode === '2d' || (phase !== 'active' && phase !== 'updating')) return;\n    state.sheetOpen = true;\n    state.sheetChrome = chrome;\n    chrome.sheet.hidden = false;\n    if (chrome.sheetBackdrop) chrome.sheetBackdrop.hidden = false;\n    // Browser Back closes the sheet on phones, like the option sheets.\n    if (window.matchMedia && window.matchMedia(PRODUCT_PREVIEW_3D_MOBILE_QUERY).matches) {\n      try {\n        scheduleDesignerUrlStateSync(store, true);\n        // The parent is dormant while Scene is open, so option URL writes\n        // cannot erase its identity (they replace the current Scene entry).\n        // Preserve other owners' state and give every opening a fresh token.\n        var parent = String(Date.now()) + ':' + String(Math.random());\n        window.history.replaceState(Object.assign({}, window.history.state, { bgPdpSceneParent: parent }), '');\n        window.history.pushState({ bgPdpScene: true }, '');\n        state.sheetHistoryParent = parent;\n        state.sheetHistoryPushed = true;\n        state.sheetHistoryOwner = 'preview';\n      } catch (_) {}\n    }\n    chrome.owner.setAttribute('data-bg-pdp-scene-sheet-open', '');\n    scrollProductPreview3dAboveSheet(chrome);\n    if (chrome.sceneButton) chrome.sceneButton.setAttribute('aria-expanded', 'true');\n    setProductPreview3dSheetInert(chrome, state, true);\n    focusProductPreview3dElement(chrome.sheet.querySelector('[role=\"radio\"][aria-checked=\"true\"]') || listProductPreview3dFocusables(chrome.sheet)[0] || chrome.sheet);\n  }\n\n  // Bound both frames to the available viewport before scrolling. The sheet\n  // scrolls internally and its spacer lets even a short page fit the preview.\n  function transitionProductPreview3dSceneSize(chrome, target, settle, fromHeight) {\n    var scene = chrome.scene;\n    var first = scene.getBoundingClientRect();\n    var center = (first.left + first.right) / 2;\n    var from = typeof fromHeight === 'number' ? fromHeight : first.height;\n    // The transform scales around the scene's center, which can differ from\n    // its parent's center (including overflowing grid items). Land the real\n    // box at that same center in both directions, before the endpoint paint.\n    function settleAtCenter() {\n      settle();\n      var rect = scene.getBoundingClientRect();\n      var offset = center - (rect.left + rect.right) / 2;\n      if (Math.abs(offset) > 0.01) scene.style.left = ((parseFloat(window.getComputedStyle(scene).left) || 0) + offset) + 'px';\n    }\n    if (scene.bgSheetMotion) scene.bgSheetMotion.cancel();\n    var base = scene.getBoundingClientRect().height;\n    if (!base || Math.abs(from - target) < 0.5 || (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches)) { settleAtCenter(); return; }\n    // Both real dimensions will match this uniform scale at the endpoint.\n    // Keeping the viewport aspect ratio avoids a camera-framing jump there.\n    var saved = { transform: scene.style.transform, origin: scene.style.transformOrigin, transition: scene.style.transition };\n    var style = window.getComputedStyle(chrome.owner);\n    var duration = style.getPropertyValue('--bg-me-t-sheet').trim() || '300ms';\n    var ease = style.getPropertyValue('--bg-me-ease').trim() || 'cubic-bezier(.2, .8, .2, 1)';\n    var milliseconds = parseFloat(duration) * (/ms$/.test(duration) ? 1 : 1000) || 300;\n    var timer;\n    var motion = { cancel: function () {\n      window.clearTimeout(timer);\n      scene.removeEventListener('transitionend', end);\n      scene.style.transform = saved.transform;\n      scene.style.transformOrigin = saved.origin;\n      scene.style.transition = saved.transition;\n      scene.removeAttribute('data-bg-pdp-scene-scaling');\n      scene.bgSheetMotion = null;\n    } };\n    function end(event) {\n      if (event && (event.target !== scene || event.propertyName !== 'transform')) return;\n      if (scene.bgSheetMotion !== motion) return;\n      motion.cancel();\n      settleAtCenter();\n    }\n    function scale(value) {\n      scene.style.transform = 'scale(' + value + ')';\n    }\n    scene.bgSheetMotion = motion;\n    scene.style.transition = 'none';\n    scene.style.transformOrigin = 'top center';\n    scale(from / base);\n    scene.getBoundingClientRect();\n    scene.style.transition = 'transform ' + duration + ' ' + ease;\n    scene.setAttribute('data-bg-pdp-scene-scaling', '');\n    scale(target / base);\n    scene.addEventListener('transitionend', end);\n    timer = window.setTimeout(function () { end(); }, milliseconds + 50);\n  }\n\n  function scrollProductPreview3dAboveSheet(chrome) {\n    if (!chrome || !chrome.scene || !chrome.sheet) return;\n    if (typeof chrome.scene.getBoundingClientRect !== 'function' || typeof window.scrollBy !== 'function') return;\n    var viewport = window.visualViewport;\n    var height = viewport ? viewport.height : window.innerHeight || 0;\n    var top = viewport ? viewport.offsetTop : 0;\n    if (!(height > 0)) return;\n    var previous = chrome.scene.bgSheetSize;\n    var width = viewport ? viewport.width : window.innerWidth;\n    var stageTop = chrome.scene.getBoundingClientRect().top;\n    // Ordinary setting syncs must not reset the raised sheet or settle an\n    // animation early. Viewport/scroll changes still remeasure the layout.\n    if (previous && !previous.closing && previous.height === height && previous.width === width && previous.top === top && previous.sheetHeight === chrome.sheet.getBoundingClientRect().height && Math.abs(previous.stageTop - stageTop) < 0.5) return;\n    chrome.owner.style.setProperty('--bg-preview-sheet-max-height', Math.floor(height / 2) + 'px');\n    var sheetBottom = Math.max(0, window.innerHeight - height - top);\n    chrome.owner.style.setProperty('--bg-preview-sheet-bottom', sheetBottom + 'px');\n    var sheetRect = chrome.sheet.getBoundingClientRect();\n    var sheetHeight = sheetRect.height || chrome.sheet.offsetHeight || 0;\n    chrome.owner.style.setProperty('--bg-preview-sheet-space', (sheetHeight + 16) + 'px');\n    // Entrance translateY shifts the painted top, but not height or bottom.\n    // sheetBottom already insets the fixed box to the visual viewport edge.\n    var sheetTop = window.innerHeight - sheetBottom - sheetHeight;\n    var oldCap = chrome.owner.style.getPropertyValue('--bg-preview-sheet-scene-height');\n    var oldMax = previous ? previous.maxHeight : chrome.scene.style.maxHeight;\n    var original = previous ? previous.original : { maxWidth: chrome.scene.style.maxWidth, width: chrome.scene.style.width, marginInline: chrome.scene.style.marginInline, left: chrome.scene.style.left };\n    var current = { maxWidth: chrome.scene.style.maxWidth, width: chrome.scene.style.width, marginInline: chrome.scene.style.marginInline, left: chrome.scene.style.left };\n    var from = chrome.scene.getBoundingClientRect().height;\n    if (chrome.scene.bgSheetMotion) chrome.scene.bgSheetMotion.cancel();\n    chrome.owner.style.setProperty('--bg-preview-sheet-scene-height', 'none');\n    Object.keys(original).forEach(function (name) { chrome.scene.style[name] = original[name]; });\n    var natural = chrome.scene.getBoundingClientRect();\n    var naturalHeight = natural.height;\n    // Cap in place only when the rendered zoom column and hint both fit.\n    // Otherwise use scrolling to preserve natural size when possible,\n    // or use the viewport room when the preview is genuinely oversized.\n    var viewportRoom = Math.max(0, sheetTop - top - 16);\n    var roomAtCurrentPosition = Math.max(0, Math.ceil(sheetTop - stageTop - 8));\n    // Measure the actual rendered minimum stage height the zoom column and\n    // hint need so neither clips outside the stage nor collides with the\n    // other, in whichever dimension is tightest: the column's own height,\n    // the hint's own height (each plus a matching margin around the inset\n    // their CSS `bottom` already uses, since there is no separate top\n    // inset to read), or \u2014 for a wide stage, where capping height also\n    // shrinks width proportionally \u2014 the two controls placed side by side\n    // converted to an equivalent height via the natural aspect ratio.\n    var controlsMinimum = 0;\n    var zoomControl = chrome.scene.querySelector('.bg-intent-first-live-mockup__stage3d-zoom');\n    var zoomBounds, zoomInset = 0;\n    if (zoomControl) {\n      zoomBounds = zoomControl.getBoundingClientRect();\n      zoomInset = parseFloat(window.getComputedStyle(zoomControl).bottom) || 0;\n      if (zoomBounds.height > 0) controlsMinimum = Math.max(controlsMinimum, zoomBounds.height + 2 * zoomInset);\n      var hintControl = chrome.scene.querySelector('.bg-intent-first-live-mockup__stage3d-hint');\n      if (hintControl) {\n        var hintBounds = hintControl.getBoundingClientRect();\n        var hintInset = parseFloat(window.getComputedStyle(hintControl).bottom) || 0;\n        if (hintBounds.height > 0) controlsMinimum = Math.max(controlsMinimum, hintBounds.height + 2 * hintInset);\n        if (zoomBounds.width > 0 && hintBounds.width > 0 && natural.width > 0) {\n          controlsMinimum = Math.max(controlsMinimum, (zoomBounds.width + hintBounds.width + 2 * zoomInset) * naturalHeight / natural.width);\n        }\n      }\n    }\n    var fitsControlsAtCurrentPosition = stageTop >= top && roomAtCurrentPosition >= controlsMinimum;\n    var capInPlace = fitsControlsAtCurrentPosition;\n    // Whether scrolling could reveal more of the stage at all: an owning\n    // scroller (an ancestor with overflow-y:auto/scroll and real overflow,\n    // the same walk the execution step below already performs) or a\n    // genuinely scrollable window. Some presentations lock html/body scroll\n    // entirely (\"the experience owns the screen; panels scroll internally\",\n    // bg-designer-storefront-mobile-experience.css) with no such scroller\n    // above the 3D stage \u2014 preferring scroll-to-reveal there would silently\n    // do nothing and leave the stage overlapping the sheet.\n    var canScroll = false;\n    var scrollProbe = chrome.scene.parentElement;\n    while (scrollProbe && scrollProbe !== document.body && scrollProbe !== document.documentElement) {\n      var probeOverflowY = '';\n      try { probeOverflowY = window.getComputedStyle(scrollProbe).overflowY; } catch (_) {}\n      if ((probeOverflowY === 'auto' || probeOverflowY === 'scroll') && scrollProbe.scrollHeight > scrollProbe.clientHeight + 1) { canScroll = true; break; }\n      scrollProbe = scrollProbe.parentElement;\n    }\n    if (!canScroll) {\n      // A modal/sheet opening commonly sets html/body to overflow:hidden\n      // regardless of mode, to block user-gesture scroll behind it \u2014 that\n      // does not stop a programmatic window.scrollBy() from moving scrollY\n      // when there is genuine room below the fold. What actually matters\n      // is whether such room exists at all: some presentations size\n      // html/body to exactly the viewport height with nothing to scroll\n      // into (\"the experience owns the screen; panels scroll internally\",\n      // bg-designer-storefront-mobile-experience.css), where scrollBy is a\n      // true no-op no matter how it is invoked.\n      try {\n        // clientHeight is 0 in environments that never run real layout\n        // (unit fixtures around this function) \u2014 treat that as \"not\n        // measured\" and default to scrollable, matching this function's\n        // behavior before this check existed. A real, rendered page always\n        // has a positive clientHeight, so this never masks the genuine\n        // fixed-viewport case above.\n        canScroll = !document.documentElement.clientHeight || document.documentElement.scrollHeight > document.documentElement.clientHeight + 1;\n      } catch (_) { canScroll = true; }\n    }\n    var fitsWithScroll = !capInPlace && canScroll && naturalHeight <= Math.max(0, sheetTop - top - 8);\n    var available = capInPlace ? roomAtCurrentPosition : (fitsWithScroll ? naturalHeight : (stageTop >= top && roomAtCurrentPosition > 0 ? roomAtCurrentPosition : viewportRoom));\n    // An oversized preview needs the same complete control footprint.\n    // If the current position cannot provide it, scroll to use viewport\n    // room \u2014 but only when scrolling can actually reach it; otherwise the\n    // current-position room is genuinely the most this stage can ever show.\n    if (!capInPlace && !fitsWithScroll) {\n      if (canScroll && available < controlsMinimum) available = viewportRoom;\n    }\n    chrome.owner.style.setProperty('--bg-preview-sheet-scene-height', oldCap || 'none');\n    Object.keys(current).forEach(function (name) { chrome.scene.style[name] = current[name]; });\n    chrome.scene.style.maxHeight = 'var(--bg-preview-sheet-scene-height, none)';\n    var target = Math.min(naturalHeight, available);\n    var size = chrome.scene.bgSheetSize = { natural: naturalHeight, target: target, height: height, top: top, width: width, sheetHeight: sheetHeight, stageTop: stageTop, maxHeight: oldMax, original: original };\n    transitionProductPreview3dSceneSize(chrome, target, function () {\n      chrome.owner.style.setProperty('--bg-preview-sheet-scene-height', naturalHeight > available ? available + 'px' : 'none');\n      chrome.scene.style.maxWidth = naturalHeight > available ? (natural.width * target / naturalHeight) + 'px' : original.maxWidth;\n      chrome.scene.style.width = naturalHeight > available ? (natural.width * target / naturalHeight) + 'px' : original.width;\n      chrome.scene.style.marginInline = original.marginInline;\n    }, from);\n    var rect = chrome.scene.getBoundingClientRect();\n    var overlap = Math.max(0, rect.top + target + 8 - sheetTop) || Math.min(0, rect.top - top);\n    // Scroll positions can round to whole CSS pixels. Round toward the scene\n    // so a fractional edge keeps a 7-8px gap instead of rounding beyond 8px.\n    if (overlap > 0) overlap = Math.floor(overlap);\n    if (overlap) {\n      var node = chrome.scene.parentElement;\n      var scrolled = false;\n      while (node && node !== document.body && node !== document.documentElement) {\n        var overflowY = '';\n        try { overflowY = window.getComputedStyle(node).overflowY; } catch (_) {}\n        if ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight + 1) {\n          node.scrollTop += overlap;\n          scrolled = true;\n          break;\n        }\n        node = node.parentElement;\n      }\n      if (!scrolled) {\n        try { window.scrollBy({ top: overlap, left: 0, behavior: 'auto' }); } catch (_) { window.scrollBy(0, overlap); }\n      }\n    }\n    size.stageTop = chrome.scene.getBoundingClientRect().top;\n    // A short preview may already fit with no overlap. Raise the sheet to\n    // meet its real bottom instead of returning with the old blank band.\n    var gap = sheetTop - (size.stageTop + target);\n    if (gap > 8) chrome.owner.style.setProperty('--bg-preview-sheet-bottom', (sheetBottom + gap - 8) + 'px');\n  }\n\n  function closeProductPreview3dSceneSheet(store, options) {\n    var settings = options || {};\n    var state = store && store.productPreview3d;\n    var chrome = state && state.sheetChrome || getProductPreview3dChrome(store);\n    if (!state || !state.sheetOpen) return;\n    state.sheetOpen = false;\n    setProductPreview3dSheetInert(chrome, state, false);\n    state.sheetChrome = null;\n    if (state.sheetHistoryPushed) {\n      state.sheetHistoryPushed = false;\n      if (settings.fromPopstate !== true) {\n        state.sheetHistoryClosing = true;\n        try { window.history.back(); } catch (_) { state.sheetHistoryClosing = false; }\n      }\n    }\n    if (!chrome) return;\n    if (chrome.sheet) chrome.sheet.hidden = true;\n    if (chrome.sheetBackdrop) chrome.sheetBackdrop.hidden = true;\n    chrome.owner.removeAttribute('data-bg-pdp-scene-sheet-open');\n    var size = chrome.scene && chrome.scene.bgSheetSize;\n    if (size) size.closing = true;\n    var clearSize = function () {\n      ['--bg-preview-sheet-max-height', '--bg-preview-sheet-bottom', '--bg-preview-sheet-space', '--bg-preview-sheet-scene-height'].forEach(function (name) { chrome.owner.style.removeProperty(name); });\n      if (chrome.scene) {\n        chrome.scene.style.maxHeight = size ? size.maxHeight : '';\n        if (size) {\n          chrome.scene.style.maxWidth = size.original.maxWidth;\n          chrome.scene.style.width = size.original.width;\n          chrome.scene.style.marginInline = size.original.marginInline;\n          chrome.scene.style.left = size.original.left;\n        }\n        chrome.scene.bgSheetSize = null;\n      }\n    };\n    if (size) transitionProductPreview3dSceneSize(chrome, size.natural, clearSize);\n    else clearSize();\n    if (chrome.sceneButton) chrome.sceneButton.setAttribute('aria-expanded', 'false');\n    if (settings.focus === false) return;\n    var target = null;\n    if (settings.focus !== 'controls' && chrome.sceneButton && !chrome.sceneButton.hidden && isProductPreview3dCompact(store)) target = chrome.sceneButton;\n    if (!target) target = listProductPreview3dFocusables(chrome.sceneControls)[0] || null;\n    if (!target) {\n      target = chrome.modeButtons.filter(function (button) {\n        return text(button.getAttribute('data-bg-pdp-preview-renderer')) === '3d' && !button.disabled;\n      })[0] || null;\n    }\n    focusProductPreview3dElement(target);\n  }\n\n  function announceProductPreview3d(store, message) {\n    var chrome = getProductPreview3dChrome(store);\n    if (chrome && chrome.liveRegion) chrome.liveRegion.textContent = text(message);\n  }\n\n  function setProductPreview3dNotice(store, message, showRetry, kind) {\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome || !chrome.notice) return;\n    if (!message) {\n      chrome.notice.hidden = true;\n      chrome.notice.removeAttribute('data-bg-pdp-3d-notice-kind');\n      return;\n    }\n    if (chrome.noticeText) chrome.noticeText.textContent = message;\n    if (chrome.retry) chrome.retry.hidden = showRetry !== true;\n    chrome.notice.setAttribute('data-bg-pdp-3d-notice-kind', text(kind) || 'info');\n    chrome.notice.hidden = false;\n  }\n\n  function restoreProductPreview3dFocus(store, chromeInput) {\n    var chrome = chromeInput || getProductPreview3dChrome(store);\n    if (!chrome) return;\n    // The 3D toggle is the control that opened the viewer.\n    var target = chrome.modeButtons.filter(function (button) {\n      return text(button.getAttribute('data-bg-pdp-preview-renderer')) === '3d';\n    })[0] || null;\n    if (target && chrome.controlsRow && chrome.controlsRow.hidden) target = null;\n    if (target && chrome.modes && chrome.modes.hidden) target = null;\n    if (target && typeof target.focus === 'function') {\n      try { target.focus(); } catch (_) {}\n    }\n  }\n\n  // P-22 (program \u00A713): product-preview facts are bounded and non-PII \u2014 the\n  // shared storefront context is allowed (product/variant/template ids,\n  // quantity) EXCEPT the raw project id, which never rides a 3D event.\n  // (Slice 9 telemetry report found it on 17 PDP rows; closed here.)\n  function emitProductPreviewTelemetry(store, eventName, payload) {\n    var telemetry = storefrontTelemetry();\n    if (!telemetry) return;\n    if (store && store.config && typeof telemetry.initFromStore === 'function') telemetry.initFromStore(store);\n    var context = telemetryProductContext(store);\n    delete context.projectId;\n    telemetry.emitEvent(eventName, 'product-preview', Object.assign({}, context, payload || {}), 'low', store);\n  }\n\n  function emitProductPreview3dEvent(store, eventName, payload) {\n    var projection = getIntentFirstProductPreviewProjection(store);\n    emitProductPreviewTelemetry(store, eventName, Object.assign({\n      profileRevisionId: text(projection && projection.profileRevisionId)\n    }, payload || {}));\n  }\n\n  function loadProductPreview3dRuntime(store) {\n    if (window.QpsProductPreviewRuntime && typeof window.QpsProductPreviewRuntime.createProductPreviewViewer === 'function') {\n      return Promise.resolve(window.QpsProductPreviewRuntime);\n    }\n    var state = ensureProductPreview3dState(store);\n    if (state.runtimePromise) return state.runtimePromise;\n    var productInfo = store.root && store.root.closest('product-info');\n    var src = text(productInfo && productInfo.getAttribute('data-bg-product-preview-runtime-src'));\n    if (!src) return Promise.reject(new Error('Product preview runtime asset is not configured.'));\n    state.runtimePromise = new Promise(function (resolve, reject) {\n      var script = document.createElement('script');\n      script.src = src;\n      script.defer = true;\n      script.onload = function () {\n        if (window.QpsProductPreviewRuntime && typeof window.QpsProductPreviewRuntime.createProductPreviewViewer === 'function') {\n          resolve(window.QpsProductPreviewRuntime);\n        } else {\n          state.runtimePromise = null;\n          reject(new Error('Product preview runtime global missing after load.'));\n        }\n      };\n      script.onerror = function () {\n        state.runtimePromise = null;\n        reject(new Error('Failed to load the product preview runtime asset.'));\n      };\n      document.head.appendChild(script);\n    });\n    return state.runtimePromise;\n  }\n\n  // The product's selected sides policy mode (single / double_same /\n  // double_different / \u2026) from the typed Product Commerce sides policies \u2014\n  // the same source the editor sync payload carries; never an option label.\n  function getProductPreview3dSidesMode(store) {\n    var payload = buildEditorSelectionSyncPayload(store);\n    var policy = plainObject(payload && payload.sidesPolicy);\n    return text(policy.mode);\n  }\n\n  // The pure projection rule is available before the lazy engine. Keep its\n  // fallback in parity with product-preview-runtime/src/projection.ts (the\n  // preview tests compare both for every policy and reordered/sparse boards).\n  function resolveProductPreview3dSourceBoardIndex(projection, mapping, boardIndex, sidesMode) {\n    var runtime = window.QpsProductPreviewRuntime;\n    if (runtime && typeof runtime.resolveSurfaceSourceBoardIndex === 'function') {\n      var resolved = runtime.resolveSurfaceSourceBoardIndex(projection, mapping, { sidesMode: sidesMode });\n      return resolved === null ? null : Math.max(0, Math.round(numberValue(resolved, boardIndex)));\n    }\n    var mode = text(sidesMode).toLowerCase();\n    var side = text(mapping && mapping.board && mapping.board.side);\n    if (mode === 'single' && side === 'back') return null;\n    if (mode === 'double_same' && side === 'back') {\n      var front = (projection.surfaces || []).filter(function (surface) { return surface.board.side === 'front'; })[0];\n      if (front) return Math.max(0, Math.round(numberValue(front.board.boardIndex, boardIndex)));\n    }\n    return boardIndex;\n  }\n\n  function getProductPreview3dImages(store) {\n    var project = store && store.state && store.state.project || {};\n    if (text(project.projectId) && Array.isArray(project.boardPreviews)) {\n      var indexed = [];\n      project.boardPreviews.forEach(function (entry) {\n        var index = Number(entry && entry.boardIndex);\n        if (Number.isInteger(index) && index >= 0 && text(entry.url)) indexed[index] = { url: entry.url };\n      });\n      return indexed;\n    }\n    var preview = getDesignerMediaPreviewState(store);\n    return preview && Array.isArray(preview.images) ? preview.images : [];\n  }\n\n  function hasMissingProductPreview3dArtwork(store, projection) {\n    if (!text(store && store.state && store.state.project && store.state.project.projectId)) return false;\n    var images = getProductPreview3dImages(store);\n    var mode = getProductPreview3dSidesMode(store);\n    return (projection.surfaces || []).some(function (mapping) {\n      var sourceIndex = resolveProductPreview3dSourceBoardIndex(projection, mapping, mapping.board.boardIndex, mode);\n      return sourceIndex !== null && !text(images[sourceIndex] && images[sourceIndex].url);\n    });\n  }\n\n  function buildProductPreview3dTextureKey(store) {\n    var images = getProductPreview3dImages(store);\n    // The sides mode is part of the key: switching between single, same-image\n    // and different-image re-applies the textures under the new rule.\n    return images.map(function (image) { return text(image && image.url); }).join('|')\n      + '|sides=' + getProductPreview3dSidesMode(store);\n  }\n\n  function applyProductPreview3dTextures(store, state, projection) {\n    var viewer = state.viewer;\n    if (!viewer) return Promise.resolve(false);\n    var images = getProductPreview3dImages(store);\n    var surfaces = Array.isArray(projection.surfaces) ? projection.surfaces : [];\n    var sidesMode = getProductPreview3dSidesMode(store);\n    var pending = [];\n    surfaces.forEach(function (mapping) {\n      var board = plainObject(mapping && mapping.board) || {};\n      var boardIndex = Math.max(0, Math.round(numberValue(board.boardIndex, 0)));\n      var side = text(board.side);\n      var sourceIndex = resolveProductPreview3dSourceBoardIndex(projection, mapping, boardIndex, sidesMode);\n      var url = sourceIndex === null ? '' : text(images[sourceIndex] && images[sourceIndex].url);\n      if (!url) {\n        // No artwork for this face under the current design + sides choice\n        // (e.g. \"same image\" switched back to single-sided): unbind whatever\n        // an earlier apply left there so the face is blank, truthfully.\n        if (typeof viewer.clearSurfaceTexture === 'function') viewer.clearSurfaceTexture({ side: side, boardIndex: boardIndex });\n        if (sourceIndex !== null && text(store.state.project && store.state.project.projectId)) pending.push(Promise.resolve(false));\n        return;\n      }\n      var textureUrl = buildProductPreview3dTextureUrl(url);\n      var applied = viewer.setSurfaceTextureFromUrl({ side: side, boardIndex: boardIndex }, textureUrl)\n        .catch(function () { return false; });\n      pending.push(applied);\n    });\n    if (!pending.length) return Promise.resolve(images.length === 0 && !!(projection.display && projection.display.beforeArtwork));\n    return Promise.all(pending).then(function (results) { return results.every(Boolean); });\n  }\n\n  // Background choices the module offers, from the viewer snapshot alone:\n  // the product's offered backdrops when it lists two or more (their real\n  // ids and labels \u2014 never a fixed catalog); the plain light/dark\n  // presentation when it offers none; nothing for a single staff-chosen\n  // backdrop.\n  function resolveProductPreview3dBackgroundOptions(snapshot) {\n    var backdrops = snapshot && Array.isArray(snapshot.backdrops) ? snapshot.backdrops : [];\n    var activeId = text(snapshot && snapshot.backdropId);\n    if (backdrops.length > 1) {\n      return {\n        kind: 'backdrop',\n        current: activeId,\n        options: backdrops.map(function (backdrop) { return { id: text(backdrop && backdrop.id), label: text(backdrop && backdrop.label) || text(backdrop && backdrop.id) }; })\n      };\n    }\n    if (!backdrops.length && !activeId && snapshot) {\n      return {\n        kind: 'environment',\n        current: snapshot.environmentMode === 'dark' ? 'dark' : 'light',\n        options: [{ id: 'light', label: 'Plain light' }, { id: 'dark', label: 'Plain dark' }]\n      };\n    }\n    return { kind: '', current: '', options: [] };\n  }\n\n  // S2: showPicker() opens a native select's list from a real click (Chrome\n  // 111+, Safari 17+); a browser without it, or one that refuses the call,\n  // falls back to focus so the keyboard still reaches the list.\n  function openProductPreview3dBackgroundSelect(select) {\n    if (!select || select.disabled) return;\n    if (typeof select.showPicker === 'function') {\n      try {\n        select.showPicker();\n        return;\n      } catch (_) {}\n    }\n    try { select.focus({ preventScroll: true }); } catch (_) { select.focus(); }\n  }\n\n  function fillProductPreview3dBackgroundSelect(select, background) {\n    var key = background.kind + ':' + background.options.map(function (option) { return option.id + '=' + option.label; }).join('|');\n    if (select.getAttribute('data-bg-pdp-3d-backdrop-select-key') !== key) {\n      select.setAttribute('data-bg-pdp-3d-backdrop-select-key', key);\n      select.innerHTML = '';\n      background.options.forEach(function (entry) {\n        var option = document.createElement('option');\n        option.value = entry.id;\n        option.textContent = entry.label;\n        select.appendChild(option);\n      });\n    }\n    if (select.getAttribute('data-bg-pdp-3d-backdrop-kind') !== background.kind) select.setAttribute('data-bg-pdp-3d-backdrop-kind', background.kind);\n    if (background.current && select.value !== background.current) select.value = background.current;\n  }\n\n  function syncProductPreview3dBackdrops(chrome, snapshot, active) {\n    var background = resolveProductPreview3dBackgroundOptions(snapshot);\n    var offered = active && background.options.length > 0;\n    var field = chrome && chrome.backdropField;\n    var select = chrome && chrome.backdropSelect;\n    if (field && field.hidden !== !offered) field.hidden = !offered;\n    if (select) {\n      if (offered) fillProductPreview3dBackgroundSelect(select, background);\n      else {\n        if (select.innerHTML !== '') select.innerHTML = '';\n        if (select.hasAttribute('data-bg-pdp-3d-backdrop-select-key')) select.removeAttribute('data-bg-pdp-3d-backdrop-select-key');\n        if (select.hasAttribute('data-bg-pdp-3d-backdrop-kind')) select.removeAttribute('data-bg-pdp-3d-backdrop-kind');\n      }\n    }\n    // The sheet lists every choice as a row in the option sheets' style; a\n    // tap applies it and the sheet stays open (SB-08).\n    var sheetField = chrome && chrome.sheetBackdropField;\n    var sheetHost = chrome && chrome.sheetBackdrops;\n    if (sheetField && sheetField.hidden !== !offered) sheetField.hidden = !offered;\n    if (sheetHost) {\n      if (!offered) {\n        if (sheetHost.innerHTML !== '') sheetHost.innerHTML = '';\n        if (sheetHost.hasAttribute('data-bg-pdp-sheet-backdrops-key')) sheetHost.removeAttribute('data-bg-pdp-sheet-backdrops-key');\n      } else {\n        var rowsKey = 'rows:' + background.kind + ':' + background.options.map(function (option) { return option.id + '=' + option.label; }).join('|');\n        if (sheetHost.getAttribute('data-bg-pdp-sheet-backdrops-key') !== rowsKey) {\n          sheetHost.setAttribute('data-bg-pdp-sheet-backdrops-key', rowsKey);\n          sheetHost.innerHTML = '<div class=\"bg-intent-first-live-mockup__scene-options\" role=\"radiogroup\" aria-labelledby=\"' + escapeHtml(productPreview3dSheetLabelId(chrome.owner)) + '\">' +\n            background.options.map(function (option) {\n              return '<button type=\"button\" class=\"bg-intent-first-live-mockup__scene-option\" role=\"radio\" aria-checked=\"false\" data-bg-pdp-3d-backdrop=\"' + escapeHtml(option.id) + '\" data-bg-pdp-3d-backdrop-kind=\"' + escapeHtml(background.kind) + '\"><span>' + escapeHtml(option.label) + '</span><span class=\"bg-intent-first-live-mockup__scene-check\" aria-hidden=\"true\">' + PRODUCT_PREVIEW_3D_CHECK_ICON + '</span></button>';\n            }).join('') + '</div>';\n        }\n        var selected = background.options.some(function (option) { return option.id === background.current; }) ? background.current : background.options[0].id;\n        Array.prototype.slice.call(sheetHost.querySelectorAll('[data-bg-pdp-3d-backdrop]')).forEach(function (button) {\n          var checked = text(button.getAttribute('data-bg-pdp-3d-backdrop')) === selected;\n          if (button.getAttribute('aria-checked') !== String(checked)) button.setAttribute('aria-checked', String(checked));\n          var tabIndex = checked ? 0 : -1;\n          if (button.tabIndex !== tabIndex) button.tabIndex = tabIndex;\n        });\n      }\n    }\n    return offered;\n  }\n\n  // Every switch carrying the same data attribute (toolbar and sheet twin)\n  // shows one state; its label wrapper hides when the control is unavailable.\n  function syncProductPreview3dSwitches(buttons, hidden, checked) {\n    (buttons || []).forEach(function (button) {\n      var wrapper = button.closest('[data-bg-pdp-switch]') || button;\n      if (wrapper.hidden !== hidden) wrapper.hidden = hidden;\n      if (button.getAttribute('aria-checked') !== String(checked)) button.setAttribute('aria-checked', String(checked));\n    });\n  }\n\n  function isProductPreview3dWebglFallback(store) {\n    var state = store && store.productPreview3d;\n    return !!state && state.status === 'error' && state.fallbackReason === 'webgl_unavailable';\n  }\n\n  function productPreview3dLoadingControls(store, snapshot) {\n    // Keep the configured control groups in place while the renderer loads.\n    // These controls are disabled until the viewer reports its actual state.\n    // Once the runtime exists, its resolved labels replace any loading copy.\n    var projection = getIntentFirstProductPreviewProjection(store) || {};\n    var environment = plainObject(projection.environment);\n    var backdrops = Array.isArray(environment.backdrops) ? environment.backdrops : [];\n    var controls = Object.assign({}, snapshot || {});\n    if (!snapshot) {\n      controls.backdrops = environment.customerBackdropChoice !== false && backdrops.length > 1\n        ? backdrops.map(function (entry) { return { id: text(entry.id), label: text(entry.label) || 'Loading\u2026' }; })\n        : [];\n      controls.backdropId = text(environment.defaultBackdropId) || text(backdrops[0] && backdrops[0].id) || null;\n      controls.viewMode = store.productPreview3d && store.productPreview3d.viewMode || '3d';\n    }\n    controls.groundAvailable = !!controls.groundAvailable || !!(environment.ground && environment.ground.enabled);\n    return controls;\n  }\n\n  // Every control mirrors the viewer snapshot (including state changed from\n  // outside the chrome) and the runtime's own view state: sides, the 2D | 3D\n  // switch and its activity cue, Background choices, Ground and Auto-rotate\n  // (toolbar and sheet), the Scene button, the zoom stack's real limit\n  // states, the hint, the viewport tone, the empty treatment, and which of\n  // the flat proof or the scene is showing.\n  function syncProductPreview3dRowControls(store, snapshotInput) {\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome) return;\n    var state = store.productPreview3d;\n    syncProductPreview3dFlatRotation(store);\n    var snapshot = snapshotInput || (state && state.viewer ? state.viewer.state : null);\n    var phase = chrome.stage.hidden ? '' : text(chrome.stage.getAttribute('data-bg-pdp-3d-phase'));\n    var active = phase === 'active' || phase === 'updating';\n    var initialLoading = phase === 'loading';\n    if (initialLoading) snapshot = productPreview3dLoadingControls(store, snapshot);\n    var viewMode = state && state.viewMode === '2d' ? '2d' : '3d';\n    var failed = !!state && state.status === 'error';\n    // The flat proof shows in 2D, while 3D loads, and when 3D is gone; the\n    // scene shows only when 3D is up and chosen.\n    var flatShown = !!phase && phase !== 'design-loading' && (phase === 'flat' || initialLoading || viewMode === '2d');\n    var sceneShown = active && !flatShown;\n    // While 3D loads in the 3D view the configured scene controls keep their\n    // place (disabled) so the card never jumps when the scene arrives.\n    var sceneReserved = sceneShown || (initialLoading && viewMode === '3d');\n    var compact = isProductPreview3dCompact(store);\n    var side = getProductPreview3dSide(store);\n    var view = flatShown ? 'flat' : '3d';\n    if (chrome.stage.getAttribute('data-bg-pdp-3d-view') !== view) chrome.stage.setAttribute('data-bg-pdp-3d-view', view);\n    if (chrome.flat && chrome.flat.hidden !== !flatShown) chrome.flat.hidden = !flatShown;\n    // 2D | 3D: the pressed segment is the chosen view; 3D carries an activity\n    // cue while it loads; the whole switch leaves when 3D failed (the flat\n    // proof stays, nothing dead-ends).\n    if (chrome.modes && chrome.modes.hidden !== failed) chrome.modes.hidden = failed;\n    chrome.modeButtons.forEach(function (button) {\n      var renderer = text(button.getAttribute('data-bg-pdp-preview-renderer'));\n      var pressed = phase && phase !== 'flat' && !failed ? renderer === viewMode : renderer === '2d';\n      if (button.getAttribute('aria-pressed') !== String(pressed)) button.setAttribute('aria-pressed', String(pressed));\n      if (renderer !== '3d') return;\n      if (initialLoading) {\n        if (button.getAttribute('data-bg-pdp-3d-busy') !== '') button.setAttribute('data-bg-pdp-3d-busy', '');\n        if (button.getAttribute('aria-busy') !== 'true') button.setAttribute('aria-busy', 'true');\n      } else {\n        if (button.hasAttribute('data-bg-pdp-3d-busy')) button.removeAttribute('data-bg-pdp-3d-busy');\n        if (button.hasAttribute('aria-busy')) button.removeAttribute('aria-busy');\n      }\n    });\n    var rotateShown = sceneReserved;\n    syncProductPreview3dSwitches(chrome.autoRotates, !rotateShown, !!(snapshot && snapshot.autoRotate));\n    var groundShown = sceneReserved && !!(snapshot && snapshot.groundAvailable);\n    syncProductPreview3dSwitches(chrome.grounds, !groundShown, !!(snapshot && snapshot.groundVisible));\n    if (chrome.surfaces) {\n      var sideButtons = Array.prototype.slice.call(chrome.surfaces.querySelectorAll('[data-bg-pdp-3d-surface]'));\n      sideButtons.forEach(function (button) {\n        var pressed = text(button.getAttribute('data-bg-pdp-3d-surface')) === side ? 'true' : 'false';\n        if (button.getAttribute('aria-pressed') !== pressed) button.setAttribute('aria-pressed', pressed);\n      });\n      // Front | Back switches the flat proof and the scene alike: shown\n      // whenever the stage is up and the model has two sides.\n      var surfacesHidden = !phase || sideButtons.length < 2;\n      if (chrome.surfaces.hidden !== surfacesHidden) chrome.surfaces.hidden = surfacesHidden;\n      if (chrome.surfaceSelect && chrome.surfaceSelect.value !== side) chrome.surfaceSelect.value = side;\n      // The runtime owns the side; the viewer follows it (a side chosen\n      // while 3D loaded, or a model swap that reset the viewer's side).\n      if (active && state && state.viewer && snapshot && text(snapshot.surfaceSide) && text(snapshot.surfaceSide) !== side && typeof state.viewer.setSurface === 'function') {\n        try { state.viewer.setSurface(side); } catch (_) {}\n      }\n    }\n    var backgroundShown = syncProductPreview3dBackdrops(chrome, snapshot, sceneReserved);\n    var sceneAvailable = sceneReserved && (backgroundShown || groundShown || rotateShown);\n    if (chrome.sceneButton && chrome.sceneButton.hidden !== !sceneAvailable) chrome.sceneButton.hidden = !sceneAvailable;\n    // Scene controls are really disabled until the viewer reports its state;\n    // the 2D | 3D switch and Front | Back stay live over the flat proof.\n    [chrome.backdropSelect, chrome.sceneButton].concat(chrome.autoRotates, chrome.grounds).forEach(function (control) {\n      if (control && control.disabled !== initialLoading) control.disabled = initialLoading;\n    });\n    if (state && state.sheetOpen && (!sceneAvailable || !compact)) closeProductPreview3dSceneSheet(store, { focus: sceneAvailable ? 'controls' : false });\n    // Viewport tone: the module paints the plain light/dark backdrop (the\n    // canvas is transparent there) and the hint follows it.\n    if (chrome.scene) {\n      if (active || initialLoading) {\n        var tone = snapshot && snapshot.environmentMode === 'dark' ? 'dark' : 'light';\n        if (chrome.scene.getAttribute('data-bg-pdp-3d-tone') !== tone) chrome.scene.setAttribute('data-bg-pdp-3d-tone', tone);\n      } else if (chrome.scene.hasAttribute('data-bg-pdp-3d-tone')) chrome.scene.removeAttribute('data-bg-pdp-3d-tone');\n    }\n    // Zoom stack and hint: scene only. Real limits from the camera distance;\n    // older runtimes without a zoom snapshot keep both buttons live.\n    var zoom = snapshot && snapshot.zoom && typeof snapshot.zoom === 'object' ? snapshot.zoom : null;\n    var zoomInDisabled = !!zoom && zoom.canZoomIn === false;\n    var zoomOutDisabled = !!zoom && zoom.canZoomOut === false;\n    if (chrome.zoomIn && chrome.zoomIn.disabled !== zoomInDisabled) chrome.zoomIn.disabled = zoomInDisabled;\n    if (chrome.zoomOut && chrome.zoomOut.disabled !== zoomOutDisabled) chrome.zoomOut.disabled = zoomOutDisabled;\n    if (chrome.controls && chrome.controls.hidden !== !sceneShown) chrome.controls.hidden = !sceneShown;\n    if (chrome.hint) {\n      if (chrome.hint.hidden !== !sceneShown) chrome.hint.hidden = !sceneShown;\n      var hint = compact ? PRODUCT_PREVIEW_3D_HINT_MOBILE : PRODUCT_PREVIEW_3D_HINT_DESKTOP;\n      if (chrome.hintText && chrome.hintText.textContent !== hint) chrome.hintText.textContent = hint;\n      if (chrome.hintZoom) {\n        var percent = zoom && Number.isFinite(Number(zoom.ratio)) ? Math.round(Number(zoom.ratio) * 100) + '%' : '';\n        if (chrome.hintZoom.textContent !== percent) chrome.hintZoom.textContent = percent;\n        var zoomHidden = compact || !percent;\n        if (chrome.hintZoom.hidden !== zoomHidden) chrome.hintZoom.hidden = zoomHidden;\n      }\n    }\n    // Empty treatment: in the scene for a face that is truly blank (no\n    // artwork, no approved sample); in the flat proof for a side with no\n    // picture at all.\n    var artworkNone = flatShown\n      ? !!chrome.flat && chrome.flat.getAttribute('data-bg-pdp-flat-artwork') === 'none'\n      : active && !!snapshot && snapshot.artworkState === 'none';\n    var emptyHidden = !phase || !artworkNone;\n    if (chrome.empty && chrome.empty.hidden !== emptyHidden) chrome.empty.hidden = emptyHidden;\n    if (artworkNone && phase) {\n      if (chrome.stage.getAttribute('data-bg-pdp-3d-artwork') !== 'none') chrome.stage.setAttribute('data-bg-pdp-3d-artwork', 'none');\n    } else if (chrome.stage.hasAttribute('data-bg-pdp-3d-artwork')) chrome.stage.removeAttribute('data-bg-pdp-3d-artwork');\n    if (state && state.sheetOpen) scrollProductPreview3dAboveSheet(chrome);\n  }\n\n  // Editor return / saved-design resume: the model is up but the design\n  // pictures are still rendering. Hold the viewer under a quiet overlay; the\n  // sync pass applies the pictures and lifts it when they arrive.\n  function enterProductPreview3dDesignLoading(store, state) {\n    state.waitingForArtwork = true;\n    showProductPreview3dStage(store, 'design-loading');\n    announceProductPreview3d(store, getProductPreviewCopy(store, 'designLoading', 'Loading your design\u2026'));\n    scheduleProductPreviewRefresh(store, text(store.state.project && store.state.project.projectId));\n  }\n\n  // Phases: 'flat' (no viewer: the flat proof alone), 'loading' (the flat\n  // proof stands in while 3D loads), 'active', 'updating' (a model swap\n  // keeps the last frame under the small ring) and 'design-loading'.\n  function showProductPreview3dStage(store, phase) {\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome) return;\n    // Viewer motion can emit the same chrome state for its entire settle\n    // sequence. Only a changed value should produce a DOM mutation.\n    if (chrome.stage.hidden) chrome.stage.hidden = false;\n    if (chrome.stage.getAttribute('data-bg-pdp-3d-phase') !== phase) chrome.stage.setAttribute('data-bg-pdp-3d-phase', phase);\n    // The scene carries the phase too: the viewport keeps its tier aspect in\n    // every state, so nothing jumps when the canvas mounts.\n    if (chrome.scene && chrome.scene.getAttribute('data-bg-pdp-3d-phase') !== phase) chrome.scene.setAttribute('data-bg-pdp-3d-phase', phase);\n    // Design loading (pictures still rendering after an editor return) is\n    // the only overlay; a first 3D load shows the flat proof instead.\n    if (chrome.loading) {\n      var loadingHidden = phase !== 'design-loading';\n      if (chrome.loading.hidden !== loadingHidden) chrome.loading.hidden = loadingHidden;\n      var loadingCopy = chrome.loading.querySelector('p');\n      var loadingText = phase === 'design-loading' ? getProductPreviewCopy(store, 'designLoading', 'Loading your design\u2026') : '';\n      if (loadingCopy && loadingCopy.textContent !== loadingText) loadingCopy.textContent = loadingText;\n    }\n    var updatingHidden = phase !== 'updating';\n    if (chrome.updating && chrome.updating.hidden !== updatingHidden) chrome.updating.hidden = updatingHidden;\n    if (phase === 'loading') closeProductPreview3dSceneSheet(store, { focus: false });\n    syncProductPreview3dFlatProof(store);\n    syncProductPreview3dRowControls(store);\n    syncProductPreview3dDisclaimer(store);\n  }\n\n  // Slice 8: a see-through product (clear card) carries the exact clear-\n  // product disclaimer \u2014 transparency and white ink are simulated.\n  function syncProductPreview3dDisclaimer(store) {\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome || !chrome.caption) return;\n    var state = store.productPreview3d;\n    var snapshot = state && state.viewer ? state.viewer.state : null;\n    var caption = snapshot && snapshot.transmissive\n      ? getProductPreviewCopy(store, 'illustrativeClear', PRODUCT_PREVIEW_3D_DISCLAIMER_CLEAR)\n      : getProductPreviewCopy(store, 'illustrative', PRODUCT_PREVIEW_3D_DISCLAIMER);\n    if (chrome.caption.textContent !== caption) chrome.caption.textContent = caption;\n  }\n\n  function hideProductPreview3dStage(store, options) {\n    var settings = options || {};\n    closeProductPreview3dSceneSheet(store, { focus: false, fromPopstate: settings.fromPopstate === true });\n    var chrome = getProductPreview3dChrome(store);\n    if (!chrome) return;\n    chrome.stage.hidden = true;\n    chrome.stage.removeAttribute('data-bg-pdp-3d-phase');\n    chrome.stage.removeAttribute('data-bg-pdp-3d-artwork');\n    chrome.stage.removeAttribute('data-bg-pdp-3d-view');\n    if (chrome.scene) {\n      chrome.scene.removeAttribute('data-bg-pdp-3d-phase');\n      chrome.scene.removeAttribute('data-bg-pdp-3d-tone');\n    }\n    if (chrome.loading) chrome.loading.hidden = true;\n    if (chrome.updating) chrome.updating.hidden = true;\n    if (chrome.controls) chrome.controls.hidden = true;\n    if (chrome.empty) chrome.empty.hidden = true;\n    if (chrome.flat) chrome.flat.hidden = true;\n    if (chrome.canvasHost) chrome.canvasHost.innerHTML = '';\n    // Back on the card: the switch reads 2D and the 3D-only controls (sides,\n    // Background, switches, Scene) leave the toolbar.\n    syncProductPreview3dRowControls(store, null);\n  }\n\n  function closeIntentFirstProductPreview3d(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var state = store && store.productPreview3d;\n    if (!state) return;\n    state.generation += 1;\n    if (state.visibilityObserver) { state.visibilityObserver.disconnect(); state.visibilityObserver = null; }\n    if (state.viewer) {\n      try { state.viewer.dispose(); } catch (_) {}\n      state.viewer = null;\n    }\n    state.flatPausedViewer = null;\n    state.autoRotateBeforeFlat = false;\n    var wasOpen = state.status === 'loading' || state.status === 'active';\n    state.status = settings.error === true ? 'error' : 'inactive';\n    if (settings.error !== true) {\n      state.waitingForArtwork = false;\n      state.fallbackReason = '';\n    }\n    state.selectionKey = '';\n    state.textureKey = '';\n    if (settings.keepFlat === true) {\n      // 3D is gone but the flat proof stays (Front | Back still works); the\n      // 3D segment leaves through the row sync.\n      var chrome = getProductPreview3dChrome(store);\n      if (chrome && chrome.canvasHost) chrome.canvasHost.innerHTML = '';\n      showProductPreview3dStage(store, 'flat');\n    } else hideProductPreview3dStage(store, { fromPopstate: settings.fromPopstate === true });\n    setProductPreview3dNotice(store, settings.notice ? text(settings.notice) : '', settings.retry === true, settings.noticeKind);\n    if (wasOpen && settings.focus !== false) restoreProductPreview3dFocus(store);\n    if (settings.announce) announceProductPreview3d(store, settings.announce);\n  }\n\n  function failProductPreview3d(store, reason) {\n    var state = ensureProductPreview3dState(store);\n    state.fallbackReason = text(reason);\n    emitProductPreview3dEvent(store, 'product_preview_failed', { reason: text(reason) });\n    // No WebGL: a truthful static fallback with no retry that could not\n    // work. Every other failure keeps the configured error copy and retry.\n    var deviceFallback = text(reason) === 'webgl_unavailable';\n    var copy = deviceFallback\n      ? getProductPreviewCopy(store, 'unavailableDevice', PRODUCT_PREVIEW_3D_DEVICE_COPY)\n      : getProductPreviewCopy(store, 'error', PRODUCT_PREVIEW_3D_ERROR_COPY);\n    // The flat proof stays and the 3D segment leaves (nothing dead-ends);\n    // \"Try again\" remains for a failure that can recover.\n    closeIntentFirstProductPreview3d(store, {\n      error: true,\n      keepFlat: true,\n      notice: copy,\n      noticeKind: deviceFallback ? 'device' : 'error',\n      retry: !deviceFallback,\n      focus: false,\n      announce: copy\n    });\n    var chrome = getProductPreview3dChrome(store);\n    if (chrome && chrome.retry && !chrome.retry.hidden && !chrome.notice.hidden && typeof chrome.retry.focus === 'function') {\n      try { chrome.retry.focus(); } catch (_) {}\n    }\n  }\n\n  function activateIntentFirstProductPreview3d(store, trigger) {\n    var state = ensureProductPreview3dState(store);\n    if (state.status === 'loading' || state.status === 'active') return;\n    // Slice 9: one live viewer per page \u2014 the generic Shopify model lane\n    // closes (and releases its viewer) before the personalized one opens.\n    closeGenericModelLane(store, { focus: false });\n    var projection = getIntentFirstProductPreviewProjection(store);\n    var chrome = getProductPreview3dChrome(store);\n    if (!projection || !chrome) return;\n    var generation = ++state.generation;\n    state.status = 'loading';\n    state.fallbackReason = '';\n    if (!state.viewMode) state.viewMode = '3d';\n    setProductPreview3dNotice(store, '', false);\n    if (chrome.controlsRow) chrome.controlsRow.hidden = false;\n    renderProductPreview3dSurfaceButtons(store, projection);\n    // Flat first (SB-15): the flat proof shows at once, the scene swaps in\n    // when it is ready, and the 3D segment carries the activity cue.\n    showProductPreview3dStage(store, 'loading');\n    announceProductPreview3d(store, 'Loading 3D preview\u2026');\n    emitProductPreview3dEvent(store, 'product_preview_opened', {\n      pageSurface: 'pdp'\n    });\n    loadProductPreview3dRuntime(store).then(function (runtime) {\n      if (state.generation !== generation || state.status !== 'loading') return null;\n      var host = getProductPreview3dChrome(store);\n      if (!host || !host.canvasHost) return null;\n      host.canvasHost.innerHTML = '';\n      var pairs = getProductPreviewSelectionPairs(store);\n      var viewer = runtime.createProductPreviewViewer({\n        container: host.canvasHost,\n        projection: projection,\n        selections: pairs,\n        // The viewer always renders the scene; 2D is the runtime's flat\n        // proof over it, so the engine's own 2D camera mode is not used.\n        viewMode: '3d',\n        // The module paints the plain light/dark backdrop behind the\n        // transparent canvas; authored surfaces and clear products keep\n        // the runtime's own fill.\n        plainBackdrop: 'consumer',\n        sizeReferenceStyle: 'subtle',\n        modelDescription: '3D preview of ' + (text(store.config && store.config.productTitle) || 'this product') + ', {side}.',\n        onAnnounce: function (message) { announceProductPreview3d(store, message); },\n        onTelemetry: function (fact) {\n          if (!fact || !text(fact.event)) return;\n          emitStorefrontEvent(store, text(fact.event), 'product-preview', {\n            profileRevisionId: text(fact.profileRevisionId),\n            rendererVersion: text(fact.rendererVersion),\n            modelBytes: numberValue(fact.modelBytes, 0) || undefined,\n            durationMs: numberValue(fact.durationMs, 0) || undefined,\n            reason: text(fact.reason) || undefined,\n            surface: text(fact.surface) || undefined,\n            cameraId: text(fact.cameraId) || undefined,\n            bindingKind: text(fact.bindingKind) || undefined,\n            materialRecipeKind: text(fact.materialRecipeKind) || undefined,\n            environmentMode: text(fact.environmentMode) || undefined\n          }, 'low');\n        },\n        onStateChange: function (snapshot) {\n          if (state.generation !== generation || !snapshot) return;\n          if (snapshot.state === '2d-fallback') {\n            failProductPreview3d(store, text(snapshot.fallbackReason) || 'viewer_fallback');\n            return;\n          }\n          if (snapshot.state === 'loading' || snapshot.state === 'active') {\n            var wasLoading = state.status === 'loading';\n            state.status = snapshot.state;\n            showProductPreview3dStage(store, snapshot.updating ? 'updating' : snapshot.state);\n            if (snapshot.state === 'active') {\n              if (hasMissingProductPreview3dArtwork(store, projection)) {\n                // The design exists but its pictures are still rendering\n                // (editor return): keep the viewer up with a \"loading your\n                // design\" overlay instead of closing to the 2D error state.\n                enterProductPreview3dDesignLoading(store, state);\n                return;\n              }\n              syncProductPreview3dDisclaimer(store);\n              if (wasLoading && trigger && state.viewMode !== '2d') {\n                var active = getProductPreview3dChrome(store);\n                var canvas = active && active.canvasHost ? active.canvasHost.querySelector('canvas') : null;\n                if (canvas && typeof canvas.focus === 'function') canvas.focus();\n                trigger = null;\n              }\n            }\n          }\n          // The row sync may have moved the viewer to the runtime's side:\n          // mirror the viewer's current state, not the snapshot it sent.\n          syncProductPreview3dRowControls(store, state.viewer && state.viewer.state ? state.viewer.state : snapshot);\n        }\n      });\n      state.viewer = viewer;\n      syncProductPreview3dFlatRotation(store);\n      state.selectionKey = JSON.stringify(pairs);\n      state.textureKey = buildProductPreview3dTextureKey(store);\n      if (hasMissingProductPreview3dArtwork(store, projection)) {\n        // Load the model now and wait for the design pictures under a\n        // \"loading your design\" overlay; the sync pass applies them on arrival.\n        state.waitingForArtwork = true;\n        scheduleProductPreviewRefresh(store, text(store.state.project.projectId));\n        return viewer.activate();\n      }\n      // Queue the current artwork before loading, so it is replayed on every\n      // selected model and the blank model never replaces an existing design.\n      void applyProductPreview3dTextures(store, state, projection);\n      return viewer.activate();\n    }).catch(function () {\n      if (state.generation === generation) failProductPreview3d(store, 'runtime_load_failed');\n    });\n  }\n\n  function syncIntentFirstProductPreview3d(store, owner, mode) {\n    var state = ensureProductPreview3dState(store);\n    var projection = getIntentFirstProductPreviewProjection(store);\n    var chrome = ensureProductPreview3dChrome(store, owner);\n    if (!chrome) return;\n    var pairs = projection ? getProductPreviewSelectionPairs(store) : [];\n    var incompatible = projection ? getIncompatibleProductPreviewSelection(projection, pairs) : null;\n    var eligible = !!projection && !incompatible && !!(mode && (mode.designPreview || mode.beforeArtwork)) && text(mode && mode.requested) !== 'standard';\n    if (!eligible) {\n      if (isIntentFirstProductPreview3dOpen(store)) {\n        if (incompatible) {\n          emitProductPreview3dEvent(store, 'product_preview_fallback', { reason: 'option_incompatible' });\n          closeIntentFirstProductPreview3d(store, {\n            notice: PRODUCT_PREVIEW_3D_INCOMPATIBLE_COPY,\n            announce: PRODUCT_PREVIEW_3D_INCOMPATIBLE_COPY,\n            focus: false\n          });\n        } else {\n          closeIntentFirstProductPreview3d(store, { focus: false });\n        }\n      } else if (state.status === 'error') {\n        state.status = 'inactive';\n        setProductPreview3dNotice(store, '', false);\n      }\n      // No 3D for this product or choice: the card shows no preview controls.\n      if (!chrome.stage.hidden) hideProductPreview3dStage(store);\n      if (chrome.controlsRow) chrome.controlsRow.hidden = true;\n      return;\n    }\n    if (chrome.controlsRow) chrome.controlsRow.hidden = false;\n    renderProductPreview3dSurfaceButtons(store, projection);\n    // Existing artwork does not require automatic 3D activation. Initialize\n    // the flat stage and side controls as soon as the projection is eligible.\n    if (chrome.stage.hidden) showProductPreview3dStage(store, 'flat');\n    syncProductPreview3dFlatProof(store, projection);\n    if (state.waitingForArtwork && !state.autoSuppressed && hasMissingProductPreview3dArtwork(store, projection) && !isDesignPreviewPending(store)) {\n      // The pictures never arrived inside the pending window: the lane falls\n      // back the way it did before design-loading existed.\n      state.waitingForArtwork = false;\n      failProductPreview3d(store, 'artwork_pending');\n      return;\n    }\n    if (state.waitingForArtwork && !state.autoSuppressed && !hasMissingProductPreview3dArtwork(store, projection)) {\n      state.waitingForArtwork = false;\n      if (state.viewer && state.viewer.state && state.viewer.state.state === 'active') {\n        // The design pictures arrived under an open viewer: apply them in\n        // place and lift the loading overlay (the texture pass below runs\n        // because the texture key changed).\n        showProductPreview3dStage(store, 'active');\n      } else {\n        activateIntentFirstProductPreview3d(store);\n        return;\n      }\n    }\n    if (!isIntentFirstProductPreview3dOpen(store)) {\n      if (state.status === 'inactive') setProductPreview3dNotice(store, '', false);\n      if (!state.eligibleEmitted) {\n        state.eligibleEmitted = true;\n        emitProductPreview3dEvent(store, 'product_preview_eligible', {\n          pageSurface: 'pdp',\n          sourceType: mode.designPreview && mode.designPreview.source === 'project' ? 'saved_project' : (mode.designPreview ? 'template' : 'blank')\n        });\n      }\n      if (mode.beforeArtwork && state.status === 'inactive' && !state.autoSuppressed && owner.closest('[data-bg-intent-first-live-preview-mode=\"live\"]')) {\n        if (!state.visibilityObserver && typeof IntersectionObserver === 'function') {\n          var observer = new IntersectionObserver(function (entries) {\n            if (state.visibilityObserver !== observer || !entries.some(function (entry) { return entry.isIntersecting; })) return;\n            observer.disconnect(); state.visibilityObserver = null;\n            var currentProjection = getIntentFirstProductPreviewProjection(store);\n            if (!owner.isConnected || state.autoSuppressed || !owner.closest('[data-bg-intent-first-live-preview-mode=\"live\"]') || !currentProjection || getIncompatibleProductPreviewSelection(currentProjection, getProductPreviewSelectionPairs(store))) return;\n            activateIntentFirstProductPreview3d(store);\n          });\n          state.visibilityObserver = observer;\n          observer.observe(owner);\n        } else if (typeof IntersectionObserver !== 'function') activateIntentFirstProductPreview3d(store);\n      }\n      return;\n    }\n    if (state.viewer) {\n      var selectionKey = JSON.stringify(pairs);\n      var selectionsChanged = state.selectionKey !== selectionKey;\n      if (selectionsChanged) {\n        state.selectionKey = selectionKey;\n        state.viewer.applySelections(pairs);\n      }\n      var textureKey = buildProductPreview3dTextureKey(store);\n      if (selectionsChanged || state.textureKey !== textureKey) {\n        state.textureKey = textureKey;\n        syncProductPreview3dFlatProof(store, projection);\n        var textureEpoch = state.textureEpoch = (state.textureEpoch || 0) + 1;\n        var generation = state.generation;\n        applyProductPreview3dTextures(store, state, projection).then(function (frontApplied) {\n          if (state.generation !== generation || state.textureEpoch !== textureEpoch || !state.viewer || state.viewer.state.state !== 'active') return;\n          // The design changed under an open viewer and the new front texture\n          // could not load \u2014 keeping the old artwork would be untruthful.\n          if (!frontApplied) failProductPreview3d(store, 'texture_failed');\n        });\n      }\n    }\n  }\n\n  // \u2500\u2500 Boguna 3D preview Slice 9 \u2014 generic Shopify model lane (\u00A74.10, ADR-026) \u2500\u2500\n  // Shopify's own model viewer + \"View in your space\" for the product's\n  // generic (blank) model media, rendered by the section ONLY when such media\n  // exists. It is a separate lane from the personalized viewer: nothing loads\n  // until the customer opens it, and the two never run together (one live\n  // viewer per page \u2014 opening either one closes the other with disposal).\n  function getGenericModelLane(store) {\n    var productInfo = store && store.root && store.root.closest('product-info');\n    return productInfo ? productInfo.querySelector('[data-bg-generic-model]') : null;\n  }\n\n  function isGenericModelLaneOpen(store) {\n    var lane = getGenericModelLane(store);\n    var state = lane ? lane.getAttribute('data-bg-generic-model-state') : '';\n    return state === 'open' || state === 'loading';\n  }\n\n  function announceGenericModelLane(lane, message) {\n    var live = lane && lane.querySelector('[data-bg-generic-model-live]');\n    if (!live) return;\n    live.textContent = '';\n    window.setTimeout(function () { live.textContent = message; }, 30);\n  }\n\n  function loadGenericModelLaneAssets(lane) {\n    if (window.customElements && window.customElements.get('product-model') && window.ProductModel) {\n      return Promise.resolve();\n    }\n    if (lane.__bgGenericModelLoad) return lane.__bgGenericModelLoad;\n    lane.__bgGenericModelLoad = new Promise(function (resolve, reject) {\n      if (!document.querySelector('link[data-bg-generic-model-style]')) {\n        var shopifyStyle = document.createElement('link');\n        shopifyStyle.rel = 'stylesheet';\n        shopifyStyle.href = 'https://cdn.shopify.com/shopifycloud/model-viewer-ui/assets/v1.0/model-viewer-ui.css';\n        shopifyStyle.setAttribute('data-bg-generic-model-style', 'shopify');\n        document.head.appendChild(shopifyStyle);\n        var themeStyle = document.createElement('link');\n        themeStyle.rel = 'stylesheet';\n        themeStyle.href = text(lane.getAttribute('data-bg-generic-model-style-src'));\n        themeStyle.setAttribute('data-bg-generic-model-style', 'theme');\n        document.head.appendChild(themeStyle);\n      }\n      var script = document.createElement('script');\n      script.src = text(lane.getAttribute('data-bg-generic-model-script-src'));\n      script.async = true;\n      script.onload = function () { resolve(); };\n      script.onerror = function () { reject(new Error('generic-model-script')); };\n      document.head.appendChild(script);\n    });\n    lane.__bgGenericModelLoad.catch(function () { lane.__bgGenericModelLoad = null; });\n    return lane.__bgGenericModelLoad;\n  }\n\n  function openGenericModelLane(store) {\n    var lane = getGenericModelLane(store);\n    if (!lane || isGenericModelLaneOpen(store)) return;\n    // One live viewer per page: the personalized viewer closes first.\n    closeIntentFirstProductPreview3d(store, { focus: false });\n    lane.setAttribute('data-bg-generic-model-state', 'loading');\n    announceGenericModelLane(lane, 'Loading 3D model\u2026');\n    emitProductPreviewTelemetry(store, 'product_preview_opened', {\n      pageSurface: 'pdp',\n      sourceType: 'generic'\n    });\n    loadGenericModelLaneAssets(lane).then(function () {\n      if (lane.getAttribute('data-bg-generic-model-state') !== 'loading') return;\n      var stage = lane.querySelector('[data-bg-generic-model-stage]');\n      var inactive = lane.querySelector('[data-bg-generic-model-inactive]');\n      var element = lane.querySelector('product-model');\n      if (stage) stage.hidden = false;\n      if (inactive) inactive.hidden = true;\n      if (element && typeof element.loadContent === 'function' && !element.hasAttribute('loaded')) {\n        element.loadContent(false);\n      }\n      if (window.ProductModel && typeof window.ProductModel.loadShopifyXR === 'function' && !lane.__bgGenericXrRequested) {\n        lane.__bgGenericXrRequested = true;\n        window.ProductModel.loadShopifyXR();\n      }\n      lane.setAttribute('data-bg-generic-model-state', 'open');\n      announceGenericModelLane(lane, '3D model ready');\n      var close = lane.querySelector('[data-bg-generic-model-close]');\n      if (close) close.focus();\n    }).catch(function () {\n      lane.setAttribute('data-bg-generic-model-state', 'inactive');\n      announceGenericModelLane(lane, 'The 3D model could not load.');\n      emitProductPreviewTelemetry(store, 'product_preview_failed', {\n        pageSurface: 'pdp',\n        sourceType: 'generic',\n        reason: 'generic-model-script'\n      });\n    });\n  }\n\n  function closeGenericModelLane(store, options) {\n    var settings = options || {};\n    var lane = getGenericModelLane(store);\n    if (!lane || !isGenericModelLaneOpen(store)) return;\n    var element = lane.querySelector('product-model');\n    if (element) {\n      // Release Shopify's viewer: its model-viewer element (and WebGL\n      // context) leaves the DOM; the template re-mounts it on the next open.\n      if (element.modelViewerUI && typeof element.modelViewerUI.destroy === 'function') {\n        try { element.modelViewerUI.destroy(); } catch (_) {}\n      }\n      element.modelViewerUI = null;\n      Array.prototype.slice.call(element.querySelectorAll('model-viewer')).forEach(function (viewer) {\n        if (viewer.parentNode) viewer.parentNode.removeChild(viewer);\n      });\n      element.removeAttribute('loaded');\n    }\n    var stage = lane.querySelector('[data-bg-generic-model-stage]');\n    var inactive = lane.querySelector('[data-bg-generic-model-inactive]');\n    if (stage) stage.hidden = true;\n    if (inactive) inactive.hidden = false;\n    lane.setAttribute('data-bg-generic-model-state', 'inactive');\n    announceGenericModelLane(lane, '3D model closed');\n    emitProductPreviewTelemetry(store, 'product_preview_closed', {\n      pageSurface: 'pdp',\n      sourceType: 'generic'\n    });\n    if (settings.focus !== false) {\n      var open = lane.querySelector('[data-bg-generic-model-open]');\n      if (open) open.focus();\n    }\n  }\n\n  function bindGenericModelLane(store) {\n    var lane = getGenericModelLane(store);\n    if (!lane || lane.__bgGenericModelBound) return;\n    lane.__bgGenericModelBound = true;\n    lane.addEventListener('click', function (event) {\n      var target = event.target;\n      if (!target || !target.closest) return;\n      if (target.closest('[data-bg-generic-model-open]')) {\n        event.preventDefault();\n        openGenericModelLane(store);\n      } else if (target.closest('[data-bg-generic-model-close]')) {\n        event.preventDefault();\n        closeGenericModelLane(store, {});\n      }\n    });\n    lane.addEventListener('keydown', function (event) {\n      if (event.key !== 'Escape' || !isGenericModelLaneOpen(store)) return;\n      event.preventDefault();\n      closeGenericModelLane(store, {});\n    });\n    window.addEventListener('pagehide', function () {\n      closeGenericModelLane(store, { focus: false });\n    });\n  }\n\n  function syncProductMedia(store) {\n    var designerPreviewState = getDesignerMediaPreviewState(store);\n    var defaults = captureDefaultMediaItems(store);\n    if (designerPreviewState && designerPreviewState.images && designerPreviewState.images.length) {\n      var combinedPreviewImages = mergeDesignerPreviewImagesWithDefaults(designerPreviewState.images, defaults);\n      var designerPreviewKey = buildMediaPreviewKey(designerPreviewState.source, combinedPreviewImages);\n      if (store.mediaState.appliedKey !== designerPreviewKey) {\n        rebuildGalleryWithImages(store, combinedPreviewImages, 0, { allowDynamicThumbnails: true });\n        store.mediaState.appliedKey = designerPreviewKey;\n      }\n      return;\n    }\n    if (!defaults.length) {\n      if (store.mediaState.appliedKey) {\n        var context = getMediaContext(store);\n        if (context) {\n          context.galleryList.innerHTML = '';\n          removeDynamicThumbnailSlider(context);\n          updateGalleryCounter(context, 0, 0);\n        }\n        store.mediaState.appliedKey = '';\n      }\n      return;\n    }\n    var overrideUrl = decideHeroOverrideImage(store);\n    var overrideKey = canonicalizeMediaUrl(overrideUrl);\n    if (!overrideKey) {\n      if (store.mediaState.appliedKey) {\n        rebuildGalleryWithImages(store, defaults, 0, { allowDynamicThumbnails: false });\n        store.mediaState.appliedKey = '';\n      }\n      return;\n    }\n    if (store.mediaState.appliedKey === overrideKey) return;\n    var existingIndex = defaults.findIndex(function (item) {\n      return canonicalizeMediaUrl(item && item.url) === overrideKey;\n    });\n    if (existingIndex !== -1) {\n      rebuildGalleryWithImages(store, defaults, existingIndex, { allowDynamicThumbnails: false });\n      store.mediaState.appliedKey = overrideKey;\n      return;\n    }\n    var merged = defaults.slice();\n    merged.push({\n      url: overrideUrl,\n      alt: text(store.config.reviewSource && store.config.reviewSource.title) || text(store.config.productTitle),\n      idSuffix: 'override'\n    });\n    rebuildGalleryWithImages(store, merged, merged.length - 1, { allowDynamicThumbnails: false });\n    store.mediaState.appliedKey = overrideKey;\n  }\n\n  function getPriceRecordForQuantity(store, quantity) {\n    var pricing = getPricingMap(store);\n    var finalSku = resolveSkuPrefix(store) + String(Math.max(1, Number(quantity || 0)));\n    return finalSku ? pricing[finalSku] || null : null;\n  }\n\n  // EXACT-CENTS-PLAN-PERCENT (2026-10-04): a plan or staff tier percentage on\n  // money, as the quote engine and the theme core price it (percentOfCents):\n  // the amount in whole cents, times the share kept, one half-up division to\n  // the cent. discountPct is a fraction (0.3) or, above 1, a percent (50). A\n  // core without scaleMoney (none is live) keeps the float formula.\n  function keepShareOfMoney(amount, discountPct) {\n    var pct = numberValue(discountPct, 0);\n    var share = pct > 1 ? pct / 100 : pct;\n    var keepBps = Math.min(10000, Math.max(0, Math.round((1 - share) * 10000)));\n    var cents = usesQuoteArithmetic() ? core.scaleMoney(amount, 1, 1) : NaN;\n    var kept = Number.isFinite(cents) ? core.scaleMoney(cents, keepBps, 10000) : NaN;\n    return Number.isFinite(kept) ? kept : roundMoney(numberValue(amount, 0) - (numberValue(amount, 0) * share));\n  }\n\n  function getArtworkFeeAmounts(store) {\n    var pricingProfile = getCustomerPricingProfile(store);\n    var editServiceCost = numberValue(store && store.state && store.state.template && store.state.template.editServiceCost, 0);\n    var customDesignCost = numberValue(store && store.productData && store.productData.customDesignCost, 0);\n    if (hasChannelDesignIncluded(store) || selectedArtworkMethodOptionHasAddon(store, 'customdesign')) {\n      customDesignCost = 0;\n    }\n    if (hasChannelDesignIncluded(store)) editServiceCost = 0;\n    var templatePersonalizationAmount = editServiceCost;\n    var customDesignAmount = customDesignCost;\n    if (editServiceCost > 0 && pricingProfile.editServiceDiscountPct) {\n      templatePersonalizationAmount = keepShareOfMoney(editServiceCost, pricingProfile.editServiceDiscountPct);\n    }\n    if (customDesignCost > 0 && pricingProfile.customDesignDiscountPct) {\n      customDesignAmount = keepShareOfMoney(customDesignCost, pricingProfile.customDesignDiscountPct);\n    }\n    return {\n      editServiceCost: roundMoney(editServiceCost),\n      editServiceOriginalCost: roundMoney(numberValue(store && store.state && store.state.template && store.state.template.editServiceOriginalCost, editServiceCost)),\n      customDesignCost: roundMoney(customDesignCost),\n      templatePersonalizationAmount: roundMoney(templatePersonalizationAmount),\n      customDesignAmount: roundMoney(customDesignAmount)\n    };\n  }\n\n  function getArtworkExtra(store) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var artworkFees = getArtworkFeeAmounts(store);\n    if (mode === 'editservice') {\n      return artworkFees.templatePersonalizationAmount;\n    }\n    if (mode === 'customdesign') {\n      return artworkFees.customDesignAmount;\n    }\n    return 0;\n  }\n\n  function getOptionAddOnTotal(store) {\n    var quantityContext = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    return core.calculateDesignerOptionAddOns(\n      buildCurrentOptionSelections(store),\n      quantityContext.paidPrintQuantity,\n      quantityContext.typedQuantity,\n      { quoteArithmetic: quantityContext.quoteArithmetic === true }\n    ).cartIncludedTotal;\n  }\n\n  function getOptionAddOnTotalForQuantity(store, quantity) {\n    var quantityContext = buildQuantityPricingContext(store, quantity);\n    return core.calculateDesignerOptionAddOns(\n      buildCurrentOptionSelections(store),\n      quantityContext.paidPrintQuantity,\n      quantityContext.typedQuantity,\n      { quoteArithmetic: quantityContext.quoteArithmetic === true }\n    ).cartIncludedTotal;\n  }\n\n  // A staff-assigned price tier (the Partner tier, the brokers, Friends and\n  // Family) prices the product from its own price column and takes 30\n  // percent off discount-eligible add-ons, exactly as the store's price entry\n  // for that tier does, so the page shows what the store charges. Retail and\n  // the member plans keep the page's own pricing.\n  var STAFF_TIER_ADDON_DISCOUNT = 0.3;\n  function applyCustomerTierPricing(store, splitPrice, priceRecord, paidQuantity, bracketQuantity, quoteArithmetic) {\n    var mode = getCustomerPricingProfile(store).mode;\n    if (mode === 'NONE' || mode === 'PRO_PLAN' || mode === 'ULTIMATE_PLAN') return splitPrice;\n    var column = artworkPlanTier(mode);\n    var special = numberValue(readTierPrice(priceRecord, column), NaN);\n    // A row without this tier's price (no column, or a cell at or below zero,\n    // blank or unreadable: BD-ZERO-TIER-CELL) has no store entry for it: the\n    // store charges retail, so the page shows retail.\n    if (!(special > 0)) return splitPrice;\n    var ratio = bracketQuantity > 0 && paidQuantity > 0 ? paidQuantity / bracketQuantity : 1;\n    var productBaseTotal = quoteArithmetic === true\n      ? core.scaleMoney(readAuthoredPrice(priceRecord, column), ratio === 1 ? 1 : paidQuantity, ratio === 1 ? 1 : bracketQuantity)\n      : roundMoney(special * ratio);\n    var addOns = splitPrice.optionAddOns && typeof splitPrice.optionAddOns === 'object' ? splitPrice.optionAddOns : {};\n    // As the store's entry: only positive discount-eligible charges take the\n    // tier's add-on discount; a credit stays whole.\n    var positiveEligible = (Array.isArray(addOns.breakdown) ? addOns.breakdown : []).reduce(function (sum, row) {\n      return row && row.cartIncluded && row.configuredDiscountEligible && numberValue(row.amount, 0) > 0.005 ? sum + numberValue(row.amount, 0) : sum;\n    }, 0);\n    // EXACT-CENTS-PLAN-PERCENT: the tier keeps 70 percent of the eligible cents,\n    // half up (the quote engine's percentOfCents); the discount is the rest.\n    var eligibleTotal = roundMoney(positiveEligible);\n    var tierDiscount = roundMoney(eligibleTotal - keepShareOfMoney(eligibleTotal, STAFF_TIER_ADDON_DISCOUNT));\n    var optionAddOns = Object.assign({}, addOns, {\n      cartIncludedDiscountEligibleTotal: roundMoney(numberValue(addOns.cartIncludedDiscountEligibleTotal, 0) - tierDiscount),\n      cartIncludedTotal: roundMoney(numberValue(addOns.cartIncludedTotal, 0) - tierDiscount)\n    });\n    var productTotal = roundMoney(productBaseTotal + optionAddOns.cartIncludedTotal);\n    var grandTotal = roundMoney(productTotal + numberValue(splitPrice.designFeeTotal, 0));\n    var quantity = Math.max(1, numberValue(splitPrice.quantity, 1) || 1);\n    return Object.assign({}, splitPrice, {\n      productBaseTotal: productBaseTotal,\n      optionAddOns: optionAddOns,\n      optionAddOnTotal: optionAddOns.cartIncludedTotal,\n      productTotal: productTotal,\n      grandTotal: grandTotal,\n      productPerUnit: roundMoney(productBaseTotal / quantity),\n      grandPerUnit: roundMoney(grandTotal / quantity)\n    });\n  }\n\n  function getSplitPriceForContext(store, quantityContext) {\n    var context = quantityContext && typeof quantityContext === 'object'\n      ? quantityContext\n      : buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    var artworkFees = getArtworkFeeAmounts(store);\n    return applyCustomerTierPricing(store, core.buildDesignerSplitPrice({\n      pricingMap: store && store.pricingData && store.pricingData.pricing,\n      baseSku: resolveSkuPrefix(store),\n      finalSku: context.finalSku,\n      basePrice: context.basePrice,\n      quantity: context.paidPrintQuantity,\n      typedQty: context.typedQuantity,\n      optionSelections: buildCurrentOptionSelections(store),\n      holdCreditsFromSale: shouldHoldCreditsFromSale(store),\n      quoteArithmetic: context.quoteArithmetic === true,\n      artworkMode: store && store.state && store.state.artworkMode,\n      template: store && store.state && store.state.template,\n      editServiceCost: artworkFees.editServiceCost,\n      customDesignCost: artworkFees.customDesignCost,\n      templatePersonalizationAmount: artworkFees.templatePersonalizationAmount,\n      customDesignAmount: artworkFees.customDesignAmount\n    }), context.priceRecord, context.paidPrintQuantity, context.priceBracketQuantity, context.quoteArithmetic === true);\n  }\n\n  function getSplitPriceForQuantity(store, quantity) {\n    return getSplitPriceForContext(store, buildQuantityPricingContext(store, quantity));\n  }\n\n  function formatSignedMoney(amount) {\n    var numeric = roundMoney(numberValue(amount, 0));\n    return (numeric < 0 ? '-' : '') + core.formatMoney(Math.abs(numeric));\n  }\n\n  // Option add-on holders (Stakes and friends) sit above the Quantity block, so\n  // their cost is part of what a finished piece costs. Pricing them at an\n  // arbitrary quantity lets the quantity ladder show real per-piece totals\n  // instead of a bare product price the customer never actually pays.\n  function getSelectedAddOnSelections(store) {\n    return buildCurrentOptionSelections(store).filter(function (entry) {\n      var holder = (store && Array.isArray(store.holders) ? store.holders : []).find(function (candidate) {\n        return text(candidate && candidate.htmlID) === text(entry && entry.holderHtmlId)\n          || text(candidate && candidate.displayName) === text(entry && entry.holderLabel);\n      });\n      if (!holder || isHolderUnavailableByRules(store, holder)) return false;\n      return !!getHolderUiConfig(holder).isAddon;\n    });\n  }\n\n  function getSelectedAddOnTotalsForQuantity(store, quantity, typedQuantity) {\n    var selectedQuantity = Math.max(1, Number(numberValue(quantity, 0)) || 0);\n    return core.calculateDesignerOptionAddOns(\n      getSelectedAddOnSelections(store),\n      selectedQuantity,\n      Math.max(1, Number(numberValue(typedQuantity, selectedQuantity)) || selectedQuantity),\n      { holdCreditsFromSale: shouldHoldCreditsFromSale(store), quoteArithmetic: usesQuoteArithmetic() },\n    );\n  }\n\n  function getSelectedAddOnSummaryRows(store) {\n    var quantity = Math.max(1, Number(store && store.state && store.state.quantity || 0));\n    // EDDM-ROUTE-MIN-ALIGN: a route mailing's typed quantity is its addresses\n    // (it differs from the quantity only below the configured minimum).\n    var typedQuantity = getQuantityMode(store) === 'eddmRoutes'\n      ? Math.max(1, Number(store && store.state && store.state.typedQuantity || 0) || quantity)\n      : quantity;\n    var addonTotals = getSelectedAddOnTotalsForQuantity(store, quantity, typedQuantity);\n    return addonTotals.breakdown.map(function (row) {\n      if (Math.abs(row.amount) < 0.01 && row.dontSayFree) return null;\n      return {\n        label: row.label,\n        amount: roundMoney(row.amount),\n        isNegative: row.isNegative,\n        discountEligible: !!row.discountEligible,\n        cartIncluded: !!row.cartIncluded,\n        excludeFromCart: !!row.excludeFromCart,\n        isPostage: !!row.isPostage\n      };\n    }).filter(Boolean);\n  }\n\n  function getSizeSurchargeSummaryAmount(store) {\n    return roundMoney(numberValue(store && store.state && store.state.sizeSurchargeTotal, 0));\n  }\n\n  function getSizeSurchargeSummaryRows(store) {\n    var amount = getSizeSurchargeSummaryAmount(store);\n    if (!(amount > 0.01)) return [];\n    return [{\n      label: 'Size Surcharge',\n      amount: amount,\n      isNegative: false,\n      // Flat by policy: the signed lane (cart-transform-signing) adds the size\n      // surcharge AFTER product discounting, so this row must never show a\n      // sale-discounted figure.\n      discountEligible: false,\n      cartIncluded: true\n    }];\n  }\n\n  function getArtworkSummaryRows(store) {\n    var rows = [];\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var artworkFees = getArtworkFeeAmounts(store);\n    if (mode === 'editservice') {\n      var editServiceCost = artworkFees.templatePersonalizationAmount;\n      var originalEditServiceCost = artworkFees.editServiceOriginalCost;\n      if (Math.abs(editServiceCost) > 0.01 || originalEditServiceCost > editServiceCost + 0.01) {\n        rows.push({\n          label: 'Template Edit Service',\n          amount: editServiceCost,\n          compareAmount: originalEditServiceCost,\n          isFree: Math.abs(editServiceCost) < 0.01,\n          isNegative: editServiceCost < 0,\n          discountEligible: true,\n          cartIncluded: true\n        });\n      }\n    }\n    if (mode === 'customdesign') {\n      var customDesignCost = artworkFees.customDesignAmount;\n      if (Math.abs(customDesignCost) > 0.01) {\n        rows.push({\n          label: 'Professional Custom Design',\n          amount: customDesignCost,\n          isNegative: customDesignCost < 0,\n          discountEligible: true,\n          cartIncluded: true\n        });\n      }\n    }\n    return rows;\n  }\n\n  function getPricePresentationForQuantity(store, quantity) {\n    var channelPrice = buildChannelPricePresentation(store, quantity);\n    if (channelPrice) return channelPrice;\n    var quantityContext = buildQuantityPricingContext(store, quantity);\n    var selectedQuantity = Math.max(1, Number(quantityContext.displayQuantity || 0));\n    var splitPrice = getSplitPriceForContext(store, quantityContext);\n    var discountPct = getShownSalePercentage(store);\n    // Everything selected above the Quantity block belongs in the quantity price:\n    // add-ons priced at this row's own quantity. Size surcharges are intentionally\n    // EXCLUDED from these totals and per-unit figures: they are a flat amount for\n    // the currently selected sizes, the signed lane (cart-transform-signing) adds\n    // them AFTER product discounting, and the summary presents them as the\n    // dedicated \"Size Surcharge\" row plus the subtotal. Folding them in here made\n    // dropdown/each displays shift whenever a surcharged size was selected. Do\n    // not add them back.\n    var addOnTotals = getSelectedAddOnTotalsForQuantity(store, selectedQuantity);\n    var sizeSurchargeTotal = roundMoney(numberValue(quantityContext.sizeSurchargeTotal, 0));\n    var discountableTotal = roundMoney(splitPrice.productBaseTotal\n      + numberValue(addOnTotals.cartIncludedDiscountEligibleTotal, 0));\n    var nonDiscountableTotal = roundMoney(numberValue(addOnTotals.cartIncludedNonDiscountEligibleTotal, 0));\n    var preDiscountTotal = roundMoney(discountableTotal + nonDiscountableTotal);\n    var total = roundMoney(applyDisplayDiscount(discountableTotal, discountPct) + nonDiscountableTotal);\n    var compareTotal = discountPct > 0 ? preDiscountTotal : total;\n    // SALE-DISPLAY-STRIKETHROUGH: a quantity row's own amount under the tier\n    // sale rule (getTierSalePercentage); the row's grand total (with the\n    // artwork fee) is the line and takes the rule once on the whole.\n    var tierPct = getTierSalePercentage(store);\n    var grandTotal = roundMoney(total + splitPrice.designFeeTotal);\n    if (tierPct > 0) {\n      compareTotal = preDiscountTotal;\n      total = tierSaleAmount(preDiscountTotal, tierPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n      grandTotal = tierSaleAmount(roundMoney(preDiscountTotal + splitPrice.designFeeTotal), tierPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n    }\n    var savings = roundMoney(compareTotal - total);\n    return attachShownPrice({\n      quantity: selectedQuantity,\n      total: total,\n      compareTotal: compareTotal,\n      savings: savings,\n      discountPct: discountPct,\n      currentPerPiece: selectedQuantity > 0 ? (tierPct > 0 ? tierSalePerPiece(total, selectedQuantity) : roundMoney(total / selectedQuantity)) : total,\n      comparePerPiece: selectedQuantity > 0 ? roundMoney(compareTotal / selectedQuantity) : compareTotal,\n      productTotal: total,\n      designFeeTotal: splitPrice.designFeeTotal,\n      grandTotal: grandTotal,\n      rawProductTotal: roundMoney(splitPrice.productTotal + sizeSurchargeTotal),\n      rawDesignFeeTotal: splitPrice.designFeeTotal,\n      rawGrandTotal: roundMoney(splitPrice.grandTotal + sizeSurchargeTotal),\n      finalSku: splitPrice.finalSku,\n      hasUnbeatablePrice: !!(store && store.config && store.config.hasUnbeatablePrice) || hasConfiguredProductTag(store, 'unbeatable-price'),\n      hasFreeShipping: !!(store && store.config && store.config.hasFreeShipping) || hasConfiguredProductTag(store, 'free-shipping')\n    }, function (shown) {\n      // FUNCTIONS-CURRENCY-AWARE: the row's amount and its line (with the\n      // artwork fee) are each converted before the tier sale takes its floor.\n      if (tierPct > 0) {\n        var row = shownSaleLine(toMoneyCents(preDiscountTotal), tierPct, 1);\n        shown.total = shown.productTotal = row.totalCents / 100;\n        shown.compareTotal = row.compareCents / 100;\n        shown.grandTotal = shownSaleLine(toMoneyCents(roundMoney(preDiscountTotal + splitPrice.designFeeTotal)), tierPct, 1).totalCents / 100;\n      }\n      shown.savings = roundMoney(shown.compareTotal - shown.total);\n      shown.currentPerPiece = selectedQuantity > 0 ? (tierPct > 0 ? tierSalePerPiece(shown.total, selectedQuantity) : roundMoney(shown.total / selectedQuantity)) : shown.total;\n      shown.comparePerPiece = selectedQuantity > 0 ? roundMoney(shown.compareTotal / selectedQuantity) : shown.compareTotal;\n    });\n  }\n\n  function getConfirmedChannelOffer(store) {\n    var origin = core.normalizeChannelOfferOrigin(store && store.state && store.state.channelOffer);\n    var offer = origin && core.findChannelOfferByVariant(store.channelCatalog, origin.variantId);\n    if (offer && origin.productId === offer.productId && origin.offerId === offer.offerId && origin.revisionId === offer.revisionId) return offer;\n    var historical = store && store.resolvedChannelOfferOrigin;\n    return origin && historical && origin.productId === historical.productId && origin.offerId === historical.offerId\n      && origin.variantId === historical.variantId && origin.revisionId === historical.revisionId ? historical : null;\n  }\n\n  function resolveChannelOfferOrigin(store, claim) {\n    store.state.channelOffer = core.normalizeChannelOfferOrigin(claim);\n    store.resolvedChannelOfferOrigin = null;\n    store.channelOfferVerificationFailed = false;\n    var origin = store.state.channelOffer;\n    if (!origin) return Promise.resolve(null);\n    if (origin.productId !== text(store.config.productId)) {\n      store.channelOfferVerificationFailed = true;\n      return Promise.resolve(null);\n    }\n    var current = getConfirmedChannelOffer(store);\n    if (current) return Promise.resolve(current);\n    var proxyRoot = text(store.config.designer && store.config.designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer';\n    var params = new URLSearchParams({ productId: origin.productId, variantId: origin.variantId,\n      offerId: origin.offerId, revisionId: origin.revisionId });\n    return core.loadJson(proxyRoot.replace(/\\/+$/, '') + '/channel-offer-revision?' + params.toString()).then(function (result) {\n      var catalog = core.normalizeChannelCatalog({ version: 1, calculatorVariantId: text(store.config.baseVariantId), offers: result && result.offer ? [result.offer] : [] }, store.config.productId);\n      var offer = catalog && catalog.offers[0];\n      if (!offer || offer.offerId !== origin.offerId || offer.variantId !== origin.variantId || offer.revisionId !== origin.revisionId) throw new Error('Offer unavailable');\n      store.resolvedChannelOfferOrigin = offer;\n      return offer;\n    }).catch(function () {\n      store.channelOfferVerificationFailed = true;\n      return null;\n    });\n  }\n\n  function hasChannelDesignIncluded(store) {\n    var offer = getConfirmedChannelOffer(store);\n    return !!(offer && offer.designIncluded);\n  }\n\n  function canDeferChannelSizes(store, quantity) {\n    var offer = getConfirmedChannelOffer(store);\n    if (!offer || !offer.collectSizesAfterOrder\n      || Number(quantity == null ? store.state.quantity : quantity) !== offer.packageQuantity) return false;\n    var apparelConfig = getApparelConfig(store);\n    if (!offer.includeSizeSurcharges && Object.values(apparelConfig && apparelConfig.sizeSurcharges || {}).some(function (amount) {\n      return Number(amount) !== 0;\n    })) return false;\n    var selections = buildCurrentOptionSelections(store);\n    return selections.length === Object.keys(offer.selections).length && selections.every(function (selection) {\n      return offer.selections[selection.holderId] === text(selection.valueId || selection.hvid);\n    });\n  }\n\n  function getChannelPurchase(store, quantity) {\n    var selections = Object.create(null);\n    buildCurrentOptionSelections(store).forEach(function (selection) {\n      selections[selection.holderId] = text(selection.valueId || selection.hvid);\n    });\n    var uploads = store.state.uploads || {};\n    return core.resolveChannelPurchase(store.channelCatalog, store.state.channelOffer, {\n      selections: selections,\n      printQuantity: quantity == null ? store.state.quantity : quantity,\n      artworkMode: store.state.artworkMode,\n      hasProject: !!text(store.state.project && store.state.project.projectId),\n      hasTemplate: !!store.state.template,\n      // Only artwork files take the order off a package: a mailing list or a\n      // QR code file is not artwork (UPLOAD-CARRY-2b).\n      hasUploads: Object.keys(uploads).some(function (key) { return uploads[key] && uploads[key].length && !findDetailUploadField(store, key); }),\n      apparelSizes: store.state.apparelSizes\n    });\n  }\n\n  // A package's own figures (quantity rows, per piece) are one package; the\n  // line totals (total, compareTotal, savings, grandTotal: the regular and sale\n  // pair, the summary and the launch total) are `sets` packages, the line an\n  // edit keeps (getRetainedSetCount). Shopify charges sets x (package -\n  // floor(package x N / 100)).\n  function buildChannelPricePresentation(store, quantity, sets) {\n    var purchase = getChannelPurchase(store, quantity);\n    if (purchase.pricingMode !== 'native') return null;\n    var rawCents = purchase.offer.price.amountCents;\n    var rawTotal = rawCents / 100;\n    var ownedPct = getShownSalePercentage(store);\n    var discountPct = ownedPct || getTierSalePercentage(store);\n    // Shopify truncates the percentage discount allocation to whole cents; the\n    // package is one Cart Transform unit at any set count, so the tier sale's\n    // rule (SALE-DISPLAY-STRIKETHROUGH) is the same floor, per package\n    // (PAGE_TIER_SALE_SHOPIFY_QUANTITY), and a line of sets is sets x that.\n    var total = ownedPct > 0\n      ? (rawCents - Math.floor(rawCents * ownedPct / 100 + 1e-8)) / 100\n      : tierSaleLineCents(rawCents, discountPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY) / 100;\n    var count = purchase.offer.packageQuantity;\n    var perPiece = discountPct > 0 && !(ownedPct > 0) ? tierSalePerPiece(total, count) : roundMoney(total / count);\n    var rawPerPiece = roundMoney(rawTotal / count);\n    var lineSets = Math.max(1, Math.floor(Number(sets) || 1));\n    var lineTotal = (lineSets * Math.round(total * 100)) / 100;\n    var lineCompareTotal = (lineSets * rawCents) / 100;\n    return attachShownPrice({ quantity: count, total: lineTotal, compareTotal: lineCompareTotal, quantityTotal: total, quantityCompareTotal: rawTotal,\n      savings: roundMoney(lineCompareTotal - lineTotal), discountPct: discountPct, currentPerPiece: perPiece, comparePerPiece: rawPerPiece,\n      productTotal: total, designFeeTotal: 0, grandTotal: lineTotal, rawProductTotal: rawTotal,\n      rawDesignFeeTotal: 0, rawGrandTotal: rawTotal, productPerPiece: perPiece, rawProductPerPiece: rawPerPiece,\n      finalSku: text(store.state.finalSku), hasUnbeatablePrice: false,\n      hasFreeShipping: !!store.config.hasFreeShipping || hasConfiguredProductTag(store, 'free-shipping') }, function (shown) {\n      // FUNCTIONS-CURRENCY-AWARE: one package converted (the Cart Transform's\n      // unit, P(unit)) takes the sale's floor; the line is its sets x that\n      // package, and the per-package figures are that same unit.\n      var line = shownSaleLine(rawCents, ownedPct > 0 ? 0 : discountPct, lineSets);\n      var afterCents = ownedPct > 0 ? line.unitCents - Math.floor(line.unitCents * ownedPct / 100 + 1e-8) : line.afterCents;\n      var packageTotal = afterCents / 100;\n      shown.total = shown.grandTotal = (lineSets * afterCents) / 100;\n      shown.compareTotal = line.compareCents / 100;\n      shown.quantityTotal = shown.productTotal = packageTotal;\n      shown.quantityCompareTotal = line.unitCents / 100;\n      shown.savings = roundMoney(shown.compareTotal - shown.total);\n      shown.currentPerPiece = shown.productPerPiece = discountPct > 0 && !(ownedPct > 0) ? tierSalePerPiece(packageTotal, count) : roundMoney(packageTotal / count);\n      shown.comparePerPiece = roundMoney(line.unitCents / 100 / count);\n    });\n  }\n\n  function applyIncomingChannelOffer(store) {\n    var token = captureArtworkOperation(store);\n    var params = new URLSearchParams(window.location.search);\n    var incomingVariant = text(params.get('bg_offer_variant') || params.get('variant'));\n    if (!incomingVariant || incomingVariant === text(store.config.baseVariantId)) return;\n    var historicalClaim = params.get('bg_offer_revision') && core.normalizeChannelOfferOrigin({\n      offerId: params.get('bg_offer_id'), revisionId: params.get('bg_offer_revision'), variantId: incomingVariant,\n      productId: text(store.config.productId), mode: 'custom'\n    });\n    if (historicalClaim) {\n      var draft = artworkConfigurationDraft(store, {});\n      return resolveChannelOfferOrigin(draft, historicalClaim).then(function (historical) {\n        if (!isArtworkOperationFresh(store, token)) return;\n        if (historical) {\n          store.resolvedChannelOfferOrigin = draft.resolvedChannelOfferOrigin;\n          applyChannelOfferDefaults(store, historical);\n        } else {\n          store.state.channelOffer = draft.state.channelOffer;\n          store.channelOfferVerificationFailed = true;\n        }\n      });\n    }\n    var offer = core.findChannelOfferByVariant(store.channelCatalog, incomingVariant);\n    if (!offer) {\n      store.pendingChannelOfferNotice = 'That package is unavailable. Choose your options below for a current price.';\n      return;\n    }\n    return applyChannelOfferDefaults(store, offer);\n  }\n\n  function applyChannelOfferDefaults(store, offer) {\n    var selections = Object.keys(offer.selections).map(function (holderId) { return { holderId: holderId, valueId: offer.selections[holderId] }; });\n    var draft = artworkConfigurationDraft(store, { channelOffer: core.normalizeChannelOfferOrigin(Object.assign({}, offer, { mode: 'native' })), quantity: offer.packageQuantity, typedQuantity: offer.packageQuantity });\n    var result = collectStoredOptionSelections(draft, selections, { strictIdentity: true });\n    var mode = offer.designIncluded ? 'customdesign' : 'youhaveart';\n    var method = getArtworkMethodOffer(draft, mode);\n    var addon = method.resolved.option && buildAddonMetadataForOption(draft, method.resolved.option, method.resolved.holder);\n    if (result.invalidSelections.length || !method.offered || (offer.designIncluded && addon && numberValue(addon.addonBasePrice, 0) > 0)) {\n      store.pendingChannelOfferNotice = 'That package has changed. Choose your options below for a current price.';\n      return;\n    }\n    var applied = commitArtworkConfiguration(store, { selections: draft.state.selections, artworkMode: mode,\n      channelOffer: core.normalizeChannelOfferOrigin(Object.assign({}, offer, { mode: 'native' })),\n      quantity: offer.packageQuantity, typedQuantity: offer.packageQuantity, apparelSizes: {}, apparelSizesInitialized: offer.collectSizesAfterOrder\n    }, { source: 'channel-offer' });\n    if (applied.status !== 'applied') { store.pendingChannelOfferNotice = 'That package has changed. Choose your options below for a current price.'; return; }\n    store.guidedArtworkIntentSelected = true;\n    recalculate(store);\n    if (getChannelPurchase(store).pricingMode !== 'native') store.pendingChannelOfferNotice = 'This package has changed. Your current calculator price is shown below, with included design retained.';\n  }\n\n  function recalculate(store) {\n    var artworkChooserExpanded = !!(store && store.uiState && store.uiState.artworkChooserExpanded);\n    var guidedArtworkIntent = text(store && store.uiState && store.uiState.guidedArtworkIntent);\n    var primaryIntent = text(store.uiState && store.uiState.artworkPrimaryIntent), secondaryIntent = text(store.uiState && store.uiState.artworkSecondaryIntent);\n    store.uiState = buildUiStateFromRules(store);\n    store.uiState.artworkChooserExpanded = artworkChooserExpanded;\n    store.uiState.artworkPrimaryIntent = primaryIntent; store.uiState.artworkSecondaryIntent = secondaryIntent;\n    if (guidedArtworkIntent === 'have' || guidedArtworkIntent === 'help') {\n      store.uiState.guidedArtworkIntent = guidedArtworkIntent;\n    }\n    var compatibilityAdjustments = ensureValidSelections(store);\n    // Price projections share the root but are never its live store. They\n    // must not clear artwork, notify the customer or touch the page.\n    if (store.root && store.root.__bgDesignerStore === store) reconcileArtworkChoice(store);\n    var compatibilityNotice = buildCompatibilityAdjustmentNotice(compatibilityAdjustments);\n    if (compatibilityNotice) store.pendingCompatibilityNotice = compatibilityNotice;\n    store.uiState.compatibilityNotice = compatibilityNotice || text(store.pendingCompatibilityNotice);\n    syncEddmStateForSelections(store);\n    store.quantityOptions = collectQuantityOptions(store);\n    var quantityContext = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    store.state.quantityMode = quantityContext.quantityMode;\n    store.state.quantity = quantityContext.displayQuantity;\n    store.state.typedQuantity = quantityContext.typedQuantity;\n    store.state.paidPrintQuantity = quantityContext.paidPrintQuantity;\n    store.state.priceBracketQuantity = quantityContext.priceBracketQuantity;\n    store.state.apparelSizesInitialized = !!quantityContext.apparelSizesInitialized;\n    store.state.apparelSizes = quantityContext.apparelSizes;\n    store.state.sizeSurchargeTotal = quantityContext.sizeSurchargeTotal;\n    if (quantityContext.quantityMode !== 'dropdown') {\n      store.state.quantityDropdownOpen = false;\n    }\n    // BD-NO-ROW-ZERO-PRICE: the displays read this; the purchase gate checks again.\n    store.state.priceRowMissing = isNoPriceRowContext(store, quantityContext);\n    var artworkFees = getArtworkFeeAmounts(store);\n    var splitPrice = getSplitPriceForContext(store, quantityContext);\n    store.state.finalSku = splitPrice.finalSku;\n    store.state.price = splitPrice.productBaseTotal;\n    store.state.priceExtras = roundMoney(splitPrice.optionAddOnTotal + splitPrice.designFeeTotal);\n    store.state.templatePersonalizationAmount = artworkFees.templatePersonalizationAmount;\n    store.state.customDesignAmount = artworkFees.customDesignAmount;\n    if (artworkOwners.has(store)) releaseStaleArtworkPurchase(store);\n  }\n\n  function resolveCartQuantityMode(store) {\n    if (core.normalizeChannelOfferOrigin(store.state.channelOffer)) return 'set_count';\n    var bindingMode = text(store && store.binding && store.binding.cartQuantityMode).toLowerCase();\n    if (bindingMode === 'print_qty' || bindingMode === 'set_count') {\n      return bindingMode;\n    }\n    if (store && store.productData && store.productData.hideQty) {\n      return '';\n    }\n    var quantityOptions = Array.isArray(store && store.quantityOptions) ? store.quantityOptions : [];\n    if (!quantityOptions.length) {\n      return '';\n    }\n    return 'print_qty';\n  }\n\n  function getSubmitButton(store) {\n    return store.form ? store.form.querySelector('[type=\"submit\"]') : null;\n  }\n\n  function getSubmitLabelNode(store) {\n    var button = getSubmitButton(store);\n    return button ? button.querySelector('span') : null;\n  }\n\n  function endPurchaseSubmission(store) {\n    if (!store || !store.purchaseSubmissionInFlight) return;\n    store.purchaseSubmissionInFlight = false;\n    syncSubmitButton(store);\n  }\n\n  function beginPurchaseSubmission(store) {\n    if (!store) return false;\n    releaseStaleArtworkPurchase(store);\n    if (store.purchaseSubmissionInFlight) return false;\n    // A new purchase: the earlier purchase's notice ends on every layout.\n    showPurchaseNotice(store, '');\n    var owner = artworkOwners.get(store);\n    owner.operation = owner.latest = captureArtworkOperation(store);\n    store.purchaseSubmissionInFlight = true;\n    syncSubmitButton(store);\n    return true;\n  }\n\n  function setMessage(store, message, tone) {\n    if (artworkDrafts.has(store)) return;\n    var blocks = readBlocks(store);\n    if (!blocks.message) return;\n    var cleanMessage = text(message);\n    blocks.message.hidden = !cleanMessage;\n    blocks.message.className = 'bg-designer-storefront__message';\n    if (tone) {\n      blocks.message.classList.add('is-' + core.slugify(tone));\n    }\n    blocks.message.textContent = cleanMessage;\n  }\n\n  // A purchase notice (why nothing was added, an add on its way to the cart,\n  // an earlier add that reached it) shows in every layout: the page message\n  // says it beside the artwork notice, and the phone layouts read it through\n  // their adapters (getPurchaseNotice), delivered on the next frame because a\n  // purchase outcome often lands outside a render. The phone changes only its\n  // notice then: an open sheet is never rebuilt (typed text, focus and scroll\n  // stay). No sentence: redraw both.\n  function showPurchaseNotice(store, sentence) {\n    var before = text(store.purchaseFailureMessage);\n    if (sentence !== undefined) store.purchaseFailureMessage = text(sentence);\n    var purchase = text(store.purchaseFailureMessage), notice = text(store.artworkChoiceNotice);\n    var message = notice && purchase && notice !== purchase ? notice + ' ' + purchase : purchase || notice;\n    setMessage(store, message, message ? 'error' : '');\n    if (purchase !== before && store.mobileExperience && !store.purchaseNoticeFrame) {\n      store.purchaseNoticeFrame = window.requestAnimationFrame(function () {\n        store.purchaseNoticeFrame = 0;\n        var active = store.mobileExperience;\n        if (active && typeof active.syncNotices === 'function') active.syncNotices();\n        else syncProductPageMobileExperience(store);\n      });\n    }\n  }\n\n  function getPurchaseNotice(store) {\n    var purchase = text(store.purchaseFailureMessage);\n    return purchase && purchase !== text(store.artworkChoiceNotice) ? purchase : '';\n  }\n\n  function isUploadMode(mode) {\n    var normalized = text(mode).toLowerCase();\n    return normalized === 'uploadfiles' || normalized === 'uploadcanva';\n  }\n\n  function normalizeCanvaUrl(value) {\n    var rawUrl = String(value == null ? '' : value)\n      .replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n      .trim();\n    if (!rawUrl) return '';\n    if (rawUrl.charAt(0) === '<' && rawUrl.charAt(rawUrl.length - 1) === '>') {\n      rawUrl = rawUrl.slice(1, -1).trim();\n    }\n    if (/^(?:www\\.)?(?:[a-z0-9-]+\\.)+[a-z]{2,63}(?::\\d{2,5})?(?:[/?#]|$)/i.test(rawUrl)) {\n      rawUrl = 'https://' + rawUrl;\n    }\n    try {\n      var parsedUrl = new URL(rawUrl);\n      if ((parsedUrl.protocol === 'https:' || parsedUrl.protocol === 'http:') && parsedUrl.hostname.indexOf('.') !== -1) {\n        return parsedUrl.toString();\n      }\n    } catch (_) {\n      return rawUrl;\n    }\n    return rawUrl;\n  }\n\n  function isValidCanvaUrl(value) {\n    var normalizedUrl = normalizeCanvaUrl(value);\n    if (!normalizedUrl) return false;\n    try {\n      var parsedUrl = new URL(normalizedUrl);\n      return (parsedUrl.protocol === 'https:' || parsedUrl.protocol === 'http:')\n        && parsedUrl.hostname.indexOf('.') !== -1;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function getCanvaLinkValidationMessage(value) {\n    return 'Paste a valid website link to continue.';\n  }\n\n  function getPrimaryArtworkUploadFiles(store) {\n    if (!store || !store.state) return [];\n    restoreUploadStateFromInputs(store);\n    var uploadField = normalizeUploadFields(store.binding)[0];\n    return uploadField && store.state.uploads ? (store.state.uploads[uploadField.id] || []) : [];\n  }\n\n  var uploadFileClientSequence = 0;\n\n  function buildUploadFileState(file) {\n    uploadFileClientSequence += 1;\n    return {\n      clientId: 'bg-upload-file-' + String(uploadFileClientSequence),\n      name: text(file && file.name),\n      fileName: text(file && file.name),\n      url: '',\n      publicUrl: '',\n      contentType: text(file && file.type),\n      byteSize: Math.max(0, Number(file && file.size || 0) || 0),\n      uploadFailed: false,\n      uploading: false,\n      sourceFile: file\n    };\n  }\n\n  function restoreUploadStateFromInputs(store) {\n    if (!store || !store.state || !store.root) return;\n    Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-upload-field]')).forEach(function (input) {\n      var fieldId = text(input.getAttribute('data-bg-upload-field'));\n      if (!fieldId) return;\n      if (store.uploadClearedFieldIds && store.uploadClearedFieldIds[fieldId]) return;\n      var currentFiles = store.state.uploads[fieldId] || [];\n      if (currentFiles.length) return;\n      var selectedFiles = Array.prototype.slice.call(input.files || []);\n      if (!selectedFiles.length) return;\n      store.state.uploads[fieldId] = selectedFiles.map(buildUploadFileState);\n    });\n  }\n\n  function requiresTemplate(mode) {\n    var normalized = text(mode).toLowerCase();\n    return normalized === 'designonline' || normalized === 'editservice';\n  }\n\n  function validateArtworkInputState(store) {\n    if (store.artworkChoiceNotice || !store.state.artworkMode || !artworkChoiceMatchesSelection(store)) {\n      return { valid: false, reason: 'Choose how you want to handle the artwork.', code: 'missing-artwork-method' };\n    }\n    if (requiresTemplate(store.state.artworkMode) && !store.state.template && !text(store.state.project && store.state.project.projectId)) {\n      return { valid: false, reason: 'Choose a template before adding this item.', code: 'missing-template' };\n    }\n    if (text(store.state.artworkMode).toLowerCase() === 'designonline' && !text(store.state.project && store.state.project.projectId)) {\n      if (isGuidedFillArmed(store)) {\n        var guidedCollected = collectGuidedFillRequests(store);\n        var guidedActionable = guidedCollected.pendingUploads\n          || (guidedCollected.fills.length > 0\n            && (!guidedCollected.requiredMissing || !!text(store.state.guidedFillProjectId)));\n        if (guidedActionable) {\n          // Uploads picked/finalized \u2014 the fill is in flight, retryable, or\n          // waiting on a drain; the submit branch waits and continues.\n          return { valid: false, reason: 'Finishing your design \u2014 one moment.', code: 'guided-fill-pending' };\n        }\n        return { valid: false, reason: 'Add your image to finish this design before adding it to the cart.', code: 'missing-slot-uploads' };\n      }\n      return { valid: false, reason: 'Save your online design before adding it to the cart.', code: 'unsaved-online-design' };\n    }\n    if (text(store.state.artworkMode).toLowerCase() === 'designonline' && !hasSavedProjectArtwork(store)) {\n      return { valid: false, reason: 'Add your artwork in the editor, then save.', code: 'empty-online-design' };\n    }\n    if (isUploadMode(store.state.artworkMode)) {\n      if (text(store.state.artworkMode).toLowerCase() === 'uploadcanva') {\n        if (!text(store.state.canvaUrl)) {\n          return { valid: false, reason: 'Add your Canva share link before adding this item.', code: 'missing-canva-link' };\n        }\n        if (!isValidCanvaUrl(store.state.canvaUrl)) {\n          return { valid: false, reason: getCanvaLinkValidationMessage(store.state.canvaUrl), code: 'invalid-canva-link' };\n        }\n        return { valid: true, reason: '' };\n      }\n      var uploadField = normalizeUploadFields(store.binding)[0];\n      var files = getPrimaryArtworkUploadFiles(store);\n      if (uploadField.required && !files.length) {\n        // Boguna upload-in-editor lane: the uploaded artwork lives in the\n        // saved project (same as designonline), never in store.state.uploads.\n        if (hasEditorUploadedArtwork(store)) {\n          return { valid: true, reason: '' };\n        }\n        return { valid: false, reason: 'Upload your artwork file before adding it to the cart.', code: 'missing-upload' };\n      }\n    }\n    return { valid: true, reason: '' };\n  }\n\n  function canUseArtworkLaterFallback(store, artworkInputValidation) {\n    if (!store || store.editingLineKey || store.artworkChoiceNotice || !canApplyArtworkMethod(store, 'youhaveart')) return false;\n    if (store.state.artworkMode && !artworkChoiceMatchesSelection(store)) return false;\n    var code = text(artworkInputValidation && artworkInputValidation.code);\n    if (['missing-artwork-method', 'missing-template', 'unsaved-online-design', 'empty-online-design', 'missing-upload', 'missing-slot-uploads', 'missing-canva-link', 'invalid-canva-link'].indexOf(code) === -1) return false;\n    var availability = getStoreArtworkAvailability(store);\n    return !!(availability && availability.youhaveart);\n  }\n\n  function validateCustomerInputField(field, rawValue) {\n    var value = field.type === 'checkbox' ? rawValue === true : String(rawValue == null ? '' : rawValue).trim();\n    if (field.type === 'checkbox') {\n      if (field.required && value !== true) {\n        return { valid: false, reason: 'Confirm ' + field.label + ' before adding this item to the cart.' };\n      }\n      return { valid: true, reason: '' };\n    }\n    if (!value) {\n      return field.required\n        ? { valid: false, reason: 'Enter ' + field.label + ' before adding this item to the cart.' }\n        : { valid: true, reason: '' };\n    }\n    var usesCharacterLimits = field.type === 'short_text' || field.type === 'long_text';\n    if (usesCharacterLimits && field.minLength !== null && value.length < field.minLength) {\n      return { valid: false, reason: field.label + ' must be at least ' + String(field.minLength) + ' characters.' };\n    }\n    if (usesCharacterLimits && field.maxLength !== null && value.length > field.maxLength) {\n      return { valid: false, reason: field.label + ' must be no more than ' + String(field.maxLength) + ' characters.' };\n    }\n    if (field.type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n      return { valid: false, reason: 'Enter a valid email address for ' + field.label + '.' };\n    }\n    if (field.type === 'phone' && value.replace(/\\D/g, '').length < 7) {\n      return { valid: false, reason: 'Enter a valid phone number for ' + field.label + '.' };\n    }\n    if (field.type === 'url') {\n      try {\n        var parsedUrl = new URL(value);\n        if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') throw new Error('unsupported protocol');\n      } catch (_) {\n        return { valid: false, reason: 'Enter a complete web address for ' + field.label + '.' };\n      }\n    }\n    if (field.type === 'number') {\n      var numericValue = Number(value);\n      if (!Number.isFinite(numericValue)) {\n        return { valid: false, reason: 'Enter a valid number for ' + field.label + '.' };\n      }\n      if (field.min !== null && numericValue < field.min) {\n        return { valid: false, reason: field.label + ' must be at least ' + String(field.min) + '.' };\n      }\n      if (field.max !== null && numericValue > field.max) {\n        return { valid: false, reason: field.label + ' must be no more than ' + String(field.max) + '.' };\n      }\n      if (field.step !== null) {\n        var stepBase = field.min !== null ? field.min : 0;\n        var stepRemainder = Math.abs((numericValue - stepBase) / field.step);\n        if (Math.abs(stepRemainder - Math.round(stepRemainder)) > 0.0000001) {\n          return { valid: false, reason: field.label + ' must use increments of ' + String(field.step) + '.' };\n        }\n      }\n    }\n    if (field.type === 'date') {\n      var parsedDate = new Date(value + 'T00:00:00.000Z');\n      if (\n        !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n        || !Number.isFinite(parsedDate.getTime())\n        || parsedDate.toISOString().slice(0, 10) !== value\n      ) {\n        return { valid: false, reason: 'Choose a valid date for ' + field.label + '.' };\n      }\n      if (field.minDate && value < field.minDate) {\n        return { valid: false, reason: field.label + ' must be on or after ' + field.minDate + '.' };\n      }\n      if (field.maxDate && value > field.maxDate) {\n        return { valid: false, reason: field.label + ' must be on or before ' + field.maxDate + '.' };\n      }\n    }\n    return { valid: true, reason: '' };\n  }\n\n  // UPLOAD-SURFACES-NEVER-SENT-01: a detail upload field the product's rules\n  // mark required blocks the purchase while it holds no file, the way a\n  // required artwork upload does. A file that is picked but not stored yet is\n  // held by the pending-upload gate of the submit, which never lets it pass\n  // without its link.\n  function validateDetailUploadFields(store) {\n    var fields = getDetailUploadFields(store);\n    for (var index = 0; index < fields.length; index += 1) {\n      var field = fields[index];\n      if (!field.required || getUploadFieldFiles(store, field.id).length) continue;\n      return {\n        valid: false,\n        reason: 'Upload the ' + field.label + ' before adding this item to the cart.',\n        code: 'missing-detail-upload',\n        fieldId: field.id\n      };\n    }\n    return { valid: true, reason: '' };\n  }\n\n  function validateCustomerInputs(store) {\n    var config = getCustomerInputConfig(store);\n    if (!config.enabled) return { valid: true, reason: '' };\n    for (var index = 0; index < config.fields.length; index += 1) {\n      var field = config.fields[index];\n      var validation = validateCustomerInputField(field, store.state.customerInputs[field.id]);\n      if (!validation.valid) {\n        return {\n          valid: false,\n          reason: validation.reason,\n          code: 'customer-input-invalid',\n          fieldId: field.id\n        };\n      }\n    }\n    return { valid: true, reason: '' };\n  }\n\n  // ALLOWED-BLOCKS-AT-MUTATION: the two refusals the page keeps (root AGENTS.md \"Minimal order friction\"), shared by\n  // the submit gate (validateState) and the check right before every cart mutation (checkAllowedBlocks).\n  function checkDesignApprovalBlock(store, artworkRuleState) {\n    if (artworkRuleState.showDesignApprovalChoice && !store.state.approvals.designReviewApproved) {\n      return { valid: false, reason: 'Approve your artwork before adding it to the cart.', code: 'design-approval-required' };\n    }\n    return null;\n  }\n  function checkEddmDateBlock(eddm) {\n    var minimumTargetDate = getEddmMinimumTargetDate();\n    if (!eddm.targetInMailboxDate || !isDateOnOrAfter(eddm.targetInMailboxDate, minimumTargetDate)) {\n      return { valid: false, reason: 'Choose a target in-mailbox date at least 10 business days out.' };\n    }\n    return null;\n  }\n  // The EDDM date a request carries (its designer state), '' when it carries none.\n  function readSentEddmDate(formData) {\n    var state = formData && typeof formData.get === 'function' ? parseJson(text(formData.get('properties[_bg_designer_state_v1]')), null) : null;\n    return text(state && state.eddm && state.eddm.targetInMailboxDate);\n  }\n  // The EDDM date each purchase's request carries, kept for the send guard (no form there; checkArtworkDispatch, RT/060).\n  var artworkSentEddmDates = new WeakMap();\n  function sentEddmDate(token, sent) {\n    if (!sent) return token ? text(artworkSentEddmDates.get(token)) : '';\n    var date = readSentEddmDate(sent);\n    if (token) artworkSentEddmDates.set(token, date);\n    return date;\n  }\n  // Never the route check or any other refusal. sentDate: the date the request carries (else the page's date). A date\n  // the page filled in place of the shopper's own (store.eddmDateMoved, RT/080) refuses once while it is the date being\n  // sent; a shopper date choice, a press of Add on the page and launchDesigner drop it.\n  function checkAllowedBlocks(store, sentDate) {\n    var approval = checkDesignApprovalBlock(store, getArtworkRuleState(store));\n    if (approval) return approval;\n    var active = isEddmFullServiceActive(store);\n    var date = text(sentDate) || (active ? text(ensureEddmState(store).targetInMailboxDate) : '');\n    if (!date && !active) return null;\n    var moved = store.eddmDateMoved;\n    var refusal = checkEddmDateBlock({ targetInMailboxDate: date })\n      || (moved && moved.to === date ? checkEddmDateBlock({ targetInMailboxDate: moved.from }) : null);\n    if (refusal) store.eddmDateMoved = null;\n    return refusal;\n  }\n\n  function validateState(store) {\n    var artworkRuleState = getArtworkRuleState(store);\n    var artworkSectionActive = shouldRenderArtworkSection(store, getArtworkSectionConfig(store));\n    var quantityMode = text(store && store.state && store.state.quantityMode);\n    var apparelConfig = getApparelConfig(store);\n    var minApparelQty = normalizePositiveInteger(\n      numberValue(apparelConfig && apparelConfig.minQty, numberValue(store && store.productData && store.productData.minQty, 1)),\n      1\n    );\n    var totalApparelPieces = sumApparelSizes(store && store.state && store.state.apparelSizes);\n    if (!store.form) return { valid: false, reason: 'The product form is missing.' };\n    if (!ensureContextualSelectedDesignCompatibility(store)) {\n      return {\n        valid: false,\n        reason: 'Resolve the selected design and product options before continuing.',\n        code: 'selected-design-incompatible'\n      };\n    }\n    if (store.channelOfferVerificationFailed) return { valid: false, reason: 'We could not verify the included-design offer. Refresh this page to try again.', code: 'channel-offer-unverified' };\n    if (isSetupDataUnavailable(store)) return { valid: false, reason: withCartFailureReferenceCode(SETUP_DATA_UNAVAILABLE_MESSAGE), code: 'setup-data-unavailable' };\n    if (!store.state.finalSku || !store.state.quantity) return { valid: false, reason: 'Choose a valid size and quantity.' };\n    var productCommerceBlocker = getProductCommerceCheckoutBlocker(store);\n    if (productCommerceBlocker) {\n      return { valid: false, reason: productCommerceBlocker, code: 'product-commerce-rule-blocked' };\n    }\n    var requiredHolderValidation = validateProductCommerceRequiredHolders(store);\n    if (!requiredHolderValidation.valid) return requiredHolderValidation;\n    // BD-NO-ROW-ZERO-PRICE: the purchase gate stays closed for a choice no\n    // price row prices (syncSubmitButton keeps Add to cart disabled).\n    if (isNoPriceRowState(store)) return { valid: false, reason: NO_PRICE_ROW_MESSAGE, code: 'no-price-row' };\n    var customerInputValidation = validateCustomerInputs(store);\n    if (!customerInputValidation.valid) return customerInputValidation;\n    if (isEddmFullServiceActive(store)) {\n      if (!hasEddmRouteSelection(store)) {\n        return { valid: false, reason: 'Select EDDM routes before adding this postcard order to the cart.' };\n      }\n      var eddmDateBlock = checkEddmDateBlock(ensureEddmState(store));\n      if (eddmDateBlock) return eddmDateBlock;\n    }\n    var deferredChannelSizes = canDeferChannelSizes(store);\n    if (quantityMode === 'apparelMatrix' && !deferredChannelSizes && (!totalApparelPieces || totalApparelPieces < minApparelQty)) {\n      return {\n        valid: false,\n        reason: 'Allocate at least ' + String(minApparelQty) + ' total pieces across the size matrix.'\n      };\n    }\n    var maxApparelQty = quantityMode === 'apparelMatrix' && !deferredChannelSizes ? getConfiguredQuantityMaximum(store) : 0;\n    if (maxApparelQty && totalApparelPieces > maxApparelQty) {\n      return {\n        valid: false,\n        reason: 'Allocate at most ' + String(maxApparelQty) + ' total pieces across the size matrix.',\n        code: 'apparel-above-maximum'\n      };\n    }\n    var artworkInputValidation = artworkSectionActive || store.artworkChoiceNotice || (store.state.artworkMode && !artworkChoiceMatchesSelection(store))\n      ? validateArtworkInputState(store)\n      : { valid: true, reason: '' };\n    var approvalBlock = checkDesignApprovalBlock(store, artworkRuleState);\n    if (approvalBlock) return approvalBlock;\n    if (artworkRuleState.showCustomDesignApprovalChoice && !store.state.approvals.customDesignApproved) {\n      return { valid: false, reason: 'Acknowledge the custom design disclaimer before adding it to the cart.' };\n    }\n    if (!artworkInputValidation.valid) {\n      artworkInputValidation.allowArtworkLater = canUseArtworkLaterFallback(store, artworkInputValidation);\n      return artworkInputValidation;\n    }\n    var detailUploadValidation = validateDetailUploadFields(store);\n    if (!detailUploadValidation.valid) return detailUploadValidation;\n    return { valid: true, reason: '' };\n  }\n\n  function clearCompletionState(store) {\n    if (!store || !store.state) return;\n    store.state.completion = {\n      allowed: false,\n      decision: '',\n      reason: '',\n      message: '',\n      checkedAt: '',\n      hardBlockCount: 0,\n      confirmationRequiredCount: 0,\n      confirmation: {\n        accepted: false,\n        acceptedAt: '',\n        documentFingerprint: '',\n        issueCodes: []\n      },\n      review: {\n        operatorReviewRequired: false,\n        customerConfirmationRequired: false,\n        issueCodes: [],\n        notes: []\n      },\n      issues: []\n    };\n    store.completionRequestKey = '';\n    store.completionModalState = null;\n  }\n\n  function normalizeCompletionEligibility(value) {\n    return core.normalizeCompletionState(value) || {\n      allowed: false,\n      decision: '',\n      reason: '',\n      message: '',\n      checkedAt: '',\n      hardBlockCount: 0,\n      confirmationRequiredCount: 0,\n      confirmation: {\n        accepted: false,\n        acceptedAt: '',\n        documentFingerprint: '',\n        issueCodes: []\n      },\n      review: {\n        operatorReviewRequired: false,\n        customerConfirmationRequired: false,\n        issueCodes: [],\n        notes: []\n      },\n      issues: []\n    };\n  }\n\n  function serializeCompletionIssueCodes(value) {\n    if (!Array.isArray(value)) return '';\n    var seen = Object.create(null);\n    var codes = value.map(text).filter(function (entry) {\n      if (!entry || seen[entry]) return false;\n      seen[entry] = true;\n      return true;\n    });\n    codes.sort();\n    return codes.join(',');\n  }\n\n  function getCompletionConfirmation(store) {\n    var completion = store && store.state && store.state.completion ? store.state.completion : {};\n    var confirmation = completion.confirmation && typeof completion.confirmation === 'object'\n      ? completion.confirmation\n      : {};\n    if (!confirmation.accepted || !text(confirmation.documentFingerprint) || !Array.isArray(confirmation.issueCodes) || !confirmation.issueCodes.length) {\n      return null;\n    }\n    return {\n      accepted: true,\n      acceptedAt: text(confirmation.acceptedAt) || new Date().toISOString(),\n      documentFingerprint: text(confirmation.documentFingerprint),\n      issueCodes: confirmation.issueCodes.map(text).filter(Boolean)\n    };\n  }\n\n  function setCompletionEligibility(store, eligibility, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var normalized = normalizeCompletionEligibility(eligibility);\n    if (settings.preserveAcceptedConfirmation && getCompletionConfirmation(store) && normalized.confirmation && !normalized.confirmation.accepted) {\n      normalized.confirmation = {\n        accepted: true,\n        acceptedAt: text(store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.acceptedAt) || new Date().toISOString(),\n        documentFingerprint: text(store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.documentFingerprint),\n        issueCodes: Array.isArray(store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.issueCodes)\n          ? store.state.completion.confirmation.issueCodes.slice()\n          : []\n      };\n    }\n    store.state.completion = normalized;\n    syncFormState(store);\n  }\n\n  function buildCompletionCheckKey(store) {\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var completion = store && store.state && store.state.completion ? store.state.completion : {};\n    var confirmation = completion.confirmation && typeof completion.confirmation === 'object'\n      ? completion.confirmation\n      : {};\n    return [\n      text(project.projectId),\n      text(project.refreshToken),\n      text(confirmation.documentFingerprint),\n      Array.isArray(confirmation.issueCodes) ? confirmation.issueCodes.map(text).filter(Boolean).sort().join(',') : ''\n    ].join('|');\n  }\n\n  function buildCompletionPayload(store) {\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var binding = store && store.binding && typeof store.binding === 'object' ? store.binding : {};\n    var sizePayload = buildSelectedSizePayload(store);\n    var editorSelectionSync = buildEditorSelectionSyncPayload(store);\n    return {\n      projectId: text(project.projectId),\n      storeKey: text(store.config && (store.config.storeKey || store.config.storefront)) || '',\n      productBindingId: text(binding.bindingId || binding.id),\n      surface: 'storefront',\n      intent: store.editingLineKey ? 'edit-cart-item' : 'add-to-cart',\n      confirmation: getCompletionConfirmation(store) || undefined,\n      metadata: {\n        storefrontBinding: {\n          productId: text(store.config && store.config.productId),\n          productHandle: text(store.config && store.config.handle),\n          selection: {\n            selectedSizeId: text(sizePayload.selectedSizeId),\n            selectedSizeLabel: text(sizePayload.selectedSizeLabel),\n            selectedWidth: text(sizePayload.selectedWidth),\n            selectedHeight: text(sizePayload.selectedHeight),\n            selectedUnit: text(sizePayload.selectedUnit),\n            selectedOrientation: text(sizePayload.selectedOrientation),\n            selectedSidesId: text(editorSelectionSync.selectedSidesId),\n            selectedSidesLabel: text(editorSelectionSync.selectedSidesLabel),\n            selectedSidesTargetingId: text(editorSelectionSync.selectedSidesTargetingId),\n            sidesPolicy: editorSelectionSync.sidesPolicy || undefined,\n            selectedPrintingId: text(editorSelectionSync.selectedPrintingId),\n            selectedPrintingLabel: text(editorSelectionSync.selectedPrintingLabel),\n            selectedPrintingTargetingId: text(editorSelectionSync.selectedPrintingTargetingId),\n            backer: text(store.state.template && store.state.template.backer),\n            printQuantity: resolveDesignerLaunchQuantity(store),\n            channelOffer: core.normalizeChannelOfferOrigin(store.state.channelOffer) || undefined,\n            optionSelections: buildCurrentOptionSelections(store)\n          },\n        },\n      },\n    };\n  }\n\n  function synthesizeCompletionFallback(store) {\n    var completion = normalizeCompletionEligibility({\n      allowed: true,\n      decision: 'allowed',\n      reason: 'post-order-review',\n      message: 'Order can continue. Final print review could not be completed at checkout and will be handled after purchase.',\n      checkedAt: new Date().toISOString(),\n      hardBlockCount: 0,\n      confirmationRequiredCount: 0,\n      confirmation: {\n        accepted: false,\n        acceptedAt: '',\n        documentFingerprint: '',\n        issueCodes: []\n      },\n      review: {\n        operatorReviewRequired: true,\n        customerConfirmationRequired: false,\n        issueCodes: ['storefront-review-unavailable'],\n        notes: ['Checkout print review was unavailable. This order requires operator follow-up before production begins.']\n      }\n    });\n    setCompletionEligibility(store, completion);\n    return completion;\n  }\n\n  function collectManagedProductForms(store) {\n    var forms = [];\n    function addForm(form) {\n      if (!form || !form.querySelector || forms.indexOf(form) !== -1) return;\n      forms.push(form);\n    }\n    if (!store || !store.form) return forms;\n    addForm(store.form);\n    var scopes = [];\n    var formShell = findNativeOrderFormShell(store);\n    if (formShell) scopes.push(formShell);\n    var infoContainer = store.root && store.root.closest\n      ? store.root.closest('[id^=\"ProductInfo-\"], product-info, .product__info-container')\n      : null;\n    if (infoContainer && scopes.indexOf(infoContainer) === -1) scopes.push(infoContainer);\n    scopes.forEach(function (scope) {\n      Array.prototype.slice.call(scope.querySelectorAll('form[action*=\"/cart/add\"], product-form form')).forEach(addForm);\n    });\n    Array.prototype.slice.call(document.querySelectorAll('form[action*=\"/cart/add\"], product-form form')).forEach(addForm);\n    return forms;\n  }\n\n  function ensureHiddenInputs(store, targetForm) {\n    var form = targetForm || (store && store.form);\n    if (!form) return null;\n    var existing = form.querySelector('[data-bg-designer-hidden-inputs=\"1\"]');\n    if (existing) {\n      if (!targetForm || form === store.form) store.hiddenInputs = existing;\n      return existing;\n    }\n    if ((!targetForm || form === store.form) && store.hiddenInputs && store.hiddenInputs.isConnected && store.hiddenInputs.closest('form') === form) {\n      return store.hiddenInputs;\n    }\n    var container = document.createElement('div');\n    container.setAttribute('data-bg-designer-hidden-inputs', '1');\n    container.hidden = true;\n    form.appendChild(container);\n    if (!targetForm || form === store.form) store.hiddenInputs = container;\n    return container;\n  }\n\n  function removeStaleManagedPropertyInputs(form, container, managedInputNames) {\n    if (!form || !container || !Array.isArray(managedInputNames) || !managedInputNames.length) return;\n    Array.prototype.slice.call(form.querySelectorAll('input[name^=\"properties[\"]')).forEach(function (input) {\n      var name = input.getAttribute('name') || '';\n      if (managedInputNames.indexOf(name) === -1) return;\n      if (input.closest('[data-bg-designer-hidden-inputs=\"1\"]') === container) return;\n      if (input.parentNode) input.parentNode.removeChild(input);\n    });\n  }\n\n  function syncManagedProductFormState(store, form, inputsMarkup, managedInputNames) {\n    var container = ensureHiddenInputs(store, form);\n    if (!container) return;\n    removeStaleManagedPropertyInputs(form, container, managedInputNames);\n    container.innerHTML = inputsMarkup;\n    var variantInput = form.querySelector('[name=\"id\"]');\n    if (variantInput) {\n      variantInput.value = getChannelPurchase(store).variantId || text(store.config.baseVariantId);\n    }\n  }\n\n  function buildSerializedEddmState(store) {\n    if (!isEddmFullServiceActive(store)) return null;\n    var eddm = ensureEddmState(store);\n    return {\n      provider: text(eddm.provider),\n      dataVersion: text(eddm.dataVersion),\n      routeGroupUuid: text(eddm.routeGroupUuid),\n      targetInMailboxDate: text(eddm.targetInMailboxDate),\n      routesSelected: !!eddm.routesSelected,\n      selectedRouteCount: Number(eddm.selectedRouteCount || 0) || 0,\n      residentialAddresses: Number(eddm.residentialAddresses || 0) || 0,\n      businessAddresses: Number(eddm.businessAddresses || 0) || 0,\n      totalAddresses: Number(eddm.totalAddresses || 0) || 0,\n      residentialOnly: !!eddm.residentialOnly,\n      politicalMailer: !!eddm.politicalMailer,\n      routeDetails: text(eddm.routeDetails),\n      selectedRoutes: Array.isArray(eddm.selectedRoutes) ? eddm.selectedRoutes.map(function (route) {\n        return {\n          routeId: text(route && route.routeId),\n          zip: text(route && route.zip),\n          crid: text(route && route.crid),\n          routeType: text(route && route.routeType),\n          dataVersion: text(route && route.dataVersion),\n          residential: Number(route && route.residential || 0) || 0,\n          business: Number(route && route.business || 0) || 0,\n          total: Number(route && route.total || 0) || 0\n        };\n      }).filter(function (route) {\n        return route.routeId || route.zip || route.crid;\n      }) : []\n    };\n  }\n\n  // The server's completion fingerprint is the full normalized document JSON\n  // (megabytes for designs with inline background art); Shopify rejects carts\n  // whose line properties carry it (\"Cart is too large\"). Nothing reads the\n  // full string back off the line, so serialize a compact digest instead.\n  function compactCompletionFingerprint(fingerprint) {\n    var value = text(fingerprint);\n    if (!value || value.length <= 128) return value;\n    var djb2 = 5381;\n    var sdbm = 0;\n    for (var index = 0; index < value.length; index += 1) {\n      var charCode = value.charCodeAt(index);\n      djb2 = ((djb2 * 33) ^ charCode) >>> 0;\n      sdbm = (charCode + (sdbm << 6) + (sdbm << 16) - sdbm) >>> 0;\n    }\n    return 'fpv1:' + value.length.toString(36) + ':' + djb2.toString(16) + sdbm.toString(16);\n  }\n\n  function buildSerializedCustomerInputs(store) {\n    var config = getCustomerInputConfig(store);\n    if (!config.enabled) return [];\n    return config.fields.map(function (field) {\n      var rawValue = store.state.customerInputs[field.id];\n      var value = field.type === 'checkbox'\n        ? rawValue === true\n        : String(rawValue == null ? '' : rawValue).trim().slice(0, 1000);\n      if (field.type === 'checkbox' ? value !== true : !value) return null;\n      return {\n        id: field.id,\n        label: field.label,\n        type: field.type,\n        value: value\n      };\n    }).filter(Boolean);\n  }\n\n  function buildSerializedState(store) {\n    var optionSelections = buildCurrentOptionSelections(store);\n    var sizePayload = buildSelectedSizePayload(store);\n    var editorSelectionSync = buildEditorSelectionSyncPayload(store);\n    var artworkFees = getArtworkFeeAmounts(store);\n    var editServiceCost = artworkFees.editServiceCost;\n    var customDesignCost = artworkFees.customDesignCost;\n    var apparelConfig = getApparelConfig(store);\n    var projectPreviewUrl = text(store && store.state && store.state.project && store.state.project.previewUrl);\n    var projectPreviews = store && store.state && store.state.project && Array.isArray(store.state.project.previews)\n      ? store.state.project.previews.map(text).filter(Boolean)\n      : [];\n    var serializedProjectId = text(store && store.state && store.state.project && store.state.project.projectId);\n    if (isPitchPrintLaunchProvider(store) && serializedProjectId) {\n      projectPreviews = getPitchPrintPreviewUrls(serializedProjectId, projectPreviewUrl, projectPreviews);\n      projectPreviewUrl = text(projectPreviews[0]);\n    }\n    var templatePersonalizationAmount = artworkFees.templatePersonalizationAmount;\n    var customDesignAmount = artworkFees.customDesignAmount;\n    var quantityPricingContext = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    var statePayload = core.buildDesignerState({\n      runtimeVersion: text(store.config.runtimeVersion) || 'designer-storefront-v1',\n      handle: store.config.handle,\n      sourceHandle: getLegacyProductSourceHandle(store),\n      productId: store.config.productId,\n      baseVariantId: store.config.baseVariantId,\n      channelOffer: store.state.channelOffer ? Object.assign({}, store.state.channelOffer, {\n        mode: getChannelPurchase(store).pricingMode,\n        designIncluded: hasChannelDesignIncluded(store)\n      }) : null,\n      quoteRevision: text(store && store.productCommerceRuntimeBundle && store.productCommerceRuntimeBundle.quoteRevision),\n      pricingFingerprint: text(store && store.state && store.state.pricingFingerprint),\n      launchProvider: getLaunchProvider(store),\n      cartQuantityMode: resolveCartQuantityMode(store),\n      optionSelections: optionSelections,\n      artworkSectionEnabled: shouldRenderArtworkSection(store, getArtworkSectionConfig(store)),\n      artworkMode: store.state.artworkMode,\n      artworkLabel: getModeLabel(store.state.artworkMode),\n      cartDesignEditor: getCartDesignEditor(store),\n      template: store.state.template ? {\n        designId: store.state.template.designId,\n        designNumber: store.state.template.designNumber,\n        templateLookup: store.state.template.templateLookup,\n        templatePublicId: store.state.template.templatePublicId,\n        foundationTemplateId: store.state.template.foundationTemplateId,\n        revision: store.state.template.revision || store.state.template.templateRevision,\n        title: store.state.template.title,\n        previewUrl: getTemplateFrontPreview(store.state.template),\n        previews: Array.isArray(store.state.template.previews) ? store.state.template.previews.map(text).filter(Boolean) : [],\n        editServiceCost: numberValue(store.state.template.editServiceCost, 0),\n        editServiceOriginalCost: numberValue(store.state.template.editServiceOriginalCost, store.state.template.editServiceCost),\n        backer: store.state.template.backer,\n        backerLabel: store.state.template.backerLabel,\n        orientation: store.state.template.orientation\n      } : null,\n      project: store.state.project ? {\n        projectId: serializedProjectId,\n        designId: store.state.project.designId || (store.state.template && store.state.template.designId),\n        designNumber: store.state.project.designNumber || (store.state.template && store.state.template.designNumber),\n        title: text(store.state.project.title),\n        updatedAt: text(store.state.project.updatedAt),\n        documentOrientation: text(store.state.project.documentOrientation),\n        previewUrl: projectPreviewUrl,\n        previews: projectPreviews,\n        numPages: Number(numberValue(store.state.project.numPages, 0) || 0),\n        hasArtwork: typeof store.state.project.hasArtwork === 'boolean' ? store.state.project.hasArtwork : undefined,\n        refreshToken: store.state.project.refreshToken,\n        provider: getLaunchProvider(store)\n      } : null,\n      editServiceCost: editServiceCost,\n      editServiceOriginalCost: artworkFees.editServiceOriginalCost,\n      customDesignCost: customDesignCost,\n      templatePersonalizationAmount: templatePersonalizationAmount,\n      customDesignAmount: customDesignAmount,\n      completion: store.state.completion ? {\n        allowed: !!store.state.completion.allowed,\n        decision: text(store.state.completion.decision),\n        reason: text(store.state.completion.reason),\n        message: text(store.state.completion.message),\n        checkedAt: text(store.state.completion.checkedAt),\n        hardBlockCount: Number(store.state.completion.hardBlockCount || 0) || 0,\n        confirmationRequiredCount: Number(store.state.completion.confirmationRequiredCount || 0) || 0,\n        confirmation: {\n          accepted: !!(store.state.completion.confirmation && store.state.completion.confirmation.accepted),\n          acceptedAt: text(store.state.completion.confirmation && store.state.completion.confirmation.acceptedAt),\n          documentFingerprint: compactCompletionFingerprint(text(store.state.completion.confirmation && store.state.completion.confirmation.documentFingerprint)),\n          issueCodes: Array.isArray(store.state.completion.confirmation && store.state.completion.confirmation.issueCodes)\n            ? store.state.completion.confirmation.issueCodes.map(text).filter(Boolean)\n            : []\n        },\n      review: {\n        operatorReviewRequired: !!(store.state.completion.review && store.state.completion.review.operatorReviewRequired),\n        customerConfirmationRequired: !!(store.state.completion.review && store.state.completion.review.customerConfirmationRequired),\n        issueCodes: Array.isArray(store.state.completion.review && store.state.completion.review.issueCodes)\n          ? store.state.completion.review.issueCodes.map(text).filter(Boolean)\n          : [],\n        notes: Array.isArray(store.state.completion.review && store.state.completion.review.notes)\n          ? store.state.completion.review.notes.map(text).filter(Boolean)\n          : []\n      },\n      issues: Array.isArray(store.state.completion.issues)\n        ? store.state.completion.issues.map(function (issue) {\n          return {\n            code: text(issue && issue.code),\n            severity: text(issue && issue.severity),\n            disposition: text(issue && issue.disposition),\n            occurrenceCount: Number(issue && issue.occurrenceCount || 0) || 1,\n            title: text(issue && issue.title),\n            message: text(issue && issue.message)\n          };\n        }).filter(function (issue) {\n          return issue.code && issue.title;\n        })\n        : []\n    } : null,\n      canvaUrl: text(store.state.canvaUrl),\n      guidedFill: store.state.guidedFillArmed || text(store.state.guidedFillProjectId) ? {\n        armed: !!store.state.guidedFillArmed,\n        projectId: text(store.state.guidedFillProjectId)\n      } : null,\n      customerInputs: buildSerializedCustomerInputs(store),\n      approvals: store.state.approvals,\n      uploads: buildSerializedUploads(store),\n      finalSku: store.state.finalSku,\n      priceEntry: quantityPricingContext.priceRecord,\n      // EDDM-ROUTE-CENT: core keeps these only on a quote-priced line.\n      quoteArithmetic: quantityPricingContext.quoteArithmetic === true,\n      authoredPriceEntry: quantityPricingContext.priceRecord && quantityPricingContext.priceRecord.authored,\n      quantityMode: store.state.quantityMode,\n      printQuantity: store.state.quantity,\n      typedQuantity: store.state.typedQuantity,\n      paidPrintQty: store.state.paidPrintQuantity,\n      quantityLockedToPricingTable: isQuantityLockedToPricingTable(store),\n      quantityPriceQuantities: store.quantityOptions,\n      quantityMin: quantityPricingContext.bounds.min,\n      quantityMax: quantityPricingContext.bounds.max,\n      quantityStep: quantityPricingContext.bounds.step,\n      setCount: 1,\n      apparelSizes: store.state.apparelSizes,\n      sizeSurchargeTotal: store.state.sizeSurchargeTotal,\n      apparelAvailableSizes: Array.isArray(apparelConfig && apparelConfig.availableSizes)\n        ? apparelConfig.availableSizes.map(text).filter(Boolean)\n        : [],\n      apparelSizeSurcharges: apparelConfig && apparelConfig.sizeSurcharges && typeof apparelConfig.sizeSurcharges === 'object'\n        ? apparelConfig.sizeSurcharges\n        : {},\n      apparelMinQty: apparelConfig ? apparelConfig.minQty : 0,\n      apparelDefaultQty: apparelConfig ? apparelConfig.defaultQty : 0,\n      apparelDefaultSize: apparelConfig ? apparelConfig.defaultSize : '',\n      selectedSizeId: sizePayload.selectedSizeId,\n      selectedSizeLabel: sizePayload.selectedSizeLabel,\n      selectedWidth: sizePayload.selectedWidth,\n      selectedHeight: sizePayload.selectedHeight,\n      selectedUnit: sizePayload.selectedUnit,\n      selectedOrientation: sizePayload.selectedOrientation,\n      selectedSidesId: editorSelectionSync.selectedSidesId,\n      selectedSidesLabel: editorSelectionSync.selectedSidesLabel,\n      selectedSidesTargetingId: editorSelectionSync.selectedSidesTargetingId,\n      sidesPolicy: editorSelectionSync.sidesPolicy,\n      selectedPrintingId: editorSelectionSync.selectedPrintingId,\n      selectedPrintingLabel: editorSelectionSync.selectedPrintingLabel,\n      selectedPrintingTargetingId: editorSelectionSync.selectedPrintingTargetingId,\n      eddm: buildSerializedEddmState(store)\n    });\n    statePayload.launchProvider = getLaunchProvider(store);\n    // RE1 reorder mark: rides the FULL state (_bg_designer_state_v1) and the\n    // staff-visible `Reorder` property only. buildCartTransformState and\n    // buildPublicProperties are strict whitelists, so this field never enters\n    // the signed compact state and the property is emitted explicitly.\n    var serializedReorderState = getSerializedReorderState(store);\n    if (serializedReorderState) statePayload.reorder = serializedReorderState;\n    if (statePayload.template && store.state.template) {\n      statePayload.template.previewUrl = getTemplateFrontPreview(store.state.template);\n      statePayload.template.previews = Array.isArray(store.state.template.previews) ? store.state.template.previews.map(text).filter(Boolean) : [];\n    }\n    if (statePayload.project) {\n      statePayload.project.previewUrl = projectPreviewUrl;\n      statePayload.project.previews = projectPreviews.slice();\n      statePayload.project.provider = statePayload.launchProvider;\n    }\n    return statePayload;\n  }\n\n  // UPLOAD-SURFACES-NEVER-SENT-01: the staff-facing \"Uploaded Files\" row and\n  // the order side both read file names out of this list, so a detail field's\n  // file is listed only once it is stored (it has its link) and only while it\n  // rides the line: its field is drawn, or the file came from the cart line\n  // being edited. A file that is still uploading, failed, or sits under a\n  // field the rules hide again is never named. Detail fields follow the\n  // artwork fields in a fixed order, so an edited line serializes as the add\n  // did. Artwork method fields serialize exactly as before.\n  function buildSerializedUploads(store) {\n    var uploads = store.state.uploads || {};\n    var liveDetailFieldIds = Object.create(null);\n    getDetailUploadFields(store).forEach(function (field) {\n      liveDetailFieldIds[field.id] = true;\n    });\n    function serializeFile(file) {\n      return {\n        name: text(file && (file.name || file.fileName)),\n        fileName: text(file && (file.fileName || file.name)),\n        uploadRef: text(file && file.uploadRef),\n        url: getUploadFilePublicUrl(file),\n        publicUrl: getUploadFilePublicUrl(file),\n        contentType: text(file && file.contentType),\n        byteSize: Math.max(0, Number(file && file.byteSize || 0) || 0),\n        storageTarget: text(file && file.storageTarget)\n      };\n    }\n    var artworkEntries = [];\n    var detailEntries = [];\n    Object.keys(uploads).forEach(function (fieldId) {\n      var detailField = findDetailUploadField(store, fieldId);\n      if (!detailField) {\n        artworkEntries.push({ id: fieldId, label: fieldId, files: (uploads[fieldId] || []).map(serializeFile) });\n        return;\n      }\n      var storedFiles = (uploads[fieldId] || []).filter(function (file) {\n        return !!getUploadFilePublicUrl(file) && (liveDetailFieldIds[fieldId] || isCarriedCartLineUpload(store, fieldId, file));\n      });\n      if (storedFiles.length) {\n        detailEntries.push({ id: fieldId, label: detailField.label, files: storedFiles.map(serializeFile) });\n      }\n    });\n    var detailOrder = getEveryDetailUploadField(store).map(function (field) {\n      return field.id;\n    });\n    detailEntries.sort(function (a, b) {\n      return detailOrder.indexOf(a.id) - detailOrder.indexOf(b.id);\n    });\n    return artworkEntries.concat(detailEntries);\n  }\n\n  function appendUploadedArtworkProperties(store, publicProperties, privateProperties) {\n    if (!store || !store.state) return;\n    var fileNames = [];\n    var uploadedIndex = 0;\n    var activeFieldIds = Object.create(null);\n    var detailFileNames = Object.create(null);\n    function appendUploadedFile(file, detailField) {\n      var publicUrl = getUploadFilePublicUrl(file);\n      if (!publicUrl) return;\n      var fileName = text(file && (file.fileName || file.name)) || 'Uploaded file';\n      uploadedIndex += 1;\n      fileNames.push(fileName);\n      privateProperties['_bg_uploaded_file_' + String(uploadedIndex) + '_url'] = publicUrl;\n      privateProperties['_bg_uploaded_file_' + String(uploadedIndex) + '_name'] = fileName;\n      if (detailField) {\n        detailFileNames[detailField.label] = (detailFileNames[detailField.label] || []).concat([fileName]);\n      }\n    }\n    getActiveArtworkUploadFields(store).forEach(function (field) {\n      activeFieldIds[text(field && field.id)] = true;\n      // Slot-fill uploads live INSIDE the design (inlined by the fill route);\n      // listing them again as order file properties would duplicate them.\n      if (text(field && field.surface) === 'slot') return;\n      var detailField = isDetailUploadField(field) ? field : null;\n      (store.state.uploads[field.id] || []).forEach(function (file) {\n        appendUploadedFile(file, detailField);\n      });\n    });\n    // CARTLINE-RESTORE-UPLOADS-01: \"Update cart item\" replaces the line's\n    // whole property set, so a file that came from the cart line being edited\n    // rides every update while it is in page state, whether or not this page\n    // draws its upload field (artwork section off, a method the product no\n    // longer offers, a renamed field). It leaves page state only when the\n    // customer removes it, replaces it or, for an artwork file, picks another\n    // artwork method (a detail file stays: UPLOAD-CARRY-2b).\n    Object.keys(store.state.uploads || {}).forEach(function (fieldId) {\n      if (activeFieldIds[fieldId]) return;\n      var carriedDetailField = findDetailUploadField(store, fieldId);\n      (store.state.uploads[fieldId] || []).forEach(function (file) {\n        if (isCarriedCartLineUpload(store, fieldId, file)) appendUploadedFile(file, carriedDetailField);\n      });\n    });\n    if (fileNames.length) {\n      publicProperties['Uploaded Files'] = fileNames.join(', ');\n    }\n    // UPLOAD-SURFACES-NEVER-SENT-01: a detail field's files ride the line in\n    // the same property family as artwork files, and one staff-facing row\n    // names which field they belong to (\"Mailing List File: list.csv\"). The\n    // cart and the order show every public row as it is. An option row with\n    // the same name is never overwritten.\n    Object.keys(detailFileNames).forEach(function (label) {\n      if (Object.prototype.hasOwnProperty.call(publicProperties, label)) return;\n      publicProperties[label] = detailFileNames[label].join(', ');\n    });\n  }\n\n  function syncFormState(store) {\n    if (artworkDrafts.has(store)) return;\n    restoreUploadStateFromInputs(store);\n    var container = ensureHiddenInputs(store);\n    if (!container) return;\n    var statePayload = buildSerializedState(store);\n    var publicProperties = core.buildPublicProperties(statePayload);\n    if (text(store.state.extraInputs.qrCodeLink)) {\n      publicProperties['QR Code Link'] = text(store.state.extraInputs.qrCodeLink);\n    }\n    if (text(store.state.extraInputs.imprintInformation)) {\n      publicProperties['Imprint Information'] = text(store.state.extraInputs.imprintInformation);\n    }\n    // The saved-design preview URL rides the line as an underscore property so\n    // the cart's server-rendered first paint can show the customer's own\n    // design; the cart client JS stays the freshness corrector. The signed\n    // prepare keeps unknown underscore properties (only _bg_update_line_key,\n    // _bg_reprice_nonce, and _bg_completion_* are stripped) and signs only the\n    // transform state, so this property never enters signed material.\n    var projectCartPreviewUrl = statePayload.project && text(statePayload.project.projectId)\n      ? text(statePayload.project.previewUrl)\n      : '';\n    var privateProperties = {\n      '_bg_designer_version': text(store.config.runtimeVersion) || 'designer-storefront-v1',\n      '_bg_preview_url': projectCartPreviewUrl,\n      '_bg_designer_handle': text(store.config.handle),\n      '_bg_designer_source_handle': getLegacyProductSourceHandle(store),\n      '_bg_designer_provider': getLaunchProvider(store),\n      '_bg_cart_design_editor': getCartDesignEditor(store),\n      '_bg_base_variant_id': text(store.config.baseVariantId),\n      '_bg_final_sku': text(store.state.finalSku),\n      '_bg_cart_quantity_mode': text(statePayload.cartQuantityMode),\n      '_bg_cart_transform_state_v1': JSON.stringify(core.buildCartTransformState(statePayload)),\n      '_bg_designer_state_v1': JSON.stringify(statePayload),\n      '_bg_completion_allowed': store.state.completion && store.state.completion.allowed ? '1' : '',\n      '_bg_completion_decision': text(store.state.completion && store.state.completion.decision),\n      '_bg_completion_reason': text(store.state.completion && store.state.completion.reason),\n      '_bg_completion_checked_at': text(store.state.completion && store.state.completion.checkedAt),\n      '_bg_completion_confirmation_required': store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.required ? '1' : '',\n      '_bg_completion_confirmation_accepted': store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.accepted ? '1' : '',\n      '_bg_completion_confirmation_accepted_at': text(store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.acceptedAt),\n      '_bg_completion_confirmation_issue_codes': serializeCompletionIssueCodes(store.state.completion && store.state.completion.confirmation && store.state.completion.confirmation.issueCodes),\n      '_bg_completion_confirmation_issue_count': String(Number(store.state.completion && store.state.completion.confirmationRequiredCount || 0) || 0),\n      '_bg_completion_operator_review': store.state.completion && store.state.completion.review && store.state.completion.review.operatorReviewRequired ? '1' : '',\n      '_bg_completion_customer_confirmation_review': store.state.completion && store.state.completion.review && store.state.completion.review.customerConfirmationRequired ? '1' : '',\n      '_bg_completion_review_issue_codes': serializeCompletionIssueCodes(store.state.completion && store.state.completion.review && store.state.completion.review.issueCodes)\n    };\n    if (store.editingLineKey) {\n      privateProperties._bg_update_line_key = store.editingLineKey;\n    }\n    appendUploadedArtworkProperties(store, publicProperties, privateProperties);\n    var inputs = [];\n    var managedInputNames = [];\n    function pushPropertyInput(key, value) {\n      var textValue = text(value);\n      if (!textValue) return;\n      var inputName = 'properties[' + key + ']';\n      managedInputNames.push(inputName);\n      inputs.push('<input type=\"hidden\" name=\"' + escapeHtml(inputName) + '\" value=\"' + escapeHtml(textValue) + '\">');\n    }\n    Object.keys(privateProperties).forEach(function (key) {\n      pushPropertyInput(key, privateProperties[key]);\n    });\n    Object.keys(publicProperties).forEach(function (key) {\n      pushPropertyInput(key, publicProperties[key]);\n    });\n    var inputsMarkup = inputs.join('');\n    collectManagedProductForms(store).forEach(function (form) {\n      syncManagedProductFormState(store, form, inputsMarkup, managedInputNames);\n    });\n    bindProductForm(store);\n  }\n\n  // PDP-PITCHPRINT-RETURN-APPROVAL (owner 2026-10-27, OD-370; main's MF-4 B-34 shape, W1 case only): the purchase\n  // opens the artwork step, except when nothing is chosen on a product with the free \"Handle artwork later\". Then the\n  // button offers Add to cart with the price and the press reaches the submit gate, which asks once in the \"Handle\n  // artwork later?\" pop-up (its Add to cart adds). The design approval box stays a stop.\n  function getGuidedArtworkPurchaseRequirement(store) {\n    var requirement = getGuidedArtworkStepRequirement(store);\n    if (!requirement || requirement.key === 'design-approval') return requirement;\n    var artworkValidation = validateArtworkInputState(store);\n    return artworkValidation.code === 'missing-artwork-method'\n      && canUseArtworkLaterFallback(store, artworkValidation)\n      && !mappedArtworkPathPrice(store, 'youhaveart')\n      ? null\n      : requirement;\n  }\n\n  function getGuidedArtworkStepRequirement(store) {\n    if (!store) return null;\n    var presentation = getProductFormPresentation(store);\n    var intentFirstV2 = presentation === 'intent_first'\n      && getArtworkSectionConfig(store).sectionLayout === 'v2';\n    if (presentation !== 'guided' && !intentFirstV2) return null;\n    // The Guided presentation also owns quantity-only product pages. When the\n    // product explicitly disables its artwork section (for example, a\n    // PitchPrint mini-editor product), the purchase CTA must stay a direct\n    // cart action instead of pointing at an artwork step that was not rendered.\n    if (!getArtworkSectionConfig(store).showArtworkSection && !(artworkOwners.has(store) && artworkOwners.get(store).recovery)) return null;\n    if (store.artworkChoiceNotice || (store.state.artworkMode && !artworkChoiceMatchesSelection(store))) {\n      return { key: 'artwork-v2', helperText: store.artworkChoiceNotice || 'Choose how you want to handle the artwork.' };\n    }\n    if (isPitchPrintDesignApprovalPending(store)) {\n      return {\n        key: 'design-approval',\n        helperText: 'Approve your saved design before adding it to the cart.',\n        focusAction: 'focus-design-approval'\n      };\n    }\n    if (intentFirstV2 && !isThreeOutcomesArtworkComplete(store)) {\n      var intentAvailability = getStoreArtworkAvailability(store);\n      var intentTemplateAvailability = getTemplateModeAvailability(intentAvailability, store.state && store.state.template);\n      var intentIncompleteState = getArtworkIncompleteState(store, intentAvailability, intentTemplateAvailability);\n      return {\n        key: 'artwork-v2',\n        helperText: text(intentIncompleteState && intentIncompleteState.helperText) || 'Choose an artwork option to continue.'\n      };\n    }\n    // The v4 wizard gates the purchase CTA until the customer answers the\n    // artwork question \u2014 the CTA becomes a navigator that reveals the wizard.\n    if (isVersionedArtworkWizardUnresolved(store)) {\n      return {\n        key: 'artwork-wizard',\n        helperText: 'Choose an artwork option to continue.'\n      };\n    }\n    var availability = getStoreArtworkAvailability(store);\n    var templateAvailability = getTemplateModeAvailability(availability, store.state && store.state.template);\n    return getArtworkIncompleteState(store, availability, templateAvailability);\n  }\n\n  function getGuidedArtworkPurchaseAction(store, requirement) {\n    var unresolved = requirement || getGuidedArtworkPurchaseRequirement(store);\n    var actions = {\n      step1: { label: 'Choose artwork', selector: '[data-bg-artwork-primary]' },\n      'step2-have-design': { label: 'Choose an artwork method', selector: '[data-bg-artwork-action=\"share-canva\"], [data-bg-artwork-action=\"upload-files\"], [data-bg-artwork-action=\"reorder\"]' },\n      'reorder-pick': { label: 'Pick a past design', selector: '[data-bg-artwork-reorder-slot], [data-bg-artwork-action=\"reorder-fallback\"], [data-bg-artwork-action=\"reorder\"]' },\n      'step2-need-design': { label: 'Choose a design option', selector: '[data-bg-artwork-action=\"use-template\"], [data-bg-artwork-action=\"custom-design\"]' },\n      'canva-link': { label: 'Add Canva link', selector: '[data-bg-canva-link-input]' },\n      'upload-file': { label: 'Upload artwork', selector: '[data-bg-upload-field]' },\n      'guided-slot-upload': { label: 'Add your image', selector: '[data-bg-guided-slot-fill] [data-bg-upload-field]' },\n      'template-select': { label: 'Choose a template', opensTemplateChooser: true },\n      'template-finish': { label: 'Choose a design option', selector: '[data-bg-artwork-action=\"review-template\"], [data-bg-artwork-action=\"template-customize-online\"]' },\n      'design-approval': { label: 'Approve Design', selector: '[data-bg-artwork-approval=\"design-review\"]' },\n      'empty-design': { label: 'Add artwork', selector: '[data-bg-contextual-resume], [data-bg-artwork-action=\"edit-existing-art\"], [data-bg-artwork-action=\"upload-in-editor\"], [data-bg-artwork-action=\"template-customize-online\"]' },\n      'artwork-v2': { label: 'Choose artwork', selector: '.bg-artwork-vx__outcome-grid, .bg-artwork-vx__later-link' },\n      'artwork-wizard': { label: 'Choose an artwork option', selector: '[data-bg-artwork-wizard-card], [data-bg-artwork-action]' }\n    };\n    return unresolved ? (actions[text(unresolved.key)] || { label: 'Choose artwork', selector: '[data-bg-artwork-primary]' }) : null;\n  }\n\n  function getGuidedPurchaseButtonLabel(store, requirement) {\n    var action = getGuidedArtworkPurchaseAction(store, requirement);\n    if (action) return action.label;\n    return store && store.editingLineKey ? 'Update cart item' : 'Add to cart';\n  }\n\n  function getPurchaseActionAttribute(label) {\n    if (/^approve design$/i.test(text(label))) return 'approve-design';\n    return /^(?:add to cart|update cart item)$/i.test(text(label)) ? 'cart' : 'guided-next';\n  }\n\n  function readPitchPrintMiniConfirmedProjectId(store) {\n    if (!store || getCartDesignEditor(store) !== 'pitchprint-mini') return '';\n    var inputs = [];\n    collectManagedProductForms(store).forEach(function (form) {\n      Array.prototype.slice.call(form.querySelectorAll(\n        '#_pitchprint, input[name=\"properties[_pitchprint]\"], ._pitchprint input'\n      )).forEach(function (input) {\n        if (inputs.indexOf(input) === -1) inputs.push(input);\n      });\n    });\n    [\n      document.getElementById('_pitchprint'),\n      document.querySelector('input[name=\"properties[_pitchprint]\"]'),\n      document.querySelector('._pitchprint input')\n    ].forEach(function (input) {\n      if (input && inputs.indexOf(input) === -1) inputs.push(input);\n    });\n    for (var index = 0; index < inputs.length; index += 1) {\n      var projectId = text(inputs[index] && inputs[index].value);\n      if (projectId) return projectId;\n    }\n    return '';\n  }\n\n  function isPitchPrintMiniConfirmationPending(store) {\n    return !!store && getCartDesignEditor(store) === 'pitchprint-mini' && !readPitchPrintMiniConfirmedProjectId(store);\n  }\n\n  function syncPitchPrintMiniMobileFullEditorLink(store) {\n    if (!store || getCartDesignEditor(store) !== 'pitchprint-mini') return false;\n    var productInfo = store.root && store.root.closest ? store.root.closest('product-info') : null;\n    if (!productInfo) return false;\n    var miniPanel = productInfo.querySelector('#pp-mini');\n    var sourceButton = productInfo.querySelector(\n      '[data-ppue-adaptive-mini-launcher] .ppue-adaptive-mini-launch-button'\n    );\n    if (!miniPanel || !sourceButton) return false;\n\n    var prompt = miniPanel.querySelector('[data-bg-pitchprint-mini-mobile-full-editor]');\n    if (!prompt) {\n      prompt = document.createElement('p');\n      prompt.className = 'bg-designer-storefront__mini-full-editor-prompt';\n      prompt.setAttribute('data-bg-pitchprint-mini-mobile-full-editor', '');\n\n      var lead = document.createElement('span');\n      lead.textContent = 'Want more customization options?';\n      prompt.appendChild(lead);\n      prompt.appendChild(document.createTextNode(' '));\n\n      var link = document.createElement('button');\n      link.type = 'button';\n      link.className = 'bg-designer-storefront__mini-full-editor-link';\n      link.textContent = 'Launch full screen editor';\n      link.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        var activeSourceButton = link.__bgPitchPrintMiniSourceButton;\n        if (!activeSourceButton || activeSourceButton.disabled || typeof activeSourceButton.click !== 'function') return;\n        activeSourceButton.click();\n      });\n      prompt.appendChild(link);\n      miniPanel.appendChild(prompt);\n    }\n\n    var promptLink = prompt.querySelector('.bg-designer-storefront__mini-full-editor-link');\n    if (promptLink) {\n      promptLink.__bgPitchPrintMiniSourceButton = sourceButton;\n      promptLink.disabled = !!sourceButton.disabled;\n    }\n    return true;\n  }\n\n  function syncPitchPrintMiniPurchaseGate(store) {\n    if (!store || getCartDesignEditor(store) !== 'pitchprint-mini') return false;\n    var pending = isPitchPrintMiniConfirmationPending(store);\n    var state = pending ? 'pending' : 'confirmed';\n    var productInfo = store.root && store.root.closest ? store.root.closest('product-info') : null;\n    [store.root, productInfo].forEach(function (node) {\n      if (node) node.setAttribute('data-bg-pitchprint-mini-design-state', state);\n    });\n    var miniHost = productInfo && productInfo.querySelector('#pp_main_btn_sec');\n    if (miniHost) {\n      if (!pending) {\n        if (!miniHost.hasAttribute('data-bg-pitchprint-mini-host-collapsed')) {\n          miniHost.__bgPitchPrintMiniDisplay = {\n            value: miniHost.style.getPropertyValue('display'),\n            priority: miniHost.style.getPropertyPriority('display')\n          };\n        }\n        miniHost.setAttribute('data-bg-pitchprint-mini-host-collapsed', '');\n        miniHost.style.setProperty('display', 'none', 'important');\n      } else if (miniHost.hasAttribute('data-bg-pitchprint-mini-host-collapsed')) {\n        var previousDisplay = miniHost.__bgPitchPrintMiniDisplay;\n        if (previousDisplay && previousDisplay.value) {\n          miniHost.style.setProperty('display', previousDisplay.value, previousDisplay.priority || '');\n        } else {\n          miniHost.style.removeProperty('display');\n        }\n        miniHost.removeAttribute('data-bg-pitchprint-mini-host-collapsed');\n        delete miniHost.__bgPitchPrintMiniDisplay;\n      }\n    }\n    collectManagedProductForms(store).forEach(function (form) {\n      Array.prototype.slice.call(form.querySelectorAll(\n        'button[type=\"submit\"], input[type=\"submit\"], button[name=\"add\"], input[name=\"add\"]'\n      )).forEach(function (button) {\n        var previousState = button.getAttribute('data-bg-pitchprint-mini-confirmation');\n        button.setAttribute('data-bg-pitchprint-mini-confirmation', state);\n        button.classList.toggle('bg-designer-storefront__purchase-button--mini-confirmation-pending', pending);\n        if (pending) {\n          button.hidden = true;\n          button.setAttribute('aria-hidden', 'true');\n          button.setAttribute('inert', '');\n          button.tabIndex = -1;\n          return;\n        }\n        if (previousState === 'pending') {\n          button.hidden = false;\n          button.removeAttribute('aria-hidden');\n          button.removeAttribute('inert');\n          if (button.getAttribute('tabindex') === '-1') button.removeAttribute('tabindex');\n        }\n      });\n    });\n    syncPitchPrintMiniMobileFullEditorLink(store);\n    return pending;\n  }\n\n  function bindPitchPrintMiniConfirmationGate(store) {\n    if (!store || getCartDesignEditor(store) !== 'pitchprint-mini' || store.pitchPrintMiniConfirmationGateBound) return;\n    store.pitchPrintMiniConfirmationGateBound = true;\n    function isProjectInput(target) {\n      return !!(target && target.matches && target.matches(\n        '#_pitchprint, input[name=\"properties[_pitchprint]\"], ._pitchprint input'\n      ));\n    }\n    function syncFromProjectInput(event) {\n      if (event && !isProjectInput(event.target)) return;\n      syncPitchPrintMiniPurchaseGate(store);\n      syncSubmitButton(store);\n      syncStickyPurchaseBar(store);\n    }\n    document.addEventListener('input', syncFromProjectInput, true);\n    document.addEventListener('change', syncFromProjectInput, true);\n    [0, 120, 360, 900, 1800, 3200, 5000, 8000, 12000].forEach(function (delay) {\n      window.setTimeout(function () { syncFromProjectInput(); }, delay);\n    });\n  }\n\n  function revealGuidedArtworkPurchaseStep(store) {\n    if (!store) return false;\n    var requirement = getGuidedArtworkPurchaseRequirement(store);\n    if (!requirement) return false;\n    var purchaseAction = getGuidedArtworkPurchaseAction(store, requirement);\n    store.uiState = store.uiState || {};\n    if (requirement.key === 'canva-link') {\n      store.canvaValidationAttempted = true;\n    }\n    if (requirement.key === 'upload-file') {\n      store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n      getInlineArtworkUploadFields(store).forEach(function (field) {\n        store.uploadValidationAttempted[field.id] = true;\n      });\n    }\n    if (requirement.key === 'guided-slot-upload') {\n      store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n      getGuidedFillUploadFields(store).forEach(function (field) {\n        if (field.required && !getUploadFieldFiles(store, field.id).length) {\n          store.uploadValidationAttempted[field.id] = true;\n        }\n      });\n    }\n    store.uiState.artworkChooserExpanded = true;\n    var intentFirstV2 = getProductFormPresentation(store) === 'intent_first'\n      && getArtworkSectionConfig(store).sectionLayout === 'v2';\n    if (!intentFirstV2) store.guidedOpenStepKey = 'artwork';\n    render(store);\n    if (!intentFirstV2) renderGuidedProductFormPresentation(store);\n    window.requestAnimationFrame(function () {\n      var step = intentFirstV2\n        ? (store.root && store.root.querySelector('[data-bg-designer-block=\"artwork\"]'))\n        : (store.root && store.root.querySelector('[data-bg-guided-step-key=\"artwork\"]'));\n      var toggle = step && getGuidedStepDirectChild(step, 'data-bg-guided-step-toggle');\n      if (toggle && toggle.getAttribute('aria-expanded') !== 'true') toggle.click();\n      if (purchaseAction && purchaseAction.opensTemplateChooser) {\n        openChangeTemplateChooser(store);\n        return;\n      }\n      var target = (step && purchaseAction && purchaseAction.selector && step.querySelector(purchaseAction.selector))\n        || (step && step.querySelector('[data-bg-artwork-next-step-required]'))\n        || toggle\n        || step;\n      if (!target) return;\n      try { target.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' }); } catch (_) {}\n      if ((requirement.key === 'upload-file' || requirement.key === 'guided-slot-upload')\n        && target.matches && target.matches('[data-bg-upload-field]') && typeof target.click === 'function') {\n        target.click();\n        return;\n      }\n      if (typeof target.focus === 'function') {\n        try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n      }\n    });\n    return true;\n  }\n\n  function syncSubmitButton(store) {\n    var button = getSubmitButton(store);\n    if (!button) return;\n    syncPitchPrintMiniPurchaseGate(store);\n    var labelNode = getSubmitLabelNode(store);\n    var validation = validateState(store);\n    var artworkRequirement = getGuidedArtworkPurchaseRequirement(store);\n    var checkingCompletion = !!store.completionRequestPromise;\n    var uploadingArtwork = !!store.artworkUploadPromise && getActiveArtworkUploadFields(store).length > 0;\n    var addingToCart = !!store.purchaseSubmissionInFlight;\n    var artworkNavigationOnly = !!artworkRequirement && [\n      'missing-artwork-method',\n      'missing-template',\n      'unsaved-online-design',\n      'empty-online-design',\n      'missing-upload',\n      'missing-slot-uploads',\n      'missing-canva-link',\n      'invalid-canva-link',\n      'design-approval-required'\n    ].indexOf(text(validation && validation.code)) !== -1;\n    // guided-fill-pending keeps the button CLICKABLE: the submit branch drains\n    // uploads, runs (or retries) the server fill, and re-enters the gates \u2014 a\n    // disabled button would dead-end a failed fill permanently.\n    var guidedFillActionable = text(validation && validation.code) === 'guided-fill-pending';\n    // A missing required detail upload keeps the button clickable too: the\n    // press is what shows the customer the sentence and the field.\n    var detailUploadActionable = text(validation && validation.code) === 'missing-detail-upload';\n    var disabled = (!validation.valid && !validation.allowArtworkLater && !artworkNavigationOnly && !guidedFillActionable && !detailUploadActionable) || checkingCompletion || uploadingArtwork;\n    button.disabled = disabled;\n    button.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n    if (artworkRequirement) button.setAttribute('data-bg-artwork-required', 'true');\n    else button.removeAttribute('data-bg-artwork-required');\n    // v4 wizard: the CTA stays clickable (it reveals the artwork question) but\n    // wears the muted treatment so it reads as not-ready-yet.\n    button.classList.toggle('bg-designer-storefront__purchase-button--artwork-wizard-gate',\n      !!artworkRequirement && text(artworkRequirement.key) === 'artwork-wizard');\n    if (!button.__bgGuidedArtworkPurchaseBound) {\n      button.__bgGuidedArtworkPurchaseBound = true;\n      button.addEventListener('click', function (event) {\n        if (!getGuidedArtworkPurchaseRequirement(store)) return;\n        event.preventDefault();\n        event.stopPropagation();\n        revealGuidedArtworkPurchaseStep(store);\n      }, true);\n    }\n    button.classList.toggle('bg-designer-storefront__purchase-button--submitting', addingToCart);\n    if (addingToCart) button.setAttribute('aria-busy', 'true');\n    else button.removeAttribute('aria-busy');\n    var nextLabel = addingToCart\n      ? 'Adding your job to the cart'\n      : checkingCompletion\n      ? 'Checking design\u2026'\n      : getGuidedPurchaseButtonLabel(store, artworkRequirement);\n    button.setAttribute('data-bg-purchase-action', getPurchaseActionAttribute(nextLabel));\n    if (labelNode) labelNode.textContent = nextLabel;\n    syncPresentationPurchaseButton(store, store.root && store.root.querySelector('[data-bg-presentation-purchase]'));\n    if ((validation.valid || validation.allowArtworkLater) && !checkingCompletion && !uploadingArtwork) {\n      // A purchase refusal (why nothing was added) stays until the customer\n      // changes something or tries again; a valid state does not erase it.\n      if (!store.purchaseFailureMessage) setMessage(store, '', '');\n      syncStickyPurchaseBar(store);\n      return;\n    }\n    var blocks = readBlocks(store);\n    if (blocks.message && blocks.message.classList.contains('is-error')) {\n      syncStickyPurchaseBar(store);\n      return;\n    }\n    setMessage(store, '', '');\n    syncStickyPurchaseBar(store);\n  }\n\n  function isElementVisibleInLayout(el) {\n    if (!el || !document.body.contains(el)) return false;\n    if (el.hidden) return false;\n    var style = window.getComputedStyle(el);\n    if (style.display === 'none' || style.visibility === 'hidden') return false;\n    var rect = el.getBoundingClientRect();\n    return rect.width > 0 && rect.height > 0;\n  }\n\n  function getInlinePurchaseTarget(store) {\n    var presentationPurchase = store && store.root && store.root.querySelector('[data-bg-presentation-purchase]');\n    if (isElementVisibleInLayout(presentationPurchase)) return presentationPurchase;\n    var button = getSubmitButton(store);\n    if (isElementVisibleInLayout(button)) return button;\n    var shell = findNativeOrderFormShell(store);\n    if (isElementVisibleInLayout(shell)) return shell;\n    return store && store.form ? store.form : null;\n  }\n\n  function getStickyPurchaseReviewTarget(store, validation) {\n    var blocks = readBlocks(store);\n    var code = text(validation && validation.code);\n    if (code === 'customer-input-invalid') {\n      return (blocks.customerInputs && blocks.customerInputs.querySelector(\n        '[data-bg-customer-input=\"' + text(validation.fieldId) + '\"]'\n      )) || blocks.customerInputs || store.root;\n    }\n    if (code === 'missing-upload') return blocks.uploads || blocks.artwork || store.root;\n    if (code === 'missing-detail-upload') {\n      return (blocks.uploads && blocks.uploads.querySelector(\n        '[data-bg-upload-dropzone=\"' + text(validation.fieldId) + '\"]'\n      )) || blocks.uploads || store.root;\n    }\n    if (code === 'missing-slot-uploads' || code === 'guided-fill-pending') {\n      return (blocks.artwork && blocks.artwork.querySelector('[data-bg-guided-slot-fill]')) || blocks.artwork || store.root;\n    }\n    if (code === 'missing-artwork-method' || code === 'missing-template' || code === 'unsaved-online-design') {\n      return blocks.artwork || store.root;\n    }\n    if (text(validation && validation.reason).toLowerCase().indexOf('quantity') !== -1) {\n      return blocks.quantity || blocks.options || store.root;\n    }\n    if (text(validation && validation.reason).toLowerCase().indexOf('approve') !== -1 || text(validation && validation.reason).toLowerCase().indexOf('acknowledge') !== -1) {\n      return blocks.artwork || store.root;\n    }\n    return blocks.message || blocks.summary || store.root;\n  }\n\n  function scrollToStickyPurchaseReviewTarget(store, validation) {\n    var target = getStickyPurchaseReviewTarget(store, validation);\n    if (!target) return;\n    try {\n      target.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n    } catch (_) {}\n    var focusTarget = target.matches && target.matches('button, input, select, textarea, [tabindex]')\n      ? target\n      : target.querySelector && target.querySelector('button, input, select, textarea, [tabindex]');\n    if (focusTarget && typeof focusTarget.focus === 'function') {\n      try { focusTarget.focus({ preventScroll: true }); } catch (_) { focusTarget.focus(); }\n    }\n  }\n\n  function getStickyPurchaseBar() {\n    var bar = document.getElementById('bgDesignerStickyPurchaseBar');\n    if (bar) return bar;\n    bar = document.createElement('div');\n    bar.id = 'bgDesignerStickyPurchaseBar';\n    bar.className = 'bg-designer-storefront-sticky-purchase';\n    bar.setAttribute('aria-hidden', 'true');\n    // Hidden state is opacity/transform only, so keyboard focus must be\n    // blocked explicitly or the bar violates aria-hidden-focus (WCAG).\n    bar.setAttribute('inert', '');\n    bar.innerHTML = '' +\n      '<div class=\"bg-designer-storefront-sticky-purchase__inner\">' +\n        '<div class=\"bg-designer-storefront-sticky-purchase__copy\">' +\n          '<div class=\"bg-designer-storefront-sticky-purchase__selection bg-designer-storefront__summary-selection-copy\"></div>' +\n          '<div class=\"bg-designer-storefront-sticky-purchase__price\">$0.00</div>' +\n          '<div class=\"bg-designer-storefront-sticky-purchase__status\"></div>' +\n        '</div>' +\n        '<button type=\"button\" class=\"bg-designer-storefront-sticky-purchase__button\"></button>' +\n      '</div>';\n    document.body.appendChild(bar);\n    bar.addEventListener('click', function (event) {\n      var notice = event.target && event.target.closest ? event.target.closest('.bg-designer-storefront-sticky-purchase__notice') : null;\n      if (!notice || !bar.contains(notice)) return;\n      notice.setAttribute('aria-expanded', notice.getAttribute('aria-expanded') === 'true' ? 'false' : 'true');\n    });\n    var button = bar.querySelector('.bg-designer-storefront-sticky-purchase__button');\n    if (button) {\n      button.addEventListener('click', function () {\n        var store = bar.__bgDesignerStore;\n        if (!store) return;\n        if (forwardExperimentalPresentationPurchase(store, button)) return;\n        if (revealGuidedArtworkPurchaseStep(store)) return;\n        var validation = validateState(store);\n        var checkingCompletion = !!store.completionRequestPromise;\n        if (checkingCompletion) return;\n        if (!validation.valid && !validation.allowArtworkLater) {\n          if (text(validation.reason)) setMessage(store, validation.reason, 'error');\n          if (validation.code === 'missing-artwork-method') {\n            store.uiState.artworkChooserExpanded = true;\n            render(store);\n          }\n          window.requestAnimationFrame(function () {\n            scrollToStickyPurchaseReviewTarget(store, validation);\n          });\n          return;\n        }\n        var submitButton = getSubmitButton(store);\n        if (submitButton && !submitButton.disabled) {\n          submitButton.click();\n          return;\n        }\n        if (store.form && typeof store.form.requestSubmit === 'function') {\n          try { store.form.requestSubmit(submitButton || undefined); } catch (_) {}\n        }\n      });\n    }\n    return bar;\n  }\n\n  function setStickyPurchaseVisible(bar, visible) {\n    if (!bar) return;\n    bar.classList.toggle('is-visible', !!visible);\n    bar.setAttribute('aria-hidden', visible ? 'false' : 'true');\n    // Keep focusability in lockstep with aria-hidden: the hidden bar stays in\n    // the layout (opacity/transform), so it must also be inert with its\n    // action un-tabbable, or screen-reader/keyboard users reach a control\n    // that is announced as absent (axe aria-hidden-focus).\n    if (visible) bar.removeAttribute('inert');\n    else bar.setAttribute('inert', '');\n    var stickyAction = bar.querySelector('.bg-designer-storefront-sticky-purchase__button');\n    if (stickyAction) stickyAction.tabIndex = visible ? 0 : -1;\n    document.body.classList.toggle('bg-designer-storefront-sticky-purchase-visible', !!visible);\n    // PDP-DISCLAIMERS: a bar carrying a notice line is taller; the page keeps\n    // room for its measured height (safe area included) so the bar never\n    // covers the page end. Only while such a bar shows; otherwise the\n    // stylesheet's own padding for each bar applies unchanged.\n    var stickyHasNotice = !!visible && bar.getAttribute('data-bg-sticky-notice') === 'true';\n    document.body.classList.toggle('bg-designer-storefront-sticky-purchase-has-notice', stickyHasNotice);\n    var stickyPadding = stickyHasNotice ? (bar.offsetHeight + 8) + 'px' : '';\n    if (document.body.style.paddingBottom !== stickyPadding) document.body.style.paddingBottom = stickyPadding;\n    document.body.classList.toggle(\n      'bg-designer-storefront-guided-mobile-purchase-visible',\n      !!visible && bar.getAttribute('data-bg-product-form-presentation') === 'guided' &&\n        !!(window.matchMedia && window.matchMedia('(max-width: 749px)').matches)\n    );\n    document.body.classList.toggle(\n      'bg-designer-storefront-guided-desktop-purchase-visible',\n      !!visible && bar.getAttribute('data-bg-product-form-presentation') === 'guided' &&\n        !!(window.matchMedia && window.matchMedia('(min-width: 750px)').matches)\n    );\n  }\n\n  function shouldSuppressStickyPurchaseBar(store) {\n    var suppressionClasses = [\n      'bg-designer-template-modal--open',\n      'bg-designer-preview-lightbox--open',\n      'bg-designer-artwork-later-modal--open',\n      'bg-designer-auth-modal--open',\n      'bg-designer-eddm-modal--open',\n      'bg-designer-editor-shell--open',\n      'bg-design-first-sheet--open',\n      'bg-designer-quantity-menu--open'\n    ];\n    if (suppressionClasses.some(function (className) {\n      return document.body.classList.contains(className);\n    })) return true;\n    if (document.querySelector('#Details-menu-drawer-container[open], header-drawer details[open]')) return true;\n    if (store && store.state && store.state.quantityDropdownOpen) return true;\n    return !!document.querySelector(\n      '[data-bg-designer-completion-modal].is-open, ' +\n      '[data-bg-designer-template-preview-modal].is-open, ' +\n      '[data-bg-designer-artwork-later-modal].is-open'\n    );\n  }\n\n  function isElementWithinViewport(element) {\n    if (!element || typeof element.getBoundingClientRect !== 'function') return false;\n    var rect = element.getBoundingClientRect();\n    var viewportHeight = Number(window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || 0);\n    var viewportWidth = Number(window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || 0);\n    if (!rect || viewportHeight <= 0 || viewportWidth <= 0) return false;\n    if (Number(rect.width || 0) <= 0 || Number(rect.height || 0) <= 0) return false;\n    return rect.bottom > 0 && rect.top < viewportHeight && rect.right > 0 && rect.left < viewportWidth;\n  }\n\n  function isGuidedArtworkWorkspaceWithinViewport(store) {\n    if (!store || !store.root) return false;\n    var artworkStep = store.root.querySelector('[data-bg-guided-step-key=\"artwork\"]');\n    var artworkBlock = readBlocks(store).artwork;\n    return isElementWithinViewport(artworkStep || artworkBlock);\n  }\n\n  function buildPresentationStickySummaryMarkup(store, presentation, omitQuantity) {\n    if (presentation === 'intent_first') {\n      var intentRequirement = getGuidedArtworkStepRequirement(store);\n      if (!intentRequirement) {\n        var intentArtworkCopy = getThreeOutcomesCompletionCopy(store);\n        return '<span class=\"bg-designer-storefront__summary-token\">' +\n          escapeHtml(intentArtworkCopy.line) + '</span>';\n      }\n      return buildCompactConfigurationSummaryMarkup(store, omitQuantity);\n    }\n    return buildCompactConfigurationSummaryMarkup(store, omitQuantity);\n  }\n\n  function syncStickyPurchaseBar(store) {\n    if (!store || !store.root || !document.body) return;\n    if (store.sectionUnloaded || !document.body.contains(store.root)) {\n      var existingBar = document.getElementById('bgDesignerStickyPurchaseBar');\n      if (existingBar && existingBar.__bgDesignerStore === store) {\n        setStickyPurchaseVisible(existingBar, false);\n        existingBar.__bgDesignerStore = null;\n      }\n      return;\n    }\n    var bar = getStickyPurchaseBar();\n    bar.__bgDesignerStore = store;\n    if (isPitchPrintMiniConfirmationPending(store) || isSetupDataUnavailable(store)) {\n      setStickyPurchaseVisible(bar, false);\n      return;\n    }\n    // A phone experience carries its own always-visible purchase action.\n    if (store.mobileExperience) {\n      setStickyPurchaseVisible(bar, false);\n      return;\n    }\n    var productFormPresentation = getProductFormPresentation(store);\n    if (productFormPresentation === 'intent_first' && store.intentFirstPresentationReady !== true) {\n      setStickyPurchaseVisible(bar, false);\n      return;\n    }\n    var experimentalPresentation = isPrototypeProductFormPresentation(productFormPresentation);\n    var experimentalArtworkCanResolve = experimentalPresentation\n      ? canResolveExperimentalPresentationArtwork(store)\n      : false;\n    bar.setAttribute('data-bg-product-form-presentation', productFormPresentation);\n    var presentationSettings = getExperimentalPresentationSettingsForMode(store, productFormPresentation);\n    bar.setAttribute('data-bg-prominent-mobile-bar', presentationSettings.prominentMobilePurchaseBar === false ? 'false' : 'true');\n    var inlineTarget = getInlinePurchaseTarget(store);\n    var pricePresentation = getPricePresentation(store);\n    var hasPrice = !!(pricePresentation && Number.isFinite(numberValue(pricePresentation.total, NaN)) && pricePresentation.total > 0)\n      && !showsNoPriceRow(store);\n    // EDDM-ROUTE-STEP: the bar repeats the order summary, so it asks for\n    // routes the same way while the quantity waits for them.\n    var routesPending = isEddmRouteQuantityPending(store);\n    var targetRect = inlineTarget && inlineTarget.getBoundingClientRect ? inlineTarget.getBoundingClientRect() : null;\n    var passedInlineCta = !!(targetRect && targetRect.bottom <= 0);\n    var viewportHeight = Number(window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || 0);\n    var inlineCtaOutsideViewport = !!(targetRect && viewportHeight > 0 && (targetRect.bottom <= 0 || targetRect.top >= viewportHeight));\n    var observerKnowsInlineVisibility = typeof store.stickyPurchaseInlineVisible === 'boolean';\n    var inlineVisible = isPrototypeProductFormPresentation(productFormPresentation)\n      ? !inlineCtaOutsideViewport\n      : (observerKnowsInlineVisibility ? store.stickyPurchaseInlineVisible : !inlineCtaOutsideViewport);\n    var mobileViewport = !!(window.matchMedia && window.matchMedia('(max-width: 749px)').matches);\n    var mobileUpwardIntent = text(store.stickyPurchaseMobileScrollDirection) === 'up';\n    var shouldShowForPosition = mobileViewport\n      ? passedInlineCta && mobileUpwardIntent\n      : (productFormPresentation === 'guided' ? !inlineVisible : passedInlineCta);\n    var validation = validateState(store);\n    var artworkRequirement = getGuidedArtworkPurchaseRequirement(store);\n    var intentFirstArtworkGate = productFormPresentation === 'intent_first' && !!artworkRequirement;\n    var intentFirstNonArtworkBlocked = productFormPresentation === 'intent_first'\n      && !intentFirstArtworkGate\n      && !validation.valid\n      && !validation.allowArtworkLater;\n    var checkingCompletion = !!store.completionRequestPromise;\n    var uploadingArtwork = !!store.artworkUploadPromise && getActiveArtworkUploadFields(store).length > 0;\n    var addingToCart = !!store.purchaseSubmissionInFlight;\n    var artworkBlocksSticky = productFormPresentation === 'guided' &&\n      isGuidedArtworkWorkspaceWithinViewport(store);\n    var priceEl = bar.querySelector('.bg-designer-storefront-sticky-purchase__price');\n    var selectionEl = bar.querySelector('.bg-designer-storefront-sticky-purchase__selection');\n    var statusEl = bar.querySelector('.bg-designer-storefront-sticky-purchase__status');\n    var button = bar.querySelector('.bg-designer-storefront-sticky-purchase__button');\n    // Hydrate the shared sticky surface even while its scroll-position rule\n    // keeps it hidden. The bar is bound before asynchronous product/pricing\n    // data settles; returning before these writes stranded its construction\n    // placeholders ($0.00 and an empty CTA) until a later scroll/resize.\n    if (priceEl && routesPending) priceEl.textContent = getGuidedCopy(store, 'stepQuantityRoutesPrompt');\n    else if (priceEl && hasPrice) priceEl.textContent = formatShownMoney(shownPrice(pricePresentation).total);\n    if (selectionEl) selectionEl.innerHTML = buildPresentationStickySummaryMarkup(store, productFormPresentation, routesPending);\n    if (statusEl) {\n      var stickyStatus = '';\n      if (checkingCompletion) stickyStatus = 'Checking design...';\n      else if (intentFirstArtworkGate) stickyStatus = 'Choose an artwork option before adding to cart.';\n      else if (productFormPresentation === 'intent_first') {\n        if (text(store.state && store.state.artworkMode).toLowerCase() === 'youhaveart') {\n          stickyStatus = 'Artwork can be handled after checkout.';\n        } else if (intentFirstNonArtworkBlocked) {\n          stickyStatus = text(validation && validation.reason) || 'Review required details before adding to cart.';\n        } else if (validation && !validation.valid && validation.allowArtworkLater) {\n          // ED-R1 fix round: an empty saved design on an artwork-later product\n          // is not \"ready\"; the bar names the route the button offers.\n          stickyStatus = 'Artwork can be handled after checkout.';\n        } else {\n          stickyStatus = 'Ready to add to cart.';\n        }\n      } else if (experimentalPresentation) {\n        if (!experimentalArtworkCanResolve) {\n          stickyStatus = text(validation && validation.reason) || 'Choose an artwork option to continue.';\n        } else if (store.state.template) {\n          stickyStatus = 'Your selected design will be personalized after checkout.';\n        } else {\n          stickyStatus = 'Artwork can be handled after checkout.';\n        }\n      } else if (artworkRequirement) {\n        stickyStatus = text(artworkRequirement.key) === 'design-approval'\n          ? 'Approve your saved design before adding to cart.'\n          : 'Choose an artwork option before adding to cart.';\n      } else if (!validation.valid && !validation.allowArtworkLater) {\n        stickyStatus = text(validation.reason);\n      } else {\n        stickyStatus = validation.allowArtworkLater ? 'Artwork can be handled after checkout.' : 'Ready to add to cart.';\n      }\n      statusEl.textContent = stickyStatus;\n    }\n    if (button) {\n      var experimentalArtworkBlocked = experimentalPresentation\n        && productFormPresentation !== 'intent_first'\n        && !text(store && store.state && store.state.artworkMode)\n        && !experimentalArtworkCanResolve;\n      button.disabled = checkingCompletion || uploadingArtwork || addingToCart || experimentalArtworkBlocked || intentFirstNonArtworkBlocked;\n      button.setAttribute('aria-disabled', button.disabled ? 'true' : 'false');\n      button.classList.toggle('is-secondary', !artworkRequirement && !validation.valid && !validation.allowArtworkLater);\n      button.classList.toggle('bg-designer-storefront__purchase-button--submitting', addingToCart);\n      if (addingToCart) button.setAttribute('aria-busy', 'true');\n      else button.removeAttribute('aria-busy');\n      var stickyButtonLabel = addingToCart\n        ? 'Adding your job to the cart'\n        : uploadingArtwork\n        ? (store.editingLineKey ? 'Update cart item' : 'Add to cart')\n        : checkingCompletion\n        ? 'Checking design...'\n        : intentFirstNonArtworkBlocked\n        ? 'Review required details'\n        : experimentalPresentation\n        ? getPresentationPurchaseLabel(store)\n        : (artworkRequirement\n          ? getGuidedPurchaseButtonLabel(store, artworkRequirement)\n          : (!validation.valid && !validation.allowArtworkLater\n          ? 'Review required details'\n          : (store.editingLineKey ? 'Update cart item' : 'Add to cart')));\n      button.setAttribute('data-bg-purchase-action', getPurchaseActionAttribute(stickyButtonLabel));\n      button.textContent = stickyButtonLabel;\n    }\n    syncStickyPurchaseNotice(bar, store);\n    if (!inlineTarget || !hasPrice || !shouldShowForPosition || artworkBlocksSticky || shouldSuppressStickyPurchaseBar(store)) {\n      setStickyPurchaseVisible(bar, false);\n      return;\n    }\n    setStickyPurchaseVisible(bar, true);\n  }\n\n  function bindStickyPurchaseBar(store) {\n    if (!store || store.stickyPurchaseBarBound) return;\n    store.stickyPurchaseBarBound = true;\n    var scheduled = false;\n    function scheduleSync() {\n      if (scheduled) return;\n      scheduled = true;\n      window.requestAnimationFrame(function () {\n        scheduled = false;\n        syncStickyPurchaseBar(store);\n      });\n    }\n    var lastMeaningfulScrollY = Math.max(0, Number(window.scrollY || window.pageYOffset || 0));\n    var scrollDirectionThreshold = 8;\n    store.stickyPurchaseMobileScrollDirection = '';\n    function captureMobileScrollDirection() {\n      var nextScrollY = Math.max(0, Number(window.scrollY || window.pageYOffset || 0));\n      var delta = nextScrollY - lastMeaningfulScrollY;\n      if (Math.abs(delta) < scrollDirectionThreshold) return;\n      store.stickyPurchaseMobileScrollDirection = delta < 0 ? 'up' : 'down';\n      lastMeaningfulScrollY = nextScrollY;\n    }\n    window.addEventListener('resize', scheduleSync);\n    window.addEventListener('scroll', function () {\n      captureMobileScrollDirection();\n      scheduleSync();\n    }, { passive: true });\n    var inlineTarget = getInlinePurchaseTarget(store);\n    if (inlineTarget && 'IntersectionObserver' in window) {\n      var observer = new IntersectionObserver(function (entries) {\n        entries.forEach(function (entry) {\n          var visible = !!(entry.isIntersecting && entry.intersectionRatio > 0);\n          if (entry.target === inlineTarget) store.stickyPurchaseInlineVisible = visible;\n        });\n        scheduleSync();\n      }, { threshold: [0, 0.01, 1] });\n      try { observer.observe(inlineTarget); } catch (_) {}\n      store.stickyPurchaseBarObserver = observer;\n    }\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener('resize', scheduleSync);\n      window.visualViewport.addEventListener('scroll', scheduleSync);\n    }\n    if ('MutationObserver' in window && document.body) {\n      var bodyClassObserver = new MutationObserver(scheduleSync);\n      bodyClassObserver.observe(document.body, { attributes: true, attributeFilter: ['class'] });\n      store.stickyPurchaseBarBodyClassObserver = bodyClassObserver;\n    }\n    scheduleSync();\n  }\n\n  function buildCompletionIssueRows(eligibility, mode) {\n    var response = eligibility && typeof eligibility === 'object' ? eligibility : {};\n    var structuredIssues = Array.isArray(response.issues)\n      ? response.issues.map(function (issue) {\n        return {\n          code: text(issue && issue.code),\n          severity: text(issue && issue.severity) || 'warning',\n          disposition: text(issue && issue.disposition) || 'advisory',\n          occurrenceCount: Number(issue && issue.occurrenceCount || 0) || 1,\n          title: text(issue && issue.title),\n          message: text(issue && issue.message)\n        };\n      }).filter(function (issue) {\n        if (!issue.code || !issue.title) return false;\n        if (mode === 'confirm') return issue.disposition === 'confirmation_required';\n        if (mode === 'blocked') return issue.disposition === 'hard_block';\n        return issue.disposition === 'operator_review';\n      })\n      : [];\n    if (structuredIssues.length) {\n      return structuredIssues;\n    }\n\n    function getIssuePresentation(code, fallbackMessage) {\n      var normalizedCode = text(code);\n      if (normalizedCode === 'low-effective-dpi') {\n        return {\n          title: 'Some images may print blurry',\n          message: 'One or more images are lower resolution than recommended for sharp print output.',\n        };\n      }\n      if (normalizedCode === 'missing-bleed') {\n        return {\n          title: 'Edge artwork may be trimmed',\n          message: 'Anything too close to the edge could be cut off slightly during production trimming.',\n        };\n      }\n      if (normalizedCode === 'missing-asset') {\n        return {\n          title: 'Missing artwork must be replaced',\n          message: 'An image or art element in this design is missing and has to be restored before checkout.',\n        };\n      }\n      if (normalizedCode === 'required-upload-missing') {\n        return {\n          title: 'Upload required artwork to continue',\n          message: 'This product requires customer-supplied artwork before it can be ordered.',\n        };\n      }\n      return {\n        title: fallbackMessage,\n        message: '',\n      };\n    }\n\n    var checks = response.preflight && Array.isArray(response.preflight.checks)\n      ? response.preflight.checks\n      : [];\n    var confirmationCodes = response.confirmation && Array.isArray(response.confirmation.issueCodes)\n      ? response.confirmation.issueCodes.map(text).filter(Boolean)\n      : [];\n    var reviewCodes = response.review && Array.isArray(response.review.issueCodes)\n      ? response.review.issueCodes.map(text).filter(Boolean)\n      : [];\n    return checks.filter(function (check) {\n      var code = text(check && check.code);\n      if (!code) return false;\n      if (mode === 'confirm') return confirmationCodes.indexOf(code) !== -1;\n      if (mode === 'blocked') return confirmationCodes.indexOf(code) === -1 && (reviewCodes.indexOf(code) !== -1 || text(check && check.severity) === 'blocking');\n      return reviewCodes.indexOf(code) !== -1;\n    }).map(function (check) {\n      var presentation = getIssuePresentation(\n        text(check && check.code),\n        text(check && check.message)\n      );\n      return {\n        code: text(check && check.code),\n        severity: text(check && check.severity) || 'warning',\n        title: text(presentation.title),\n        message: text(presentation.message),\n      };\n    });\n  }\n\n  function closeCompletionModal() {\n    var modal = document.querySelector('[data-bg-designer-completion-modal]');\n    if (!modal) return;\n    modal.hidden = true;\n    modal.classList.remove('is-open');\n    document.body.classList.remove('bg-designer-template-modal--open');\n    // BUG-05: return keyboard focus to whatever opened the review.\n    var previousFocus = modal.__bgCompletionPreviousFocus || null;\n    modal.__bgCompletionPreviousFocus = null;\n    if (previousFocus && typeof previousFocus.focus === 'function' && document.contains(previousFocus)) {\n      try { previousFocus.focus({ preventScroll: true }); } catch (_) { previousFocus.focus(); }\n    }\n  }\n\n  function ensureCompletionModal(store) {\n    var existing = document.querySelector('[data-bg-designer-completion-modal]');\n    if (existing) return existing;\n    var modal = document.createElement('div');\n    modal.className = 'bg-designer-storefront-modal bg-designer-storefront-completion-modal';\n    modal.hidden = true;\n    modal.setAttribute('data-bg-designer-completion-modal', '1');\n    modal.innerHTML = '' +\n      '<div class=\"bg-designer-storefront-modal__backdrop\" data-bg-designer-completion-close></div>' +\n      '<div class=\"bg-designer-storefront-modal__dialog bg-designer-storefront-completion-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bg-designer-completion-title\" tabindex=\"-1\">' +\n        '<button type=\"button\" class=\"bg-designer-storefront-modal__close\" data-bg-designer-completion-close aria-label=\"Close review\">&times;</button>' +\n        '<div class=\"bg-designer-storefront-modal__head bg-designer-storefront-completion-modal__head\">' +\n          '<div class=\"bg-designer-storefront__eyebrow\" data-bg-designer-completion-eyebrow></div>' +\n          '<h2 id=\"bg-designer-completion-title\" data-bg-designer-completion-title></h2>' +\n          '<p data-bg-designer-completion-copy></p>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-modal__body bg-designer-storefront-completion-modal__body\">' +\n          '<div class=\"bg-designer-storefront-completion-modal__section\" data-bg-designer-completion-issues-wrap hidden>' +\n            '<div class=\"bg-designer-storefront-completion-modal__section-title\">Issues to review</div>' +\n            '<div class=\"bg-designer-storefront-completion-modal__issues\" data-bg-designer-completion-issues></div>' +\n          '</div>' +\n          '<div class=\"bg-designer-storefront-completion-modal__section\" data-bg-designer-completion-notes-wrap hidden>' +\n            '<div class=\"bg-designer-storefront-completion-modal__section-title\">What happens next</div>' +\n            '<div class=\"bg-designer-storefront-completion-modal__notes\" data-bg-designer-completion-notes></div>' +\n          '</div>' +\n          '<label class=\"bg-designer-storefront-completion-modal__confirm\" data-bg-designer-completion-confirm-wrap hidden>' +\n            '<input type=\"checkbox\" data-bg-designer-completion-confirm-input>' +\n            '<span data-bg-designer-completion-confirm-copy></span>' +\n          '</label>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-modal__footer bg-designer-storefront-completion-modal__footer\">' +\n          '<button type=\"button\" class=\"bg-designer-storefront-modal__button bg-designer-storefront-modal__button--ghost\" data-bg-designer-completion-cancel>Return to design</button>' +\n          '<button type=\"button\" class=\"button button--primary\" data-bg-designer-completion-continue>Continue</button>' +\n        '</div>' +\n      '</div>';\n    document.body.appendChild(modal);\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-completion-close], [data-bg-designer-completion-cancel]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        closeCompletionModal();\n        store.completionModalState = null;\n      });\n    });\n    var confirmInput = modal.querySelector('[data-bg-designer-completion-confirm-input]');\n    var continueButton = modal.querySelector('[data-bg-designer-completion-continue]');\n    if (confirmInput && continueButton) {\n      confirmInput.addEventListener('change', function () {\n        if (!store.completionModalState || store.completionModalState.mode !== 'confirm') return;\n        continueButton.disabled = !confirmInput.checked;\n      });\n    }\n    if (continueButton) {\n      continueButton.addEventListener('click', function () {\n        if (!store.completionModalState) return;\n        var modalState = store.completionModalState;\n        if (modalState.mode === 'blocked') {\n          closeCompletionModal();\n          store.completionModalState = null;\n          return;\n        }\n        if (modalState.mode !== 'confirm') return;\n        if (confirmInput && !confirmInput.checked) return;\n        closeCompletionModal();\n        store.completionModalState = null;\n        if (typeof modalState.onConfirm === 'function') {\n          modalState.onConfirm();\n        }\n      });\n    }\n    // BUG-05: keyboard contract shared with the other storefront dialogs \u2014\n    // Escape cancels, Tab stays inside while open.\n    modal.addEventListener('keydown', function (event) {\n      if (modal.hidden) return;\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        event.stopPropagation();\n        closeCompletionModal();\n        store.completionModalState = null;\n        return;\n      }\n      if (event.key !== 'Tab') return;\n      var focusable = getTemplatePreviewFocusableElements(modal);\n      if (!focusable.length) return;\n      var first = focusable[0];\n      var last = focusable[focusable.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      } else if (!modal.contains(document.activeElement)) {\n        event.preventDefault();\n        first.focus();\n      }\n    });\n    return modal;\n  }\n\n  function openCompletionModal(store, eligibility, mode, onConfirm) {\n    var modal = ensureCompletionModal(store);\n    var response = eligibility && typeof eligibility === 'object' ? eligibility : {};\n    var eyebrow = modal.querySelector('[data-bg-designer-completion-eyebrow]');\n    var title = modal.querySelector('[data-bg-designer-completion-title]');\n    var copy = modal.querySelector('[data-bg-designer-completion-copy]');\n    var issuesWrap = modal.querySelector('[data-bg-designer-completion-issues-wrap]');\n    var issues = modal.querySelector('[data-bg-designer-completion-issues]');\n    var notesWrap = modal.querySelector('[data-bg-designer-completion-notes-wrap]');\n    var notes = modal.querySelector('[data-bg-designer-completion-notes]');\n    var confirmWrap = modal.querySelector('[data-bg-designer-completion-confirm-wrap]');\n    var confirmInput = modal.querySelector('[data-bg-designer-completion-confirm-input]');\n    var confirmCopy = modal.querySelector('[data-bg-designer-completion-confirm-copy]');\n    var continueButton = modal.querySelector('[data-bg-designer-completion-continue]');\n    var issueRows = buildCompletionIssueRows(response, mode);\n    var noteRows = response.review && Array.isArray(response.review.notes)\n      ? response.review.notes.map(text).filter(Boolean)\n      : [];\n    if (eyebrow) eyebrow.textContent = mode === 'confirm' ? 'Customer confirmation' : 'Print review blocked';\n    if (title) {\n      title.textContent = mode === 'confirm'\n        ? 'Please review these print warnings'\n        : 'This design needs attention before checkout';\n    }\n    if (copy) {\n      copy.textContent = text(response.message)\n        || (mode === 'confirm'\n          ? 'These warnings will not stop the order, but they need acknowledgment before checkout can continue.'\n          : 'A required production issue still needs to be fixed before this design can move forward.');\n    }\n    if (issuesWrap) issuesWrap.hidden = issueRows.length === 0;\n    if (issues) {\n      issues.innerHTML = issueRows.map(function (issue) {\n        return '' +\n          '<div class=\"bg-designer-storefront-completion-modal__issue is-' + escapeHtml(core.slugify(issue.severity || 'warning')) + '\">' +\n            '<div class=\"bg-designer-storefront-completion-modal__issue-title\">' + escapeHtml(issue.title || issue.message) + '</div>' +\n            (text(issue.message)\n              ? '<div class=\"bg-designer-storefront-completion-modal__issue-message\">' + escapeHtml(issue.message) + '</div>'\n              : '') +\n          '</div>';\n      }).join('');\n    }\n    if (notesWrap) notesWrap.hidden = noteRows.length === 0;\n    if (notes) {\n      notes.innerHTML = noteRows.map(function (note) {\n        return '<div class=\"bg-designer-storefront-completion-modal__note\">' + escapeHtml(note) + '</div>';\n      }).join('');\n    }\n    if (confirmWrap) confirmWrap.hidden = mode !== 'confirm';\n    if (confirmInput) confirmInput.checked = false;\n    if (confirmCopy) {\n      confirmCopy.textContent = store.editingLineKey\n        ? 'I understand these print warnings and still want to update this cart item.'\n        : 'I understand these print warnings and still want to add this item to my cart.';\n    }\n    if (continueButton) {\n      continueButton.textContent = mode === 'confirm'\n        ? (store.editingLineKey ? 'I Understand, Update Cart Item' : 'I Understand, Add to Cart')\n        : 'Return to design';\n      continueButton.disabled = mode === 'confirm';\n    }\n    store.completionModalState = {\n      mode: mode,\n      onConfirm: typeof onConfirm === 'function' ? onConfirm : null,\n    };\n    // BUG-05: remember the opener and move keyboard focus into the dialog.\n    modal.__bgCompletionPreviousFocus = document.activeElement;\n    modal.hidden = false;\n    modal.classList.add('is-open');\n    document.body.classList.add('bg-designer-template-modal--open');\n    window.requestAnimationFrame(function () {\n      if (modal.hidden || !modal.classList.contains('is-open')) return;\n      var dialog = modal.querySelector('[role=\"dialog\"]') || modal;\n      if (dialog && typeof dialog.focus === 'function') {\n        try { dialog.focus({ preventScroll: true }); } catch (_) { dialog.focus(); }\n      }\n    });\n  }\n\n  function getArtworkLaterModal(store) {\n    var scope = store && store.root && store.root.closest ? (store.root.closest('product-info') || store.root) : document;\n    return (scope && scope.querySelector ? scope.querySelector('[data-bg-designer-artwork-later-modal]') : null)\n      || document.querySelector('[data-bg-designer-artwork-later-modal]');\n  }\n\n  // The modal's copy has exactly one source: applyArtworkLaterModalCopy fills\n  // the guided-copy registry strings into whichever shell exists (the host\n  // liquid ships the structure with empty text nodes; this fallback mirrors\n  // that). Do not put literals back here or in the liquid (GUIDED-PDP-TOKENIZE-01 T4).\n  function createArtworkLaterModalFallback() {\n    var modal = document.createElement('div');\n    modal.className = 'bg-designer-storefront-auth-modal bg-designer-storefront-artwork-later-modal';\n    modal.hidden = true;\n    modal.setAttribute('data-bg-designer-artwork-later-modal', '1');\n    modal.setAttribute('aria-hidden', 'true');\n    modal.innerHTML = '' +\n      '<div class=\"bg-designer-storefront-auth-modal__backdrop\" data-bg-designer-artwork-later-close></div>' +\n      '<div class=\"bg-designer-storefront-auth-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bg-designer-artwork-later-modal-title\" tabindex=\"-1\">' +\n        '<button type=\"button\" class=\"bg-designer-storefront-auth-modal__close\" aria-label=\"Close artwork confirmation\" data-bg-designer-artwork-later-close>&times;</button>' +\n        '<div class=\"bg-designer-storefront-auth-modal__content\">' +\n          '<p class=\"bg-designer-storefront-auth-modal__eyebrow\">Artwork selection</p>' +\n          '<h2 id=\"bg-designer-artwork-later-modal-title\"></h2>' +\n          '<p></p>' +\n          '<p class=\"bg-designer-storefront-auth-modal__note\"></p>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-auth-modal__actions\">' +\n          '<button type=\"button\" class=\"bg-designer-storefront-auth-modal__button bg-designer-storefront-auth-modal__button--secondary\" data-bg-designer-artwork-later-back></button>' +\n          '<button type=\"button\" class=\"bg-designer-storefront-auth-modal__button bg-designer-storefront-auth-modal__button--primary\" data-bg-designer-artwork-later-confirm></button>' +\n        '</div>' +\n      '</div>';\n    document.body.appendChild(modal);\n    return modal;\n  }\n\n  function applyArtworkLaterModalCopy(store, modal) {\n    if (!modal || !modal.querySelector) return modal;\n    var title = modal.querySelector('h2[id^=\"bg-designer-artwork-later-modal-title\"]');\n    if (title) title.textContent = getGuidedCopy(store, 'laterModalTitle');\n    var content = modal.querySelector('.bg-designer-storefront-auth-modal__content');\n    var body = content ? content.querySelector('p:not([class])') : null;\n    if (body) body.textContent = getGuidedCopy(store, 'laterModalBody');\n    var note = modal.querySelector('.bg-designer-storefront-auth-modal__note');\n    if (note) note.textContent = getGuidedCopy(store, 'laterModalNote');\n    var back = modal.querySelector('button[data-bg-designer-artwork-later-back]');\n    if (back) back.textContent = getGuidedCopy(store, 'laterModalBackLabel');\n    var confirm = modal.querySelector('button[data-bg-designer-artwork-later-confirm]');\n    var price = mappedArtworkPathPrice(store, 'youhaveart');\n    modal.__bgArtworkLaterPrice = price ? price.display : '';\n    if (confirm) confirm.textContent = getGuidedCopy(store, 'laterModalConfirmLabel') + (price ? ' (' + price.display + ')' : '');\n    return modal;\n  }\n\n  function ensureArtworkLaterModal(store) {\n    return applyArtworkLaterModalCopy(store, getArtworkLaterModal(store) || createArtworkLaterModalFallback());\n  }\n\n  function closeArtworkLaterModal(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var modal = getArtworkLaterModal(store);\n    if (!modal) return;\n    modal.hidden = true;\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.body.classList.remove('bg-designer-artwork-later-modal--open');\n    if (settings.restoreFocus === false || !store) return;\n    var target = store.artworkLaterModalPreviousFocus;\n    store.artworkLaterModalPreviousFocus = null;\n    if (target && typeof target.focus === 'function' && document.contains(target)) {\n      try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n    }\n  }\n\n  function submitArtworkLaterFallback(store) {\n    if (!store || !store.state || store.artworkChoiceNotice) return false;\n    var designReviewApproved = store.state.approvals.designReviewApproved;\n    if (!applyArtworkMethodOption(store, 'youhaveart', 'fallback', null)) return false;\n    clearProjectState(store);\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n    setArtworkChoice(store, 'send-later', '', 'youhaveart', 'fallback');\n    store.uiState.artworkChooserExpanded = false;\n    store.state.approvals.designReviewApproved = false;\n    store.state.approvals.customDesignApproved = false;\n    clearCompletionState(store);\n    syncFormState(store);\n    // ALLOWED-BLOCKS-AT-MUTATION: a design approval box still shown after the switch keeps the shopper's tick. The rule\n    // state is rebuilt first and the tick is restored before render, so the drawn box matches the state.\n    recalculate(store);\n    if (designReviewApproved && getArtworkRuleState(store).showDesignApprovalChoice) store.state.approvals.designReviewApproved = true;\n    render(store);\n    return submitProductForm(store);\n  }\n\n  function bindArtworkLaterModal(store, modal) {\n    if (!modal) return false;\n    modal.__bgArtworkLaterStore = store;\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-artwork-later-close], [data-bg-designer-artwork-later-back]')).forEach(function (button) {\n      button.onclick = function (event) {\n        event.preventDefault();\n        closeArtworkLaterModal(store);\n      };\n    });\n    var confirmButton = modal.querySelector('[data-bg-designer-artwork-later-confirm]');\n    if (confirmButton) {\n      confirmButton.onclick = function (event) {\n        event.preventDefault();\n        var price = mappedArtworkPathPrice(store, 'youhaveart');\n        if (modal.__bgArtworkLaterPrice !== (price ? price.display : '')) {\n          applyArtworkLaterModalCopy(store, modal);\n          modal.__bgArtworkLaterOperation = captureArtworkOperation(store);\n          return;\n        }\n        if (!isArtworkOperationFresh(store, modal.__bgArtworkLaterOperation)) { closeArtworkLaterModal(store, { restoreFocus: false }); return; }\n        closeArtworkLaterModal(store, { restoreFocus: false });\n        submitArtworkLaterFallback(store);\n      };\n    }\n    modal.onkeydown = function (event) {\n      if (modal.hidden) return;\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        closeArtworkLaterModal(store);\n        return;\n      }\n      if (event.key !== 'Tab') return;\n      var focusable = getFocusableElements(modal);\n      if (!focusable.length) return;\n      var first = focusable[0];\n      var last = focusable[focusable.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    };\n    return true;\n  }\n\n  function openArtworkLaterModal(store) {\n    var modal = ensureArtworkLaterModal(store);\n    bindArtworkLaterModal(store, modal);\n    modal.__bgArtworkLaterOperation = captureArtworkOperation(store);\n    store.artworkLaterModalPreviousFocus = document.activeElement;\n    modal.hidden = false;\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('bg-designer-artwork-later-modal--open');\n    window.requestAnimationFrame(function () {\n      var focusTarget = modal.querySelector('[data-bg-designer-artwork-later-back]')\n        || modal.querySelector('[role=\"dialog\"]')\n        || modal;\n      if (focusTarget && typeof focusTarget.focus === 'function') {\n        try { focusTarget.focus({ preventScroll: true }); } catch (_) { focusTarget.focus(); }\n      }\n    });\n  }\n\n  // PDP-PITCHPRINT-RETURN-APPROVAL (owner 2026-10-27, OD-370): the W1 press asks once in the shared dialog (TC-DIALOG-01, registry copy). Add to\n  // cart applies the free choice now and re-enters the gate; with no shared dialog on the page the press adds as MF-4 did. Go back or a changed page add nothing.\n  function askArtworkLater(store) {\n    var operation = captureArtworkOperation(store), copy = function (key) { return getGuidedCopy(store, key); }, shared = window.BgStorefrontConfirm, asked = shared && typeof shared.open === 'function' ? openStorefrontConfirmDialog({ title: copy('laterModalTitle'), body: copy('laterModalBody'), note: copy('laterModalNote'), confirmLabel: copy('laterModalConfirmLabel'), cancelLabel: copy('laterModalBackLabel') }) : Promise.resolve(true);\n    return asked.then(function (accepted) {\n      if (accepted && isArtworkOperationFresh(store, operation)) submitArtworkLaterFallback(store);\n    });\n  }\n\n  // BUG-04: native window.confirm is banned on this surface (it is dead\n  // inside iframes and unattended browsers auto-dismiss it). TC-DIALOG-01\n  // moved the single dialog implementation to the shared asset\n  // bg-storefront-confirm.js ([data-bg-designer-confirm-modal]) so the\n  // template collection controller consumes the SAME dialog instead of\n  // forking a second one. The PDP section loads that asset before this\n  // runtime. Focus moves into the dialog, Tab is trapped, Escape cancels,\n  // and focus returns to the opener. Resolves true only on the explicit\n  // confirm action; when the shared asset failed to load, every confirm\n  // fails closed as declined (never a native dialog).\n  function openStorefrontConfirmDialog(options) {\n    var shared = window.BgStorefrontConfirm;\n    if (!shared || typeof shared.open !== 'function') return Promise.resolve(false);\n    return shared.open(options);\n  }\n\n  function getUploadFilePublicUrl(file) {\n    return text(file && (file.downloadUrl || file.publicUrl || file.url));\n  }\n\n  // BUG-02: interrupted (uploadFailed) files must never read as uploaded. A\n  // file counts as uploaded once it holds a stored URL; freshly selected\n  // files that have not been attempted keep the pre-existing selection copy.\n  function countUploadedArtworkFiles(files) {\n    var list = Array.isArray(files) ? files : [];\n    var uploaded = 0;\n    var failed = 0;\n    list.forEach(function (file) {\n      if (getUploadFilePublicUrl(file)) uploaded += 1;\n      else if (file && file.uploadFailed) failed += 1;\n    });\n    return { total: list.length, uploaded: uploaded, failed: failed };\n  }\n\n  function buildUploadedFileCountLabel(files) {\n    var counts = countUploadedArtworkFiles(files);\n    if (!counts.total) return '';\n    if (counts.failed > 0) {\n      return counts.uploaded + ' of ' + counts.total + ' file' + (counts.total === 1 ? '' : 's') + ' uploaded';\n    }\n    return counts.total + ' file' + (counts.total === 1 ? '' : 's') + ' uploaded';\n  }\n\n  function hasPendingArtworkUploads(store) {\n    if (!store || !store.state) return false;\n    var fields = getActiveArtworkUploadFields(store);\n    if (!fields.length) return false;\n    restoreUploadStateFromInputs(store);\n    return fields.some(function (field) {\n      return (store.state.uploads[field.id] || []).some(function (file) {\n        return file && file.sourceFile && !getUploadFilePublicUrl(file);\n      });\n    });\n  }\n\n  function uploadArtworkFieldFiles(store, field, files) {\n    if (files.length && files.every(function (file) { return Number((file.sourceFile || file).size) > STOREFRONT_FILE_MAX_BYTES; })) {\n      return Promise.resolve(files.map(function () { return { ok: false, code: UPLOAD_TOO_LARGE_CODE, message: STOREFRONT_FILE_TOO_LARGE_MESSAGE }; }));\n    }\n    emitStorefrontEvent(store, 'upload_started', 'upload', {\n      fieldId: text(field && field.id),\n      fileCount: Array.prototype.slice.call(files || []).length,\n      files: summarizeUploadFiles((files || []).map(function (file) { return file && file.sourceFile ? file.sourceFile : file; }))\n    }, 'high');\n    return ensureDesignerBootstrapLoaded(store).then(function (bootstrap) {\n      var apiBaseUrl = getDesignerApiBaseUrlFromBootstrap(bootstrap);\n      var sessionToken = getDesignerSessionTokenFromBootstrap(bootstrap);\n      if (!apiBaseUrl) {\n        throw new Error('Upload service is not ready yet on this page.');\n      }\n      if (!sessionToken) {\n        throw new Error('Upload session is not ready yet on this page.');\n      }\n      var uploadFiles = files.map(function (file) {\n        return file && file.sourceFile ? file : null;\n      }).filter(Boolean);\n      var results = new Array(uploadFiles.length);\n      var nextIndex = 0;\n      var commonScope = {\n        storeKey: text(store.config && (store.config.storeKey || store.config.storefront) || window.__siteCfg && window.__siteCfg.brand_slug),\n        fieldId: text(field && field.id),\n        productHandle: getEditorProductHandle(store),\n        productId: text(store.config && store.config.productId),\n        projectId: text(store.state && store.state.project && store.state.project.projectId)\n      };\n\n      function parseUploadResponse(response) {\n        return response.json().catch(function () { return null; }).then(function (payload) {\n          if (!response.ok || !payload || payload.ok !== true) {\n            var failure = new Error(payload && payload.error ? payload.error : (response.status === 413 ? STOREFRONT_FILE_TOO_LARGE_MESSAGE : ('Upload failed (' + response.status + ')')));\n            failure.code = response.status === 413 ? 'UPLOAD_TOO_LARGE' : text(payload && payload.code);\n            throw failure;\n          }\n          return payload;\n        });\n      }\n\n      function uploadNext() {\n        var index = nextIndex;\n        nextIndex += 1;\n        if (index >= uploadFiles.length) return Promise.resolve();\n        var fileState = uploadFiles[index];\n        var sourceFile = fileState.sourceFile;\n        if (Number(sourceFile.size) > STOREFRONT_FILE_MAX_BYTES) {\n          results[index] = { ok: false, code: UPLOAD_TOO_LARGE_CODE, message: STOREFRONT_FILE_TOO_LARGE_MESSAGE };\n          return uploadNext();\n        }\n        var initPayload = Object.assign({}, commonScope, {\n          fileName: text(fileState.name || fileState.fileName || sourceFile.name) || 'artwork-file',\n          contentType: text(sourceFile.type) || 'application/octet-stream',\n          byteSize: Math.max(0, Number(sourceFile.size || 0) || 0)\n        });\n        return fetch(buildDesignerApiEndpoint(apiBaseUrl, '/api/storefront/uploads/init'), {\n          method: 'POST',\n          body: JSON.stringify(initPayload),\n          credentials: 'omit',\n          headers: {\n            'content-type': 'application/json',\n            'x-designer-session-token': sessionToken\n          }\n        }).then(parseUploadResponse).then(function (intent) {\n          var uploadHeaders = intent.requiredHeaders && typeof intent.requiredHeaders === 'object'\n            ? intent.requiredHeaders\n            : { 'content-type': initPayload.contentType };\n          var transfer = store.mobileExperience && store.mobileExperience.experience === 'quick_build' && typeof window.XMLHttpRequest === 'function'\n            ? new Promise(function (resolve, reject) {\n              var request = new window.XMLHttpRequest();\n              request.open('PUT', text(intent.uploadUrl));\n              Object.keys(uploadHeaders).forEach(function (key) { request.setRequestHeader(key, uploadHeaders[key]); });\n              request.upload.onprogress = function (event) {\n                if (!event.lengthComputable) return;\n                fileState.uploadProgress = Math.min(99, Math.round(event.loaded * 100 / event.total));\n                notifyMobileArtwork(store);\n              };\n              request.onload = function () {\n                var body = request.responseText;\n                // parseUploadResponse reads a refusal body the same way as a fetch response.\n                resolve({ ok: request.status >= 200 && request.status < 300, status: request.status,\n                  json: function () { return Promise.resolve().then(function () { return JSON.parse(body); }); } });\n              };\n              request.onerror = request.ontimeout = function () { reject(new Error('The connection was lost. Choose the file again to retry.')); };\n              request.send(sourceFile);\n            })\n            : fetch(text(intent.uploadUrl), { method: 'PUT', body: sourceFile, credentials: 'omit', headers: uploadHeaders });\n          return transfer.then(function (response) {\n            if (response.status === 413) return parseUploadResponse(response);\n            if (!response.ok) throw new Error('The file could not be uploaded. Check your connection and choose it again.');\n            return fetch(buildDesignerApiEndpoint(apiBaseUrl, '/api/storefront/uploads/finalize'), {\n              method: 'POST',\n              body: JSON.stringify(Object.assign({}, commonScope, { uploadId: text(intent.uploadId) })),\n              credentials: 'omit',\n              headers: {\n                'content-type': 'application/json',\n                'x-designer-session-token': sessionToken\n              }\n            });\n          }).then(parseUploadResponse).then(function (finalized) {\n            if (!finalized.item || !text(finalized.item.publicUrl)) {\n              throw new Error('Upload did not return a usable file reference.');\n            }\n            results[index] = { ok: true, item: finalized.item };\n          });\n        }).catch(function (error) {\n          results[index] = { ok: false, code: readUploadFailureCode(error && error.code), message: text(error && error.message) };\n        }).then(uploadNext);\n      }\n\n      var workerCount = Math.min(4, uploadFiles.length);\n      var workers = [];\n      for (var workerIndex = 0; workerIndex < workerCount; workerIndex += 1) {\n        workers.push(uploadNext());\n      }\n      return Promise.all(workers).then(function () {\n        var succeeded = results.filter(function (result) { return result && result.ok; });\n        var failed = results.length - succeeded.length;\n        emitStorefrontEvent(store, failed ? 'upload_partially_failed' : 'upload_succeeded', 'upload', {\n          fieldId: text(field && field.id),\n          fileCount: files.length,\n          resultCount: succeeded.length,\n          failedCount: failed,\n          resultCodes: succeeded.map(function (result) {\n            return text(result && result.item && result.item.storageTarget) || 'stored';\n          }).slice(0, 12)\n        }, 'high');\n        return results;\n      });\n    }).catch(function (error) {\n      emitStorefrontError(store, 'upload_failed', 'upload_failed', error, {\n        fieldId: text(field && field.id),\n        fileCount: Array.prototype.slice.call(files || []).length,\n        files: summarizeUploadFiles((files || []).map(function (file) { return file && file.sourceFile ? file.sourceFile : file; }))\n      });\n      return Array.prototype.slice.call(files || []).map(function () {\n        return { ok: false, code: 'retryable_upload_failure' };\n      });\n    });\n  }\n\n  var STOREFRONT_FILE_MAX_BYTES = 200 * 1024 * 1024;\n  var STOREFRONT_FILE_TOO_LARGE_MESSAGE = 'This file is larger than 200 MB. Choose a file up to 200 MB.';\n  var UPLOAD_TOO_LARGE_CODE = 'upload_too_large';\n  var UPLOAD_FILE_TYPE_REFUSED_CODE = 'file_type_not_allowed';\n  var UPLOAD_NOT_ACCEPTED_CODE = 'upload_not_accepted';\n\n  // The upload service refuses a file for good when its type is not allowed\n  // (at init, or when finalize's byte check quarantines it), or when the item\n  // cannot take it (uploads off, a field it does not have, its file pool\n  // full). Any other failure (network, timeout, a busy service) is worth a retry.\n  function readUploadFailureCode(serviceCode) {\n    var code = text(serviceCode);\n    if (code === 'UPLOAD_TOO_LARGE') return UPLOAD_TOO_LARGE_CODE;\n    if (code === 'UPLOAD_FILE_TYPE_NOT_ALLOWED') return UPLOAD_FILE_TYPE_REFUSED_CODE;\n    if (code === 'UPLOAD_POLICY_MISMATCH' || code === 'UPLOAD_FIELD_NOT_ALLOWED' || code === 'UPLOAD_FIELD_LIMIT_REACHED') {\n      return UPLOAD_NOT_ACCEPTED_CODE;\n    }\n    return 'retryable_upload_failure';\n  }\n\n  function isUploadFileTypeRefused(file) {\n    return !!(file && file.uploadFailed && file.uploadFailureCode === UPLOAD_FILE_TYPE_REFUSED_CODE);\n  }\n\n  function isUploadNotAccepted(file) {\n    return !!(file && file.uploadFailed && file.uploadFailureCode === UPLOAD_NOT_ACCEPTED_CODE);\n  }\n\n  // Sending the same file again cannot help: the customer removes it.\n  function isUploadRefusedForGood(file) {\n    return isUploadFileTypeRefused(file) || isUploadNotAccepted(file) || !!(file && file.uploadFailureCode === UPLOAD_TOO_LARGE_CODE);\n  }\n\n  function applyArtworkUploadResult(file, result) {\n    if (!result || !result.ok || !result.item) {\n      return Object.assign({}, file || {}, {\n        uploadFailed: true,\n        uploading: false,\n        uploadFailureMessage: text(result && result.message),\n        uploadFailureCode: [UPLOAD_TOO_LARGE_CODE, UPLOAD_FILE_TYPE_REFUSED_CODE, UPLOAD_NOT_ACCEPTED_CODE].indexOf(text(result && result.code)) !== -1\n          ? text(result.code)\n          : 'retryable_upload_failure'\n      });\n    }\n    var item = result.item;\n    return {\n      clientId: text(file && file.clientId),\n      id: text(item.id),\n      name: text(item.fileName) || text(file && (file.name || file.fileName)),\n      fileName: text(item.fileName) || text(file && (file.name || file.fileName)),\n      uploadRef: text(item.uploadRef),\n      url: text(item.downloadUrl || item.publicUrl),\n      publicUrl: text(item.publicUrl),\n      downloadUrl: text(item.downloadUrl || item.publicUrl),\n      contentType: text(item.contentType || file && file.contentType),\n      byteSize: Math.max(0, Number(item.byteSize || file && file.byteSize || 0) || 0),\n      uploadedAt: text(item.uploadedAt),\n      storageTarget: text(item.storageTarget),\n      uploadFailed: false,\n      uploading: false\n    };\n  }\n\n  function retryArtworkUploadFile(store, fieldId, fileIndex) {\n    if (!store || !store.state || store.artworkUploadPromise) return Promise.resolve(false);\n    var field = getActiveArtworkUploadFields(store).find(function (entry) {\n      return text(entry && entry.id) === text(fieldId);\n    });\n    var files = field && store.state.uploads ? (store.state.uploads[field.id] || []) : [];\n    var file = files[fileIndex];\n    if (!field || !file || !file.sourceFile || getUploadFilePublicUrl(file)) return Promise.resolve(false);\n    var retryFile = Object.assign({}, file, { uploadFailed: false, uploading: true });\n    var retriesDetailUpload = isDetailUploadField(field);\n    files[fileIndex] = retryFile;\n    refreshUploadFieldLists(store);\n    syncSubmitButton(store);\n    setMessage(store, retriesDetailUpload ? 'Retrying your upload...' : 'Retrying artwork upload...', '');\n    emitStorefrontEvent(store, 'upload_retry_started', 'upload', {\n      fieldId: text(field.id),\n      fileCount: 1\n    }, 'high');\n    var operation = captureArtworkOperation(store);\n    var retrySucceeded = false;\n    var retryPromise = uploadArtworkFieldFiles(store, field, [retryFile]).then(function (results) {\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      var currentFiles = store.state.uploads[field.id] || [];\n      var result = results[0] || { ok: false };\n      var currentIndex = currentFiles.findIndex(function (candidate) {\n        return candidate === retryFile || text(candidate && candidate.clientId) === text(retryFile.clientId);\n      });\n      if (currentIndex !== -1) currentFiles[currentIndex] = applyArtworkUploadResult(currentFiles[currentIndex], result);\n      syncFormState(store);\n      if (!result.ok || currentIndex === -1) {\n        var retryFailedMessage = describeUploadFailures(currentIndex === -1 ? [] : [currentFiles[currentIndex]], retriesDetailUpload\n          ? DETAIL_UPLOAD_FAILED_MESSAGE\n          : 'That artwork file did not finish uploading. Your other file is safe.');\n        setMessage(store, retryFailedMessage, 'error');\n        emitStorefrontEvent(store, 'upload_retry_failed', 'upload', { fieldId: text(field.id), fileCount: 1 }, 'high');\n        throw new Error(retryFailedMessage);\n      }\n      setMessage(store, retriesDetailUpload ? 'File uploaded.' : 'Artwork file uploaded. Your other file stayed safe.', 'success');\n      emitStorefrontEvent(store, 'upload_retry_succeeded', 'upload', { fieldId: text(field.id), fileCount: 1 }, 'high');\n      retrySucceeded = true;\n      return true;\n    }).finally(function () {\n      if (store.artworkUploadPromise !== retryPromise) return;\n      store.artworkUploadPromise = null;\n      refreshUploadFieldLists(store);\n      syncSubmitButton(store);\n      // The Artwork details header follows the file (UPLOAD-CARRY-2b).\n      scheduleGuidedProductFormPresentation(store);\n      if (store.root) {\n        window.requestAnimationFrame(function () {\n          if (retrySucceeded) {\n            var status = store.root.querySelector('[data-bg-upload-status=\"' + text(field.id).replace(/\"/g, '') + '\"]');\n            if (status && typeof status.focus === 'function') {\n              status.hidden = false;\n              status.setAttribute('tabindex', '-1');\n              status.focus();\n            }\n            return;\n          }\n          var currentFiles = store.state.uploads[field.id] || [];\n          var failedIndex = currentFiles.findIndex(function (candidate) {\n            return text(candidate && candidate.clientId) === text(retryFile.clientId);\n          });\n          var retryButton = failedIndex === -1 ? null : store.root.querySelector(\n            '[data-bg-artwork-action=\"retry-upload-file\"]' +\n            '[data-bg-upload-file-field=\"' + text(field.id).replace(/\"/g, '') + '\"]' +\n            '[data-bg-upload-file-index=\"' + String(failedIndex) + '\"]'\n          );\n          if (retryButton && typeof retryButton.focus === 'function') retryButton.focus();\n        });\n      }\n    });\n    store.artworkUploadPromise = retryPromise;\n    return retryPromise;\n  }\n\n  function notifyMobileArtwork(store) {\n    if (store && store.mobileExperience && typeof store.mobileExperience.syncArtwork === 'function') store.mobileExperience.syncArtwork();\n  }\n\n  function refreshUploadFieldLists(store) {\n    notifyMobileArtwork(store);\n    if (!store || !store.root || !store.state) return;\n    normalizeUploadFields(store.binding).concat(getDetailUploadFields(store)).forEach(function (field) {\n      Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-upload-list=\"' + field.id + '\"]')).forEach(function (list) {\n        list.innerHTML = buildUploadListMarkup(store, field);\n      });\n      // BUG-02: the uploaded-count line now distinguishes interrupted files,\n      // so it must refresh with the rows or a settled retry reads stale.\n      Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-upload-status=\"' + field.id + '\"]')).forEach(function (status) {\n        var statusText = buildUploadStatusText(store, field);\n        status.textContent = statusText;\n        status.hidden = !statusText;\n      });\n    });\n  }\n\n  // UPLOAD-SURFACES-NEVER-SENT-01: a detail field's file (a QR code file, a\n  // mailing list) is not artwork, and a failed one blocks the purchase until\n  // it is stored or removed, so its sentences say what it is and what to do.\n  function hasFailedDetailUploads(store) {\n    return getDetailUploadFields(store).some(function (field) {\n      return getUploadFieldFiles(store, field.id).some(function (file) {\n        return !!(file && file.uploadFailed);\n      });\n    });\n  }\n\n  function hasPendingDetailUploads(store) {\n    return getDetailUploadFields(store).some(function (field) {\n      return (store.state.uploads[field.id] || []).some(function (file) {\n        return file && file.sourceFile && !getUploadFilePublicUrl(file);\n      });\n    });\n  }\n\n  var DETAIL_UPLOAD_FAILED_MESSAGE = 'One or more files did not finish uploading. Try again, or remove the file to continue.';\n  var UPLOAD_FILE_TYPE_REFUSED_MESSAGE = 'One or more files are a type we can\u2019t use here. Remove the file and choose another to continue.';\n  var UPLOAD_NOT_ACCEPTED_MESSAGE = 'This item can\u2019t take this upload right now. Remove the file to continue.';\n\n  // The purchase row names the failure a retry cannot fix first.\n  function describeUploadFailures(files, retryableMessage) {\n    if (files.some(isUploadFileTypeRefused)) return UPLOAD_FILE_TYPE_REFUSED_MESSAGE;\n    if (files.some(isUploadNotAccepted)) return UPLOAD_NOT_ACCEPTED_MESSAGE;\n    return retryableMessage;\n  }\n\n  function ensureArtworkUploadsReady(store) {\n    if (!hasPendingArtworkUploads(store)) return Promise.resolve(true);\n    if (store.artworkUploadPromise) return store.artworkUploadPromise;\n    var operation = captureArtworkOperation(store);\n    var drainsDetailUploads = hasPendingDetailUploads(store);\n    setMessage(store, drainsDetailUploads ? 'Uploading your files...' : 'Uploading artwork files...', '');\n    emitStorefrontEvent(store, 'upload_completion_check_started', 'upload', {\n      pendingFields: getActiveArtworkUploadFields(store).filter(function (field) {\n        return (store.state.uploads[field.id] || []).some(function (file) {\n          return file && file.sourceFile && !getUploadFilePublicUrl(file);\n        });\n      }).map(function (field) { return text(field && field.id); }).slice(0, 12)\n    }, 'high');\n    var failedUploadCount = 0;\n    var drain = Promise.all(getActiveArtworkUploadFields(store).map(function (field) {\n      var currentFiles = store.state.uploads[field.id] || [];\n      var replacement = (store.mobileArtworkUploadReplacements || {})[field.id];\n      var pendingFiles = currentFiles.filter(function (file) {\n        return file && file.sourceFile && !getUploadFilePublicUrl(file);\n      });\n      // A file refused for good is not sent again; it still blocks the purchase.\n      failedUploadCount += pendingFiles.filter(isUploadRefusedForGood).length;\n      pendingFiles = pendingFiles.filter(function (file) { return !isUploadRefusedForGood(file); });\n      if (!pendingFiles.length) return Promise.resolve();\n      pendingFiles.forEach(function (file) {\n        file.uploadFailed = false;\n        file.uploading = true;\n      });\n      return uploadArtworkFieldFiles(store, field, pendingFiles).then(function (results) {\n        if (!isArtworkOperationFresh(store, operation)) return;\n        store.state.uploads[field.id] = (store.state.uploads[field.id] || []).map(function (file) {\n          if (!file || !file.sourceFile || getUploadFilePublicUrl(file)) return file;\n          var itemIndex = pendingFiles.indexOf(file);\n          if (itemIndex === -1) return file;\n          var result = results[itemIndex] || { ok: false };\n          if (!result.ok) failedUploadCount += 1;\n          return applyArtworkUploadResult(file, result);\n        });\n        if (replacement && (store.mobileArtworkUploadReplacements || {})[field.id] === replacement && replacement.newIds && replacement.previousFiles.length) {\n          var replacements = store.state.uploads[field.id] || [];\n          if (replacements.some(function (file) { return replacement.newIds.indexOf(file.clientId) !== -1 && file.uploadFailed; })) {\n            // The native upload owner keeps the last usable artwork. The\n            // phone plan retains the failed attempt solely to show its reason.\n            replacement.failedFiles = replacements.filter(function (file) { return file.uploadFailed; });\n            store.state.uploads[field.id] = replacement.previousFiles;\n          } else if (replacements.every(function (file) { return !!getUploadFilePublicUrl(file); })) {\n            delete store.mobileArtworkUploadReplacements[field.id];\n          }\n        }\n      });\n    })).then(function () {\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      syncFormState(store);\n      render(store);\n      if (failedUploadCount) {\n        var activeFiles = [];\n        getActiveArtworkUploadFields(store).forEach(function (field) {\n          activeFiles = activeFiles.concat(store.state.uploads[field.id] || []);\n        });\n        throw new Error(describeUploadFailures(activeFiles, drainsDetailUploads\n          ? DETAIL_UPLOAD_FAILED_MESSAGE\n          : 'One or more artwork files did not finish uploading. Your other file is safe.'));\n      }\n      setMessage(store, '', '');\n      emitStorefrontEvent(store, 'upload_completion_check_succeeded', 'upload', {}, 'high');\n      return true;\n    }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      setMessage(store, text(error && error.message) || 'Artwork upload failed. Please try again.', 'error');\n      emitStorefrontError(store, 'upload_completion_check_failed', 'upload_completion_failed', error, {});\n      throw error;\n    }).finally(function () {\n      if (store.artworkUploadPromise !== drain) return;\n      store.artworkUploadPromise = null;\n      refreshUploadFieldLists(store);\n      syncSubmitButton(store);\n    });\n    store.artworkUploadPromise = drain;\n    refreshUploadFieldLists(store);\n    syncSubmitButton(store);\n    return drain;\n  }\n\n  function ensureArtworkUploadsDrained(store) {\n    return ensureArtworkUploadsReady(store).then(function () {\n      if (hasPendingArtworkUploads(store)) {\n        return ensureArtworkUploadsDrained(store);\n      }\n      return true;\n    });\n  }\n\n  function applyPreparedCommercePropertiesToForm(form, properties) {\n    var wanted = {};\n    Object.keys(properties && typeof properties === 'object' ? properties : {}).forEach(function (key) {\n      var value = text(properties[key]);\n      if (value) wanted['properties[' + key + ']'] = value;\n    });\n    Array.prototype.slice.call(\n      form.querySelectorAll('input[name^=\"properties[\"], textarea[name^=\"properties[\"], select[name^=\"properties[\"]')\n    ).forEach(function (input) {\n      var name = text(input.name);\n      if (!Object.prototype.hasOwnProperty.call(wanted, name)) {\n        if (String(input.type).toLowerCase() === 'hidden' && input.parentNode) {\n          input.parentNode.removeChild(input);\n        } else {\n          input.disabled = true;\n        }\n        return;\n      }\n      if (input.value !== wanted[name]) input.value = wanted[name];\n      delete wanted[name];\n    });\n    Object.keys(wanted).forEach(function (name) {\n      var input = document.createElement('input');\n      input.type = 'hidden';\n      input.name = name;\n      input.value = wanted[name];\n      form.appendChild(input);\n    });\n  }\n\n  function dispatchPreparedProductFormSubmit(store, token, signed) {\n    var owner = artworkOwners.get(store);\n    // A signed payload carries the signer's canonical state (compact\n    // selections, server price entries), never the page's own quote; the\n    // quote was compared on the exact form sent to the signer.\n    var sent = new window.FormData(store.form);\n    var check = checkArtworkDispatch(store, signed ? null : sent, token, sent);\n    if (owner.handed.has(token) || owner.dispatched.has(token)) return discardArtworkOperation(store, token, false);\n    if (!check.ok) return discardArtworkOperation(store, token, check.message);\n    // A hosting product-form still prepares and signs before it sends the\n    // line: the purchase is handed over, not yet in the cart, and a stale\n    // turn before that is still told. A plain submit goes to the cart now.\n    owner.handed.add(token);\n    var guarded = ensureArtworkSendGuard(store);\n    if (!productFormPreparesDispatchedSubmit(store) && !guarded) owner.dispatched.add(token);\n    store.completionSubmitBypass = true;\n    if (typeof store.form.requestSubmit === 'function') {\n      var submitButton = getSubmitButton(store);\n      if (submitButton) {\n        store.form.requestSubmit(submitButton);\n      } else {\n        store.form.requestSubmit();\n      }\n    } else {\n      store.form.submit();\n    }\n  }\n\n  // The theme's <product-form> prepares (saves and signs) every designer add it\n  // receives, from the live form. When it will receive this form's dispatched\n  // submit, a runtime prepare first would save a second record that no cart\n  // line ever uses, so one click must prepare exactly once.\n  function productFormPreparesDispatchedSubmit(store) {\n    if (!store || !store.form || typeof store.form.requestSubmit !== 'function') return false;\n    var host = typeof store.form.closest === 'function' ? store.form.closest('product-form') : null;\n    return !!(host && host.form === store.form && typeof host.prepareDesignerCommerceContext === 'function');\n  }\n\n  function submitProductForm(store, operation) {\n    if (!store || !store.form) return false;\n    // BD-NO-ROW-ZERO-PRICE: every add funnels here, the editor's direct add\n    // too (it never passes the button). A choice no price row prices is\n    // never sent; the same state keeps the button disabled.\n    if (isNoPriceRowState(store)) {\n      store.commercePrepareInFlight = false;\n      endPurchaseSubmission(store);\n      setMessage(store, NO_PRICE_ROW_MESSAGE, 'error');\n      if (store.activeDirectToCartAdd) store.activeDirectToCartAdd.fail(NO_PRICE_ROW_MESSAGE, { plain: true });\n      return false;\n    }\n    var owner = artworkOwners.get(store), token = operation || owner.operation;\n    if (token && !isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n    reconcileArtworkChoice(store);\n    var entry = checkArtworkDispatch(store, null, token);\n    if (!entry.ok) {\n      store.commercePrepareInFlight = false;\n      endPurchaseSubmission(store);\n      setMessage(store, entry.message, 'error');\n      revealGuidedArtworkPurchaseStep(store);\n      if (store.activeDirectToCartAdd) store.activeDirectToCartAdd.fail(entry.message);\n      return false;\n    }\n    if (!token) { beginPurchaseSubmission(store); token = owner.operation; }\n    else if (!owner.operation) { owner.operation = owner.latest = token; store.purchaseSubmissionInFlight = true; }\n    else if (owner.operation !== token) return false;\n    if (!token || owner.handed.has(token) || owner.dispatched.has(token) || store.commercePrepareInFlight) return false;\n    syncFormState(store);\n    syncSubmitButton(store);\n    var formData = new window.FormData(store.form), core = window.BGDesignerStorefrontCore;\n    var quoted = checkArtworkDispatch(store, formData, token, formData);\n    if (!quoted.ok) { discardArtworkOperation(store, token); setMessage(store, quoted.message, 'error'); return false; }\n    // Designer adds must carry a signed commerce context. When the <product-form>\n    // AJAX interceptor will receive this dispatched submit it signs there (and\n    // runs the shared artwork guard after its own signing); otherwise the\n    // runtime signs here before handing the form on.\n    var isDesignerAdd = !!store.form.querySelector('[name=\"properties[_bg_designer_version]\"]');\n    var canSign = !!(core && typeof core.prepareCommerceContextFormData === 'function'\n      && typeof core.fetchCartState === 'function' && typeof core.hashCartToken === 'function');\n    if (!isDesignerAdd || !canSign) {\n      dispatchPreparedProductFormSubmit(store, token, false); return true;\n    }\n    var formSigns = productFormPreparesDispatchedSubmit(store);\n    store.commercePrepareInFlight = true;\n    var updateLineKey = text(formData.get('properties[_bg_update_line_key]'));\n    if (!formSigns) {\n      emitStorefrontEvent(store, 'commerce_context_prepare_started', 'cart', {\n        source: updateLineKey ? 'runtime-cart-update' : 'runtime-add-to-cart'\n      }, 'high');\n    }\n    var staleArtworkStep = {};\n    function fresh(signed) {\n      if (owner.operation !== token || !isArtworkOperationFresh(store, token)) { discardArtworkOperation(store, token); return false; }\n      // prepareCommerceContextFormData rewrites formData with the signed state.\n      var check = checkArtworkDispatch(store, signed ? null : formData, token, formData);\n      if (!check.ok) throw Object.assign(new Error(check.message), { artworkCustomerMessage: true });\n      return true;\n    }\n    // A cart-line edit re-reads the cart: a line another tab changed is never\n    // overwritten, whichever lane signs it.\n    var cartCheck = updateLineKey ? core.fetchCartState({ forceFresh: true }).then(function (cart) {\n      if (!fresh()) return false;\n      var line = (cart && cart.items || []).find(function (item) { return text(item.key) === updateLineKey; });\n      if (!line || (store.editingLineFingerprint && artworkCartLineFingerprint(line) !== store.editingLineFingerprint)) {\n        throw Object.assign(new Error('This cart item changed in another tab. Open it again from your cart before saving.'), { artworkCustomerMessage: true });\n      }\n      return true;\n    }) : Promise.resolve(true);\n    var handoff = formSigns ? cartCheck.then(function (currentLine) {\n      if (!currentLine || !fresh()) return;\n      store.commercePrepareInFlight = false;\n      dispatchPreparedProductFormSubmit(store, token, false);\n    }) : cartCheck.then(function (currentLine) {\n      if (!currentLine || !fresh()) return staleArtworkStep;\n      // A cookieless guest gets a different transient token from every\n      // /cart.js read; the durable resolver pins the cart first so the hash\n      // bound at create still matches at the sign-lane rewrite.\n      return typeof core.resolveDurableCartTokenHash === 'function' ? core.resolveDurableCartTokenHash()\n        : core.fetchCartState({ forceFresh: true }).then(function (cart) { return core.hashCartToken(cart && cart.token); });\n    }).then(function (cartTokenHash) {\n      // The durable lookup can outlive the customer's quoted choice.\n      if (cartTokenHash === staleArtworkStep || !fresh()) return staleArtworkStep;\n      if (!cartTokenHash) throw new Error('Secure cart context is unavailable.');\n      return core.prepareCommerceContextFormData(formData, { lineKey: updateLineKey,\n        source: updateLineKey ? 'cart-update' : 'add-to-cart', cartTokenHash: cartTokenHash });\n    }).then(function (prepared) {\n      if (prepared === staleArtworkStep || !fresh(true)) return;\n      if (!prepared || !text(prepared._bg_context_id)\n        || (!(core.isNativeChannelOfferProperties && core.isNativeChannelOfferProperties(prepared))\n          && !text(prepared._bg_pt_v5) && !text(prepared._bg_pt_v4))) throw new Error('Secure cart pricing is unavailable.');\n      // prepareCommerceContextProperties intentionally strips the transient\n      // _bg_update_line_key from the stored-line property set, but the\n      // <product-form> submitter re-reads the LIVE form to pick its\n      // update-vs-add branch, so restore it before applying the properties.\n      var repriced = artworkSignedPriceMessage(token, function (key) { return text(prepared[key]); });\n      if (repriced) throw Object.assign(new Error(refuseArtworkSignedPrice(store, repriced)), { artworkCustomerMessage: true });\n      if (updateLineKey) prepared._bg_update_line_key = updateLineKey;\n      if (!fresh(true)) return;\n      applyPreparedCommercePropertiesToForm(store.form, prepared);\n      store.commercePrepareInFlight = false;\n      emitStorefrontEvent(store, 'commerce_context_prepare_succeeded', 'cart', {\n        source: updateLineKey ? 'runtime-cart-update' : 'runtime-add-to-cart'\n      }, 'high');\n      dispatchPreparedProductFormSubmit(store, token, true);\n    });\n    handoff.catch(function (error) {\n      // An old operation's failure never clears or overwrites a newer one.\n      if (owner.operation !== token || !isArtworkOperationFresh(store, token)) { discardArtworkOperation(store, token); return; }\n      store.commercePrepareInFlight = false;\n      endPurchaseSubmission(store);\n      // Core save, signing and identity failures already carry the plain\n      // message and reference code; the artwork and cart-line checks carry\n      // their own plain sentence; any other error shows the same plain\n      // message and keeps its own text for telemetry only.\n      var hasCustomerCopy = !!(error && (error.artworkCustomerMessage || (typeof error.referenceCode === 'string' && text(error.message))));\n      var message = hasCustomerCopy\n        ? text(error.message)\n        : buildCartFailureMessageWithCode(updateLineKey ? 'update' : 'add');\n      // syncSubmitButton clears the message block whenever the form state is\n      // valid, so it must run BEFORE the error is written or the customer\n      // never sees the fail-closed reason.\n      syncSubmitButton(store);\n      showPurchaseNotice(store, message);\n      scrollToStickyPurchaseReviewTarget(store, { reason: message });\n      emitStorefrontError(store, 'add_to_cart_failed', 'commerce_context_prepare_error', new Error(message), {\n        source: updateLineKey ? 'runtime-cart-update' : 'runtime-add-to-cart',\n        status: error && typeof error.status === 'number' ? error.status : undefined,\n        referenceCode: readCartFailureReferenceCode(),\n        reason: text((error && error.serverError) || (hasCustomerCopy ? '' : error && error.message)).slice(0, 120)\n      });\n      // Pass-through direct cart: the product-page message block above is\n      // invisible behind the still-open editor overlay \u2014 settle the active\n      // watch so the failure surfaces INSIDE the editor instead of hanging.\n      if (store.activeDirectToCartAdd) store.activeDirectToCartAdd.fail(message);\n    });\n    return true;\n  }\n\n  // The same bytes core compares right before its cart update (a number\n  // variant id from /cart.js becomes text there): core's own function when\n  // it has one, else an exact copy of its formula.\n  function artworkCartLineFingerprint(line) {\n    if (core && typeof core.cartLineFingerprint === 'function') return core.cartLineFingerprint(line);\n    if (!line) return '';\n    return JSON.stringify([text(line.key), text(line.variant_id || line.id), Number(line.quantity), line.properties || {}]);\n  }\n\n  function deferProductFormSubmit(store) {\n    if (!store || !store.form) return false;\n    var token = artworkOwners.get(store).operation || captureArtworkOperation(store);\n    window.setTimeout(function () {\n      submitProductForm(store, token);\n    }, 0);\n    return true;\n  }\n\n  // Pass-through direct cart: the editor overlay STAYS OPEN (the shell close\n  // was deferred) while this baselines the cart, runs the signed add corridor\n  // behind it, and opens the cart page once the new line lands \u2014 the product\n  // page is never visible in between. Failures (secure-prepare errors and the\n  // landed-line poll deadline) are posted INTO the editor overlay, and the\n  // classic product-page message lane is mirrored so the reason survives a\n  // manual overlay close. Never a silent hang: every terminal path either\n  // navigates or reports.\n  var DIRECT_TO_CART_POLL_DEADLINE_MS = 20000;\n  var DIRECT_TO_CART_UNVERIFIED_NAVIGATE_DELAY_MS = 2500;\n  var DIRECT_TO_CART_FALLBACK_FAILURE_MESSAGE = 'We could not confirm your design was added to the cart. Please try again.';\n\n  function notifyDirectToCartResult(store, detail) {\n    if (store && store.editorShell && typeof store.editorShell.postMessageToEditor === 'function') {\n      return store.editorShell.postMessageToEditor('storefront:direct-add-result', detail);\n    }\n    return false;\n  }\n\n  function completeDirectToCartClose(store, projectId) {\n    var core = window.BGDesignerStorefrontCore;\n    if (store.activeDirectToCartAdd) return Promise.resolve(false);\n    var token = captureArtworkOperation(store);\n    // The approved design's own record read settles its document revision\n    // (the editor's save and close carry none), so the corridor checks the\n    // configuration and quote without it and captures the purchase after it.\n    var configurationKey = artworkOperationKey(store, true);\n    // A direct add whose options changed stops and says why, inside the\n    // editor at once (never the landed-line poll).\n    function fresh() {\n      if (artworkOperationKey(store, true) === configurationKey) return true;\n      var owner = artworkOwners.get(store);\n      discardArtworkOperation(store, token, false);\n      if (!watch.settled) watch.fail(owner.notice || artworkStaleMessage, { plain: true });\n      return false;\n    }\n    var watch = {\n      projectId: text(projectId),\n      settled: false\n    };\n    watch.fail = function (message, options) {\n      if (watch.settled) return;\n      watch.settled = true;\n      store.activeDirectToCartAdd = null;\n      // An artwork sentence asks the customer to review a choice; it never\n      // carries an earlier cart failure's reference code.\n      var cleanMessage = options && options.plain && text(message)\n        ? text(message)\n        : withCartFailureReferenceCode(text(message) || DIRECT_TO_CART_FALLBACK_FAILURE_MESSAGE);\n      // Mirror onto the product page so the reason is still visible after the\n      // customer closes the editor overlay manually.\n      setMessage(store, cleanMessage, 'error');\n      notifyDirectToCartResult(store, { ok: false, message: cleanMessage });\n      // Mobile marker-return lane (MOBILE-DTC-PARITY-01): there is no editor\n      // overlay top-level \u2014 the full-page scrim owner drops its scrim here so\n      // the product-page message block above becomes the visible surface.\n      if (typeof store.onDirectToCartAddFailed === 'function') {\n        try {\n          store.onDirectToCartAddFailed(cleanMessage);\n        } catch (_) {}\n      }\n      emitStorefrontError(store, 'add_to_cart_failed', 'direct_to_cart_close_failed', new Error(cleanMessage), {\n        projectId: watch.projectId\n      });\n    };\n    watch.succeed = function () {\n      if (watch.settled) return;\n      watch.settled = true;\n      store.activeDirectToCartAdd = null;\n      window.location.assign('/cart');\n    };\n    store.activeDirectToCartAdd = watch;\n    // The cart add-once owner settles the add: handed over (the cart page),\n    // or a read-back failure message inside the editor.\n    var addOnce = window.BGCartAddOnce;\n    if (!addOnce) {\n      watch.fail(\"We couldn't confirm this item was added. Check your cart before trying again.\");\n      return Promise.resolve(false);\n    }\n    return refreshProjectPreview(store, projectId).catch(function () {}).then(function () {\n      if (!fresh()) return false;\n      render(store);\n      // The approved design's record read settled its document revision:\n      // the purchase is captured now, and signing checks it from here on.\n      token = captureArtworkOperation(store);\n      var unsubscribe = addOnce.subscribe(store.form, function (outcome) {\n        if (outcome.state === 'handoff') {\n          unsubscribe();\n          watch.succeed();\n        } else if (outcome.state !== 'sent' && outcome.state !== 'read-back') {\n          unsubscribe();\n          watch.fail(outcome.message || addOnce.recoveryMessage);\n        }\n      });\n      if (!submitProductForm(store, token)) {\n        unsubscribe();\n        endPurchaseSubmission(store);\n        watch.fail('We could not add this design to your cart. Please refresh the page and try again.');\n      }\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // MOBILE-DTC-PARITY-01 \u2014 mobile pass-through direct cart (marker return).\n  //\n  // Phone-class devices open the editor TOP-LEVEL (core isTouchEditingShell-\n  // Viewport gates the overlay), so no parent shell can receive the deferred\n  // storefront:close that drives the desktop corridor. Instead the editor\n  // appends completionDestination=add-to-cart to its classic return URL. On\n  // product-page load with that marker (plus the standing return params:\n  // projectId + launchProvider=self-hosted) this lane:\n  //   1. holds a full-page \"Adding to your cart\u2026\" scrim from the earliest\n  //      paint the runtime owns, so the restored product page never flashes;\n  //   2. lets the EXISTING return machinery restore the project from the URL;\n  //   3. restores the pre-launch form commerce state (quantity/options/\n  //      apparel/EDDM) from the sessionStorage stash written at launch, so\n  //      the auto-add never fabricates a quantity-1 order;\n  //   4. runs the EXISTING completeDirectToCartClose corridor (one commerce\n  //      engine \u2014 never a second add implementation) and lands on /cart.\n  // Failures drop the scrim and surface through the classic PDP message\n  // block, which IS the visible surface top-level. A theme running without\n  // the marker (flag off, guards failed) keeps the classic restored product\n  // page byte-identically.\n  // -------------------------------------------------------------------------\n  var DIRECT_TO_CART_LAUNCH_STASH_PREFIX = 'bgDesignerDirectAddLaunchState:';\n  var DIRECT_ADD_RETURN_SCRIM_ID = 'bg-designer-direct-add-return-scrim';\n\n  // Resume-restored and proof surfaces can carry the self-hosted-<id>\n  // publicId alias for the same project; compares must normalize it.\n  function normalizeSelfHostedProjectIdAlias(value) {\n    return text(value).replace(/^self-hosted-(?=shp_)/i, '');\n  }\n\n  function getDirectToCartLaunchStashKey(store) {\n    return DIRECT_TO_CART_LAUNCH_STASH_PREFIX + text(store && store.config && store.config.handle);\n  }\n\n  function buildDirectToCartLaunchStash(store) {\n    return {\n      runtimeVersion: 'designer-direct-add-launch-state-v1',\n      handle: text(store.config.handle),\n      // Fresh template launches have no projectId yet \u2014 the marker return's\n      // consume gate treats an empty stash projectId as \"this launch\".\n      projectId: text(store.state.project && store.state.project.projectId),\n      stashedAt: Date.now(),\n      quantityMode: text(store.state.quantityMode),\n      printQuantity: Number(store.state.quantity || 0) || 0,\n      typedQuantity: Number(store.state.typedQuantity || 0) || 0,\n      paidPrintQty: Number(store.state.paidPrintQuantity || 0) || 0,\n      apparelSizes: store.state.apparelSizes && typeof store.state.apparelSizes === 'object'\n        ? store.state.apparelSizes\n        : {},\n      sizeSurchargeTotal: Number(store.state.sizeSurchargeTotal || 0) || 0,\n      optionSelections: buildCurrentOptionSelections(store),\n      eddm: buildSerializedEddmState(store),\n      customerInputs: buildSerializedCustomerInputs(store),\n      extraInputs: {\n        qrCodeLink: text(store.state.extraInputs && store.state.extraInputs.qrCodeLink),\n        imprintInformation: text(store.state.extraInputs && store.state.extraInputs.imprintInformation)\n      }\n    };\n  }\n\n  function writeDirectToCartLaunchStash(store) {\n    if (!store || !store.form || !store.state) return false;\n    // Only a flagged, non-cart-edit launch can produce a marker return;\n    // classic launches write nothing (flag-off path stays byte-identical).\n    if (!isProductCommerceDirectToCart(store) || text(store.editingLineKey)) return false;\n    try {\n      window.sessionStorage.setItem(\n        getDirectToCartLaunchStashKey(store),\n        JSON.stringify(buildDirectToCartLaunchStash(store))\n      );\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function consumeDirectToCartLaunchStash(store, projectId) {\n    var raw = '';\n    try {\n      var key = getDirectToCartLaunchStashKey(store);\n      raw = text(window.sessionStorage.getItem(key));\n      window.sessionStorage.removeItem(key);\n    } catch (_) {\n      return null;\n    }\n    if (!raw) return null;\n    var stash = parseJson(raw, null);\n    if (!stash || typeof stash !== 'object') return null;\n    if (text(stash.handle) !== text(store.config.handle)) return null;\n    // A stash bound to a DIFFERENT project must never leak across designs; an\n    // empty stash projectId is a fresh-template launch whose project was only\n    // minted inside the editor.\n    if (text(stash.projectId)\n      && normalizeSelfHostedProjectIdAlias(stash.projectId) !== normalizeSelfHostedProjectIdAlias(projectId)) {\n      return null;\n    }\n    return stash;\n  }\n\n  function applyDirectToCartLaunchStash(store, stash) {\n    if (!store || !store.state || !stash || typeof stash !== 'object') return false;\n    if (Array.isArray(stash.optionSelections) && stash.optionSelections.length) {\n      applyStoredOptionSelections(store, stash.optionSelections);\n    }\n    var quantity = Number(numberValue(stash.printQuantity, store.state.quantity || 0));\n    if (Number.isFinite(quantity) && quantity > 0) {\n      store.state.quantity = quantity;\n    }\n    if (text(stash.quantityMode)) {\n      store.state.quantityMode = text(stash.quantityMode);\n    }\n    store.state.typedQuantity = Number(numberValue(stash.typedQuantity, store.state.quantity || 0));\n    store.state.paidPrintQuantity = Number(numberValue(stash.paidPrintQty, store.state.quantity || 0));\n    if (text(stash.quantityMode) === 'apparelMatrix') {\n      store.state.apparelSizesInitialized = true;\n      store.state.apparelSizes = core.normalizeApparelSizes ? core.normalizeApparelSizes(stash.apparelSizes) : {};\n    }\n    store.state.sizeSurchargeTotal = Number(numberValue(stash.sizeSurchargeTotal, 0) || 0);\n    if (stash.eddm && typeof stash.eddm === 'object') {\n      store.state.eddm = Object.assign(buildDefaultEddmState(), {\n        provider: text(stash.eddm.provider),\n        dataVersion: text(stash.eddm.dataVersion),\n        routeGroupUuid: text(stash.eddm.routeGroupUuid),\n        targetInMailboxDate: text(stash.eddm.targetInMailboxDate),\n        routesSelected: !!stash.eddm.routesSelected,\n        selectedRouteCount: Number(stash.eddm.selectedRouteCount || 0) || 0,\n        residentialAddresses: Number(stash.eddm.residentialAddresses || 0) || 0,\n        businessAddresses: Number(stash.eddm.businessAddresses || 0) || 0,\n        totalAddresses: Number(stash.eddm.totalAddresses || 0) || 0,\n        residentialOnly: !!stash.eddm.residentialOnly,\n        politicalMailer: !!stash.eddm.politicalMailer,\n        routeDetails: text(stash.eddm.routeDetails),\n        selectedRoutes: Array.isArray(stash.eddm.selectedRoutes) ? stash.eddm.selectedRoutes : []\n      });\n    }\n    var stashedCustomerInputs = Array.isArray(stash.customerInputs) ? stash.customerInputs : [];\n    if (stashedCustomerInputs.length) {\n      getCustomerInputConfig(store).fields.forEach(function (field) {\n        var stashedEntry = stashedCustomerInputs.find(function (entry) {\n          return text(entry && entry.id) === field.id;\n        });\n        if (!stashedEntry) return;\n        store.state.customerInputs[field.id] = field.type === 'checkbox'\n          ? stashedEntry.value === true\n          : String(stashedEntry.value == null ? '' : stashedEntry.value).slice(0, 1000);\n      });\n    }\n    if (stash.extraInputs && typeof stash.extraInputs === 'object') {\n      if (text(stash.extraInputs.qrCodeLink)) {\n        store.state.extraInputs.qrCodeLink = text(stash.extraInputs.qrCodeLink);\n      }\n      if (text(stash.extraInputs.imprintInformation)) {\n        store.state.extraInputs.imprintInformation = text(stash.extraInputs.imprintInformation);\n      }\n    }\n    recalculate(store);\n    syncFormState(store);\n    return true;\n  }\n\n  // ---- Configuration Session flow-back (Stage 2 S4, ADR-021) ----\n  // The editor's size-change transitions mutate the server-owned\n  // Configuration Session. After such a mutation the SESSION \u2014 not this\n  // page's launch-time state \u2014 is the selection/quantity truth, so the page\n  // reads it back and re-renders options, price, and the add-to-cart state\n  // from it instead of its stale pre-editor values.\n\n  function resolveDesignerLaunchQuantity(store) {\n    var quantity = Number(store && store.state && store.state.quantity);\n    return Number.isInteger(quantity) && quantity > 0 ? quantity : 0;\n  }\n\n  // Written by the editor (same-origin, per-tab sessionStorage): the current\n  // configuration session id plus the session token whose claims name it.\n  // Writer: apps/editor lib/editor-guest-claim-proofs.ts\n  // (rememberConfigurationSessionHandoff). Keep the key in sync.\n  function readDesignerConfigurationSessionHandoff() {\n    try {\n      var parsed = JSON.parse(window.sessionStorage.getItem('bg_designer_configuration_session_v1') || 'null');\n      if (!parsed || typeof parsed !== 'object') return null;\n      var id = text(parsed.id);\n      var token = text(parsed.token);\n      return id && token ? { id: id, token: token } : null;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function rememberDesignerConfigurationSession(store, sessionId) {\n    var id = text(sessionId);\n    if (!id || !store || !store.state) return;\n    store.state.designerConfigurationSessionId = id;\n  }\n\n  // A classic (non-direct-add) top-level editor return carries the session id\n  // on the URL; consume it exactly once.\n  function readConfigurationSessionReturnParam() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      var sessionId = text(params.get('bgConfigurationSession'));\n      if (!sessionId) return '';\n      var cleanUrl = new URL(window.location.href);\n      cleanUrl.searchParams.delete('bgConfigurationSession');\n      window.history.replaceState({}, document.title, cleanUrl.toString());\n      return sessionId;\n    } catch (_) {\n      return '';\n    }\n  }\n\n  // STUDIO-0011 (one size writer): a required session read answers whether it\n  // read the session ({ ok: true, session }) or could not ({ ok: false }), so a\n  // failed read is never mistaken for an unchanged session.\n  function fetchDesignerConfigurationSession(store, sessionId) {\n    var id = text(sessionId);\n    var handoff = readDesignerConfigurationSessionHandoff();\n    if (!id || !handoff || handoff.id !== id) return Promise.resolve({ ok: false, reload: true });\n    var designer = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    var proxyRoot = (text(designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer').replace(/\\/+$/, '');\n    return fetch(proxyRoot + '/session/configuration?id=' + encodeURIComponent(id), {\n      method: 'GET',\n      headers: {\n        accept: 'application/json',\n        'x-designer-session-token': handoff.token\n      },\n      credentials: 'same-origin'\n    }).then(function (response) {\n      if (!response || !response.ok) return null;\n      return response.json().catch(function () { return null; });\n    }).then(function (payload) {\n      var session = payload && typeof payload === 'object' ? payload.configurationSession : null;\n      return session && typeof session === 'object' ? { ok: true, session: session } : { ok: false };\n    }).catch(function () {\n      return { ok: false };\n    });\n  }\n\n  // STUDIO-0011 (one size writer): a return that carries a Configuration\n  // Session must read it before anything is added. A failed read holds every\n  // add path with one sentence and Try again; a successful read (changed or\n  // unchanged) releases the hold. The hold is the only state: no adoption\n  // record, no saved-design geometry read.\n  var designerConfigurationHoldMessage = 'We could not confirm your design choices. Please try again.';\n  // Without this tab's session credential, or with a choice this page cannot\n  // show, trying again cannot help: a reload reads the page and session fresh.\n  var designerConfigurationReloadMessage = 'We could not confirm your design choices. Reload this page.';\n\n  function designerConfigurationHoldSentence(store) {\n    var hold = store && store.designerConfigurationHold;\n    return hold && hold.reload ? designerConfigurationReloadMessage : designerConfigurationHoldMessage;\n  }\n\n  function holdDesignerConfigurationSession(store, sessionId, reload) {\n    store.designerConfigurationHold = { sessionId: text(sessionId), retrying: false, reload: !!reload };\n    showPurchaseNotice(store, designerConfigurationHoldSentence(store));\n    renderDesignerConfigurationHold(store);\n  }\n\n  function releaseDesignerConfigurationHold(store) {\n    if (!store.designerConfigurationHold) return;\n    var sentence = designerConfigurationHoldSentence(store);\n    store.designerConfigurationHold = null;\n    // Redraw the page message from the current notices so the hold sentence\n    // never outlives the hold.\n    showPurchaseNotice(store, text(store.purchaseFailureMessage) === sentence ? '' : undefined);\n    renderDesignerConfigurationHold(store);\n  }\n\n  function retryDesignerConfigurationSession(store) {\n    var hold = store.designerConfigurationHold;\n    if (!hold || hold.retrying || hold.reload) return Promise.resolve(false);\n    hold.retrying = true;\n    renderDesignerConfigurationHold(store);\n    return syncProductStateFromConfigurationSession(store, hold.sessionId).then(function (applied) {\n      if (store.designerConfigurationHold) store.designerConfigurationHold.retrying = false;\n      render(store);\n      return applied;\n    });\n  }\n\n  // A direct add whose session could not be read adds nothing: the page\n  // drops its scrim and holds; an editor still open is told why.\n  function stopHeldDirectAdd(store, notifyEditor) {\n    if (!store.designerConfigurationHold) return false;\n    hideDirectToCartReturnScrim();\n    renderDesignerConfigurationHold(store);\n    if (notifyEditor) notifyDirectToCartResult(store, { ok: false, message: designerConfigurationHoldSentence(store) });\n    return true;\n  }\n\n  function renderDesignerConfigurationHold(store) {\n    var blocks = readBlocks(store);\n    var anchor = blocks && blocks.message;\n    var button = store.designerConfigurationRetryButton || null;\n    var hold = store.designerConfigurationHold;\n    if (hold) setMessage(store, designerConfigurationHoldSentence(store), 'error');\n    if (!hold || hold.reload) {\n      if (button) button.hidden = true;\n      return;\n    }\n    if (!button && anchor && anchor.parentNode) {\n      button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'button button--secondary bg-designer-storefront__retry';\n      button.setAttribute('data-bg-designer-configuration-retry', '');\n      button.textContent = 'Try again';\n      button.addEventListener('click', function () {\n        void retryDesignerConfigurationSession(store);\n      });\n      anchor.parentNode.insertBefore(button, anchor.nextSibling);\n      store.designerConfigurationRetryButton = button;\n    }\n    if (button) {\n      button.hidden = false;\n      button.disabled = !!hold.retrying;\n    }\n  }\n\n  // Stage 2 S6 (ECO-SIGNS-04): does the session's sellable product still\n  // match THIS page? A cross-product move rewrites the session's product;\n  // rendering (or adding) another product's configuration on this page would\n  // be wrong, so the mismatch lane navigates to the moved product instead \u2014\n  // the same cross-product hop the linked-product holders already use.\n  function designerConfigurationSessionMatchesStorePage(store, session) {\n    var sellable = session && session.sellableProduct && typeof session.sellableProduct === 'object'\n      ? session.sellableProduct\n      : null;\n    if (!sellable) return true;\n    var sessionHandle = text(sellable.productHandle).toLowerCase();\n    var sessionProductId = text(sellable.productId).replace(/^.*\\//, '');\n    var pageHandle = text(store && store.config && store.config.handle).toLowerCase();\n    var pageProductId = text(store && store.config && store.config.productId).replace(/^.*\\//, '');\n    if (sessionHandle && pageHandle && sessionHandle !== pageHandle) return false;\n    if (sessionProductId && pageProductId && sessionProductId !== pageProductId) return false;\n    return true;\n  }\n\n  function buildDesignerMovedProductUrl(store, session, sessionId) {\n    var sellable = session && session.sellableProduct ? session.sellableProduct : {};\n    var handle = text(sellable.productHandle);\n    if (!handle) return '';\n    try {\n      var url = new URL('/products/' + encodeURIComponent(handle.replace(/^\\/+/, '')), window.location.origin);\n      var projectId = text(session.projectId);\n      if (projectId) {\n        url.searchParams.set('bg_saved_project_id', projectId);\n        url.searchParams.set('bg_saved_source', 'product-move');\n      }\n      if (text(sessionId)) url.searchParams.set('bgConfigurationSession', text(sessionId));\n      return url.toString();\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function navigateToDesignerMovedProduct(store, session, sessionId) {\n    var targetUrl = buildDesignerMovedProductUrl(store, session, sessionId);\n    if (!targetUrl) return false;\n    window.location.assign(targetUrl);\n    return true;\n  }\n\n  // STUDIO-0011: answers 'unchanged' (verified, nothing to adopt), 'applied',\n  // 'unresolved' (a session choice this page cannot adopt, or a refused\n  // commit: the page must not add its old choice) or 'moved'.\n  function applyDesignerConfigurationSessionState(store, session, options) {\n    if (!store || !session || typeof session !== 'object') return 'unresolved';\n    // Only a planner-mutated session outranks the page's own state; an\n    // untouched session still mirrors what this page launched with.\n    if (!text(session.mutatedByPlannerAt)) return 'unchanged';\n    // S6 safety net: a session that moved to another product never renders\n    // (or adds) on this page \u2014 hand the customer to the moved product.\n    if (!designerConfigurationSessionMatchesStorePage(store, session)) {\n      var movedSessionId = text(options && options.sessionId)\n        || text(store.state && store.state.designerConfigurationSessionId);\n      navigateToDesignerMovedProduct(store, session, movedSessionId);\n      return 'moved';\n    }\n    var applied = false;\n    var unresolved = false;\n    var proposal = { selections: Object.assign({}, store.state.selections) };\n    var quantity = Number(session.quantity && session.quantity.requested);\n    if (Number.isInteger(quantity) && quantity > 0 && quantity !== Number(store.state.quantity)) {\n      proposal.quantity = quantity;\n      proposal.typedQuantity = quantity;\n      proposal.paidPrintQuantity = quantity;\n      applied = true;\n    }\n    var selectionRows = session.selection && Array.isArray(session.selection.selectedOptions)\n      ? session.selection.selectedOptions\n      : [];\n    // STUDIO-0011 R4: every session choice must be adoptable here. A choice\n    // for a holder this page does not have (a configuration this page's data\n    // predates) is unresolved, the same as a value it does not have.\n    var pageHolderIds = (Array.isArray(store.holders) ? store.holders : []).map(getHolderId);\n    selectionRows.forEach(function (entry) {\n      var rowHolderId = text(entry && entry.holderId);\n      if (rowHolderId && text(entry && entry.valueId) && pageHolderIds.indexOf(rowHolderId) === -1) unresolved = true;\n    });\n    (Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      var holderId = getHolderId(holder);\n      var row = selectionRows.find(function (entry) {\n        return text(entry && entry.holderId) === holderId && text(entry && entry.valueId);\n      });\n      if (!row) return;\n      var valueId = text(row.valueId);\n      var options = Array.isArray(holder.values) ? holder.values : [];\n      var matched = null;\n      for (var index = 0; index < options.length; index += 1) {\n        var option = options[index];\n        if (\n          getOptionStableValueId(option) === valueId\n          || text(option.hvId) === valueId\n          || text(option.targetingID) === valueId\n        ) {\n          matched = option;\n          break;\n        }\n      }\n      if (!matched) {\n        unresolved = true;\n        return;\n      }\n      if (text(store.state.selections[holderId]) !== text(matched.hvId)) {\n        proposal.selections[holderId] = text(matched.hvId);\n        applied = true;\n      }\n    });\n    if (unresolved) return 'unresolved';\n    if (applied) {\n      if (commitArtworkConfiguration(store, proposal, { source: 'restore' }).status === 'refused') return 'unresolved';\n      recalculate(store);\n      syncFormState(store);\n      render(store);\n    }\n    return applied ? 'applied' : 'unchanged';\n  }\n\n  function syncProductStateFromConfigurationSession(store, sessionId) {\n    var id = text(sessionId);\n    if (!id) return Promise.resolve(false);\n    rememberDesignerConfigurationSession(store, id);\n    var token = captureArtworkOperation(store), configurationKey = artworkOperationKey(store, true);\n    return fetchDesignerConfigurationSession(store, id).then(function (result) {\n      // PHONE-GUEST-RETURN: a choice made meanwhile outdates the session; a revision the design read settled outdates only a hold.\n      if (artworkOperationKey(store, true) !== configurationKey) return false;\n      // STUDIO-0011: a failed required read holds every add path; any read that succeeds (changed or not) releases the hold.\n      if (!result || !result.ok) {\n        if (isArtworkOperationFresh(store, token)) holdDesignerConfigurationSession(store, id, !!(result && result.reload));\n        return false;\n      }\n      var adopted = applyDesignerConfigurationSessionState(store, result.session, { sessionId: id });\n      // A session choice this page cannot adopt holds too: adding would\n      // carry the page's old choice beside the editor's design.\n      if (adopted === 'unresolved') {\n        if (isArtworkOperationFresh(store, token)) holdDesignerConfigurationSession(store, id, true);\n        return false;\n      }\n      releaseDesignerConfigurationHold(store);\n      return adopted === 'applied';\n    }).catch(function () {\n      holdDesignerConfigurationSession(store, id);\n      return false;\n    });\n  }\n\n  function readDirectToCartReturnMarker() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      if (text(params.get('completionDestination')).toLowerCase() !== 'add-to-cart') return null;\n      var projectId = text(params.get('projectId') || params.get('projectID') || params.get('project_id'));\n      if (!projectId) return null;\n      var launchProvider = readLaunchProviderCandidate(\n        params.get('launchProvider')\n        || params.get('designerProvider')\n        || params.get('_bg_designer_provider')\n      );\n      if (launchProvider !== 'self-hosted') return null;\n      var configurationSessionId = text(params.get('bgConfigurationSession'));\n      return { projectId: projectId, configurationSessionId: configurationSessionId };\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function showDirectToCartReturnScrim() {\n    var existing = document.getElementById(DIRECT_ADD_RETURN_SCRIM_ID);\n    if (existing) return existing;\n    if (!document.body) return null;\n    var scrim = document.createElement('div');\n    scrim.id = DIRECT_ADD_RETURN_SCRIM_ID;\n    scrim.className = 'bg-designer-direct-add-scrim';\n    scrim.setAttribute('role', 'status');\n    scrim.setAttribute('aria-live', 'polite');\n    scrim.innerHTML = '' +\n      '<div class=\"bg-designer-direct-add-scrim__card\">' +\n        '<div class=\"bg-designer-direct-add-scrim__spinner\" aria-hidden=\"true\"></div>' +\n        '<p class=\"bg-designer-direct-add-scrim__copy\">Adding to your cart\u2026</p>' +\n      '</div>';\n    document.body.appendChild(scrim);\n    return scrim;\n  }\n\n  function hideDirectToCartReturnScrim() {\n    var scrim = document.getElementById(DIRECT_ADD_RETURN_SCRIM_ID);\n    if (scrim && scrim.parentNode) {\n      scrim.parentNode.removeChild(scrim);\n    }\n  }\n\n  function stripDirectToCartReturnMarkerFromUrl() {\n    try {\n      var cleanUrl = new URL(window.location.href);\n      cleanUrl.searchParams.delete('completionDestination');\n      cleanUrl.searchParams.delete('bgConfigurationSession');\n      window.history.replaceState({}, document.title, cleanUrl.toString());\n    } catch (_) {}\n  }\n\n  // Runs once at the end of the boot restore chain. Returns true when the\n  // lane claimed the return (the page is now adding/navigating); false keeps\n  // every classic boot behavior.\n  function runDirectToCartReturnLane(store) {\n    var marker = store && store.directToCartReturnMarker;\n    if (!marker) return false;\n    store.directToCartReturnMarker = null;\n    // The marker is consumed exactly once: a reload after this point is a\n    // classic restored product page, never a duplicate add.\n    stripDirectToCartReturnMarkerFromUrl();\n    var restoredProjectId = text(store.state.project && store.state.project.projectId);\n    var eligible = isProductCommerceDirectToCart(store)\n      && !text(store.editingLineKey)\n      && text(store.state.artworkMode).toLowerCase() === 'designonline'\n      && !!restoredProjectId\n      && normalizeSelfHostedProjectIdAlias(restoredProjectId) === normalizeSelfHostedProjectIdAlias(marker.projectId)\n      && !store.activeDirectToCartAdd\n      // A heal after the setup-data message: the scrim that promised the add\n      // came down with the failure, so the page never adds on its own.\n      && !store.directToCartReturnStandDown;\n    if (!eligible) {\n      // Unflagged product, cart-edit session, non-designonline lane, or a\n      // project mismatch: classic restored product page, no auto-add.\n      hideDirectToCartReturnScrim();\n      // URL-PROJECT-PARAM-ARTWORK-OFF-01: the address lane let the marker's\n      // design in only because this lane adds it at once. The lane stood\n      // down, so on a page that cannot show a saved design the design leaves\n      // page state again and the customer reads why.\n      if (restoredProjectId\n        && normalizeSelfHostedProjectIdAlias(restoredProjectId) === normalizeSelfHostedProjectIdAlias(marker.projectId)\n        && refuseSavedDesignLanding(store)) {\n        clearProjectState(store);\n        if (text(store.state.artworkMode).toLowerCase() === 'designonline') setArtworkChoice(store, '', '', '');\n        recalculate(store);\n        syncFormState(store);\n        render(store);\n      }\n      return false;\n    }\n    var stash = consumeDirectToCartLaunchStash(store, marker.projectId);\n    if (stash) {\n      // Restore BEFORE the corridor submits so the add carries the\n      // customer's pre-editor quantity/options. An absent stash (expired\n      // tab, direct link) proceeds with the restored-project state as-is \u2014\n      // the same state today's classic return would submit.\n      applyDirectToCartLaunchStash(store, stash);\n    }\n    showDirectToCartReturnScrim();\n    store.onDirectToCartAddFailed = function () {\n      store.onDirectToCartAddFailed = null;\n      hideDirectToCartReturnScrim();\n    };\n    var returnKey = artworkOperationKey(store, true);\n    if (marker.configurationSessionId) {\n      // S4 flow-back: an in-editor transition made the SESSION the truth \u2014\n      // apply it before the corridor submits so the cart line carries the\n      // transitioned options and quantity. A failed readback degrades to the\n      // stash state (today's behavior), never blocks the add.\n      void syncProductStateFromConfigurationSession(store, marker.configurationSessionId)\n        .then(function (applied) {\n          // The applied session is the customer's own editor choice (the key leaves out the revision).\n          if (applied) returnKey = artworkOperationKey(store, true);\n        }, function () {})\n        .then(function () {\n          if (stopHeldDirectAdd(store, false)) return;\n          if (artworkOperationKey(store, true) === returnKey) return void completeDirectToCartClose(store, marker.projectId);\n          hideDirectToCartReturnScrim();\n          setMessage(store, store.artworkChoiceNotice || artworkStaleMessage, 'error');\n        });\n    } else {\n      void completeDirectToCartClose(store, marker.projectId);\n    }\n    return true;\n  }\n\n  // Hold the scrim from the earliest paint this asset owns: a marker return\n  // must never flash the restored product page while the runtime boots. The\n  // full guards run later in runDirectToCartReturnLane, which drops the\n  // scrim if any of them fail.\n  function maybeShowEarlyDirectToCartReturnScrim() {\n    if (!readDirectToCartReturnMarker()) return;\n    if (document.body) {\n      showDirectToCartReturnScrim();\n      return;\n    }\n    document.addEventListener('DOMContentLoaded', function () {\n      if (readDirectToCartReturnMarker()) showDirectToCartReturnScrim();\n    }, { once: true });\n  }\n\n  // Re-enters the FULL submit pipeline (validation + designonline completion\n  // gate) instead of the prepared-submit bypass \u2014 used after an awaited guided\n  // fill or upload drain so the completion eligibility check still runs.\n  function resubmitProductFormThroughGates(store) {\n    if (!store || !store.form) return false;\n    window.setTimeout(function () {\n      if (!store.form) return;\n      if (typeof store.form.requestSubmit === 'function') {\n        var submitButton = getSubmitButton(store);\n        store.automaticResubmit = true;\n        try {\n          if (submitButton) store.form.requestSubmit(submitButton);\n          else store.form.requestSubmit();\n        } finally { store.automaticResubmit = false; }\n        return;\n      }\n      // requestSubmit-less browsers fall back to the prepared submit; the\n      // server-side completion hard blocks still gate the order.\n      submitProductForm(store);\n    }, 0);\n    return true;\n  }\n\n  function requestCompletionEligibility(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var projectId = text(store.state && store.state.project && store.state.project.projectId);\n    if (!projectId) {\n      return Promise.resolve(null);\n    }\n    var token = captureArtworkOperation(store);\n    var requestKey = buildCompletionCheckKey(store);\n    if (!settings.force && requestKey && requestKey === store.completionRequestKey && text(store.state.completion && store.state.completion.checkedAt)) {\n      return Promise.resolve(store.state.completion);\n    }\n    if (store.completionRequestPromise && isArtworkOperationFresh(store, store.completionArtworkOperation)) return store.completionRequestPromise;\n    store.completionArtworkOperation = token;\n    var request = ensureDesignerBootstrapLoaded(store).then(function (bootstrap) {\n      var fallbackToken = getDesignerSessionTokenFromBootstrap(bootstrap);\n      // The page bootstrap session is not scoped to guest-claimed projects,\n      // so the print-readiness check resolves the same project-bound session\n      // the signing lane uses; the page session stays as the fallback.\n      return core.resolveCommerceProjectSession({\n        _bg_designer_state_v1: JSON.stringify({\n          project: { projectId: projectId },\n          productId: text(store.config && store.config.productId),\n          handle: text(store.config && store.config.handle)\n        })\n      }).catch(function () {\n        return null;\n      }).then(function (projectSession) {\n        return core.fetchProjectCompletionEligibility(store.config, buildCompletionPayload(store), {\n          sessionToken: text(projectSession && projectSession.sessionToken) || fallbackToken\n        });\n      });\n    }).then(function (eligibility) {\n      if (!isArtworkOperationFresh(store, token)) return null;\n      setCompletionEligibility(store, eligibility);\n      store.completionRequestKey = buildCompletionCheckKey(store);\n      return store.state.completion;\n    }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, token)) return null;\n      var status = Number(error && error.status) || 0;\n      if (status >= 500 || status === 0) {\n        return synthesizeCompletionFallback(store);\n      }\n      throw error;\n    }).finally(function () {\n      if (store.completionRequestPromise !== request) return;\n      store.completionRequestPromise = null;\n      syncSubmitButton(store);\n    });\n    store.completionRequestPromise = request;\n    syncSubmitButton(store);\n    return request;\n  }\n\n  function acceptCompletionAndContinue(store) {\n    var token = artworkOwners.get(store).operation || captureArtworkOperation(store);\n    if (!isArtworkOperationFresh(store, token)) return Promise.resolve(false);\n    var response = store && store.state && store.state.completion ? store.state.completion : {};\n    var confirmation = response.confirmation && typeof response.confirmation === 'object'\n      ? response.confirmation\n      : {};\n    if (!confirmation || !text(confirmation.documentFingerprint)) return Promise.resolve(false);\n    store.state.completion.confirmation = {\n      accepted: true,\n      acceptedAt: new Date().toISOString(),\n      documentFingerprint: text(confirmation.documentFingerprint),\n      issueCodes: Array.isArray(confirmation.issueCodes) ? confirmation.issueCodes.map(text).filter(Boolean) : []\n    };\n    emitStorefrontEvent(store, 'completion_confirmation_accepted', 'completion', {\n      issueCount: store.state.completion.confirmation.issueCodes.length\n    }, 'high');\n    syncFormState(store);\n    return requestCompletionEligibility(store, { force: true }).then(function (eligibility) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n      if (eligibility && eligibility.allowed) {\n        emitStorefrontEvent(store, 'completion_check_succeeded', 'completion', {\n          decision: text(eligibility.decision) || 'allowed',\n          afterConfirmation: true\n        }, 'high');\n        beginPurchaseSubmission(store);\n        submitProductForm(store);\n        return true;\n      }\n      if (eligibility && eligibility.decision === 'blocked') {\n        emitStorefrontEvent(store, 'completion_check_blocked', 'completion', {\n          decision: text(eligibility.decision),\n          afterConfirmation: true\n        }, 'high');\n        openCompletionModal(store, eligibility, 'blocked');\n      }\n      return false;\n    }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n      setMessage(store, text(error && error.message) || 'We could not verify print readiness. Please try again.', 'error');\n      emitStorefrontError(store, 'completion_check_failed', 'completion_check_failed', error, {\n        afterConfirmation: true\n      });\n      return false;\n    });\n  }\n\n  function handleProductFormSubmit(store, event) {\n    if (store.completionSubmitBypass) { store.completionSubmitBypass = false; return; }\n    releaseStaleArtworkPurchase(store);\n    if (store.purchaseSubmissionInFlight) { event.preventDefault(); return; }\n    if (isPitchPrintMiniConfirmationPending(store)) {\n      event.preventDefault();\n      setMessage(store, 'Confirm and submit your design before adding it to the cart.', 'error');\n      syncPitchPrintMiniPurchaseGate(store); syncStickyPurchaseBar(store);\n      return;\n    }\n    emitStorefrontEvent(store, 'add_to_cart_started', 'cart', { source: 'runtime-submit-gate' }, 'high');\n    // A press of Add on the page that shows the EDDM date; an automatic re-entry keeps the moved date.\n    if (!store.automaticResubmit) store.eddmDateMoved = null;\n    var validation = validateState(store);\n    if (!validation.valid) {\n      if (validation.code === 'customer-input-invalid') {\n        getCustomerInputConfig(store).fields.forEach(function (field) {\n          store.state.customerInputTouched[field.id] = true;\n        });\n        syncCustomerInputValidationUi(store);\n        window.requestAnimationFrame(function () {\n          scrollToStickyPurchaseReviewTarget(store, validation);\n        });\n      }\n      if (validation.code === 'missing-detail-upload') {\n        store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n        store.uploadValidationAttempted[validation.fieldId] = true;\n        if (getProductFormPresentation(store) === 'guided') store.guidedOpenStepKey = 'artwork-details';\n        render(store);\n        window.requestAnimationFrame(function () {\n          scrollToStickyPurchaseReviewTarget(store, validation);\n        });\n      }\n      if (validation.code === 'guided-fill-pending') {\n        // Slot uploads are picked \u2014 drain them, run (or retry) the server\n        // fill, then RE-ENTER the gates so the completion check still runs\n        // (deferProductFormSubmit would bypass it).\n        event.preventDefault();\n        beginPurchaseSubmission(store);\n    var token = artworkOwners.get(store).operation;\n        emitStorefrontEvent(store, 'add_to_cart_waiting_guided_fill', 'upload', {}, 'high');\n        ensureArtworkUploadsReady(store).then(function () {\n        if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n          return maybeRunGuidedSlotFill(store);\n        }).then(function () {\n          if (text(store.state.project && store.state.project.projectId)) {\n            endPurchaseSubmission(store);\n            resubmitProductFormThroughGates(store);\n          }\n        }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n          endPurchaseSubmission(store);\n          setMessage(store, text(error && error.message) || 'We could not place your image automatically. Please try again.', 'error');\n        });\n        return;\n      }\n      if (validation.allowArtworkLater) {\n        event.preventDefault();\n        setMessage(store, '', '');\n        emitStorefrontEvent(store, 'add_to_cart_validation_blocked', 'validation', {\n          reason: text(validation.reason),\n          allowArtworkLater: true\n        }, 'high');\n        if (mappedArtworkPathPrice(store, 'youhaveart')) openArtworkLaterModal(store); else void askArtworkLater(store);\n        return;\n      }\n      event.preventDefault();\n      setMessage(store, validation.reason, 'error');\n      emitStorefrontEvent(store, 'add_to_cart_validation_blocked', 'validation', {\n        reason: text(validation.reason),\n        allowArtworkLater: false\n      }, 'high');\n      return;\n    }\n    beginPurchaseSubmission(store);\n    var token = artworkOwners.get(store).operation;\n    if (hasPendingArtworkUploads(store)) {\n      event.preventDefault();\n      emitStorefrontEvent(store, 'add_to_cart_blocked_pending_uploads', 'upload', {}, 'high');\n      ensureArtworkUploadsReady(store).then(function () {\n        if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n        emitStorefrontEvent(store, 'add_to_cart_retry_after_uploads', 'upload', {}, 'high');\n        if (isGuidedFillArmed(store)) {\n          // A replacement slot upload just drained: refill first, then\n          // re-enter the gates so the completion check runs on the new design.\n          return maybeRunGuidedSlotFill(store).then(function () {\n            endPurchaseSubmission(store);\n            resubmitProductFormThroughGates(store);\n          });\n        }\n        // UPLOAD-SURFACES-NEVER-SENT-01: a detail upload can be pending\n        // beside a saved online design. That line still owes its print\n        // readiness check, so it re-enters the gates instead of going\n        // straight to the cart.\n        if (text(store.state.artworkMode).toLowerCase() === 'designonline' && !isPitchPrintLaunchProvider(store)) {\n          endPurchaseSubmission(store);\n          resubmitProductFormThroughGates(store);\n          return;\n        }\n        deferProductFormSubmit(store);\n      }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n        endPurchaseSubmission(store);\n        // The drain's own error message gets wiped by its finally-phase\n        // syncSubmitButton (pending files still validate), so re-surface it.\n        setMessage(store, text(error && error.message) || 'Artwork upload failed. Please try again.', 'error');\n        emitStorefrontError(store, 'add_to_cart_failed', 'upload_not_ready', error, {});\n      });\n      return;\n    }\n    if (text(store.state.artworkMode).toLowerCase() !== 'designonline') {\n      setMessage(store, '', '');\n      emitStorefrontEvent(store, 'add_to_cart_handoff_started', 'cart', {\n        reason: 'non-designonline'\n      }, 'high');\n      deferProductFormSubmit(store);\n      return;\n    }\n    if (isPitchPrintLaunchProvider(store)) {\n      setMessage(store, '', '');\n      emitStorefrontEvent(store, 'add_to_cart_handoff_started', 'cart', {\n        reason: 'pitchprint-provider'\n      }, 'high');\n      deferProductFormSubmit(store);\n      return;\n    }\n    if (!text(store.state.project && store.state.project.projectId)) {\n      endPurchaseSubmission(store);\n      emitStorefrontEvent(store, 'add_to_cart_handoff_started', 'cart', {\n        reason: 'no-project'\n      }, 'high');\n      return;\n    }\n    event.preventDefault();\n    setMessage(store, '', '');\n    emitStorefrontEvent(store, 'completion_check_started', 'completion', {}, 'high');\n    requestCompletionEligibility(store).then(function (eligibility) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n      if (!eligibility) {\n        emitStorefrontEvent(store, 'completion_check_unavailable', 'completion', {}, 'high');\n        submitProductForm(store, token);\n        return;\n      }\n      if (eligibility.decision === 'allowed_with_confirmation') {\n        endPurchaseSubmission(store);\n        emitStorefrontEvent(store, 'completion_confirmation_required', 'completion', {\n          decision: text(eligibility.decision)\n        }, 'high');\n        openCompletionModal(store, eligibility, 'confirm', function () {\n          if (isArtworkOperationFresh(store, token)) void acceptCompletionAndContinue(store);\n        });\n        return;\n      }\n      if (eligibility.allowed) {\n        emitStorefrontEvent(store, 'completion_check_succeeded', 'completion', {\n          decision: text(eligibility.decision) || 'allowed'\n        }, 'high');\n        submitProductForm(store, token);\n        return;\n      }\n      endPurchaseSubmission(store);\n      emitStorefrontEvent(store, 'completion_check_blocked', 'completion', {\n        decision: text(eligibility.decision)\n      }, 'high');\n      openCompletionModal(store, eligibility, 'blocked');\n    }).catch(function (error) {\n      if (!isArtworkOperationFresh(store, token)) return discardArtworkOperation(store, token);\n      endPurchaseSubmission(store);\n      setMessage(store, text(error && error.message) || 'We could not verify print readiness. Please try again.', 'error');\n      emitStorefrontError(store, 'completion_check_failed', 'completion_check_failed', error, {});\n    });\n  }\n\n  function readCartFailureReferenceCode() {\n    var liveCore = window.BGDesignerStorefrontCore || core;\n    if (!liveCore || typeof liveCore.readCustomerReferenceCode !== 'function') return '';\n    try {\n      return text(liveCore.readCustomerReferenceCode());\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function withCartFailureReferenceCode(message) {\n    var cleanMessage = text(message);\n    var referenceCode = readCartFailureReferenceCode();\n    if (!cleanMessage || !referenceCode || /reference code is/i.test(cleanMessage)) return cleanMessage;\n    return cleanMessage + ' Your reference code is ' + referenceCode + '.';\n  }\n\n  function buildCartFailureMessageWithCode(operation) {\n    var liveCore = window.BGDesignerStorefrontCore || core;\n    if (liveCore && typeof liveCore.buildCartFailureMessage === 'function') {\n      try {\n        var built = text(liveCore.buildCartFailureMessage(operation));\n        if (built) return built;\n      } catch (_) {}\n    }\n    return withCartFailureReferenceCode(operation === 'update'\n      ? 'We could not update this cart item. Please try again.'\n      : 'We could not add this item to your cart. Please try again.');\n  }\n\n  // product-form reports a failed designer preparation (no cart request was\n  // sent) with its plain message and reference code. Its own error box is not\n  // the visible surface on guided and intent-first pages, and nothing on the\n  // page is visible in front of the editor, so the runtime shows that ONE\n  // message where the customer is looking. Failures after a cart request was\n  // sent (stage cart-add / cart-update) are not handled here: their outcome\n  // can be unknown, and the add-once owner (CART-ADD-ONCE) settles them by\n  // reading the cart back.\n  function showCartSubmitFailure(store, form, detail) {\n    var stage = text(detail && detail.stage).toLowerCase();\n    if (stage !== 'commerce-context' && stage !== 'artwork') return;\n    var nativeHost = form && typeof form.closest === 'function' ? form.closest('product-form') : null;\n    var nativeWrapper = nativeHost ? nativeHost.querySelector('.product-form__error-message-wrapper') : null;\n    var nativeText = nativeWrapper && !nativeWrapper.hidden\n      ? text((nativeWrapper.querySelector('.product-form__error-message') || nativeWrapper).textContent)\n      : '';\n    // An artwork refusal is the customer's own choice to review, not a\n    // failure with a reference code.\n    var plain = (stage === 'artwork' || detail.plain === true) && !!text(detail.message);\n    var message = plain\n      ? text(detail.message)\n      : withCartFailureReferenceCode(text(detail.message) || nativeText) || buildCartFailureMessageWithCode('add');\n    if (nativeWrapper) nativeWrapper.hidden = true;\n    if (store.activeDirectToCartAdd) {\n      store.activeDirectToCartAdd.fail(message, { plain: plain });\n      return;\n    }\n    // syncSubmitButton clears the message block while the form is valid, so\n    // it runs before the message is written.\n    syncSubmitButton(store);\n    showPurchaseNotice(store, message);\n    scrollToStickyPurchaseReviewTarget(store, { reason: message });\n  }\n\n  function bindSingleProductForm(store, form) {\n    if (!store || !form || form.dataset.bgDesignerCompletionBound === '1') return;\n    form.dataset.bgDesignerCompletionBound = '1';\n    form.addEventListener('bg:designer-cart-submit-state', function (event) {\n      var detail = event && event.detail && typeof event.detail === 'object' ? event.detail : {};\n      var submitState = text(detail.state).toLowerCase();\n      if (submitState !== 'error') return;\n      var owner = artworkOwners.get(store);\n      var stage = text(detail.stage).toLowerCase();\n      // An old operation's failure never clears or overwrites a newer one.\n      // Its own sentence was said when it went stale, or the page says its\n      // failure (one outcome), so product-form's copy of it is hidden.\n      if (detail.operation && detail.operation !== owner.operation) {\n        var oldHost = typeof form.closest === 'function' ? form.closest('product-form') : null;\n        var oldWrapper = oldHost ? oldHost.querySelector('.product-form__error-message-wrapper') : null;\n        var hideOldCopy = function () { if (oldWrapper) oldWrapper.hidden = true; };\n        if (stage === 'artwork' || stage === 'earlier-add' || (text(detail.message) && text(detail.message) === text(store.purchaseFailureMessage))) hideOldCopy();\n        // An earlier purchase's add reached the cart after the customer moved\n        // on: said once where the customer looks; a newer purchase keeps its\n        // controls.\n        if (stage === 'earlier-add' && text(detail.message)) {\n          showPurchaseNotice(store, detail.message);\n          return;\n        }\n        // A purchase dropped while its add was on its way kept the purchase\n        // indicators until this outcome: with no newer purchase they end now,\n        // and its failure replaces the sentence that said it was being added.\n        if (owner.transport === detail.operation) {\n          owner.transport = null;\n          if (!owner.operation) {\n            var wasBeingAdded = store.purchaseFailureMessage === artworkTransportMessage;\n            endPurchaseSubmission(store);\n            if (wasBeingAdded) {\n              hideOldCopy();\n              showPurchaseNotice(store, text(detail.message) || buildCartFailureMessageWithCode(stage === 'cart-update' ? 'update' : 'add'));\n            }\n          }\n          return;\n        }\n        // The customer's own later choice may have cleared the sentence said\n        // when the purchase was dropped: with no newer purchase and nothing\n        // else on the page, say once why nothing was added.\n        if (stage === 'artwork' && !owner.operation && text(detail.message) && !store.purchaseFailureMessage && !store.artworkChoiceNotice) {\n          showPurchaseNotice(store, detail.message);\n        }\n        return;\n      }\n      // product-form stopped this purchase before the cart: it is over, and\n      // the next click starts a new one.\n      if ((stage === 'artwork' || stage === 'commerce-context') && owner.operation && !owner.dispatched.has(owner.operation)) {\n        discardArtworkOperation(store, owner.operation, false);\n      }\n      endPurchaseSubmission(store);\n      showCartSubmitFailure(store, form, detail);\n    });\n    form.addEventListener('submit', function (event) {\n      if (store.completionSubmitBypass) {\n        store.completionSubmitBypass = false;\n        return;\n      }\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\n      if (event && typeof event.stopImmediatePropagation === 'function') {\n        event.stopImmediatePropagation();\n      } else if (event && typeof event.stopPropagation === 'function') {\n        event.stopPropagation();\n      }\n      handleProductFormSubmit(store, event);\n    }, true);\n  }\n\n  function bindProductForm(store) {\n    if (!store || !store.form) return;\n    collectManagedProductForms(store).forEach(function (form) {\n      bindSingleProductForm(store, form);\n    });\n  }\n\n  function renderAccolades(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.accolades) return;\n    var accolades = Array.isArray(store.productData && store.productData.accolades)\n      ? store.productData.accolades.map(text).filter(Boolean)\n      : [];\n    var accoladeIconMap = Object.assign(\n      {},\n      ACCOLADE_ICON_MAP,\n      window.accoladeIconMap && typeof window.accoladeIconMap === 'object' ? window.accoladeIconMap : {}\n    );\n    if (!accolades.length) {\n      blocks.accolades.innerHTML = '';\n      blocks.accolades.hidden = true;\n      return;\n    }\n    blocks.accolades.hidden = false;\n    blocks.accolades.innerHTML = '<div class=\"bg-designer-storefront__accolade-list product-accolades-zone\">' + accolades.map(function (entry) {\n      var iconOrSvg = accoladeIconMap[entry];\n      if (iconOrSvg && (String(iconOrSvg).indexOf('http') === 0 || String(iconOrSvg).slice(-4) === '.svg')) {\n        return '<span class=\"product-accolade-badge\"><img src=\"' + escapeHtml(iconOrSvg) + '\" alt=\"' + escapeHtml(entry) + ' icon\"></span>';\n      }\n      if (iconOrSvg && String(iconOrSvg).trim().indexOf('<svg') === 0) {\n        return '<span class=\"product-accolade-badge\">' + String(iconOrSvg) + '</span>';\n      }\n      return '<span class=\"product-accolade-badge\">' + escapeHtml(entry) + '</span>';\n    }).join('') + '</div>';\n  }\n\n  function buildOptionTemplateSelectionSummary(store) {\n    var template = getSelectedOptionTemplateEntry(store);\n    if (!template) return '';\n    var config = getOptionTemplateModalConfig(store);\n    var previewUrl = getTemplateFrontPreview(template);\n    return '' +\n      '<div class=\"bg-designer-storefront__option-template-summary bg-designer-storefront__template-card\">' +\n        (previewUrl ? '<img class=\"bg-designer-storefront__template-preview\" src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(template.title) + '\" loading=\"lazy\">' : '') +\n        '<div class=\"bg-designer-storefront__template-copy\">' +\n          '<div class=\"bg-designer-storefront__option-template-eyebrow\">' + escapeHtml(text(config.selectedLabel) || DEFAULT_OPTION_TEMPLATE_MODAL_CONFIG.selectedLabel) + '</div>' +\n          '<div class=\"bg-guided-artwork__selected-template-name\">' + escapeHtml(template.title) + '</div>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront__template-actions\">' +\n          '<button type=\"button\" class=\"button button--secondary\" data-bg-option-template-open>Change template</button>' +\n        '</div>' +\n      '</div>';\n  }\n\n  function getRenderedSwatchImageKey(image) {\n    var choice = image && image.closest\n      ? image.closest('.bg-designer-storefront__swatch-choice')\n      : null;\n    var input = choice && choice.querySelector\n      ? choice.querySelector('[data-bg-holder-input][data-bg-hvid]')\n      : null;\n    var holderId = text(input && input.getAttribute('data-bg-holder-input'));\n    var hvid = text(input && input.getAttribute('data-bg-hvid'));\n    return holderId && hvid ? holderId + '::' + hvid : '';\n  }\n\n  // A description picture (a brand logo, or a picture inside the description\n  // text) is kept across re-renders like a swatch picture: a re-created lazy\n  // image has no height until it decodes, so the description box collapsed\n  // for a few frames and everything under it jumped (BD-STYLE-DESCRIPTION-JUMP).\n  var RENDERED_OPTION_IMAGE_SELECTOR = '.bg-designer-storefront__swatch-image, [data-bg-option-description-hvid] img';\n\n  function getRenderedDescriptionImageKey(image) {\n    var card = image && image.closest ? image.closest('[data-bg-option-description-hvid]') : null;\n    if (!card) return '';\n    var holderId = text(card.getAttribute('data-bg-option-description-holder'));\n    var hvid = text(card.getAttribute('data-bg-option-description-hvid'));\n    var index = Array.prototype.indexOf.call(card.querySelectorAll('img'), image);\n    return holderId && hvid ? 'description::' + holderId + '::' + hvid + '::' + index : '';\n  }\n\n  function getRenderedOptionImageKey(image) {\n    return image && image.classList && image.classList.contains('bg-designer-storefront__swatch-image')\n      ? getRenderedSwatchImageKey(image)\n      : getRenderedDescriptionImageKey(image);\n  }\n\n  function captureRenderedSwatchImages(block) {\n    var imagesByKey = Object.create(null);\n    if (!block || !block.querySelectorAll) return imagesByKey;\n    Array.prototype.slice.call(block.querySelectorAll(RENDERED_OPTION_IMAGE_SELECTOR)).forEach(function (image) {\n      var key = getRenderedOptionImageKey(image);\n      var src = text(image && image.getAttribute('src'));\n      if (!key || !src) return;\n      imagesByKey[key] = { node: image, src: src };\n    });\n    return imagesByKey;\n  }\n\n  function restoreRenderedSwatchImages(block, imagesByKey) {\n    if (!block || !block.querySelectorAll || !imagesByKey) return;\n    Array.prototype.slice.call(block.querySelectorAll(RENDERED_OPTION_IMAGE_SELECTOR)).forEach(function (image) {\n      var preserved = imagesByKey[getRenderedOptionImageKey(image)];\n      if (!preserved || !preserved.node || preserved.src !== text(image.getAttribute('src')) || !image.parentNode) return;\n      image.parentNode.replaceChild(preserved.node, image);\n    });\n  }\n\n  // The compatibility notice floats over the page instead of rendering inside\n  // the options column: an in-flow banner pushed every option down when it\n  // appeared and snapped them back when it cleared. The toast keeps the exact\n  // message and polite announcement with zero layout impact, and hides itself\n  // after a few seconds.\n  function syncCompatibilityNoticeToast(store) {\n    var message = text(store && store.uiState && store.uiState.compatibilityNotice);\n    if (!message || !document.body) return;\n    var toast = document.querySelector('[data-bg-compatibility-notice-toast]');\n    if (!toast) {\n      toast = document.createElement('div');\n      toast.className = 'bg-designer-storefront__compatibility-notice bg-designer-storefront__compatibility-notice--toast';\n      toast.setAttribute('data-bg-compatibility-notice-toast', '');\n      toast.setAttribute('role', 'status');\n      toast.setAttribute('aria-live', 'polite');\n      document.body.appendChild(toast);\n    }\n    if (toast.textContent !== message) toast.textContent = message;\n    toast.classList.add('is-visible');\n    if (toast.__bgHideTimer) window.clearTimeout(toast.__bgHideTimer);\n    toast.__bgHideTimer = window.setTimeout(function () {\n      toast.__bgHideTimer = 0;\n      toast.classList.remove('is-visible');\n    }, 8000);\n  }\n\n  function getContextualCompatibilityChoiceNoun(holder) {\n    var label = [\n      holder && holder.displayName,\n      holder && holder.label,\n      holder && holder.name,\n      holder && holder.targetingID,\n      holder && holder.role\n    ].map(text).join(' ');\n    if (/printing|print mode|sides?/i.test(label)) return 'printing choice';\n    if (/orientation/i.test(label)) return 'orientation';\n    if (/shape/i.test(label)) return 'shape';\n    if (/format/i.test(label)) return 'format';\n    if (/size|dimension|canvas/i.test(label)) return 'size';\n    return 'product option';\n  }\n\n  function ensureContextualSelectedDesignCompatibility(store) {\n    var contextual = !!(\n      store && store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid\n      || store && store.savedProjectResumeAuthoritativelyValidated === true\n      || store && store.selectedDesignCompatibilityConflict\n    );\n    var template = store && store.state ? store.state.template : null;\n    if (!contextual || !template) return true;\n    var configuration = templateMatchesStorePage(store, template)\n      ? getTemplateModalConfiguration(store, template)\n      : null;\n    if (configuration && configuration.mappable && configuration.matchesCurrent) {\n      if (store.selectedDesignCompatibilityConflict) {\n        store.selectedDesignCompatibilityConflict = null;\n        emitStorefrontEvent(store, 'selected_design_compatibility_resolved', 'artwork', {\n          recovery: 'authoritative_revalidation'\n        }, 'normal');\n      }\n      return true;\n    }\n    if (!store.selectedDesignCompatibilityConflict) {\n      var change = configuration && Array.isArray(configuration.changes) && configuration.changes.length\n        ? configuration.changes[0]\n        : null;\n      var holder = change && change.holder;\n      var compatibleSelections = Object.assign({}, store.state.selections);\n      if (configuration && Array.isArray(configuration.changes)) {\n        configuration.changes.forEach(function (entry) {\n          if (!entry || !entry.holder || !entry.option) return;\n          compatibleSelections[getHolderId(entry.holder)] = text(entry.option.hvId);\n        });\n      }\n      var currentOption = holder ? getSelectedOptionFromAllOptions(store, holder) : null;\n      store.selectedDesignCompatibilityConflict = {\n        holderId: holder ? getHolderId(holder) : '',\n        previousSelections: compatibleSelections,\n        previousHvid: text(change && change.option && change.option.hvId),\n        previousLabel: text(change && change.to),\n        nextLabel: holder ? getOptionDisplayLabel(store, holder, currentOption) : '',\n        choiceNoun: getContextualCompatibilityChoiceNoun(holder),\n        designTitle: getContextualSelectedDesignTitle(store)\n      };\n      emitStorefrontEvent(store, 'selected_design_compatibility_warning', 'artwork', {\n        choiceType: store.selectedDesignCompatibilityConflict.choiceNoun,\n        hasProject: !!text(store.state.project && store.state.project.projectId),\n        source: 'authoritative_revalidation'\n      }, 'high');\n    }\n    return false;\n  }\n\n  // options.styleSwitchRules === false skips the S1b in-product Style switch\n  // rules (a stash restore wins); options.deferStyleSwitchNotice leaves the\n  // rule sentence to the caller's own closing recalculate.\n  function commitContextualOptionSelection(store, holderId, hvid, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var previousSelections = Object.assign({}, store.state.selections);\n    var holder = (Array.isArray(store.holders) ? store.holders : []).find(function (entry) {\n      return getHolderId(entry) === holderId;\n    });\n    var previousOption = holder ? getSelectedOptionFromAllOptions(store, holder) : null;\n    var nextOption = holder && Array.isArray(holder.values) ? holder.values.find(function (entry) {\n      return text(entry && entry.hvId) === hvid;\n    }) : null;\n    writeArtworkSelection(store, holderId, hvid, 'customer');\n    // A click on the already-selected Style is not a switch: no rules, no\n    // sentence (PR #178 review note).\n    var styleChanged = text(previousOption && previousOption.hvId) !== text(hvid);\n    if (settings.styleSwitchRules !== false && styleChanged) applyStyleSwitchRules(store, holderId, hvid);\n    recalculate(store);\n    if (!settings.deferStyleSwitchNotice) finalizeStyleSwitchNotice(store);\n    var contextual = !!(\n      store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid\n      || text(store.state && store.state.project && store.state.project.projectId)\n    );\n    var template = store.state.template;\n    var holderLabel = text(holder && (holder.displayName || holder.label || holder.name));\n    if (!contextual || !template || text(previousOption && previousOption.hvId) === hvid) return false;\n    var configuration = getTemplateModalConfiguration(store, template);\n    if (configuration && configuration.mappable && configuration.matchesCurrent) {\n      if (store.selectedDesignCompatibilityConflict) {\n        store.selectedDesignCompatibilityConflict = null;\n        emitStorefrontEvent(store, 'selected_design_compatibility_resolved', 'artwork', {\n          recovery: 'compatible_option'\n        }, 'normal');\n        return true;\n      }\n      return false;\n    }\n    var priorConflict = store.selectedDesignCompatibilityConflict;\n    var choiceNoun = getContextualCompatibilityChoiceNoun(holder);\n    store.selectedDesignCompatibilityConflict = {\n      holderId: holderId,\n      previousSelections: priorConflict && priorConflict.previousSelections\n        ? Object.assign({}, priorConflict.previousSelections)\n        : previousSelections,\n      previousHvid: text(priorConflict && priorConflict.previousHvid) || text(previousOption && previousOption.hvId),\n      previousLabel: text(priorConflict && priorConflict.previousLabel) || getOptionDisplayLabel(store, holder, previousOption),\n      nextLabel: getOptionDisplayLabel(store, holder, nextOption),\n      choiceNoun: choiceNoun,\n      designTitle: getContextualSelectedDesignTitle(store)\n    };\n    emitStorefrontEvent(store, 'selected_design_compatibility_warning', 'artwork', {\n      choiceType: choiceNoun,\n      hasProject: !!text(store.state.project && store.state.project.projectId)\n    }, 'high');\n    return true;\n  }\n\n  function bindResponsiveProductOptions(store) {\n    if (store.responsiveProductOptionsBound || !window.matchMedia) return;\n    store.responsiveProductOptionsBound = true;\n    var query = window.matchMedia('(max-width: 749px)');\n    var onChange = function () {\n      if (!store.root || !store.root.isConnected) return;\n      var presentation = readProductPresentationConfig(store);\n      var inlineStyles = plainObject(presentation.optionPresentation) || {};\n      var hasMobileStyles = (store.holders || []).some(function (holder) {\n        return holder.ui && Object.keys(plainObject(holder.ui.mobile)).length;\n      }) || Object.keys(inlineStyles).some(function (key) {\n        return inlineStyles[key] && Object.keys(plainObject(inlineStyles[key].mobile)).length;\n      });\n      if (!hasMobileStyles && readGuidedLayoutVariant(store) !== 'guided_desktop_open_mobile_closed') return;\n      var active = document.activeElement;\n      var holderSection = active && active.closest && active.closest('[data-bg-holder-id]');\n      var focusedHolderId = holderSection && holderSection.getAttribute('data-bg-holder-id');\n      // Rebuild presentation only. Canonical selections, quantity, artwork,\n      // pricing, and the product-preview viewer are untouched.\n      renderOptions(store);\n      applyRuleSurfaceAttributes(store);\n      renderGuidedProductFormPresentation(store);\n      renderVersion2ProductFormPresentation(store);\n      renderExperimentalProductFormPresentations(store);\n      if (focusedHolderId) {\n        var section = Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-holder-id]')).find(function (node) {\n          return node.getAttribute('data-bg-holder-id') === focusedHolderId;\n        });\n        var focusTarget = section && section.querySelector('[data-bg-guided-step-toggle]:not(:disabled), button[aria-pressed=\"true\"], input[type=\"radio\"]:checked, [data-bg-holder-dropdown-toggle]');\n        if (focusTarget && !focusTarget.closest('[inert]')) focusTarget.focus({ preventScroll: true });\n      }\n    };\n    if (query.addEventListener) query.addEventListener('change', onChange);\n    else if (query.addListener) query.addListener(onChange);\n  }\n\n  // The option sections' markup for the current state. renderOptions writes\n  // it; refreshOptionPriceDifferences reads the price lines from it.\n  function buildOptionSectionsMarkup(store) {\n    return store.holders.map(function (holder) {\n      var holderId = getHolderId(holder);\n      if (isHolderUnavailableByRules(store, holder)) return '';\n      if (shouldHideOptionTemplateHolder(store, holder)) return '';\n      var semantics = getHolderUiConfig(holder);\n      if (!semantics.isRequired && isHolderRequiredByProductCommerceRules(store, holder)) {\n        semantics = Object.assign({}, semantics, { isRequired: true });\n      }\n      var visibleValues = getVisibleOptions(store, holder);\n      if (!visibleValues.length) return '';\n      var selected = getSelectedOption(store, holder);\n      var selectedOpensOptionTemplateModal = isOptionTemplateTriggerValue(store, holder, selected);\n      var labelText = text(holder.displayName);\n      var sectionId = text(holder.htmlID || core.slugify(labelText));\n      var sectionSelector = sectionId ? ('#' + sectionId) : '';\n      var holderType = getHolderType(holder);\n      var isSwatchType = isSwatchHolderType(holderType);\n      var preferHexColor = shouldPreferHolderHexColor(holder);\n      var useGuidedIntrinsicSwatches = getProductFormPresentation(store) === 'guided';\n      var swatchVisualStyle = isSwatchType ? buildSwatchVisualStyle(holder) : '';\n      var swatchVisualConfig = isSwatchType ? getHolderSwatchVisualConfig(holder) : null;\n      var selectedDescriptionMarkup = renderOptionDescriptions(holder, visibleValues, selected);\n      var inputName = 'bg-designer-option-' + core.slugify(holderId || labelText || 'option');\n      var holderDisabled = isHolderDisabledByRuleSurface(store, holder) || getUiSurfaceDisabled(store, sectionSelector, false) || isTargetingDisabled(store, holder && holder.targetingID);\n      // Any priced holder can grow a price delta or add-on chip as the\n      // configuration changes, so every tile of such a holder always carries\n      // the (possibly empty) price line. Reserving the line keeps tile and\n      // section heights constant while the customer switches options.\n      var reservesPriceLine = (holderType === 'buttons' || isSwatchType)\n        && !semantics.hidePrice && !isProductLinkHolder(holder);\n      var labelPosition = text(semantics.labelPosition).toLowerCase();\n      // 'inside' renders the label inside the dropdown toggle (see line below); the outer\n      // section <h3> must be suppressed to match the legacy contract (bg-prod-main-script-part2\n      // case 'inside': break) and avoid a duplicated label on dropdown holders.\n      var showLabel = labelPosition !== 'hidden' && labelPosition !== 'inside';\n      var sectionHelpText = text(semantics.helpText);\n      var sectionHelpMarkup = sectionHelpText\n        ? '<div class=\"bg-designer-storefront__section-help\">' + sectionHelpText + '</div>'\n        : '';\n      var selectedLabel = selected ? getOptionDisplayLabel(store, holder, selected) : '';\n      var selectedFlavor = selected ? getOptionFlavorText(selected) : '';\n      var selectedPriceChip = '';\n      var renderStaticValue = shouldRenderStaticOptionValue(store, holder, visibleValues, selected, semantics, showLabel, holderDisabled);\n      var selectedDropdownMarkup = selectedLabel\n        ? (escapeHtml(selectedLabel) + (selectedFlavor ? '<span class=\"flavorText bg-designer-storefront__flavor-text\"> (' + escapeHtml(selectedFlavor) + ')</span>' : '') + buildAddonPriceLabelMarkup(store, holder, selected) + (selectedPriceChip ? ' <span class=\"bg-designer-storefront__option-price\">' + selectedPriceChip + '</span>' : ''))\n        : '--Select--';\n      var controlClass = holderType === 'buttons'\n        ? 'bg-designer-storefront__button-grid'\n        : (holderType === 'dropdown'\n          ? 'bg-designer-storefront__dropdown-grid'\n          : 'bg-designer-storefront__swatch-grid');\n      var sectionClasses = buildHolderSectionClasses(holder, holderType, semantics, showLabel, holderDisabled);\n      if (renderStaticValue) sectionClasses += ' bg-designer-storefront__option-section--static';\n      // PDP-TOKENIZE-02 Stage C: a holder pinned to the guided inline\n      // presentation keeps its live controls but is excluded from the\n      // accordion steps and re-homed above them (static sections keep their\n      // own extraction seam and win over an inline pin).\n      var holderPresentation = !renderStaticValue && semantics.presentation === 'inline' ? 'inline' : '';\n      if (holderPresentation === 'inline') sectionClasses += ' bg-designer-storefront__option-section--guided-inline';\n      var holderLayoutStyle = buildHolderLayoutStyle(holder);\n      return '' +\n        '<section class=\"' + escapeHtml(sectionClasses) +\n          '\" data-bg-option-group=\"1\" data-bg-holder-id=\"' + escapeHtml(holderId) + '\" data-bg-holder-type=\"' + escapeHtml(holderType) + '\" data-bg-option-count=\"' + escapeHtml(String(visibleValues.length)) + '\" id=\"' + escapeHtml(sectionId) + '\" targetingid=\"' + escapeHtml(text(holder.targetingID)) + '\"' +\n          (holderPresentation ? ' data-bg-holder-presentation=\"' + escapeHtml(holderPresentation) + '\"' : '') +\n          holderLayoutStyle +\n          (labelText ? ' aria-label=\"' + escapeHtml(labelText) + '\"' : '') + '>' +\n          (showLabel && !renderStaticValue ? (\n            '<div class=\"bg-designer-storefront__section-head\">' +\n              '<h3 class=\"bg-designer-storefront__section-label' + (semantics.usesLargeLabel ? ' bg-designer-storefront__section-label--large' : '') + '\">' + escapeHtml(labelText) + '</h3>' +\n              sectionHelpMarkup +\n            '</div>'\n          ) : '') +\n          (renderStaticValue ? (\n            renderStaticOptionValue(store, holder, holderId, labelText, selected, selectedPriceChip) +\n            sectionHelpMarkup\n          ) : holderType === 'dropdown' ? (\n            '<div class=\"' + controlClass + '\">' +\n              '<div class=\"bg-designer-storefront__dropdown-control option-type-dropdown bg-dropdown-wrapper' + (holderDisabled ? ' is-disabled' : '') + '\" data-bg-holder-dropdown=\"' + escapeHtml(holderId) + '\">' +\n                '<button type=\"button\" class=\"bgDropdownToggle bg-designer-storefront__dropdown-toggle\"' +\n                  ' data-bg-holder-dropdown-toggle data-bg-holder-id=\"' + escapeHtml(holderId) + '\"' +\n                  ' aria-expanded=\"false\"' +\n                  ' aria-label=\"' + escapeHtml(labelText + ': ' + (selectedLabel || 'Choose an option')) + '\"' +\n                  (holderDisabled ? ' disabled aria-disabled=\"true\"' : '') +\n                '>' +\n                  '<span class=\"bgDropdown-label bg-designer-storefront__dropdown-label\">' + (labelPosition === 'inside' ? escapeHtml(labelText) : '') + '</span>' +\n                  '<span class=\"bgDropdown-value left-justify-value bg-designer-storefront__dropdown-value\">' + selectedDropdownMarkup + '</span>' +\n                  '<span class=\"bgDropdown-caret bg-designer-storefront__dropdown-caret\" aria-hidden=\"true\">\u2304</span>' +\n                '</button>' +\n                '<div class=\"bgDropdownOptions bg-designer-storefront__dropdown-options\" data-bg-holder-dropdown-options hidden>' +\n                  visibleValues.map(function (value) {\n                    var isSelected = selected && text(selected.hvId) === text(value.hvId);\n                    var badges = getOptionBadges(value);\n                    var flavorText = getOptionFlavorText(value);\n                    var priceDifference = getOptionPriceDifference(store, holder, value, isSelected);\n                    var priceChip = buildOptionPriceDifferenceMarkup(store, holder, value, isSelected, priceDifference);\n                    var priceAriaSuffix = getOptionPriceDifferenceAriaSuffix(priceDifference);\n                    var valueLabel = getOptionDisplayLabel(store, holder, value);\n                    var isDisabled = holderDisabled || !!(value && value.outOfStock) || isOptionDisabledByRules(store, value);\n                    var optionId = 'bg-designer-option-' + core.slugify(holderId || labelText || 'option') + '-' + core.slugify(text(value.hvId || valueLabel || 'value'));\n                    var disabledExplanation = isDisabled ? buildOptionDisabledExplanation(store, holder, value) : '';\n                    var optionTooltip = disabledExplanation || getOptionTooltip(value);\n                    var linkedProductAttributes = buildLinkedProductAttributes(store, value);\n                    return '' +\n                      '<label class=\"bgDropdownOption bg-designer-storefront__dropdown-option' +\n                        (isSelected ? ' is-selected' : '') +\n                        (isDisabled ? ' disabledOption is-disabled' : '') +\n                        '\" for=\"' + escapeHtml(optionId) + '\"' +\n                        ' data-bg-holder-dropdown-option=\"' + escapeHtml(holderId) + '\"' +\n                        ' data-bg-hvid=\"' + escapeHtml(text(value.hvId)) + '\"' +\n                        linkedProductAttributes +\n                        (optionTooltip ? ' data-bg-tooltip=\"' + escapeHtml(optionTooltip) + '\"' : '') +\n                        (disabledExplanation ? ' tabindex=\"0\" aria-label=\"' + escapeHtml(disabledExplanation) + '\"' : '') +\n                      '>' +\n                        '<input type=\"radio\" class=\"bg-designer-storefront__dropdown-radio\" id=\"' + escapeHtml(optionId) + '\"' +\n                          ' name=\"' + escapeHtml(inputName) + '\"' +\n                          ' value=\"' + escapeHtml(valueLabel) + '\"' +\n                          ' aria-label=\"' + escapeHtml(labelText + ': ' + valueLabel + priceAriaSuffix + (disabledExplanation ? '. ' + disabledExplanation : '')) + '\"' +\n                          ' data-bg-holder-input=\"' + escapeHtml(holderId) + '\"' +\n                          ' data-bg-hvid=\"' + escapeHtml(text(value.hvId)) + '\"' +\n                          linkedProductAttributes +\n                          (isSelected ? ' checked' : '') +\n                          (isDisabled ? ' disabled aria-disabled=\"true\"' : '') +\n                        '>' +\n                        '<span class=\"optionText bg-designer-storefront__dropdown-option-text\">' +\n                          escapeHtml(valueLabel) +\n                          (flavorText ? '<span class=\"flavorText bg-designer-storefront__flavor-text\"> (' + escapeHtml(flavorText) + ')</span>' : '') +\n                          buildAddonPriceLabelMarkup(store, holder, value) +\n                          (priceChip ? '<span class=\"bg-designer-storefront__option-price\">' + priceChip + '</span>' : '') +\n                        '</span>' +\n                        (badges.length ? (\n                          '<span class=\"bg-designer-storefront__dropdown-badge-row\">' +\n                            badges.map(function (badge) {\n                              return '<span class=\"bg-designer-storefront__badge' + (text(badge).toLowerCase() === 'popular' ? ' bg-option-popular-badge' : '') + '\">' + escapeHtml(badge) + '</span>';\n                            }).join('') +\n                          '</span>'\n                        ) : '') +\n                      '</label>';\n                  }).join('') +\n                '</div>' +\n              '</div>' +\n            '</div>'\n          ) : (\n          '<div class=\"' + controlClass + '\">' +\n            visibleValues.map(function (value) {\n              var isSelected = selected && text(selected.hvId) === text(value.hvId);\n              var badges = getOptionBadges(value);\n              var flavorText = getOptionFlavorText(value);\n              var priceDifference = getOptionPriceDifference(store, holder, value, isSelected);\n              var priceChip = buildOptionPriceDifferenceMarkup(store, holder, value, isSelected, priceDifference);\n              var priceAriaSuffix = getOptionPriceDifferenceAriaSuffix(priceDifference);\n              var valueLabel = getOptionDisplayLabel(store, holder, value);\n              var isDisabled = holderDisabled || !!(value && value.outOfStock) || isOptionDisabledByRules(store, value);\n              var optionId = 'bg-designer-option-' + core.slugify(holderId || labelText || 'option') + '-' + core.slugify(text(value.hvId || valueLabel || 'value'));\n              var disabledExplanation = isDisabled ? buildOptionDisabledExplanation(store, holder, value) : '';\n              var optionTooltip = disabledExplanation || getOptionTooltip(value);\n              var opensOptionTemplateModal = isOptionTemplateTriggerValue(store, holder, value);\n              var linkedProductAttributes = buildLinkedProductAttributes(store, value);\n              var contextImageUrl = resolveOptionContextImageUrl(store, holder, value);\n              var swatchImageUrl = contextImageUrl || getOptionPreviewUrl(value);\n              var useIntrinsicSwatchImage = useGuidedIntrinsicSwatches && !!swatchImageUrl && !preferHexColor;\n              var tooltipAttributes = optionTooltip && !disabledExplanation\n                ? ' data-bg-tooltip=\"' + escapeHtml(optionTooltip) + '\"'\n                : '';\n              var disabledChoiceAttributes = disabledExplanation\n                ? ' data-bg-tooltip=\"' + escapeHtml(disabledExplanation) + '\" tabindex=\"0\" aria-label=\"' + escapeHtml(disabledExplanation) + '\"'\n                : '';\n              var optionTemplateTriggerAttrs = opensOptionTemplateModal\n                ? ' data-bg-option-template-trigger=\"1\" data-bg-option-template-trigger-holder=\"' + escapeHtml(holderId) + '\" data-bg-option-template-trigger-hvid=\"' + escapeHtml(text(value.hvId)) + '\"'\n                : '';\n              return '' +\n                '<div class=\"' + (holderType === 'buttons'\n                  ? 'bg-designer-storefront__button-choice bg-designer-storefront__button-holder' + (isDisabled ? ' is-disabled' : '')\n                  : 'bg-designer-storefront__swatch-choice bg-designer-storefront__swatch-holder' + (isDisabled ? ' outOfStock is-disabled' : '')) +\n                  (linkedProductAttributes ? ' bg-designer-storefront__option-choice--linked-product' : '') +\n                  (semantics.usesLargeLabel ? ' bg-designer-storefront__swatch-holder--large-label' : '') +\n                  (semantics.isAddon ? ' bg-designer-storefront__swatch-holder--addon' : '') +\n                  (isSelected ? ' is-selected' : '') + '\"' + optionTemplateTriggerAttrs + linkedProductAttributes + disabledChoiceAttributes + swatchVisualStyle + '>' +\n                  (badges.length ? (\n                    '<span class=\"bg-designer-storefront__badge-row\">' +\n                      badges.map(function (badge) {\n                        return '<span class=\"bg-designer-storefront__badge' + (text(badge).toLowerCase() === 'popular' ? ' bg-option-popular-badge' : '') + '\">' + escapeHtml(badge) + '</span>';\n                      }).join('') +\n                    '</span>'\n                  ) : '') +\n                  (holderType === 'buttons'\n                    ? (\n                      '<button type=\"button\" class=\"bg-designer-storefront__option-button' + (isSelected ? ' is-selected' : '') + '\"' +\n                        ' data-bg-holder-value=\"' + escapeHtml(holderId) + '\"' +\n                        ' data-bg-hvid=\"' + escapeHtml(text(value.hvId)) + '\"' +\n                        ' aria-label=\"' + escapeHtml(labelText + ': ' + valueLabel + priceAriaSuffix + (disabledExplanation ? '. ' + disabledExplanation : '')) + '\"' +\n                        ' aria-pressed=\"' + (isSelected ? 'true' : 'false') + '\"' +\n                        linkedProductAttributes +\n                        optionTemplateTriggerAttrs +\n                        tooltipAttributes +\n                        (isDisabled ? ' disabled aria-disabled=\"true\"' : '') +\n                      '>' +\n                        '<span class=\"bg-designer-storefront__button-copy\">' +\n                          '<span class=\"bg-designer-storefront__swatch-title\" data-full-label=\"' + escapeHtml(valueLabel) + '\">' +\n                            buildResponsiveOptionLabelMarkup(holder, valueLabel) +\n                            (flavorText ? '<span class=\"flavorText bg-designer-storefront__flavor-text\"> (' + escapeHtml(flavorText) + ')</span>' : '') +\n                            buildAddonPriceLabelMarkup(store, holder, value) +\n                          '</span>' +\n                        '</span>' +\n                        (isSelected ? '<span class=\"bg-designer-storefront__option-selected-check\" aria-hidden=\"true\">\u2713</span>' : '') +\n                      '</button>' +\n                      (priceChip || reservesPriceLine\n                        ? '<span class=\"bg-designer-storefront__option-price bg-designer-storefront__option-price--below-control' + (reservesPriceLine ? ' bg-designer-storefront__option-price--reserved' : '') + '\" aria-hidden=\"true\">' + priceChip + '</span>'\n                        : '')\n                    )\n                    : (\n                      '<input type=\"radio\" class=\"bg-designer-storefront__swatch-radio\" id=\"' + escapeHtml(optionId) + '\"' +\n                        ' name=\"' + escapeHtml(inputName) + '\"' +\n                        ' value=\"' + escapeHtml(valueLabel) + '\"' +\n                        ' aria-label=\"' + escapeHtml(labelText + ': ' + valueLabel + priceAriaSuffix + (disabledExplanation ? '. ' + disabledExplanation : '')) + '\"' +\n                        ' data-bg-holder-input=\"' + escapeHtml(holderId) + '\"' +\n                        ' data-bg-hvid=\"' + escapeHtml(text(value.hvId)) + '\"' +\n                        linkedProductAttributes +\n                        optionTemplateTriggerAttrs +\n                        (isSelected ? ' checked' : '') +\n                        (isDisabled ? ' disabled aria-disabled=\"true\"' : '') +\n                      '>' +\n                      '<label class=\"bg-designer-storefront__swatch-preview' + (useIntrinsicSwatchImage ? ' bg-designer-storefront__swatch-preview--intrinsic' : '') + '\" for=\"' + escapeHtml(optionId) + '\"' +\n                        (swatchVisualConfig && swatchVisualConfig.hoverPreviewEnabled ? ' data-bg-hover-preview=\"1\" data-bg-preview-size=\"' + escapeHtml(String(swatchVisualConfig.hoverPreviewPx)) + '\"' : '') +\n                        (swatchImageUrl ? ' data-preview-src=\"' + escapeHtml(swatchImageUrl) + '\"' : '') +\n                        optionTemplateTriggerAttrs +\n                        linkedProductAttributes +\n                        tooltipAttributes +\n                        (useIntrinsicSwatchImage ? '' : getOptionPreviewStyle(value, preferHexColor, swatchVisualConfig && swatchVisualConfig.fillMode, contextImageUrl)) +\n                        ' aria-label=\"' + escapeHtml(valueLabel + priceAriaSuffix) + '\">' +\n                        (useIntrinsicSwatchImage ? '<img class=\"bg-designer-storefront__swatch-image\" src=\"' + escapeHtml(swatchImageUrl) + '\" alt=\"\" loading=\"lazy\" decoding=\"async\">' : '') +\n                      '</label>' +\n                      '<div class=\"bg-designer-storefront__swatch-title\" data-full-label=\"' + escapeHtml(valueLabel) + '\">' +\n                        escapeHtml(valueLabel) +\n                        (flavorText ? '<span class=\"flavorText bg-designer-storefront__flavor-text\"> (' + escapeHtml(flavorText) + ')</span>' : '') +\n                        buildAddonPriceLabelMarkup(store, holder, value) +\n                      '</div>' +\n                        (priceChip || reservesPriceLine\n                          ? '<span class=\"bg-designer-storefront__option-price' + (reservesPriceLine ? ' bg-designer-storefront__option-price--reserved' : '') + '\">' + priceChip + '</span>'\n                          : '')\n                    )) +\n                '</div>';\n            }).join('') +\n          '</div>')) +\n          selectedDescriptionMarkup +\n          (selectedOpensOptionTemplateModal ? buildOptionTemplateSelectionSummary(store) : '') +\n        '</section>';\n    }).join('');\n  }\n\n  function renderOptions(store) {\n    bindResponsiveProductOptions(store);\n    var blocks = readBlocks(store);\n    if (!blocks.options) return;\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n    clearInitialOptionsLoader(blocks);\n    var preservedSwatchImages = captureRenderedSwatchImages(blocks.options);\n    syncCompatibilityNoticeToast(store);\n    blocks.options.innerHTML = buildOptionSectionsMarkup(store);\n    restoreRenderedSwatchImages(blocks.options, preservedSwatchImages);\n\n    ensureDesignerOptionDropdownDocumentListener();\n    setupSwatchPreviewRuntime();\n\n    Array.prototype.slice.call(blocks.options.querySelectorAll('[data-bg-option-template-open]')).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        openOptionTemplateModal(store);\n      });\n    });\n\n    Array.prototype.slice.call(blocks.options.querySelectorAll('[data-bg-option-template-trigger]')).forEach(function (trigger) {\n      trigger.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (trigger.disabled) return;\n        var holderId = text(trigger.getAttribute('data-bg-option-template-trigger-holder'));\n        var hvid = text(trigger.getAttribute('data-bg-option-template-trigger-hvid'));\n        if (holderId && hvid) {\n          // OBS-45 (S3G): this handler owns every native trigger click (it\n          // runs first and prevents the label's input change), so a featured\n          // Style value that is also the trigger runs its switch rules here,\n          // before the modal, exactly as the holder handlers below do. A\n          // re-click of the selected value runs no rule.\n          var previousTriggerHvid = text(store.state.selections[holderId]);\n          writeArtworkSelection(store, holderId, hvid, 'customer');\n          if (previousTriggerHvid !== text(hvid)) applyStyleSwitchRules(store, holderId, hvid);\n          emitStorefrontEvent(store, 'option_changed', 'options', {\n            holderId: holderId,\n            hvid: hvid,\n            opensTemplateModal: true\n          }, 'low');\n          recalculate(store);\n          finalizeStyleSwitchNotice(store);\n          render(store);\n        }\n        openOptionTemplateModal(store);\n      });\n    });\n\n    Array.prototype.slice.call(blocks.options.querySelectorAll('[data-bg-holder-dropdown-toggle]')).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (button.disabled) return;\n        var dropdown = button.closest('[data-bg-holder-dropdown]');\n        if (!dropdown) return;\n        var shouldOpen = !dropdown.classList.contains('is-open');\n        closeDesignerOptionDropdowns(blocks.options, dropdown);\n        setDesignerOptionDropdownOpen(dropdown, shouldOpen);\n      });\n    });\n\n    Array.prototype.slice.call(blocks.options.querySelectorAll('[data-bg-holder-value]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        if (button.disabled) return;\n        var holderId = text(button.getAttribute('data-bg-holder-value'));\n        var hvid = text(button.getAttribute('data-bg-hvid'));\n        if (!holderId || !hvid) return;\n        if (navigateToLinkedProductIfNeeded(store, holderId, hvid)) return;\n        if (text(button.getAttribute('data-bg-option-template-trigger')) === '1') {\n          var previousTriggerHvid = text(store.state.selections[holderId]);\n          writeArtworkSelection(store, holderId, hvid, 'customer');\n          // A featured Style value can also be the option-template trigger:\n          // its switch rules still apply before the modal (PR #178 review note).\n          if (previousTriggerHvid !== text(hvid)) applyStyleSwitchRules(store, holderId, hvid);\n          emitStorefrontEvent(store, 'option_changed', 'options', {\n            holderId: holderId,\n            hvid: hvid,\n            opensTemplateModal: true\n          }, 'low');\n          recalculate(store);\n          finalizeStyleSwitchNotice(store);\n          render(store);\n          openOptionTemplateModal(store);\n          return;\n        }\n        if (interceptStyleLockedSelection(store, holderId, hvid)) {\n          emitStorefrontEvent(store, 'option_changed', 'options', {\n            holderId: holderId,\n            hvid: hvid,\n            styleLock: true\n          }, 'low');\n          render(store);\n          return;\n        }\n        commitContextualOptionSelection(store, holderId, hvid);\n        emitStorefrontEvent(store, 'option_changed', 'options', {\n          holderId: holderId,\n          hvid: hvid\n        }, 'low');\n        render(store);\n      });\n    });\n\n    Array.prototype.slice.call(blocks.options.querySelectorAll('[data-bg-holder-input]')).forEach(function (input) {\n      input.addEventListener('change', function () {\n        if (!input.checked) return;\n        var holderId = text(input.getAttribute('data-bg-holder-input'));\n        var hvid = text(input.getAttribute('data-bg-hvid'));\n        if (!holderId || !hvid) return;\n        if (navigateToLinkedProductIfNeeded(store, holderId, hvid)) return;\n        if (text(input.getAttribute('data-bg-option-template-trigger')) === '1') {\n          var previousTriggerHvid = text(store.state.selections[holderId]);\n          writeArtworkSelection(store, holderId, hvid, 'customer');\n          // A featured Style value can also be the option-template trigger:\n          // its switch rules still apply before the modal (PR #178 review note).\n          if (previousTriggerHvid !== text(hvid)) applyStyleSwitchRules(store, holderId, hvid);\n          emitStorefrontEvent(store, 'option_changed', 'options', {\n            holderId: holderId,\n            hvid: hvid,\n            opensTemplateModal: true\n          }, 'low');\n          recalculate(store);\n          finalizeStyleSwitchNotice(store);\n          render(store);\n          openOptionTemplateModal(store);\n          return;\n        }\n        if (interceptStyleLockedSelection(store, holderId, hvid)) {\n          emitStorefrontEvent(store, 'option_changed', 'options', {\n            holderId: holderId,\n            hvid: hvid,\n            styleLock: true\n          }, 'low');\n          render(store);\n          return;\n        }\n        commitContextualOptionSelection(store, holderId, hvid);\n        emitStorefrontEvent(store, 'option_changed', 'options', {\n          holderId: holderId,\n          hvid: hvid\n        }, 'low');\n        render(store);\n      });\n    });\n  }\n\n  function getQuantityBracketNoteText(quantityContext) {\n    if (!quantityContext || !quantityContext.usesTypedPricing) return '';\n    if (Number(quantityContext.priceBracketQuantity || 0) === Number(quantityContext.displayQuantity || 0)) return '';\n    return 'Using the ' + String(quantityContext.priceBracketQuantity || '') + '-qty bracket for pricing.';\n  }\n\n  function getQuantityTablePresentationForQuantity(store, quantity, quantityContext) {\n    var normalizedQuantity = normalizePositiveInteger(quantity, 1);\n    var baseContext = quantityContext && typeof quantityContext === 'object'\n      ? quantityContext\n      : buildQuantityPricingContext(store, normalizedQuantity);\n    var quantityOptions = Array.isArray(baseContext.quantityOptions) && baseContext.quantityOptions.length\n      ? baseContext.quantityOptions\n      : collectQuantityOptionsForMode(store, baseContext.quantityMode);\n    if (shouldLockQuantityToPricingOptions(store, baseContext.quantityMode)) {\n      normalizedQuantity = snapQuantityToPriceOption(quantityOptions, normalizedQuantity);\n    }\n    var priceBracketQuantity = baseContext.usesTypedPricing\n      ? resolvePriceBracketQuantity(quantityOptions, normalizedQuantity, baseContext.roundUp)\n      : normalizedQuantity;\n    var skuPrefix = resolveSkuPrefix(store);\n    var pricing = getPricingMap(store);\n    var finalSku = skuPrefix && priceBracketQuantity > 0 ? skuPrefix + String(priceBracketQuantity) : '';\n    var priceRecord = finalSku ? pricing[finalSku] || null : null;\n    var basePrice = 0;\n    // EDDM-ROUTE-CENT: a row quotes what the cart would charge at its quantity.\n    var quoteArithmetic = !!priceRecord && usesQuoteArithmetic();\n    if (priceRecord) {\n      var bracketPrice = numberValue(priceRecord.price, 0);\n      if (quoteArithmetic) {\n        var authoredPrice = numberValue(readAuthoredPrice(priceRecord, 'price'), 0);\n        basePrice = baseContext.usesTypedPricing && priceBracketQuantity > 0\n          ? core.scaleMoney(authoredPrice, normalizedQuantity, priceBracketQuantity)\n          : core.scaleMoney(authoredPrice, 1, 1);\n      } else if (baseContext.usesTypedPricing && priceBracketQuantity > 0) {\n        basePrice = roundMoney(bracketPrice * (normalizedQuantity / priceBracketQuantity));\n      } else {\n        basePrice = roundMoney(bracketPrice);\n      }\n    }\n    var artworkFees = getArtworkFeeAmounts(store);\n    var splitPrice = applyCustomerTierPricing(store, core.buildDesignerSplitPrice({\n      pricingMap: pricing,\n      baseSku: resolveSkuPrefix(store),\n      finalSku: finalSku,\n      basePrice: basePrice,\n      quantity: normalizedQuantity,\n      typedQty: normalizedQuantity,\n      optionSelections: buildCurrentOptionSelections(store),\n      holdCreditsFromSale: shouldHoldCreditsFromSale(store),\n      quoteArithmetic: quoteArithmetic,\n      artworkMode: store && store.state && store.state.artworkMode,\n      template: store && store.state && store.state.template,\n      editServiceCost: artworkFees.editServiceCost,\n      customDesignCost: artworkFees.customDesignCost,\n      templatePersonalizationAmount: artworkFees.templatePersonalizationAmount,\n      customDesignAmount: artworkFees.customDesignAmount\n    }), priceRecord, normalizedQuantity, baseContext.usesTypedPricing ? priceBracketQuantity : normalizedQuantity, quoteArithmetic);\n    var discountPct = getShownSalePercentage(store);\n    var optionAddOns = splitPrice.optionAddOns && typeof splitPrice.optionAddOns === 'object'\n      ? splitPrice.optionAddOns\n      : {};\n    // Every option holder renders above the Quantity block, so a range row quotes\n    // the configured piece: base product plus add-ons already priced at this\n    // row's quantity by buildDesignerSplitPrice. Size surcharges are intentionally\n    // EXCLUDED: they are a flat amount for the CURRENT size selection (wrong at\n    // every other row quantity), and the signed lane (cart-transform-signing)\n    // adds them FLAT after product discounting \u2014 they belong in the subtotal and\n    // the dedicated \"Size Surcharge\" summary row only. Folding them in here\n    // skewed every bracket row's total and per-unit. Do not add them back.\n    var discountableTotal = roundMoney(splitPrice.productBaseTotal\n      + numberValue(optionAddOns.cartIncludedDiscountEligibleTotal, 0));\n    var nonDiscountableTotal = roundMoney(numberValue(optionAddOns.cartIncludedNonDiscountEligibleTotal, 0));\n    var channelPrice = buildChannelPricePresentation(store, normalizedQuantity);\n    var total = channelPrice ? channelPrice.total : roundMoney(applyDisplayDiscount(discountableTotal, discountPct) + nonDiscountableTotal);\n    var compareTotal = channelPrice ? channelPrice.compareTotal : (discountPct > 0 ? roundMoney(discountableTotal + nonDiscountableTotal) : total);\n    // SALE-DISPLAY-STRIKETHROUGH: a range row's own amount under the tier sale\n    // rule, at the Shopify quantity the page submits\n    // (PAGE_TIER_SALE_SHOPIFY_QUANTITY).\n    var tierPct = getTierSalePercentage(store);\n    if (!channelPrice && tierPct > 0) {\n      compareTotal = roundMoney(discountableTotal + nonDiscountableTotal);\n      total = tierSaleAmount(compareTotal, tierPct, PAGE_TIER_SALE_SHOPIFY_QUANTITY);\n    }\n    var postageTotal = roundMoney(numberValue(optionAddOns.postageTotal, 0));\n    // Cart-included add-ons now live inside total, so the EDDM print+mailing column\n    // reads from the same figure instead of adding them a second time.\n    var printMailingTotal = total;\n    var printMailingCompareTotal = compareTotal;\n    return attachShownPrice({\n      quantity: normalizedQuantity,\n      total: total,\n      compareTotal: compareTotal,\n      // Fix round 1 (Astra 4, review of #690): a channel row keeps the package's\n      // own per piece (rounded up after the tier sale); a calculator row after\n      // the tier sale rounds up too, never implying less than its charge.\n      currentPerPiece: channelPrice ? channelPrice.currentPerPiece : (normalizedQuantity > 0 ? (tierPct > 0 ? tierSalePerPiece(total, normalizedQuantity) : roundMoney(total / normalizedQuantity)) : total),\n      comparePerPiece: normalizedQuantity > 0 ? roundMoney(compareTotal / normalizedQuantity) : compareTotal,\n      printMailingTotal: printMailingTotal,\n      printMailingCompareTotal: printMailingCompareTotal,\n      postageTotal: postageTotal,\n      postagePerPiece: normalizedQuantity > 0 ? roundMoney(postageTotal / normalizedQuantity) : postageTotal,\n      priceBracketQuantity: priceBracketQuantity,\n      priceRecord: priceRecord\n    }, function (shown) {\n      // FUNCTIONS-CURRENCY-AWARE: a package row is the package's own shown\n      // figures; a calculator row's amount is converted before the tier sale\n      // takes its floor.\n      var channelShown = shownPrice(channelPrice);\n      if (channelShown) {\n        shown.total = channelShown.total;\n        shown.compareTotal = channelShown.compareTotal;\n        shown.currentPerPiece = channelShown.currentPerPiece;\n      } else {\n        if (tierPct > 0) {\n          var row = shownSaleLine(toMoneyCents(compareTotal), tierPct, 1);\n          shown.total = row.totalCents / 100;\n          shown.compareTotal = row.compareCents / 100;\n        }\n        shown.currentPerPiece = normalizedQuantity > 0 ? (tierPct > 0 ? tierSalePerPiece(shown.total, normalizedQuantity) : roundMoney(shown.total / normalizedQuantity)) : shown.total;\n      }\n      shown.comparePerPiece = normalizedQuantity > 0 ? roundMoney(shown.compareTotal / normalizedQuantity) : shown.compareTotal;\n      shown.printMailingTotal = shown.total;\n      shown.printMailingCompareTotal = shown.compareTotal;\n      shown.postagePerPiece = normalizedQuantity > 0 ? roundMoney(shown.postageTotal / normalizedQuantity) : shown.postageTotal;\n    });\n  }\n\n  function buildQuantityRangeLabel(start, end) {\n    if (!Number.isFinite(start) || start < 1) return '';\n    if (!Number.isFinite(end) || end < start) return String(start) + '+';\n    if (start === end) return String(start);\n    return String(start) + '\u2013' + String(end);\n  }\n\n  // row holds shownPrice figures.\n  function buildQuantityTablePriceMarkup(row) {\n    var hasDiscount = Math.abs(numberValue(row.compareTotal, 0) - numberValue(row.total, 0)) > 0.004;\n    if (row.displayPerPieceOnly) {\n      var comparePerPieceMarkup = hasDiscount\n        ? '<s class=\"calc-qty-original-price\">' + escapeHtml(formatShownMoney(row.comparePerPiece)) + '</s>'\n        : '';\n      return '' +\n        comparePerPieceMarkup +\n        '<span class=\"bg-designer-storefront__range-price-current' + (hasDiscount ? ' is-discounted' : '') + '\">' + escapeHtml(formatShownMoney(hasDiscount ? row.currentPerPiece : row.comparePerPiece)) + '</span>' +\n        '<span class=\"calc-qty-per-unit\">/' + escapeHtml(text(row.unitLabel) || 'unit') + '</span>';\n    }\n    var compareTotalMarkup = hasDiscount\n      ? '<s class=\"calc-qty-original-price\">' + escapeHtml(formatShownMoney(row.compareTotal)) + '</s>'\n      : '';\n    return '' +\n      compareTotalMarkup +\n      '<span class=\"bg-designer-storefront__range-price-current' + (hasDiscount ? ' is-discounted' : '') + '\">' + escapeHtml(formatShownMoney(hasDiscount ? row.total : row.compareTotal)) + '</span>' +\n      ' <span class=\"calc-qty-per-unit\">(' + escapeHtml(formatShownMoney(hasDiscount ? row.currentPerPiece : row.comparePerPiece)) + ' per ' + escapeHtml(text(row.unitLabel) || 'unit') + ')</span>';\n  }\n\n  // row holds shownPrice figures.\n  function buildQuantityTablePostageMarkup(row) {\n    var total = roundMoney(numberValue(row && row.postageTotal, 0));\n    var perPiece = roundMoney(numberValue(row && row.postagePerPiece, 0));\n    return '' +\n      '<span class=\"bg-designer-storefront__range-price-current\">' + escapeHtml(formatShownMoney(total)) + '</span>' +\n      '<span class=\"calc-qty-per-unit\">(' + escapeHtml(formatShownMoney(perPiece)) + '/piece)</span>';\n  }\n\n  function shouldShowPostageRangeColumns(store) {\n    return isEddmFullServiceActive(store) || isPostcardsBulkMailActive(store);\n  }\n\n  // Buttons quantity style: a wrapping row of selectable tiles (bold\n  // quantity, total price, optional per-unit line). Sale pricing mirrors the\n  // quantity table: the pre-discount total renders struck-through beside the\n  // sale total via buildSummaryMoneyMarkup.\n  function buildQuantityButtonsMarkup(store, quantityContext, options) {\n    var productConfig = getQuantityProductConfig(store);\n    var showPerUnit = productConfig.quantityShowPerUnitPrice !== false;\n    // BD-NO-ROW-ZERO-PRICE: no money is read out for a choice no row prices.\n    var showMoney = !showsNoPriceRow(store);\n    return options.map(function (value) {\n      var row = shownPrice(getQuantityTablePresentationForQuantity(store, value, quantityContext));\n      var selected = Number(store.state.quantity) === Number(value);\n      var buttonLabel = String(value) + ' ' + getIntentFirstUnitNoun(store, value) + (showMoney\n        ? ', ' + formatShownMoney(row.total) + ' total' + (showPerUnit ? ', ' + formatShownMoney(row.currentPerPiece) + ' each' : '')\n        : '');\n      return '' +\n        '<button type=\"button\" class=\"bg-designer-storefront__quantity-button' + (selected ? ' is-selected' : '') + '\" data-bg-quantity-row-target=\"' + escapeHtml(String(value)) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\" aria-label=\"' + escapeHtml(buttonLabel) + '\">' +\n          '<span class=\"bg-designer-storefront__quantity-button-qty\">' + escapeHtml(Number(value).toLocaleString()) + '</span>' +\n          '<span class=\"bg-designer-storefront__quantity-button-price\">' + buildShownSummaryMoneyMarkup(row.total, row.compareTotal) + '</span>' +\n          (showPerUnit ? '<span class=\"bg-designer-storefront__quantity-button-unit\">(' + escapeHtml(formatShownMoney(row.currentPerPiece)) + '/' + escapeHtml(getQuantityPerUnitLabel(store)) + ')</span>' : '') +\n        '</button>';\n    }).join('');\n  }\n\n  function bindQuantityRowsToggleControls(store, container) {\n    if (!container) return;\n    Array.prototype.slice.call(container.querySelectorAll('[data-bg-quantity-rows-toggle]')).forEach(function (toggleButton) {\n      toggleButton.addEventListener('click', function () {\n        store.state.quantityRowsExpanded = store.state.quantityRowsExpanded !== true;\n        renderQuantity(store);\n        syncStickyPurchaseBar(store);\n      });\n    });\n  }\n\n  function buildQuantityRangeTableMarkup(store, quantityContext, settings) {\n    var options = Array.isArray(quantityContext && quantityContext.quantityOptions) && quantityContext.quantityOptions.length\n      ? quantityContext.quantityOptions.slice()\n      : collectQuantityOptionsForMode(store, quantityContext && quantityContext.quantityMode);\n    if (!options.length) return '';\n    options.sort(function (a, b) { return a - b; });\n    var config = settings && typeof settings === 'object' ? settings : {};\n    if (!config.unitPriceLabel) config.unitPriceLabel = getQuantityPerUnitLabel(store);\n    var currentQuantity = normalizePositiveInteger(quantityContext && quantityContext.displayQuantity, options[0] || 1);\n    // EDDM-ROUTE-PENDING-HINTS: while the quantity waits for routes no row is\n    // the shopper's choice, so none is highlighted. (A displayQuantity of 0\n    // would fall back to the first row here.)\n    var marksSelection = !isEddmRouteQuantityPending(store);\n    // Optional truncation (pricing_table / range_table only): render the first\n    // maxVisibleRows rows plus a \"Show more quantities\" expander. When the\n    // current selection sits past the cutoff the table stays fully expanded so\n    // the highlighted row can never disappear.\n    var configuredTableFieldType = getConfiguredQuantityFieldType(store);\n    var maxVisibleRows = 0;\n    if (configuredTableFieldType === 'pricing_table' || configuredTableFieldType === 'range_table') {\n      var configuredMaxRows = Number(getQuantityProductConfig(store).quantityMaxVisibleRows);\n      if (Number.isInteger(configuredMaxRows) && configuredMaxRows > 0) maxVisibleRows = configuredMaxRows;\n    }\n    var showPostageColumns = shouldShowPostageRangeColumns(store);\n    var lockedToPricingTable = shouldLockQuantityToPricingOptions(store, quantityContext && quantityContext.quantityMode);\n    var useDiscreteRows = lockedToPricingTable || config.discreteOptions === true;\n    // The cutoff check must locate the selection's BRACKET row, not an exact\n    // option match: a typed range-table quantity (e.g. 35 against 10/20/30/40)\n    // belongs to the 30 row, so indexOf returned -1 and a past-cutoff\n    // selection stayed collapsed with the wrong open-ended row highlighted.\n    var selectionRowQuantity = useDiscreteRows\n      ? currentQuantity\n      : resolvePriceBracketQuantity(options, currentQuantity, false);\n    var selectionPastCutoff = maxVisibleRows > 0 && options.indexOf(selectionRowQuantity) >= maxVisibleRows;\n    var rowsExpanded = store.state.quantityRowsExpanded === true || selectionPastCutoff;\n    var showRowsToggle = maxVisibleRows > 0 && options.length > maxVisibleRows && !selectionPastCutoff;\n    // Keep the full option list for range ends: a truncated list must not turn\n    // its last visible row into a fabricated open-ended bracket.\n    var fullOptions = options.slice();\n    if (maxVisibleRows > 0 && !rowsExpanded && options.length > maxVisibleRows) {\n      options = options.slice(0, maxVisibleRows);\n    }\n    var rowPresentations = options.map(function (quantity) {\n      return getQuantityTablePresentationForQuantity(store, quantity, quantityContext);\n    });\n    var highestEffectivePerPiece = config.guidedExactTable\n      ? rowPresentations.reduce(function (highest, presentation) {\n          return Math.max(highest, numberValue(shownPrice(presentation) && shownPrice(presentation).currentPerPiece, 0));\n        }, 0)\n      : 0;\n    return '' +\n      '<div class=\"bg-designer-storefront__range-price-table range-price-table' + (config.guidedExactTable ? ' bg-designer-storefront__range-price-table--guided-exact' : '') + '\">' +\n        '<table class=\"bg-designer-storefront__range-table range-table' + (showPostageColumns ? ' bg-designer-storefront__range-table--postage' : '') + '\">' +\n          (config.hideHeader ? '' : (\n            '<thead>' +\n              '<tr>' +\n                '<th>' + (useDiscreteRows ? 'Quantity' : 'Qty Range') + '</th>' +\n                '<th>' + (showPostageColumns ? 'Print + Mailing Cost' : 'Price') + '</th>' +\n                (showPostageColumns ? '<th>Postage</th>' : '') +\n              '</tr>' +\n            '</thead>'\n          )) +\n          '<tbody>' +\n            options.map(function (start, index) {\n              var next = fullOptions[index + 1];\n              var end = useDiscreteRows ? start : (next ? (next - 1) : 999999);\n              var presentation = rowPresentations[index];\n              var priceRecord = presentation.priceRecord && typeof presentation.priceRecord === 'object'\n                ? presentation.priceRecord\n                : {};\n              var meta = priceRecord && priceRecord.data && typeof priceRecord.data === 'object'\n                ? priceRecord.data\n                : {};\n              var qtyNote = text(meta.qtyNote || priceRecord.qtyNote);\n              var displayPerPieceOnly = !!(meta.displayPerPieceOnly || priceRecord.displayPerPieceOnly);\n              var isHighlighted = marksSelection && (useDiscreteRows ? currentQuantity === start : currentQuantity >= start && currentQuantity <= end);\n              // FUNCTIONS-CURRENCY-AWARE: the row's text shows its shown\n              // figures; its data attributes keep the shop amounts.\n              var shownRow = shownPrice(presentation);\n              var printMailingTotal = showPostageColumns ? shownRow.printMailingTotal : shownRow.total;\n              var printMailingCompareTotal = showPostageColumns ? shownRow.printMailingCompareTotal : shownRow.compareTotal;\n              var rowQuantity = normalizePositiveInteger(start, 1);\n              // Fix round 1 (Astra 4, review of #690): after the tier sale a per\n              // piece rounds UP (tierSalePerPiece), so 85.01 for 10 pieces is\n              // 8.51 a piece, never 8.50; without it the old rounding stays.\n              var printMailingPerPiece = rowQuantity > 0\n                ? (getTierSalePercentage(store) > 0 ? tierSalePerPiece(printMailingTotal, rowQuantity) : roundMoney(printMailingTotal / rowQuantity))\n                : printMailingTotal;\n              var printMailingComparePerPiece = rowQuantity > 0\n                ? roundMoney(printMailingCompareTotal / rowQuantity)\n                : printMailingCompareTotal;\n              var savingsPercent = config.guidedExactTable && highestEffectivePerPiece > 0\n                ? Math.max(0, Math.round((1 - (printMailingPerPiece / highestEffectivePerPiece)) * 100))\n                : 0;\n              return '' +\n                '<tr class=\"' + (isHighlighted ? 'highlight' : '') + (config.clickable ? ' is-clickable' : '') + '\"' +\n                  ' data-bg-quantity-range-row' +\n                  (config.clickable ? ' data-bg-quantity-row-target=\"' + escapeHtml(String(start)) + '\"' : '') +\n                  (config.clickable ? ' role=\"radio\" tabindex=\"0\" aria-checked=\"' + (isHighlighted ? 'true' : 'false') + '\"' : '') +\n                  ' data-range-start=\"' + escapeHtml(String(start)) + '\"' +\n                  ' data-range-end=\"' + escapeHtml(String(end)) + '\"' +\n                  ' data-price=\"' + escapeHtml(String(numberValue(showPostageColumns ? presentation.printMailingTotal : presentation.total, 0))) + '\"' +\n                  (showPostageColumns ? ' data-postage=\"' + escapeHtml(String(numberValue(presentation.postageTotal, 0))) + '\"' : '') + '>' +\n                  '<td>' + escapeHtml(useDiscreteRows ? String(start) : buildQuantityRangeLabel(start, next ? end : NaN)) + (qtyNote ? ' <span class=\"qty-note\">' + escapeHtml(qtyNote) + '</span>' : '') + '</td>' +\n                  '<td class=\"bg-designer-storefront__range-price-cell\">' + buildQuantityTablePriceMarkup({\n                    total: printMailingTotal,\n                    compareTotal: printMailingCompareTotal,\n                    currentPerPiece: printMailingPerPiece,\n                    comparePerPiece: printMailingComparePerPiece,\n                    displayPerPieceOnly: displayPerPieceOnly,\n                    unitLabel: config.unitPriceLabel\n                  }) + (savingsPercent > 0\n                    ? '<span class=\"bg-designer-storefront__quantity-savings\" aria-label=\"Save ' + escapeHtml(String(savingsPercent)) + ' percent\">Save ' + escapeHtml(String(savingsPercent)) + '%</span>'\n                    : '') + '</td>' +\n                  (showPostageColumns ? '<td class=\"bg-designer-storefront__range-price-cell bg-designer-storefront__range-postage-cell\">' + buildQuantityTablePostageMarkup({\n                    postageTotal: shownRow.postageTotal,\n                    postagePerPiece: shownRow.postagePerPiece\n                  }) + '</td>' : '') +\n                '</tr>';\n            }).join('') +\n          '</tbody>' +\n        '</table>' +\n        (showRowsToggle\n          ? '<div class=\"bg-designer-storefront__quantity-rows-toggle-row\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__quantity-rows-toggle\" data-bg-quantity-rows-toggle aria-expanded=\"' + (rowsExpanded ? 'true' : 'false') + '\">' +\n                (rowsExpanded ? 'Show fewer quantities' : 'Show more quantities') +\n              '</button>' +\n            '</div>'\n          : '') +\n      '</div>';\n  }\n\n  function syncQuantityModePresentation(store, block, settings) {\n    if (!block) return;\n    var config = settings && typeof settings === 'object' ? settings : {};\n    var quantityContext = buildQuantityPricingContext(store, store && store.state && store.state.quantity);\n    var pricePresentation = shownPrice(getPricePresentationForQuantity(store, quantityContext.displayQuantity));\n    var totalNode = block.querySelector('[data-bg-quantity-mode-total]');\n    var eachNode = block.querySelector('[data-bg-quantity-mode-each]');\n    var noteNode = block.querySelector('[data-bg-quantity-note]');\n    var warningNode = block.querySelector('[data-bg-quantity-warning]');\n    var tableNode = block.querySelector('[data-bg-quantity-range-table]');\n    if (totalNode) {\n      totalNode.innerHTML = buildShownSummaryMoneyMarkup(pricePresentation.total, pricePresentation.compareTotal);\n    }\n    if (eachNode) {\n      eachNode.textContent = buildQuantityUnitLine(store, quantityContext.displayQuantity, pricePresentation.currentPerPiece);\n    }\n    if (noteNode) {\n      var noteText = getQuantityBracketNoteText(quantityContext);\n      noteNode.textContent = noteText;\n      noteNode.hidden = !noteText;\n    }\n    if (warningNode) {\n      var apparelConfig = getApparelConfig(store);\n      var totalPieces = sumApparelSizes(normalizeApparelSizesState(store && store.state && store.state.apparelSizes, apparelConfig));\n      var minQty = normalizePositiveInteger(numberValue(apparelConfig && apparelConfig.minQty, 1), 1);\n      var deferredSizes = totalPieces === 0 && canDeferChannelSizes(store);\n      var apparelTotalNode = block.querySelector('[data-bg-apparel-total]');\n      var deferredNoteNode = block.querySelector('[data-bg-channel-size-note]');\n      if (apparelTotalNode) apparelTotalNode.value = String(deferredSizes ? store.state.quantity : totalPieces);\n      if (deferredNoteNode) {\n        deferredNoteNode.textContent = deferredSizes ? String(store.state.quantity) + ' pieces. Sizes collected after checkout.' : '';\n        deferredNoteNode.hidden = !deferredSizes;\n      }\n      var warningText = deferredSizes ? '' : getApparelQuantityWarningText(store, totalPieces, minQty);\n      warningNode.textContent = warningText;\n      warningNode.hidden = !warningText;\n    }\n    if (tableNode) {\n      tableNode.hidden = getConfiguredQuantityFieldType(store) === 'numeric_input' && !getQuantityPresentation(store).showRangeTable;\n      tableNode.innerHTML = buildQuantityRangeTableMarkup(store, quantityContext, {\n        clickable: !!config.clickableRows\n      });\n      bindQuantityRowsToggleControls(store, tableNode);\n      if (config.clickableRows && typeof config.onSelectQuantity === 'function') {\n        Array.prototype.slice.call(tableNode.querySelectorAll('[data-bg-quantity-row-target]')).forEach(function (row) {\n          var selectRowQuantity = function () {\n            var nextQuantity = parseInt(row.getAttribute('data-bg-quantity-row-target'), 10);\n            if (Number.isFinite(nextQuantity) && nextQuantity > 0) {\n              config.onSelectQuantity(nextQuantity);\n            }\n          };\n          row.addEventListener('click', selectRowQuantity);\n          row.addEventListener('keydown', function (event) {\n            if (!event || (event.key !== 'Enter' && event.key !== ' ')) return;\n            event.preventDefault();\n            selectRowQuantity();\n          });\n        });\n      }\n    }\n  }\n\n  function getEddmLaunchEndpoint(store) {\n    var designerConfig = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    var proxyRoot = text(designerConfig.proxyRoot) || '/apps/qps-commerce-control-plane/designer';\n    return proxyRoot.replace(/\\/+$/, '') + '/eddm/launch';\n  }\n\n  function buildEddmLaunchRequest(store) {\n    var sizeOption = getSelectedOptionByHolderDisplayName(store, 'Size');\n    var serviceOption = getSelectedOptionByHolderDisplayName(store, 'Service');\n    var eddm = ensureEddmState(store);\n    // The Worker allows the launch by this page's own product (id and\n    // handle); 'handle' stays for older Workers and carries the same value.\n    var ownHandle = text(store.config && store.config.handle);\n    return {\n      handle: ownHandle,\n      productHandle: ownHandle,\n      productId: text(store.config && store.config.productId),\n      selectedSizeId: normalizeTargetingIdKey(sizeOption && sizeOption.targetingID),\n      selectedSizeLabel: getOptionDisplayLabel(store, null, sizeOption),\n      selectedServiceId: normalizeTargetingIdKey(serviceOption && serviceOption.targetingID),\n      targetInMailboxDate: text(eddm.targetInMailboxDate) || getEddmMinimumTargetDate(),\n      mapEventData: store.eddmSessionMapEventData || null\n    };\n  }\n\n  function parseEddmMessagePayload(value) {\n    if (value && typeof value === 'object') return value;\n    if (typeof value !== 'string') return null;\n    try {\n      var parsed = JSON.parse(value);\n      return parsed && typeof parsed === 'object' ? parsed : null;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function eddmFirstNumber() {\n    for (var index = 0; index < arguments.length; index += 1) {\n      var value = numberValue(arguments[index], NaN);\n      if (Number.isFinite(value)) return value;\n    }\n    return 0;\n  }\n\n  function normalizeEddmBoolean(value) {\n    if (value === true || value === 1) return true;\n    var normalized = text(value).toLowerCase();\n    return normalized === 'true' || normalized === 'yes' || normalized === '1';\n  }\n\n  function normalizeEddmRouteModel(route) {\n    var source = route && typeof route === 'object' ? route : {};\n    var attributes = source.attributes && typeof source.attributes === 'object' ? source.attributes : {};\n    var zip = text(attributes.zip_code || attributes.zipCode || source.zip || source.zipCode || source.zip_code);\n    var crid = text(attributes.crid_id || attributes.cridId || source.crid || source.cridId || source.crid_id);\n    var routeId = text(source.route_id || source.routeId || source.id || source.crid_id || source.crid || (zip && crid ? zip + '-' + crid : ''));\n    var residential = eddmFirstNumber(source.res_cnt_copy, source.res_cnt, source.residential, source.residentialCount, attributes.res_cnt);\n    var business = eddmFirstNumber(source.bus_cnt_copy, source.bus_cnt, source.business, source.businessCount, attributes.bus_cnt);\n    var total = eddmFirstNumber(source.tot_cnt_copy, source.tot_cnt, source.total, source.totalCount, residential + business);\n    return {\n      routeId: routeId,\n      zip: zip,\n      crid: crid,\n      routeType: text(source.routeType || source.route_type || attributes.routeType || attributes.TYPE),\n      dataVersion: text(source.dataVersion || source.data_version || attributes.dataVersion || attributes.DATA_VERSION),\n      residential: Math.max(0, Math.round(residential)),\n      business: Math.max(0, Math.round(business)),\n      total: Math.max(0, Math.round(total))\n    };\n  }\n\n  function collectSelectedEddmRoutes(mapEventData) {\n    var source = mapEventData && typeof mapEventData === 'object' ? mapEventData : {};\n    var routeModels = Array.isArray(source.selectedCarrierRouteModels)\n      ? source.selectedCarrierRouteModels\n      : (Array.isArray(source.selectedRoutes) ? source.selectedRoutes : []);\n    return routeModels.filter(function (route) {\n      if (!route || typeof route !== 'object') return false;\n      if (route.is_selected === false || route.isSelected === false || route.selected === false) return false;\n      return !!(route.is_selected || route.isSelected || route.selected || source.selectedRoutes === routeModels);\n    }).map(normalizeEddmRouteModel).filter(function (route) {\n      return route.routeId || route.zip || route.crid;\n    });\n  }\n\n  function buildEddmRouteDetails(routes, residentialOnly) {\n    return (Array.isArray(routes) ? routes : []).map(function (route) {\n      var label = [route.zip, route.crid].filter(Boolean).join('-') || text(route.routeId);\n      if (!label) return '';\n      if (residentialOnly) {\n        return label + ' -- ' + String(route.residential || 0) + ' Residents';\n      }\n      return label + ' Bus: ' + String(route.business || 0) + ' --- Residents: ' + String(route.residential || 0) + ' --- Total: ' + String(route.total || 0);\n    }).filter(Boolean).join(' | ');\n  }\n\n  function applyEddmMapEventData(store, mapEventData, settings) {\n    var config = settings && typeof settings === 'object' ? settings : {};\n    var data = mapEventData && typeof mapEventData === 'object' ? mapEventData : {};\n    var eddm = ensureEddmState(store);\n    var selectedRoutes = collectSelectedEddmRoutes(data);\n    var rawResidential = eddmFirstNumber(data.tot_res, data.total_residential, data.residentialAddresses, selectedRoutes.reduce(function (sum, route) { return sum + route.residential; }, 0));\n    var rawBusiness = eddmFirstNumber(data.tot_bus, data.total_business, data.businessAddresses, selectedRoutes.reduce(function (sum, route) { return sum + route.business; }, 0));\n    var rawTotal = eddmFirstNumber(data.tot_cnt, data.total_addresses, data.totalAddresses, rawResidential + rawBusiness);\n    var routeCount = Math.max(0, Math.round(eddmFirstNumber(data.tot_sel, data.total_selected, data.selectedRouteCount, selectedRoutes.length)));\n    var residentialOnly = Object.prototype.hasOwnProperty.call(config, 'residentialOnly')\n      ? !!config.residentialOnly\n      : (normalizeEddmBoolean(data.residential_only || data.residentialOnly || data.isResidentialOnly) || !!eddm.residentialOnly);\n    var politicalMailer = Object.prototype.hasOwnProperty.call(config, 'politicalMailer')\n      ? !!config.politicalMailer\n      : (normalizeEddmBoolean(data.political_mailer || data.politicalMailer || data.isPoliticalMailer) || !!eddm.politicalMailer);\n    var businessAddresses = residentialOnly ? 0 : Math.max(0, Math.round(rawBusiness));\n    var residentialAddresses = Math.max(0, Math.round(rawResidential));\n    var totalAddresses = residentialOnly\n      ? Math.max(0, Math.round(rawTotal - rawBusiness))\n      : Math.max(0, Math.round(rawTotal || (residentialAddresses + businessAddresses)));\n    var routeDetails = buildEddmRouteDetails(selectedRoutes, residentialOnly);\n    store.eddmSessionMapEventData = data;\n    eddm.provider = eddm.provider || 'four-over-eddm';\n    eddm.dataVersion = text(data.dataVersion || data.data_version || selectedRoutes[0] && selectedRoutes[0].dataVersion || eddm.dataVersion);\n    eddm.routeGroupUuid = text(config.routeGroupUuid) || text(data.route_group_uuid || data.routeGroupUuid) || text(eddm.routeGroupUuid);\n    eddm.routesSelected = !!(config.finalize || eddm.routesSelected);\n    eddm.selectedRouteCount = routeCount;\n    eddm.residentialAddresses = residentialAddresses;\n    eddm.businessAddresses = businessAddresses;\n    eddm.totalAddresses = totalAddresses;\n    eddm.residentialOnly = residentialOnly;\n    eddm.politicalMailer = politicalMailer;\n    eddm.routeDetails = routeDetails || text(data.routeDetails || eddm.routeDetails);\n    eddm.selectedRoutes = selectedRoutes;\n    eddm.launchError = '';\n    if (totalAddresses > 0 && isEddmFullServiceActive(store)) {\n      store.state.quantity = totalAddresses;\n      store.state.typedQuantity = totalAddresses;\n    }\n  }\n\n  // EDDM-ROUTE-DELTAS-REFRESH (2026-10-02): routes change the quantity\n  // without a full render, so the option price differences are rewritten in\n  // place from the markup a full render builds for the same state. Only each\n  // choice's price line and screen-reader label change; the choices, their\n  // focus, swatch images and reserved price line heights stay.\n  var OPTION_PRICE_CHOICE_SELECTOR = '.bg-designer-storefront__button-holder, .bg-designer-storefront__swatch-holder, [data-bg-holder-dropdown-option]';\n  var OPTION_PRICE_LABEL_SELECTOR = '[data-bg-holder-value], [data-bg-holder-input], .bg-designer-storefront__swatch-preview';\n\n  function getOptionChoiceHvid(choice) {\n    var node = choice.hasAttribute('data-bg-hvid') ? choice : choice.querySelector('[data-bg-hvid]');\n    return node ? text(node.getAttribute('data-bg-hvid')) : '';\n  }\n\n  // The price line is the last child of the choice (buttons, swatches) or of\n  // its option text (dropdown rows), present only when it has a value or a\n  // reserved line.\n  function getOptionChoicePriceLineOwner(choice) {\n    return choice.querySelector('.bg-designer-storefront__dropdown-option-text') || choice;\n  }\n\n  function getOptionChoicePriceLine(owner) {\n    return Array.prototype.slice.call(owner.children).filter(function (child) {\n      return child.classList.contains('bg-designer-storefront__option-price');\n    })[0] || null;\n  }\n\n  function syncOptionChoicePriceDifference(freshChoice, liveChoice) {\n    var liveOwner = getOptionChoicePriceLineOwner(liveChoice);\n    var freshLine = getOptionChoicePriceLine(getOptionChoicePriceLineOwner(freshChoice));\n    var liveLine = getOptionChoicePriceLine(liveOwner);\n    if (freshLine && liveLine) {\n      if (liveLine.innerHTML !== freshLine.innerHTML) liveLine.innerHTML = freshLine.innerHTML;\n    } else if (freshLine) {\n      liveOwner.appendChild(document.importNode(freshLine, true));\n    } else if (liveLine) {\n      liveOwner.removeChild(liveLine);\n    }\n    var freshLabels = freshChoice.querySelectorAll(OPTION_PRICE_LABEL_SELECTOR);\n    var liveLabels = liveChoice.querySelectorAll(OPTION_PRICE_LABEL_SELECTOR);\n    if (freshLabels.length !== liveLabels.length) return;\n    Array.prototype.forEach.call(liveLabels, function (node, index) {\n      var label = freshLabels[index].getAttribute('aria-label');\n      if (label !== null && node.getAttribute('aria-label') !== label) node.setAttribute('aria-label', label);\n    });\n  }\n\n  function refreshOptionPriceDifferences(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.options || !Array.isArray(store.holders)) return;\n    var template = document.createElement('template');\n    template.innerHTML = buildOptionSectionsMarkup(store);\n    var liveSections = Array.prototype.slice.call(blocks.options.querySelectorAll('section[data-bg-option-group][data-bg-holder-id]'));\n    Array.prototype.slice.call((template.content || template).querySelectorAll('section[data-bg-option-group][data-bg-holder-id]')).forEach(function (freshSection) {\n      var holderId = freshSection.getAttribute('data-bg-holder-id');\n      var liveSection = liveSections.filter(function (section) {\n        return section.getAttribute('data-bg-holder-id') === holderId;\n      })[0];\n      if (!liveSection) return;\n      var liveChoices = {};\n      Array.prototype.slice.call(liveSection.querySelectorAll(OPTION_PRICE_CHOICE_SELECTOR)).forEach(function (choice) {\n        liveChoices[getOptionChoiceHvid(choice)] = choice;\n      });\n      Array.prototype.slice.call(freshSection.querySelectorAll(OPTION_PRICE_CHOICE_SELECTOR)).forEach(function (freshChoice) {\n        var liveChoice = liveChoices[getOptionChoiceHvid(freshChoice)];\n        if (liveChoice) syncOptionChoicePriceDifference(freshChoice, liveChoice);\n      });\n    });\n  }\n\n  function refreshEddmProductSurface(store) {\n    recalculate(store);\n    renderQuantity(store);\n    refreshOptionPriceDifferences(store);\n    renderSummary(store);\n    renderCtaMeta(store);\n    syncFormState(store);\n    syncSubmitButton(store);\n    syncEddmModalPresentation(store);\n  }\n\n  function closeEddmModal(store) {\n    var modal = store && store.eddmModal ? store.eddmModal : document.querySelector('[data-bg-eddm-modal]');\n    if (store && store.eddmMessageHandler) {\n      window.removeEventListener('message', store.eddmMessageHandler);\n      store.eddmMessageHandler = null;\n    }\n    if (!modal) return;\n    modal.hidden = true;\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.body.classList.remove('bg-designer-eddm-modal--open');\n  }\n\n  function ensureEddmModal(store) {\n    if (store.eddmModal && store.eddmModal.isConnected) return store.eddmModal;\n    var existing = document.querySelector('[data-bg-eddm-modal]');\n    if (existing) {\n      store.eddmModal = existing;\n      return existing;\n    }\n    var modal = document.createElement('div');\n    modal.className = 'bg-designer-storefront-modal bg-designer-storefront-eddm-modal';\n    modal.hidden = true;\n    modal.setAttribute('data-bg-eddm-modal', '1');\n    modal.setAttribute('aria-hidden', 'true');\n    modal.innerHTML = '' +\n      '<div class=\"bg-designer-storefront-modal__backdrop\" data-bg-eddm-close></div>' +\n      '<div class=\"bg-designer-storefront-modal__dialog bg-designer-storefront-eddm-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bg-designer-eddm-label\" tabindex=\"-1\">' +\n        '<div class=\"bg-designer-storefront-modal__header bg-designer-storefront-eddm-modal__header\">' +\n          '<div class=\"bg-designer-storefront__eyebrow\" id=\"bg-designer-eddm-label\">EDDM Route Selection</div>' +\n          '<button type=\"button\" class=\"bg-designer-storefront-modal__close\" data-bg-eddm-close aria-label=\"Close EDDM route selector\">&times;</button>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-eddm-modal__body\">' +\n          '<iframe class=\"bg-designer-storefront-eddm-modal__iframe\" data-bg-eddm-iframe title=\"EDDM route selector\"></iframe>' +\n          '<div class=\"bg-designer-storefront-eddm-modal__overlay\" data-bg-eddm-overlay aria-live=\"polite\">' +\n            '<div class=\"bg-designer-storefront-eddm-modal__overlay-panel bg-designer-storefront-eddm-modal__overlay-panel--selections\">' +\n              '<div class=\"bg-designer-storefront-eddm-modal__overlay-header\">Selections</div>' +\n              '<div class=\"bg-designer-storefront-eddm-modal__overlay-section\">' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Routes:</span><strong data-bg-eddm-overlay-value=\"routes\">0</strong></div>' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Businesses:</span><strong data-bg-eddm-overlay-value=\"businesses\">0</strong></div>' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Residential:</span><strong data-bg-eddm-overlay-value=\"residential\">0</strong></div>' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Total Addresses:</span><strong data-bg-eddm-overlay-value=\"totalAddresses\">0</strong></div>' +\n                '<label class=\"bg-designer-storefront-eddm-modal__overlay-check\"><span>Hit residential only?</span><input type=\"checkbox\" data-bg-eddm-overlay-flag=\"residentialOnly\"></label>' +\n                '<label class=\"bg-designer-storefront-eddm-modal__overlay-check\"><span>Is this a political mailer?</span><input type=\"checkbox\" data-bg-eddm-overlay-flag=\"politicalMailer\"></label>' +\n              '</div>' +\n            '</div>' +\n            '<div class=\"bg-designer-storefront-eddm-modal__overlay-panel bg-designer-storefront-eddm-modal__overlay-panel--pricing\">' +\n              '<div class=\"bg-designer-storefront-eddm-modal__overlay-header\">Pricing</div>' +\n              '<div class=\"bg-designer-storefront-eddm-modal__overlay-section\">' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Addresses Selected:</span><strong data-bg-eddm-overlay-value=\"totalSelected\">0</strong></div>' +\n                '<div class=\"bg-designer-storefront-eddm-modal__overlay-row\"><span>Quantity tier:</span><strong data-bg-eddm-overlay-value=\"priceTier\">-</strong></div>' +\n                '<p class=\"bg-designer-storefront-eddm-modal__overlay-note\">You can still send <strong data-bg-eddm-overlay-value=\"listingsLeft\">0</strong> pieces for only the cost of postage!</p>' +\n              '</div>' +\n              '<table class=\"bg-designer-storefront-eddm-modal__price-table\">' +\n                '<tbody>' +\n                  '<tr><td>Print:</td><td><span data-bg-eddm-overlay-value=\"overlayProductPrice\">$0.00</span></td></tr>' +\n                  '<tr><td>Discount:</td><td><span data-bg-eddm-overlay-value=\"overlayDiscount\">-$0.00</span></td></tr>' +\n                  '<tr><td>Postage:</td><td><span data-bg-eddm-overlay-value=\"overlayPostage\">$0.00</span></td></tr>' +\n                  '<tr><td><strong>Total:</strong></td><td><strong data-bg-eddm-overlay-value=\"overlayTotalPrice\">$0.00</strong></td></tr>' +\n                '</tbody>' +\n              '</table>' +\n            '</div>' +\n          '</div>' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront-eddm-modal__welcome\" data-bg-eddm-welcome role=\"document\" aria-labelledby=\"bg-designer-eddm-welcome-title\" aria-hidden=\"true\" hidden>' +\n          '<div class=\"bg-designer-storefront-eddm-modal__welcome-content\">' +\n            '<h2 id=\"bg-designer-eddm-welcome-title\">Welcome to our new EDDM Mapping Tool</h2>' +\n            '<p><strong>Important Notes!</strong></p>' +\n            '<p>At the moment, <strong>the mapping tool is NOT Mobile or Touchscreen friendly</strong>. That is coming. We recommend using a desktop computer.</p>' +\n            '<p>The print and mailing service is priced at a flat rate based on your total addresses. Exceeding a quantity break will increase your price bracket. For the best value, try to get your addresses as close as possible.</p>' +\n            '<p>The maximum allowed addresses using this tool is 40,000 pieces. Larger mailings must be processed as separate orders.</p>' +\n            '<p>Searching by zip code will limit your route selection to just that zip code.</p>' +\n            '<p>For targeting a wide area, enter an address central to your target area.</p>' +\n            '<p>By default, the mapping tool includes businesses. To target residential listings only, click residential only at the bottom right of the Selections and Pricing section. Targeting only businesses is not allowed with EDDM.</p>' +\n            '<button type=\"button\" class=\"button button--primary bg-designer-storefront-eddm-modal__welcome-button\" data-bg-eddm-welcome-close>I Understand</button>' +\n          '</div>' +\n        '</div>' +\n      '</div>';\n    document.body.appendChild(modal);\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-eddm-close]')).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        closeEddmModal(store);\n      });\n    });\n    var welcomeClose = modal.querySelector('[data-bg-eddm-welcome-close]');\n    if (welcomeClose) {\n      welcomeClose.addEventListener('click', function (event) {\n        event.preventDefault();\n        dismissEddmWelcome(store);\n      });\n    }\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-eddm-overlay-flag]')).forEach(function (input) {\n      input.addEventListener('change', function () {\n        updateEddmFlagState(store, text(input.getAttribute('data-bg-eddm-overlay-flag')), input.checked);\n      });\n    });\n    modal.addEventListener('keydown', function (event) {\n      if (modal.hidden || event.key !== 'Escape') return;\n      event.preventDefault();\n      closeEddmModal(store);\n    });\n    store.eddmModal = modal;\n    return modal;\n  }\n\n  function openEddmModal(store, launch) {\n    var modal = ensureEddmModal(store);\n    var iframe = modal.querySelector('[data-bg-eddm-iframe]');\n    var eddm = ensureEddmState(store);\n    if (store.eddmMessageHandler) {\n      window.removeEventListener('message', store.eddmMessageHandler);\n      store.eddmMessageHandler = null;\n    }\n    eddm.provider = text(launch && launch.provider) || 'four-over-eddm';\n    eddm.targetOrigin = text(launch && launch.targetOrigin);\n    eddm.launchStatus = 'Route selector opened.';\n    eddm.launchError = '';\n    store.eddmMessageHandler = function (event) {\n      handleEddmMessageEvent(store, event);\n    };\n    window.addEventListener('message', store.eddmMessageHandler);\n    if (iframe) {\n      iframe.onload = function () {\n        if (iframe.contentWindow && launch && launch.postMessagePayload && eddm.targetOrigin) {\n          iframe.contentWindow.postMessage(launch.postMessagePayload, eddm.targetOrigin);\n        }\n      };\n      iframe.src = text(launch && launch.iframeUrl) || 'about:blank';\n    }\n    modal.hidden = false;\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('bg-designer-eddm-modal--open');\n    syncEddmModalPresentation(store);\n    setEddmWelcomeVisible(store, !store.eddmWelcomeDismissed);\n    window.requestAnimationFrame(function () {\n      var dialog = modal.querySelector('[role=\"dialog\"]');\n      if (dialog && typeof dialog.focus === 'function') dialog.focus({ preventScroll: true });\n    });\n  }\n\n  function handleEddmMessageEvent(store, event) {\n    var eddm = ensureEddmState(store);\n    if (!eddm.targetOrigin || event.origin !== eddm.targetOrigin) return;\n    var payload = parseEddmMessagePayload(event.data);\n    if (!payload || !text(payload.type)) return;\n    if (payload.type === 'login_sync') return;\n    if (payload.type === 'map_event_data_sync') {\n      applyEddmMapEventData(store, payload.data || payload.map_event_data || payload, { finalize: false });\n      eddm.launchStatus = 'Route selection updated.';\n      refreshEddmProductSurface(store);\n      return;\n    }\n    if (payload.type === 'next_button_sync') {\n      var data = payload.data && typeof payload.data === 'object' ? payload.data : {};\n      applyEddmMapEventData(store, data.map_event_data || data, {\n        finalize: true,\n        routeGroupUuid: data.route_group_uuid || data.routeGroupUuid\n      });\n      eddm.launchStatus = 'Routes selected.';\n      closeEddmModal(store);\n      setMessage(store, 'EDDM routes selected. Review your target date before adding to cart.', 'success');\n      refreshEddmProductSurface(store);\n    }\n  }\n\n  function launchEddmMapper(store) {\n    if (!isEddmFullServiceActive(store)) return Promise.resolve(false);\n    var eddm = ensureEddmState(store);\n    eddm.launchStatus = 'Preparing route selector...';\n    eddm.launchError = '';\n    syncSubmitButton(store);\n    return fetch(getEddmLaunchEndpoint(store), {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: {\n        accept: 'application/json',\n        'content-type': 'application/json'\n      },\n      body: JSON.stringify(buildEddmLaunchRequest(store))\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (payload) {\n        if (!response.ok || !payload || payload.ok !== true || !payload.launch) {\n          throw new Error(text(payload && payload.error) || ('EDDM route selector failed to launch (' + response.status + ').'));\n        }\n        openEddmModal(store, payload.launch);\n        refreshEddmProductSurface(store);\n        return true;\n      });\n    }).catch(function (error) {\n      eddm.launchStatus = '';\n      eddm.launchError = text(error && error.message) || 'EDDM route selector failed to launch.';\n      setMessage(store, eddm.launchError, 'error');\n      refreshEddmProductSurface(store);\n      return false;\n    });\n  }\n\n  function buildEddmRouteSummaryMarkup(store) {\n    var eddm = ensureEddmState(store);\n    var totalAddresses = Number(eddm.totalAddresses || 0) || 0;\n    var hasRoutes = totalAddresses > 0 || Number(eddm.selectedRouteCount || 0) > 0;\n    if (!hasRoutes) {\n      return '<div class=\"bg-designer-storefront__eddm-empty\">No EDDM routes selected yet.</div>';\n    }\n    var routeDetails = text(eddm.routeDetails);\n    return '' +\n      '<div class=\"bg-designer-storefront__eddm-summary\">' +\n        '<div class=\"bg-designer-storefront__eddm-summary-grid\">' +\n          '<span>Routes</span><strong>' + escapeHtml(String(eddm.selectedRouteCount || 0)) + '</strong>' +\n          '<span>Residential</span><strong>' + escapeHtml(String(eddm.residentialAddresses || 0)) + '</strong>' +\n          '<span>Businesses</span><strong>' + escapeHtml(String(eddm.businessAddresses || 0)) + '</strong>' +\n          '<span>Total Addresses</span><strong>' + escapeHtml(String(totalAddresses)) + '</strong>' +\n        '</div>' +\n        (routeDetails ? '<p class=\"bg-designer-storefront__eddm-routes\">' + escapeHtml(routeDetails) + '</p>' : '') +\n      '</div>';\n  }\n\n  function renderQuantity(store) {\n    renderQuantityControls(store);\n    renderQuantityPresentationCopy(store, readBlocks(store).quantity);\n  }\n\n  function renderQuantityControls(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.quantity) return;\n    if (document.body) document.body.classList.remove('bg-designer-quantity-menu--open');\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n    var quantityContext = buildQuantityPricingContext(store, store.state.quantity);\n    var options = Array.isArray(quantityContext.quantityOptions) ? quantityContext.quantityOptions : [];\n    var pricePresentation = shownPrice(getPricePresentationForQuantity(store, quantityContext.displayQuantity));\n    var quantityMode = text(quantityContext.quantityMode);\n    var configuredQuantityFieldType = getConfiguredQuantityFieldType(store);\n    blocks.quantity.setAttribute('data-bg-quantity-field-type', configuredQuantityFieldType);\n\n    if (quantityMode === 'rangeInput') {\n      var numericInput = configuredQuantityFieldType === 'numeric_input';\n      var rangeNumberId = 'bg-designer-range-quantity-input-' + escapeHtml(store.config.handle);\n      blocks.quantity.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__quantity-section' + (numericInput ? ' bg-designer-storefront__quantity-section--numeric' : '') + '\" id=\"quantity\" data-bg-quantity-group>' +\n          (numericInput ? '' : '<h3 class=\"bg-designer-storefront__section-label\">Quantity</h3>') +\n          '<div class=\"bg-designer-storefront__quantity-mode bg-designer-storefront__quantity-mode--range-input\">' +\n            '<div class=\"bg-designer-storefront__quantity-range-row\">' +\n              '<label class=\"bg-designer-storefront__quantity-input-label\" for=\"' + rangeNumberId + '\">Quantity' +\n                (quantityContext.bounds.min > 1 ? '<span class=\"bg-designer-storefront__quantity-meta\">(' + escapeHtml(String(quantityContext.bounds.min)) + ' min.)</span>' : '') + '</label>' +\n              '<div class=\"bg-designer-storefront__quantity-number-controls\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__quantity-stepper\" data-bg-quantity-decrement aria-label=\"Decrease quantity\" aria-controls=\"' + rangeNumberId + '\">\u2212</button>' +\n              '<input class=\"bg-designer-storefront__quantity-number\" id=\"' + rangeNumberId + '\" type=\"number\" inputmode=\"numeric\" min=\"' + escapeHtml(String(quantityContext.bounds.min)) + '\" max=\"' + escapeHtml(String(quantityContext.bounds.max)) + '\" step=\"' + escapeHtml(String(quantityContext.bounds.step)) + '\" value=\"' + escapeHtml(String(quantityContext.displayQuantity)) + '\" data-bg-quantity-number aria-label=\"Quantity\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__quantity-stepper\" data-bg-quantity-increment aria-label=\"Increase quantity\" aria-controls=\"' + rangeNumberId + '\">+</button>' +\n              '</div>' +\n            '</div>' +\n            '<div class=\"bg-designer-storefront__quantity-summary bg-designer-storefront__quantity-summary--mode\">' +\n              '<div class=\"bg-designer-storefront__quantity-total\" data-bg-quantity-mode-total>' + buildShownSummaryMoneyMarkup(pricePresentation.total, pricePresentation.compareTotal) + '</div>' +\n              '<div class=\"bg-designer-storefront__quantity-each\" data-bg-quantity-mode-each>(' + escapeHtml(formatShownMoney(pricePresentation.currentPerPiece)) + '/ea)</div>' +\n            '</div>' +\n            '<p class=\"bg-designer-storefront__quantity-note\" data-bg-quantity-note hidden></p>' +\n            '<div data-bg-quantity-range-table>' + buildQuantityRangeTableMarkup(store, quantityContext, { clickable: true }) + '</div>' +\n          '</div>' +\n        '</section>';\n      var rangeNumberInput = blocks.quantity.querySelector('[data-bg-quantity-number]');\n      var rangeDecrement = blocks.quantity.querySelector('[data-bg-quantity-decrement]');\n      var rangeIncrement = blocks.quantity.querySelector('[data-bg-quantity-increment]');\n      var syncRangeBounds = function () {\n        var bounds = buildQuantityPricingContext(store, store.state.quantity).bounds;\n        var current = Number(store.state.quantity);\n        rangeDecrement.disabled = clampQuantityToBounds(current - bounds.step, bounds) >= current;\n        rangeIncrement.disabled = clampQuantityToBounds(current + bounds.step, bounds) <= current;\n      };\n      var applyRangeQuantity = function (nextValue, editing) {\n        var raw = text(nextValue);\n        // Blank, signs and incomplete exponents remain editable drafts.\n        if (!raw || !Number.isFinite(Number(raw))) return;\n        var bounds = buildQuantityPricingContext(store, store.state.quantity).bounds;\n        var nextQuantity = buildQuantityPricingContext(store, clampQuantityToBounds(Number(raw), bounds)).displayQuantity;\n        var changed = Number(store.state.quantity) !== nextQuantity;\n        store.state.quantityDropdownOpen = false;\n        store.state.quantity = nextQuantity;\n        store.state.typedQuantity = nextQuantity;\n        // Price the canonical value immediately, but preserve the draft and\n        // caret until commit so a min/step clamp cannot swallow multi-digit entry.\n        if (!editing) rangeNumberInput.value = String(nextQuantity);\n        syncRangeBounds();\n        if (!changed) return;\n        emitStorefrontEvent(store, 'quantity_changed', 'quantity', {\n          mode: quantityMode,\n          quantity: Number(store.state.quantity) || 0\n        }, 'low');\n        recalculate(store);\n        syncQuantityModePresentation(store, blocks.quantity, {\n          clickableRows: true,\n          onSelectQuantity: applyRangeQuantity\n        });\n        renderSummary(store);\n        renderCtaMeta(store);\n        syncFormState(store);\n        syncSubmitButton(store);\n        renderExperimentalProductFormPresentations(store);\n        syncStickyPurchaseBar(store);\n        scheduleDesignerUrlStateSync(store);\n      };\n      syncQuantityModePresentation(store, blocks.quantity, {\n        clickableRows: true,\n        onSelectQuantity: applyRangeQuantity\n      });\n      syncRangeBounds();\n      if (rangeNumberInput) {\n        rangeNumberInput.addEventListener('input', function () {\n          applyRangeQuantity(rangeNumberInput.value, true);\n        });\n        var handleRangeNumberCommit = function () {\n          if (!text(rangeNumberInput.value)) return;\n          applyRangeQuantity(rangeNumberInput.value);\n        };\n        rangeNumberInput.addEventListener('change', handleRangeNumberCommit);\n        rangeNumberInput.addEventListener('blur', handleRangeNumberCommit);\n        rangeNumberInput.addEventListener('keydown', function (event) {\n          if (event.key === 'Enter') { event.preventDefault(); handleRangeNumberCommit(); }\n        });\n      }\n      rangeDecrement.addEventListener('click', function () {\n        var bounds = buildQuantityPricingContext(store, store.state.quantity).bounds;\n        applyRangeQuantity(Number(store.state.quantity) - bounds.step);\n      });\n      rangeIncrement.addEventListener('click', function () {\n        var bounds = buildQuantityPricingContext(store, store.state.quantity).bounds;\n        applyRangeQuantity(Number(store.state.quantity) + bounds.step);\n      });\n      return;\n    }\n\n    if (quantityMode === 'eddmRoutes') {\n      var eddm = ensureEddmState(store);\n      var selectedAddressCount = getEddmSelectedAddressCount(store);\n      // EDDM-ROUTE-MIN-ALIGN: the quantity the page prices (the configured\n      // minimum for fewer addresses) beside that minimum, in the range input's\n      // plain \"(N min.)\" meta, shown before routes as well.\n      var routeQuantityMinimum = getConfiguredQuantityMinimum(store);\n      var minimumDate = getEddmMinimumTargetDate();\n      var dateValue = text(eddm.targetInMailboxDate) || minimumDate;\n      var dateInputId = 'bg-designer-eddm-date-' + escapeHtml(store.config.handle);\n      var errorMarkup = text(eddm.launchError)\n        ? '<p class=\"bg-designer-storefront__quantity-warning\" data-bg-eddm-error>' + escapeHtml(eddm.launchError) + '</p>'\n        : '';\n      var statusMarkup = text(eddm.launchStatus)\n        ? '<p class=\"bg-designer-storefront__quantity-note\" data-bg-eddm-status>' + escapeHtml(eddm.launchStatus) + '</p>'\n        : '';\n      blocks.quantity.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__quantity-section bg-designer-storefront__eddm-section\" id=\"quantity\" data-bg-quantity-group>' +\n          '<h3 class=\"bg-designer-storefront__section-label\">Quantity</h3>' +\n          '<div class=\"bg-designer-storefront__quantity-mode bg-designer-storefront__quantity-mode--eddm\">' +\n            '<div class=\"bg-designer-storefront__eddm-controls\">' +\n              '<div class=\"bg-designer-storefront__quantity-range-row\">' +\n                '<label class=\"bg-designer-storefront__quantity-input-label\" for=\"bg-designer-eddm-quantity-' + escapeHtml(store.config.handle) + '\">Quantity from selected routes' +\n                  (routeQuantityMinimum > 1 ? '<span class=\"bg-designer-storefront__quantity-meta\">(' + escapeHtml(String(routeQuantityMinimum)) + ' min.)</span>' : '') + '</label>' +\n                '<input class=\"bg-designer-storefront__quantity-number bg-designer-storefront__quantity-number--readonly\" id=\"bg-designer-eddm-quantity-' + escapeHtml(store.config.handle) + '\" type=\"number\" readonly value=\"' + escapeHtml(String(selectedAddressCount > 0 ? quantityContext.displayQuantity : 0)) + '\" data-bg-eddm-quantity>' +\n              '</div>' +\n              '<div class=\"bg-designer-storefront__eddm-date-row\">' +\n                '<label class=\"bg-designer-storefront__quantity-input-label\" for=\"' + dateInputId + '\">Target in-mailbox date</label>' +\n                '<input class=\"bg-designer-storefront__select bg-designer-storefront__eddm-date-input\" id=\"' + dateInputId + '\" type=\"date\" min=\"' + escapeHtml(minimumDate) + '\" value=\"' + escapeHtml(dateValue) + '\" data-bg-eddm-target-date>' +\n              '</div>' +\n              '<div class=\"bg-designer-storefront__eddm-flags\">' +\n                '<label class=\"bg-designer-storefront__eddm-flag\"><input type=\"checkbox\" data-bg-eddm-flag=\"residentialOnly\"' + (eddm.residentialOnly ? ' checked' : '') + '> Residential only</label>' +\n                '<label class=\"bg-designer-storefront__eddm-flag\"><input type=\"checkbox\" data-bg-eddm-flag=\"politicalMailer\"' + (eddm.politicalMailer ? ' checked' : '') + '> Political mailer</label>' +\n              '</div>' +\n              '<button type=\"button\" class=\"button button--secondary bg-designer-storefront__eddm-launch\" data-bg-eddm-launch>Select EDDM Routes</button>' +\n            '</div>' +\n            buildEddmRouteSummaryMarkup(store) +\n            statusMarkup +\n            errorMarkup +\n            '<div data-bg-quantity-range-table>' + buildQuantityRangeTableMarkup(store, quantityContext, { clickable: false }) + '</div>' +\n          '</div>' +\n        '</section>';\n      var eddmDateInput = blocks.quantity.querySelector('[data-bg-eddm-target-date]');\n      var eddmLaunchButton = blocks.quantity.querySelector('[data-bg-eddm-launch]');\n      if (eddmDateInput) {\n        eddmDateInput.addEventListener('change', function () {\n          var nextDate = text(eddmDateInput.value);\n          var minDate = getEddmMinimumTargetDate();\n          ensureEddmState(store).targetInMailboxDate = isDateOnOrAfter(nextDate, minDate) ? nextDate : minDate;\n          store.eddmDateMoved = null;\n          refreshEddmProductSurface(store);\n        });\n      }\n      Array.prototype.slice.call(blocks.quantity.querySelectorAll('[data-bg-eddm-flag]')).forEach(function (input) {\n        input.addEventListener('change', function () {\n          updateEddmFlagState(store, text(input.getAttribute('data-bg-eddm-flag')), input.checked);\n        });\n      });\n      if (eddmLaunchButton) {\n        eddmLaunchButton.addEventListener('click', function () {\n          void launchEddmMapper(store);\n        });\n      }\n      return;\n    }\n\n    if (quantityMode === 'promoSlider') {\n      var numberId = 'bg-designer-quantity-input-' + escapeHtml(store.config.handle);\n      blocks.quantity.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__quantity-section\" id=\"quantity\" data-bg-quantity-group>' +\n          '<h3 class=\"bg-designer-storefront__section-label\">Quantity</h3>' +\n          '<div class=\"bg-designer-storefront__quantity-mode bg-designer-storefront__quantity-mode--slider\">' +\n            '<div class=\"bg-designer-storefront__quantity-range-row\">' +\n              '<input class=\"bg-designer-storefront__quantity-number\" id=\"' + numberId + '\" type=\"number\" inputmode=\"numeric\" min=\"' + escapeHtml(String(quantityContext.bounds.min)) + '\" max=\"' + escapeHtml(String(quantityContext.bounds.max)) + '\" step=\"' + escapeHtml(String(quantityContext.bounds.step)) + '\" value=\"' + escapeHtml(String(quantityContext.displayQuantity)) + '\" data-bg-quantity-number aria-label=\"Quantity\">' +\n            '</div>' +\n            '<div class=\"bg-designer-storefront__quantity-slider-shell\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__quantity-stepper\" data-bg-quantity-stepper=\"decrement\" aria-label=\"Decrease quantity\">-</button>' +\n              '<input class=\"bg-designer-storefront__quantity-range\" type=\"range\" min=\"' + escapeHtml(String(quantityContext.bounds.min)) + '\" max=\"' + escapeHtml(String(quantityContext.bounds.max)) + '\" step=\"' + escapeHtml(String(quantityContext.bounds.step)) + '\" value=\"' + escapeHtml(String(quantityContext.displayQuantity)) + '\" data-bg-quantity-range>' +\n              '<button type=\"button\" class=\"bg-designer-storefront__quantity-stepper\" data-bg-quantity-stepper=\"increment\" aria-label=\"Increase quantity\">+</button>' +\n            '</div>' +\n            '<div data-bg-quantity-range-table>' + buildQuantityRangeTableMarkup(store, quantityContext, { clickable: true }) + '</div>' +\n          '</div>' +\n        '</section>';\n      var sliderInput = blocks.quantity.querySelector('[data-bg-quantity-range]');\n      var numberInput = blocks.quantity.querySelector('[data-bg-quantity-number]');\n      var decrementButton = blocks.quantity.querySelector('[data-bg-quantity-stepper=\"decrement\"]');\n      var incrementButton = blocks.quantity.querySelector('[data-bg-quantity-stepper=\"increment\"]');\n      var applySliderQuantity = function (nextValue) {\n        store.state.quantityDropdownOpen = false;\n        store.state.quantity = shouldLockQuantityToPricingOptions(store, quantityMode)\n          ? snapQuantityToPriceOption(options, clampQuantityToBounds(nextValue, quantityContext.bounds))\n          : clampQuantityToBounds(nextValue, quantityContext.bounds);\n        store.state.typedQuantity = store.state.quantity;\n        emitStorefrontEvent(store, 'quantity_changed', 'quantity', {\n          mode: quantityMode,\n          quantity: Number(store.state.quantity) || 0\n        }, 'low');\n        recalculate(store);\n        if (sliderInput) sliderInput.value = String(store.state.quantity);\n        if (numberInput) numberInput.value = String(store.state.quantity);\n        syncQuantityModePresentation(store, blocks.quantity, {\n          clickableRows: true,\n          onSelectQuantity: applySliderQuantity\n        });\n        renderSummary(store);\n        renderCtaMeta(store);\n        syncFormState(store);\n        syncSubmitButton(store);\n        scheduleDesignerUrlStateSync(store);\n      };\n      syncQuantityModePresentation(store, blocks.quantity, {\n        clickableRows: true,\n        onSelectQuantity: applySliderQuantity\n      });\n      if (sliderInput) {\n        sliderInput.addEventListener('input', function () {\n          applySliderQuantity(sliderInput.value);\n        });\n      }\n      if (numberInput) {\n        var handleSliderNumberCommit = function () {\n          if (!text(numberInput.value)) return;\n          applySliderQuantity(numberInput.value);\n        };\n        numberInput.addEventListener('change', handleSliderNumberCommit);\n        numberInput.addEventListener('blur', handleSliderNumberCommit);\n      }\n      if (decrementButton) {\n        decrementButton.addEventListener('click', function () {\n          var currentQuantity = numberValue(store && store.state && store.state.quantity, quantityContext.displayQuantity);\n          applySliderQuantity(shouldLockQuantityToPricingOptions(store, quantityMode)\n            ? getAdjacentQuantityOption(options, currentQuantity, -1)\n            : currentQuantity - quantityContext.bounds.step);\n        });\n      }\n      if (incrementButton) {\n        incrementButton.addEventListener('click', function () {\n          var currentQuantity = numberValue(store && store.state && store.state.quantity, quantityContext.displayQuantity);\n          applySliderQuantity(shouldLockQuantityToPricingOptions(store, quantityMode)\n            ? getAdjacentQuantityOption(options, currentQuantity, 1)\n            : currentQuantity + quantityContext.bounds.step);\n        });\n      }\n      return;\n    }\n\n    if (quantityMode === 'apparelMatrix') {\n      var apparelConfig = getApparelConfig(store);\n      var apparelSizes = normalizeApparelSizesState(store.state.apparelSizes, apparelConfig);\n      var minQty = normalizePositiveInteger(numberValue(apparelConfig && apparelConfig.minQty, 1), 1);\n      var totalPieces = sumApparelSizes(apparelSizes);\n      var includedSizeSurcharges = canDeferChannelSizes(store);\n      var deferredSizes = totalPieces === 0 && includedSizeSurcharges;\n      var availableApparelSizes = Array.isArray(apparelConfig && apparelConfig.availableSizes)\n        ? apparelConfig.availableSizes.map(text).filter(Boolean)\n        : [];\n      var standardApparelSizes = availableApparelSizes.filter(function (size) {\n        return !isTallApparelSize(size);\n      });\n      var tallApparelSizes = availableApparelSizes.filter(isTallApparelSize);\n      var hasTallApparelSizes = tallApparelSizes.length > 0;\n      var hasSelectedTallSizes = tallApparelSizes.some(function (size) {\n        return Math.max(0, parseInt(apparelSizes[size], 10) || 0) > 0;\n      });\n      var tallSizesExpanded = !standardApparelSizes.length\n        || !!store.state.apparelTallSizesExpanded\n        || (!store.state.apparelTallSizesUserToggled && hasSelectedTallSizes);\n      var tallGridId = 'bg-designer-apparel-tall-' + text(store.config.handle || 'sizes').replace(/[^a-z0-9_-]+/gi, '-');\n      var renderApparelCell = function (size, modifierClass) {\n        var surcharge = roundMoney(numberValue(apparelConfig && apparelConfig.sizeSurcharges && apparelConfig.sizeSurcharges[size], 0));\n        var currentValue = Math.max(0, parseInt(apparelSizes[size], 10) || 0);\n        var cellClass = 'bg-designer-storefront__apparel-cell' + (modifierClass ? ' ' + modifierClass : '');\n        return '' +\n          '<div class=\"' + escapeHtml(cellClass) + '\">' +\n            '<div class=\"bg-designer-storefront__apparel-header\">' +\n              '<span class=\"bg-designer-storefront__apparel-size\">' + escapeHtml(size) + '</span>' +\n              (surcharge > 0 ? '<span class=\"bg-designer-storefront__apparel-surcharge\">' + (includedSizeSurcharges ? 'Included in package' : '+' + escapeHtml(core.formatMoney(surcharge)) + '/ea') + '</span>' : '') +\n            '</div>' +\n            '<div class=\"bg-designer-storefront__apparel-stepper\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__apparel-button\" data-bg-apparel-step data-size=\"' + escapeHtml(size) + '\" data-delta=\"-1\" aria-label=\"Decrease ' + escapeHtml(size) + ' quantity\">-</button>' +\n              '<input class=\"bg-designer-storefront__apparel-input\" type=\"number\" min=\"0\" step=\"1\" value=\"' + escapeHtml(String(currentValue)) + '\" data-bg-apparel-input data-size=\"' + escapeHtml(size) + '\" aria-label=\"' + escapeHtml(size) + ' quantity\">' +\n              '<button type=\"button\" class=\"bg-designer-storefront__apparel-button\" data-bg-apparel-step data-size=\"' + escapeHtml(size) + '\" data-delta=\"1\" aria-label=\"Increase ' + escapeHtml(size) + ' quantity\">+</button>' +\n            '</div>' +\n          '</div>';\n      };\n      var warningText = deferredSizes ? '' : getApparelQuantityWarningText(store, totalPieces, minQty);\n      blocks.quantity.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__quantity-section\" id=\"quantity\" data-bg-quantity-group>' +\n          '<h3 class=\"bg-designer-storefront__section-label\">Quantity</h3>' +\n          '<div class=\"bg-designer-storefront__quantity-mode bg-designer-storefront__quantity-mode--apparel\">' +\n            '<div class=\"bg-designer-storefront__quantity-range-row\">' +\n              '<label class=\"bg-designer-storefront__quantity-input-label\" for=\"bg-designer-apparel-total-' + escapeHtml(store.config.handle) + '\">Total Pieces <span class=\"bg-designer-storefront__quantity-meta\">(' + escapeHtml(String(minQty)) + ' min.)</span></label>' +\n              '<input class=\"bg-designer-storefront__quantity-number bg-designer-storefront__quantity-number--readonly\" id=\"bg-designer-apparel-total-' + escapeHtml(store.config.handle) + '\" type=\"number\" readonly data-bg-apparel-total value=\"' + escapeHtml(String(deferredSizes ? store.state.quantity : totalPieces)) + '\">' +\n            '</div>' +\n            '<p class=\"bg-designer-storefront__quantity-note\" data-bg-channel-size-note' + (deferredSizes ? '' : ' hidden') + '>' + (deferredSizes ? escapeHtml(String(store.state.quantity)) + ' pieces. Sizes collected after checkout.' : '') + '</p>' +\n            (standardApparelSizes.length\n              ? '<div class=\"bg-designer-storefront__apparel-grid bg-designer-storefront__apparel-grid--standard\">' + standardApparelSizes.map(function (size) {\n                  return renderApparelCell(size, '');\n                }).join('') + '</div>'\n              : '') +\n            (hasTallApparelSizes\n              ? '<div class=\"bg-designer-storefront__apparel-tall-toggle-row\">' +\n                  '<button type=\"button\" class=\"bg-designer-storefront__apparel-tall-toggle\" data-bg-apparel-toggle-tall aria-expanded=\"' + (tallSizesExpanded ? 'true' : 'false') + '\" aria-controls=\"' + escapeHtml(tallGridId) + '\">' +\n                    (tallSizesExpanded ? 'Hide Tall Sizes' : 'Show Tall Sizes') +\n                  '</button>' +\n                '</div>' +\n                '<div class=\"bg-designer-storefront__apparel-grid bg-designer-storefront__apparel-grid--tall\" id=\"' + escapeHtml(tallGridId) + '\"' + (tallSizesExpanded ? '' : ' hidden') + '>' +\n                  tallApparelSizes.map(function (size) {\n                    return renderApparelCell(size, 'bg-designer-storefront__apparel-cell--tall');\n                  }).join('') +\n                '</div>'\n              : '') +\n            '<p class=\"bg-designer-storefront__quantity-warning\"' + (warningText ? '' : ' hidden') + ' data-bg-quantity-warning>' + escapeHtml(warningText) + '</p>' +\n            '<div data-bg-quantity-range-table>' + buildQuantityRangeTableMarkup(store, quantityContext, { clickable: false }) + '</div>' +\n          '</div>' +\n        '</section>';\n      var commitApparelSizes = function (size, nextValue) {\n        var nextSizes = normalizeApparelSizesState(store.state.apparelSizes, apparelConfig);\n        var quantity = Math.max(0, parseInt(nextValue, 10) || 0);\n        if (quantity > 0) {\n          nextSizes[size] = quantity;\n        } else {\n          delete nextSizes[size];\n        }\n        store.state.quantityDropdownOpen = false;\n        store.state.apparelSizes = nextSizes;\n        store.state.apparelSizesInitialized = true;\n        store.state.quantity = sumApparelSizes(nextSizes);\n        emitStorefrontEvent(store, 'quantity_changed', 'quantity', {\n          mode: quantityMode,\n          quantity: Number(store.state.quantity) || 0,\n          size: text(size)\n        }, 'low');\n        recalculate(store);\n        render(store);\n      };\n      Array.prototype.slice.call(blocks.quantity.querySelectorAll('[data-bg-apparel-step]')).forEach(function (button) {\n        button.addEventListener('click', function () {\n          var size = text(button.getAttribute('data-size'));\n          var delta = parseInt(button.getAttribute('data-delta'), 10) || 0;\n          var currentValue = Math.max(0, parseInt(apparelSizes[size], 10) || 0);\n          commitApparelSizes(size, Math.max(0, currentValue + delta));\n        });\n      });\n      Array.prototype.slice.call(blocks.quantity.querySelectorAll('[data-bg-apparel-input]')).forEach(function (input) {\n        var commitInput = function () {\n          commitApparelSizes(text(input.getAttribute('data-size')), input.value);\n        };\n        input.addEventListener('change', commitInput);\n        input.addEventListener('blur', commitInput);\n      });\n      var tallToggle = blocks.quantity.querySelector('[data-bg-apparel-toggle-tall]');\n      if (tallToggle) {\n        tallToggle.addEventListener('click', function () {\n          store.state.apparelTallSizesExpanded = !tallSizesExpanded;\n          store.state.apparelTallSizesUserToggled = true;\n          render(store);\n        });\n      }\n      return;\n    }\n\n    // Buttons win over the guided forced direct table: the tile row is its\n    // own always-open presentation.\n    var useQuantityButtons = configuredQuantityFieldType === 'buttons';\n    var useDirectPricingTable = !useQuantityButtons && (configuredQuantityFieldType === 'pricing_table'\n      || getProductFormPresentation(store) === 'guided');\n    var dropdownOpen = !useDirectPricingTable && !useQuantityButtons && !!store.state.quantityDropdownOpen;\n    if (document.body) {\n      document.body.classList.toggle(\n        'bg-designer-quantity-menu--open',\n        dropdownOpen && getProductFormPresentation(store) === 'guided'\n      );\n    }\n    var quantityDisplayTotal = numberValue(pricePresentation.quantityTotal, numberValue(pricePresentation.total, NaN));\n    var quantityDisplayCompare = numberValue(pricePresentation.quantityCompareTotal, numberValue(pricePresentation.compareTotal, NaN));\n    if (!Number.isFinite(quantityDisplayTotal) || (Math.abs(quantityDisplayTotal) < 0.01 && numberValue(pricePresentation.currentPerPiece, 0) > 0.01)) {\n      quantityDisplayTotal = roundMoney(numberValue(pricePresentation.currentPerPiece, 0) * Math.max(1, numberValue(store.state.quantity, 1)));\n    }\n    if (!Number.isFinite(quantityDisplayCompare) || (quantityDisplayCompare < quantityDisplayTotal - 0.01 && numberValue(pricePresentation.comparePerPiece, 0) > 0.01)) {\n      quantityDisplayCompare = roundMoney(numberValue(pricePresentation.comparePerPiece, 0) * Math.max(1, numberValue(store.state.quantity, 1)));\n    }\n    var summaryMarkup = [\n      '<span class=\"bg-designer-storefront__quantity-toggle-title\">' + escapeHtml(String(store.state.quantity || '')) + '</span>',\n      '<span class=\"bg-designer-storefront__quantity-toggle-price\">' + buildShownSummaryMoneyMarkup(quantityDisplayTotal, quantityDisplayCompare) + '</span>',\n      '<span class=\"bg-designer-storefront__quantity-toggle-unit\">(' + escapeHtml(formatShownMoney(pricePresentation.currentPerPiece)) + ' per ' + escapeHtml(getQuantityPerUnitLabel(store)) + ')</span>'\n    ].join('');\n    var quantityPanelId = 'bg-designer-quantity-options-' + core.slugify(text(store.config.handle) || 'product');\n    // BD-NO-ROW-ZERO-PRICE: no money is read out for a choice no row prices\n    // (the stylesheet hides the shown amounts without moving the layout).\n    var showQuantityMoney = !showsNoPriceRow(store);\n    var quantityToggleLabel = 'Quantity: ' + String(store.state.quantity || '') + (showQuantityMoney\n      ? ', ' + formatShownMoney(quantityDisplayTotal) + ' total, ' + formatShownMoney(pricePresentation.currentPerPiece) + ' per ' + getQuantityPerUnitLabel(store)\n      : '');\n    var activeProductFormPresentation = getProductFormPresentation(store);\n    var useGuidedExactPricingTable = useDirectPricingTable && activeProductFormPresentation === 'guided';\n    var quantityPanelMarkup = useQuantityButtons\n      ? buildQuantityButtonsMarkup(store, quantityContext, options)\n      : useDirectPricingTable\n      ? buildQuantityRangeTableMarkup(store, quantityContext, {\n          clickable: true,\n          discreteOptions: true,\n          guidedExactTable: useGuidedExactPricingTable,\n          hideHeader: useGuidedExactPricingTable\n        })\n      : options.map(function (value, index) {\n          var rowPresentation = shownPrice(getPricePresentationForQuantity(store, value));\n          return '' +\n            '<div class=\"bg-designer-storefront__quantity-row\">' +\n              '<input type=\"radio\" class=\"bg-designer-storefront__quantity-radio\" name=\"calc-quantity-' + escapeHtml(store.config.handle) + '\" id=\"qtyDropdown_' + escapeHtml(store.config.handle) + '_' + escapeHtml(String(value)) + '_' + index + '\" value=\"' + escapeHtml(String(value)) + '\" aria-label=\"' + escapeHtml(String(value) + ' ' + getIntentFirstUnitNoun(store, value) + (showQuantityMoney ? ', ' + formatShownMoney(rowPresentation.total) + ' total, ' + formatShownMoney(rowPresentation.currentPerPiece) + ' per ' + getQuantityPerUnitLabel(store) : '')) + '\"' + (Number(store.state.quantity) === Number(value) ? ' checked' : '') + ' data-bg-quantity-option>' +\n              '<label class=\"bg-designer-storefront__quantity-option\" for=\"qtyDropdown_' + escapeHtml(store.config.handle) + '_' + escapeHtml(String(value)) + '_' + index + '\">' +\n                '<span class=\"bg-designer-storefront__quantity-option-title\">' + escapeHtml(String(value)) + '</span>' +\n                '<span class=\"bg-designer-storefront__quantity-option-price\">' +\n                  buildShownSummaryMoneyMarkup(rowPresentation.total, rowPresentation.compareTotal) +\n                  '&nbsp;<span class=\"bg-designer-storefront__quantity-option-unit\">(' + escapeHtml(formatShownMoney(rowPresentation.currentPerPiece)) + ' per ' + escapeHtml(getQuantityPerUnitLabel(store)) + ')</span>' +\n                '</span>' +\n              '</label>' +\n            '</div>';\n        }).join('');\n    var quantityControlMarkup = useQuantityButtons\n      ? '<div class=\"bg-designer-storefront__quantity-buttons\" id=\"' + escapeHtml(quantityPanelId) + '\" data-bg-quantity-options role=\"radiogroup\" aria-label=\"Quantity options\">' +\n          quantityPanelMarkup +\n        '</div>'\n      : useDirectPricingTable\n      ? '<div class=\"bg-designer-storefront__quantity-panel bg-designer-storefront__quantity-panel--table bg-designer-storefront__quantity-panel--direct' + (useGuidedExactPricingTable ? ' bg-designer-storefront__quantity-panel--guided-exact' : '') + '\" id=\"' + escapeHtml(quantityPanelId) + '\" data-bg-quantity-options role=\"radiogroup\" aria-label=\"Quantity options\">' +\n          quantityPanelMarkup +\n        '</div>'\n      : '<div class=\"bg-designer-storefront__quantity-dropdown' + (dropdownOpen ? ' is-open' : '') + '\" data-bg-quantity-dropdown>' +\n          '<button type=\"button\" class=\"bg-designer-storefront__quantity-toggle\" data-bg-quantity-toggle aria-expanded=\"' + (dropdownOpen ? 'true' : 'false') + '\" aria-controls=\"' + escapeHtml(quantityPanelId) + '\" aria-label=\"' + escapeHtml(quantityToggleLabel) + '\">' +\n            '<span class=\"bg-designer-storefront__quantity-toggle-value\">' + summaryMarkup + '</span>' +\n            '<span class=\"bg-designer-storefront__quantity-toggle-caret\" aria-hidden=\"true\">\u2304</span>' +\n          '</button>' +\n          '<div class=\"bg-designer-storefront__quantity-panel\" id=\"' + escapeHtml(quantityPanelId) + '\" data-bg-quantity-options role=\"radiogroup\" aria-label=\"Quantity options\" style=\"display: ' + (dropdownOpen ? 'block' : 'none') + ';\">' +\n            quantityPanelMarkup +\n          '</div>' +\n        '</div>';\n    // Per-product guided opt-in: the quantity buttons share one row with the\n    // Quantity step label, reusing the inline-label step layout options use.\n    var quantityLabelInline = useQuantityButtons\n      && activeProductFormPresentation === 'guided'\n      && readGuidedPresentationSettings(store).quantityLabelInline === true;\n    blocks.quantity.innerHTML = '' +\n      '<section class=\"bg-designer-storefront__section bg-designer-storefront__quantity-section' + (quantityLabelInline ? ' bg-designer-storefront__option-section--inline-label' : '') + '\" id=\"quantity\" data-bg-quantity-group>' +\n        '<h3 class=\"bg-designer-storefront__section-label\">Quantity</h3>' +\n        quantityControlMarkup +\n        '<div class=\"bg-designer-storefront__field-row bg-designer-storefront__field-row--sr-only\">' +\n          '<select class=\"bg-designer-storefront__select\" id=\"bg-designer-quantity-' + escapeHtml(store.config.handle) + '\" data-bg-quantity-select tabindex=\"-1\" aria-hidden=\"true\" aria-label=\"Quantity\">' +\n            options.map(function (value) {\n              return '<option value=\"' + value + '\"' + (Number(store.state.quantity) === Number(value) ? ' selected' : '') + '>' + value + '</option>';\n            }).join('') +\n          '</select>' +\n        '</div>' +\n      '</section>';\n    var select = blocks.quantity.querySelector('[data-bg-quantity-select]');\n    var toggle = blocks.quantity.querySelector('[data-bg-quantity-toggle]');\n    var selectQuantityOption = function (nextQuantity) {\n      store.state.quantityDropdownOpen = false;\n      store.state.quantity = Number(nextQuantity || 0);\n      emitStorefrontEvent(store, 'quantity_changed', 'quantity', {\n        mode: quantityMode,\n        quantity: Number(store.state.quantity) || 0\n      }, 'low');\n      recalculate(store);\n      render(store);\n    };\n    if (toggle) {\n      toggle.addEventListener('click', function (event) {\n        if (event && typeof event.stopPropagation === 'function') event.stopPropagation();\n        store.state.quantityDropdownOpen = !store.state.quantityDropdownOpen;\n        renderQuantity(store);\n        syncStickyPurchaseBar(store);\n      });\n    }\n    Array.prototype.slice.call(blocks.quantity.querySelectorAll('[data-bg-quantity-option]')).forEach(function (input) {\n      input.addEventListener('change', function () {\n        selectQuantityOption(input.value);\n      });\n    });\n    Array.prototype.slice.call(blocks.quantity.querySelectorAll('[data-bg-quantity-row-target]')).forEach(function (row) {\n      var selectRowQuantity = function () {\n        selectQuantityOption(row.getAttribute('data-bg-quantity-row-target'));\n      };\n      row.addEventListener('click', selectRowQuantity);\n      row.addEventListener('keydown', function (event) {\n        if (!event || (event.key !== 'Enter' && event.key !== ' ')) return;\n        event.preventDefault();\n        selectRowQuantity();\n      });\n    });\n    if (select) {\n      select.addEventListener('change', function () {\n        selectQuantityOption(select.value);\n      });\n    }\n    bindQuantityRowsToggleControls(store, blocks.quantity);\n    syncStickyPurchaseBar(store);\n  }\n\n  function buildSummaryAddOnRowsMarkup(store, discountPct) {\n    var optionAddOnRows = getSelectedAddOnSummaryRows(store);\n    var sizeSurchargeRows = getSizeSurchargeSummaryRows(store);\n    var artworkRows = getArtworkSummaryRows(store);\n    return optionAddOnRows.concat(sizeSurchargeRows, artworkRows).map(function (row) {\n      var rawAmount = roundMoney(numberValue(row.amount, 0));\n      var compareAmount = roundMoney(numberValue(row.compareAmount, NaN));\n      var shouldDiscountRow = !!row.discountEligible && row.cartIncluded !== false && !row.excludeFromCart && !row.isPostage;\n      var displayAmount = shouldDiscountRow ? applyDisplayDiscount(rawAmount, discountPct) : rawAmount;\n      var hasCompareDeal = Number.isFinite(compareAmount) && compareAmount > displayAmount + 0.01;\n      if (Math.abs(rawAmount) < 0.01 && !hasCompareDeal) return '';\n      var amountMarkup = hasCompareDeal\n        ? buildDealMoneyMarkup(displayAmount, compareAmount, { freeLabel: row.isFree ? 'FREE' : '' })\n        : shouldDiscountRow && discountPct > 0 && rawAmount > displayAmount + 0.01\n          ? buildSummaryMoneyMarkup(displayAmount, rawAmount)\n          : escapeHtml(formatSignedMoney(displayAmount));\n      return '' +\n        '<tr class=\"addon-row' + (row.isNegative ? ' addon-row--negative' : '') + '\">' +\n          '<td class=\"addon-header\">' + escapeHtml(text(row.label)) + ':</td>' +\n          '<td class=\"addon-amount\">' + amountMarkup + '</td>' +\n        '</tr>';\n    }).join('');\n  }\n\n  function getPostageSummaryTotal(store) {\n    return roundMoney(getSelectedAddOnSummaryRows(store).reduce(function (total, row) {\n      if (!row || !row.isPostage) return total;\n      return total + roundMoney(numberValue(row.amount, 0));\n    }, 0));\n  }\n\n  // BD-NO-ROW-ZERO-PRICE: the price box of a choice no price row prices\n  // keeps the configuration summary and says one sentence instead of money.\n  function buildNoPriceRowSummaryMarkup(store) {\n    var isGuided = getProductFormPresentation(store) === 'guided';\n    var configurationSummaryMarkup = isGuided\n      ? buildGuidedSummaryContextMarkup(store, null)\n      : buildCompactConfigurationSummaryMarkup(store, false);\n    return '' +\n      '<section class=\"bg-designer-storefront__section bg-designer-storefront__summary-shell bg-designer-storefront__summary-card bg-designer-storefront__summary-card--final' + (isGuided ? ' bg-designer-storefront__summary-card--guided' : '') + ' bg-designer-storefront__summary-card--simple bg-designer-storefront__summary-card--no-price\" id=\"priceSummary\"' + (isGuided ? ' aria-label=\"Order summary\"' : '') + '>' +\n        '<div class=\"bg-designer-storefront__summary-selection\">' +\n          '<div class=\"bg-designer-storefront__summary-selection-copy\">' + configurationSummaryMarkup + '</div>' +\n        '</div>' +\n        '<p class=\"bg-designer-storefront__summary-no-price\" role=\"status\">' + escapeHtml(NO_PRICE_ROW_MESSAGE) + '</p>' +\n      '</section>';\n  }\n\n  function buildFinalSummaryMarkup(store) {\n    if (showsNoPriceRow(store)) return buildNoPriceRowSummaryMarkup(store);\n    var pricePresentation = getPricePresentation(store);\n    // FUNCTIONS-CURRENCY-AWARE: the line's figures as shown; the add-on rows\n    // and the base product are amounts of one thing (core.formatMoney).\n    var shown = shownPrice(pricePresentation);\n    var priceRecord = getCurrentPriceRecord(store);\n    var isGuided = getProductFormPresentation(store) === 'guided';\n    // EDDM-ROUTE-STEP: no price, and no quantity token, for a quantity the\n    // shopper has not chosen; one row asks for routes instead.\n    var routesPending = isEddmRouteQuantityPending(store);\n    var baseProductAmount = roundMoney(numberValue(store && store.state && store.state.price, numberValue(priceRecord && priceRecord.price, 0)));\n    var discountPct = pricePresentation.discountPct;\n    var displayBaseProductAmount = applyDisplayDiscount(baseProductAmount, discountPct);\n    var nativePackage = getChannelPurchase(store).pricingMode === 'native';\n    var productMarkup = nativePackage\n      ? buildShownSummaryMoneyMarkup(shown.total, discountPct > 0 ? shown.compareTotal : NaN)\n      : buildSummaryMoneyMarkup(displayBaseProductAmount, discountPct > 0 ? baseProductAmount : NaN);\n    var extraRowsMarkup = nativePackage || routesPending ? '' : buildSummaryAddOnRowsMarkup(store, discountPct);\n    var postageSummaryTotal = getPostageSummaryTotal(store);\n    var hasSeparatePostage = postageSummaryTotal > 0.005;\n    // Savings is informational, not a line item. Every priced row above already\n    // shows its own discounted amount, so subtracting the saving again inside the\n    // table made the column stop summing to the total. Render it under the total.\n    var hasSavings = !routesPending && shown.savings > 0.01;\n    var summarySaleNote = routesPending ? '' : getSummarySalePendingNote(store);\n    var savingsNoteMarkup = summarySaleNote\n      ? '<p class=\"bg-designer-storefront__summary-savings is-sale-pending\" role=\"status\">' + escapeHtml(summarySaleNote) + '</p>'\n      : (hasSavings\n        ? '<p class=\"bg-designer-storefront__summary-savings\">You saved ' + escapeHtml(formatShownMoney(shown.savings)) + '</p>'\n        : '');\n    var artworkDelayNoteMarkup = isGuided && text(store && store.state && store.state.artworkPrimaryChoice) === 'send-later'\n      ? '<p class=\"bg-designer-storefront__summary-artwork-delay\"><span aria-hidden=\"true\">i</span><span>Sale pricing is held for 10 business days after purchase while your artwork is finalized.</span></p>'\n      : '';\n    var unbeatableRow = !routesPending && pricePresentation.hasUnbeatablePrice\n      ? '<tr class=\"unbeatable-price-row\"><td colspan=\"2\"><span class=\"unbeatable-price-pill\">Unbeatable Price</span><span class=\"unbeatable-price-note\">Locked in. No promo codes needed.</span></td></tr>'\n      : '';\n    var hasDetailedRows = isGuided || routesPending || !!(extraRowsMarkup || hasSavings || unbeatableRow);\n    var configurationSummaryMarkup = isGuided\n      ? buildGuidedSummaryContextMarkup(store, priceRecord)\n      : buildCompactConfigurationSummaryMarkup(store, routesPending);\n    var simplePriceMarkup = hasDetailedRows\n      ? ''\n      : '<div class=\"bg-designer-storefront__summary-selection-price\">' + escapeHtml(formatShownMoney(shown.total)) + '</div>';\n    // OD-122: the simple card says the sentence under its price row.\n    var simpleSaleNoteMarkup = !hasDetailedRows && summarySaleNote\n      ? '<p class=\"bg-designer-storefront__summary-savings is-sale-pending\" role=\"status\">' + escapeHtml(summarySaleNote) + '</p>'\n      : '';\n    var totalRowsMarkup = routesPending\n      ? '<tr class=\"' + (isGuided ? '' : 'subtotal-row ') + 'routes-pending-row\"><td class=\"subtotal-header\">Total:</td><td class=\"subtotal-amount\">' + escapeHtml(getGuidedCopy(store, 'stepQuantityRoutesPrompt')) + '</td></tr>'\n      : hasSeparatePostage\n      ? '' +\n        '<tr class=\"subtotal-row subtotal-row--pre-postage\">' +\n          '<td class=\"subtotal-header\">Subtotal:</td>' +\n          '<td class=\"subtotal-amount\">' + buildShownSummaryMoneyMarkup(shown.total, shown.compareTotal) + '</td>' +\n        '</tr>' +\n        '<tr class=\"grand-total-row\">' +\n          '<td class=\"grand-total-header\">Grand Total:</td>' +\n          '<td class=\"grand-total-amount\">' + buildShownSummaryMoneyMarkup(\n            roundMoney(shown.total + presentmentFigure(postageSummaryTotal)),\n            roundMoney(shown.compareTotal + presentmentFigure(postageSummaryTotal))\n          ) + '</td>' +\n        '</tr>' +\n        '<tr class=\"postage-note-row\">' +\n          '<td colspan=\"2\">Postage is shown for planning and will be invoiced separately. It will not be charged in the cart.</td>' +\n        '</tr>'\n      : '' +\n        '<tr class=\"subtotal-row\">' +\n          '<td class=\"subtotal-header\">Total:</td>' +\n          '<td class=\"subtotal-amount\">' + buildShownSummaryMoneyMarkup(shown.total, shown.compareTotal) + '</td>' +\n        '</tr>';\n    var productRowMarkup = routesPending || (isGuided && !extraRowsMarkup) ? '' : (\n      '<tr class=\"product-row\">' +\n        '<td class=\"product-header\">Product:</td>' +\n        '<td class=\"product-amount\">' + productMarkup + '</td>' +\n      '</tr>'\n    );\n    var detailMarkup = hasDetailedRows ? (\n      '<div class=\"bg-designer-storefront__summary-body\">' +\n        '<div class=\"product-price-summary\">' +\n          '<table class=\"price-summary-table\"><tbody>' +\n            productRowMarkup +\n            extraRowsMarkup +\n            unbeatableRow +\n            totalRowsMarkup +\n          '</tbody></table>' +\n          savingsNoteMarkup +\n          artworkDelayNoteMarkup +\n        '</div>' +\n      '</div>'\n    ) : '';\n\n    return '' +\n      '<section class=\"bg-designer-storefront__section bg-designer-storefront__summary-shell bg-designer-storefront__summary-card bg-designer-storefront__summary-card--final' + (isGuided ? ' bg-designer-storefront__summary-card--guided' : '') + (hasDetailedRows ? ' bg-designer-storefront__summary-card--detailed' : ' bg-designer-storefront__summary-card--simple') + '\" id=\"priceSummary\"' + (isGuided ? ' aria-label=\"Order summary\"' : '') + '>' +\n        '<div class=\"bg-designer-storefront__summary-selection\">' +\n          '<div class=\"bg-designer-storefront__summary-selection-copy\">' + configurationSummaryMarkup + '</div>' +\n          simplePriceMarkup +\n        '</div>' +\n        simpleSaleNoteMarkup +\n        detailMarkup +\n        (hasChannelDesignIncluded(store) ? '<p class=\"bg-designer-storefront__summary-artwork-delay\">Free design included. We will contact you after checkout.</p>' : '') +\n      '</section>';\n  }\n\n  function buildGuidedSummaryContextMarkup(store, priceRecord) {\n    var turnaround = getGuidedTurnaroundText(store, priceRecord);\n    // The first part is the quantity (buildCompactConfigurationParts); it is\n    // left out while that quantity waits for routes (EDDM-ROUTE-STEP).\n    var omitQuantity = isEddmRouteQuantityPending(store);\n    var configurationParts = buildCompactConfigurationParts(store).slice(omitQuantity ? 1 : 0);\n    var configurationMarkup = configurationParts.length\n      ? '<div class=\"bg-designer-storefront-guided__summary-configuration\" aria-label=\"Selected order configuration\">' +\n          '<div class=\"bg-designer-storefront-guided__summary-tokens\">' + configurationParts.map(function (part, index) {\n            var label = index === 0 && !omitQuantity ? 'Qty: ' + part : part;\n            return '<span class=\"bg-designer-storefront__summary-token\">' + escapeHtml(label) + '</span>';\n          }).join('') + '</div>' +\n        '</div>'\n      : '';\n    var rows = [];\n    var addRow = function (label, value, className) {\n      if (!text(value)) return;\n      rows.push(\n        '<div class=\"bg-designer-storefront-guided__summary-line' + (className ? ' ' + className : '') + '\">' +\n          '<span>' + escapeHtml(label) + '</span>' +\n          '<strong>' + escapeHtml(value) + '</strong>' +\n        '</div>'\n      );\n    };\n    addRow('Production estimate', turnaround);\n    return (configurationMarkup || rows.length)\n      ? '<div class=\"bg-designer-storefront-guided__summary-context\">' + configurationMarkup + rows.join('') + '</div>'\n      : '';\n  }\n\n  // OD-122 (SALE-DISPLAY-OTHER-SURFACES, 2026-10-06): at 750 px and up the guided page\n  // has no price box (the price line is the phone's), so the sentence goes under the\n  // guided summary card; the stylesheet hides it below 750 px, where the phone price\n  // line already says it. One status node, created once and written only when its text\n  // changes; the card above it is rebuilt on every render, the node is never moved.\n  function readGuidedSummarySaleNote(summaryBlock) {\n    var children = summaryBlock ? summaryBlock.children : [];\n    for (var index = 0; index < children.length; index += 1) {\n      if (children[index].hasAttribute('data-bg-guided-summary-sale-note')) return children[index];\n    }\n    return null;\n  }\n\n  function syncGuidedSummarySaleNote(store, summaryBlock) {\n    var note = readGuidedSummarySaleNote(summaryBlock);\n    var noteText = getProductFormPresentation(store) === 'guided' && !isEddmRouteQuantityPending(store) && !showsNoPriceRow(store)\n      ? getSalePendingNote(store)\n      : '';\n    if (!noteText) {\n      if (note && !note.hidden) note.hidden = true;\n      return;\n    }\n    if (!note) {\n      note = document.createElement('p');\n      note.className = 'bg-designer-storefront-guided__summary-sale-note';\n      note.setAttribute('data-bg-guided-summary-sale-note', '');\n      note.setAttribute('role', 'status');\n      note.textContent = noteText;\n      summaryBlock.appendChild(note);\n    }\n    if (note.textContent !== noteText) note.textContent = noteText;\n    if (note.hidden) note.hidden = false;\n  }\n\n  function renderSummary(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.summary) return;\n    blocks.summary.hidden = false;\n    var guidedSaleNote = readGuidedSummarySaleNote(blocks.summary);\n    if (guidedSaleNote) {\n      Array.prototype.slice.call(blocks.summary.childNodes).forEach(function (child) {\n        if (child !== guidedSaleNote) blocks.summary.removeChild(child);\n      });\n      blocks.summary.insertAdjacentHTML('afterbegin', buildFinalSummaryMarkup(store));\n    } else {\n      blocks.summary.innerHTML = buildFinalSummaryMarkup(store);\n    }\n    syncGuidedSummarySaleNote(store, blocks.summary);\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n  }\n\n  function appendPreviewRefreshToken(url, refreshToken) {\n    var cleanUrl = text(url);\n    if (!cleanUrl) return '';\n    var token = text(refreshToken);\n    if (!token) return cleanUrl;\n    return cleanUrl + (cleanUrl.indexOf('?') === -1 ? '?' : '&') + 'bg_refresh=' + encodeURIComponent(token);\n  }\n\n  function isDirectPitchPrintDesignUrl(url) {\n    var cleanUrl = text(url);\n    if (!cleanUrl) return false;\n    try {\n      var parsed = new URL(cleanUrl, window.location.origin);\n      var host = text(parsed.hostname).toLowerCase();\n      var pathname = text(parsed.pathname).toLowerCase();\n      return (host === 'pitchprint.io' && pathname.indexOf('/designs/') === 0)\n        || (host === 's3-eu-west-1.amazonaws.com' && pathname.indexOf('/pitchprint.io/designs/') === 0);\n    } catch (_) {\n      return /^https?:\\/\\/pitchprint\\.io\\/designs\\//i.test(cleanUrl)\n        || /^https?:\\/\\/s3-eu-west-1\\.amazonaws\\.com\\/pitchprint\\.io\\/designs\\//i.test(cleanUrl);\n    }\n  }\n\n  function firstSafePreviewUrl(values) {\n    var candidates = Array.isArray(values) ? values : [values];\n    for (var index = 0; index < candidates.length; index += 1) {\n      var candidate = text(candidates[index]);\n      if (candidate && !isDirectPitchPrintDesignUrl(candidate)) return candidate;\n    }\n    return '';\n  }\n\n  function resolveSavedProjectPreview(store, template) {\n    var project = store && store.state && store.state.project && typeof store.state.project === 'object'\n      ? store.state.project\n      : {};\n    var previewUrl = text(project.previewUrl);\n    if (!previewUrl) {\n      var previewList = Array.isArray(project.previews) ? project.previews.map(text).filter(Boolean) : [];\n      previewUrl = text(previewList[0]);\n    }\n    var fallbackPreviewUrl = resolveTemplatePreview(template);\n    if (!previewUrl && !isDirectPitchPrintDesignUrl(fallbackPreviewUrl)) previewUrl = fallbackPreviewUrl;\n    if (isDirectPitchPrintDesignUrl(previewUrl)) return '';\n    return appendPreviewRefreshToken(previewUrl, project.refreshToken);\n  }\n\n  function buildSelectedTemplateCard(store, artworkRuleState) {\n    var hasSavedProject = !!text(store.state.project && store.state.project.projectId);\n    if (!store.state.template && !hasSavedProject) return '';\n    artworkRuleState = artworkRuleState || getArtworkRuleState(store);\n    var template = store.state.template || {\n      title: '',\n      designNumber: text(store.state.project && store.state.project.designNumber),\n      backerLabel: ''\n    };\n    var savedDesignName = text(template.title)\n      || text(store.state.project && (store.state.project.title || store.state.project.designName))\n      || (text(store.state.project && store.state.project.designNumber)\n        ? 'Design ' + text(store.state.project.designNumber)\n        : 'Saved design');\n    var previewUrl = hasSavedProject\n      ? resolveSavedProjectPreview(store, template)\n      : getTemplateFrontPreview(template);\n    var backerLabel = text(template.backerLabel || template.backer);\n    var backerMarkup = backerLabel\n      ? '<div class=\"bg-guided-artwork__selected-template-backer\">Backer: ' + escapeHtml(backerLabel) + '</div>'\n      : '';\n    var canChangeBacker = !hasSavedProject && Array.isArray(template.backers) && template.backers.length > 0;\n    var savedDesignHelper = hasSavedProject\n      ? '<div class=\"bg-designer-storefront__saved-design-helper\">Saved and attached to this item. You can reopen it from My Designs.</div>'\n      : '';\n    var inlineDesignApproval = shouldShowPitchPrintDesignApproval(store, artworkRuleState)\n      ? '<div class=\"bg-guided-artwork__design-approval-inline\" data-bg-pitchprint-design-approval>' +\n          '<h5 class=\"bg-guided-artwork__design-approval-title\">Design approval</h5>' +\n          '<ul class=\"bg-guided-artwork__info-list\"><li>Your artwork will be printed exactly as submitted.</li><li>Review text, images, bleed, and safety areas carefully.</li><li>If your design includes a QR code, you are responsible for verifying it works correctly.</li></ul>' +\n          '<div class=\"bg-guided-artwork__design-approval-action\">' + buildArtworkApprovalMarkup(store, artworkRuleState, {\n            embedded: true,\n            suppressCustomDesignApproval: true,\n            suppressDesignApproval: false\n          }) + '</div>' +\n        '</div>'\n      : '';\n    return '' +\n      '<div class=\"bg-guided-artwork__selected-template-card bg-designer-storefront__template-card\">' +\n        (previewUrl ? '<img class=\"bg-guided-artwork__selected-template-thumb bg-designer-storefront__template-preview\" src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(hasSavedProject ? 'Your Design' : template.title) + '\" loading=\"lazy\">' : '') +\n        '<div class=\"bg-guided-artwork__selected-template-copy bg-designer-storefront__template-copy\">' +\n          '<div class=\"bg-guided-artwork__selected-template-name\">' + escapeHtml(hasSavedProject ? savedDesignName : template.title) + '</div>' +\n          backerMarkup +\n          savedDesignHelper +\n        '</div>' +\n        '<div class=\"bg-designer-storefront__template-actions' + (hasSavedProject ? ' bg-designer-storefront__template-actions--stacked' : '') + '\">' +\n          (hasSavedProject ? (\n            '<button type=\"button\" class=\"button button--primary bg-designer-storefront__saved-design-edit-button\" data-bg-artwork-action=\"edit-existing-art\">Edit Design' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</button>' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"clear-design\">Remove from this item</button>'\n          ) : (\n            '<button type=\"button\" class=\"button button--secondary\" data-bg-artwork-action=\"change-template\">Change template</button>' +\n            (canChangeBacker ? '<button type=\"button\" class=\"button button--secondary\" data-bg-artwork-action=\"change-backer\">Change Backer</button>' : '')\n          )) +\n        '</div>' +\n      '</div>' + inlineDesignApproval;\n  }\n\n  function getArtworkIncompleteState(store, availability, templateAvailability) {\n    var primaryChoice = text(store.state.artworkPrimaryChoice);\n    var secondaryChoice = text(store.state.artworkSecondaryChoice);\n    var artworkMode = text(store.state.artworkMode).toLowerCase();\n    var hasPersistedArtworkChoice = !!(artworkMode || secondaryChoice || store.state.template || text(store.state.project && store.state.project.projectId));\n    if (!primaryChoice || (store.guidedArtworkIntentSelected !== true && !hasPersistedArtworkChoice)) {\n      return {\n        key: 'step1',\n        helperText: 'Next: choose an artwork option.',\n        focusAction: 'focus-primary'\n      };\n    }\n    // A restored or newly saved project resolves the artwork method, but an\n    // editor-lane project (design online, or upload on the canvas) whose saved\n    // document holds no artwork still needs the customer back in the editor.\n    // Any provider-specific approval remains a separate purchase requirement.\n    if (text(store.state.project && store.state.project.projectId)) {\n      var emptyEditorDesign = artworkMode === 'designonline'\n        ? !hasSavedProjectArtwork(store)\n        : (artworkMode === 'uploadfiles' && shouldLaunchEditorForArtworkUpload(store) && !isArtworkUploadProvided(store));\n      if (emptyEditorDesign) {\n        return {\n          key: 'empty-design',\n          helperText: 'Add your artwork in the editor, then save.',\n          focusAction: 'focus-editor-launch'\n        };\n      }\n      return null;\n    }\n\n    if (primaryChoice === 'need-design') {\n      if (!secondaryChoice) {\n        return {\n          key: 'step2-need-design',\n          helperText: 'Next: choose a design path.',\n          focusAction: 'focus-secondary-design'\n        };\n      }\n      if (secondaryChoice === 'use-template') {\n        if (!store.state.template) {\n          return {\n            key: 'template-select',\n            helperText: 'Next: choose a template.',\n            focusAction: 'focus-template-browse'\n          };\n        }\n        var hasValidFinishChoice = (\n          (artworkMode === 'designonline' && templateAvailability.designonline) ||\n          (artworkMode === 'editservice' && templateAvailability.editservice)\n        );\n        if (!hasValidFinishChoice) {\n          return {\n            key: 'template-finish',\n            helperText: 'Next: choose how to finish your template.',\n            focusAction: 'focus-template-finish'\n          };\n        }\n        if (artworkMode === 'designonline' && isGuidedFillArmed(store) && !text(store.state.project && store.state.project.projectId)) {\n          var guidedNeed = collectGuidedFillRequests(store);\n          if (!guidedNeed.fills.length || guidedNeed.requiredMissing) {\n            return {\n              key: 'guided-slot-upload',\n              helperText: 'Next: add your image.',\n              focusAction: 'focus-guided-slot-upload'\n            };\n          }\n        }\n      }\n      if (secondaryChoice === 'custom-design' && artworkMode !== 'customdesign') {\n        return {\n          key: 'step2-need-design',\n          helperText: 'Next: choose a design path.',\n          focusAction: 'focus-secondary-design'\n        };\n      }\n      return null;\n    }\n\n    if (primaryChoice === 'have-design') {\n      // Reorder agrees with getGuidedArtworkStepCompleteCore: the chooser\n      // lane resolves by picking a design (mode flips to designonline) or by\n      // the \"I don't see my design\" fallback; the plain lane is complete on\n      // its own (the promise IS the resolution).\n      if (artworkMode === 'reorder') {\n        if (isReorderChooserPresentation(store) && !isReorderFallbackSelected(store) && !isReorderReferenceSelected(store)) {\n          return {\n            key: 'reorder-pick',\n            helperText: 'Next: pick a past design, or choose \"I don\u2019t see my design\".',\n            focusAction: 'focus-secondary-have'\n          };\n        }\n        return null;\n      }\n      if (artworkMode !== 'uploadcanva' && artworkMode !== 'uploadfiles') {\n        return {\n          key: 'step2-have-design',\n          helperText: 'Next: choose how you want to send your artwork.',\n          focusAction: 'focus-secondary-have'\n        };\n      }\n      if (artworkMode === 'uploadcanva' && !isValidCanvaUrl(store.state.canvaUrl)) {\n        return {\n          key: 'canva-link',\n          helperText: 'Link required.',\n          focusAction: 'focus-canva-link',\n          suppressNote: true\n        };\n      }\n      if (artworkMode === 'uploadfiles' && !isArtworkUploadProvided(store)) {\n        return {\n          key: 'upload-file',\n          helperText: 'File required.',\n          focusAction: 'focus-upload-file',\n          suppressNote: true\n        };\n      }\n      return null;\n    }\n\n    if (primaryChoice === 'send-later' && artworkMode !== 'youhaveart') {\n      return {\n        key: 'step1',\n        helperText: 'Next: choose an artwork option.',\n        focusAction: 'focus-primary'\n      };\n    }\n\n    return null;\n  }\n\n  function buildArtworkIncompleteNote(store, incompleteState) {\n    if (!incompleteState || incompleteState.suppressNote) return '';\n    return '' +\n      '<div class=\"bg-guided-artwork__next-step\" data-bg-artwork-next-step-required=\"' + escapeHtml(text(incompleteState.key)) + '\">' +\n        '<div class=\"bg-guided-artwork__next-step-copy\">' + escapeHtml(text(incompleteState.helperText)) + '</div>' +\n        '<button type=\"button\" class=\"bg-guided-artwork__next-step-button\" data-bg-artwork-action=\"' + escapeHtml(text(incompleteState.focusAction)) + '\">Go to required option</button>' +\n      '</div>';\n  }\n\n  function buildGuidedInfoBox(title, bodyHtml, footerHtml) {\n    if (!text(title) || !text(bodyHtml)) return '';\n    var footer = text(footerHtml);\n    return '' +\n      '<div class=\"bg-guided-artwork__info-box\">' +\n        '<h5 class=\"bg-guided-artwork__info-box-title\">' + escapeHtml(title) + '</h5>' +\n        '<div class=\"bg-guided-artwork__info-copy\">' + bodyHtml + '</div>' +\n        (footer ? '<div class=\"bg-guided-artwork__info-action\">' + footer + '</div>' : '') +\n      '</div>';\n  }\n\n  function getReadableCanvaLink(value) {\n    var rawUrl = text(value);\n    if (!rawUrl) return '';\n    try {\n      var parsedUrl = new URL(rawUrl);\n      var pathParts = parsedUrl.pathname.split('/').filter(Boolean).slice(0, 2);\n      var display = parsedUrl.hostname.replace(/^www\\./i, '') + (pathParts.length ? '/' + pathParts.join('/') : '');\n      return display.length > 52 ? display.slice(0, 49) + '\u2026' : display;\n    } catch (_) {\n      return rawUrl.length > 52 ? rawUrl.slice(0, 49) + '\u2026' : rawUrl;\n    }\n  }\n\n  function buildCanvaLinkInputMarkup(store) {\n    var canvaUrl = text(store && store.state && store.state.canvaUrl);\n    var hasValidLink = isValidCanvaUrl(canvaUrl);\n    return '' +\n      '<div class=\"bg-designer-storefront__upload-card bg-designer-storefront__canva-card\" data-bg-canva-link-card>' +\n        '<div data-bg-canva-link-editor' + (hasValidLink ? ' hidden' : '') + '>' +\n          '<input type=\"url\" id=\"bg-designer-canva-link\" class=\"bg-designer-storefront__select bg-designer-storefront__canva-input\" data-bg-canva-link-input aria-label=\"Canva design link\" placeholder=\"Paste your Canva link here...\" inputmode=\"url\" autocomplete=\"off\">' +\n        '</div>' +\n        '<div class=\"bg-designer-storefront__canva-complete\" data-bg-canva-link-complete' + (hasValidLink ? '' : ' hidden') + '>' +\n          '<a href=\"' + escapeHtml(canvaUrl || '#') + '\" target=\"_blank\" rel=\"noreferrer\" data-bg-canva-link-display title=\"' + escapeHtml(canvaUrl) + '\">' + escapeHtml(getReadableCanvaLink(canvaUrl)) + '</a>' +\n          '<div class=\"bg-designer-storefront__canva-actions\" role=\"group\" aria-label=\"Canva link actions\">' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"change-canva-link\">Change link</button>' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"remove-canva-link\">Remove link</button>' +\n          '</div>' +\n        '</div>' +\n        buildCanvaShareHelpMarkup(canvaUrl) +\n        '<div class=\"bg-guided-artwork__status-row\" data-bg-canva-link-status aria-live=\"polite\" hidden></div>' +\n      '</div>';\n  }\n\n  // CANVA-EDIT-LINK: the instruction line, \"See how\" and the soft view-only\n  // hint under every Canva link field (owner: bg-canva-share-help.js, which\n  // the product section loads before this runtime). The hint never blocks.\n  function getCanvaShareHelp() {\n    var help = window.BgCanvaShareHelp;\n    return help && typeof help.markup === 'function' && typeof help.isViewOnlyLink === 'function' ? help : null;\n  }\n\n  function isCanvaViewOnlyLink(value) {\n    var help = getCanvaShareHelp();\n    try {\n      return !!(help && isValidCanvaUrl(value) && help.isViewOnlyLink(normalizeCanvaUrl(value)));\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function buildCanvaShareHelpMarkup(canvaUrl) {\n    var help = getCanvaShareHelp();\n    return help ? help.markup({ viewOnly: isCanvaViewOnlyLink(canvaUrl) }) : '';\n  }\n\n  function buildCanvaGuidedInfoMarkup(store, showInstructions) {\n    var instructions = showInstructions ? '<ol class=\"bg-guided-artwork__info-list\"><li>Open your design in Canva.</li><li>Click Share. Set Access to Anyone with the link and Can edit.</li><li>Paste the link below so we can export the correct print-ready file.</li></ol>' : '';\n    return '' +\n      '<div class=\"bg-guided-artwork__info-box bg-guided-artwork__info-box--canva\">' +\n        '<h5 class=\"bg-guided-artwork__info-box-title\">How to share your Canva design</h5>' +\n        '<div class=\"bg-guided-artwork__info-copy\">' +\n          instructions +\n          buildCanvaLinkInputMarkup(store) +\n        '</div>' +\n      '</div>';\n  }\n\n  function buildUploadListMarkup(store, field) {\n    var fileList = store && store.state && store.state.uploads ? (store.state.uploads[field.id] || []) : [];\n    if (!fileList.length) return '';\n    var filesMarkup = fileList.map(function (file, fileIndex) {\n      var fileName = text(file && (file.name || file.fileName)) || 'Uploaded file';\n      var publicUrl = text(file && (file.publicUrl || file.url));\n      var isUploading = !!(file && file.uploading && file.sourceFile && !publicUrl);\n      var removeButton = '<button type=\"button\" class=\"bg-designer-storefront__upload-chip-remove\" data-bg-artwork-action=\"remove-upload-file\" data-bg-upload-file-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-file-index=\"' + fileIndex + '\" aria-label=\"Remove ' + escapeHtml(fileName) + '\">&times;</button>';\n      if (publicUrl) {\n        return '<span class=\"bg-designer-storefront__upload-chip\"><a href=\"' + escapeHtml(publicUrl) + '\" target=\"_blank\" rel=\"noreferrer\">' + escapeHtml(fileName) + '</a>' + removeButton + '</span>';\n      }\n      if (isUploading) {\n        return '<span class=\"bg-designer-storefront__upload-chip bg-designer-storefront__upload-chip--uploading\">' +\n          '<span class=\"bg-designer-storefront__upload-spinner\" aria-hidden=\"true\"></span>' +\n          '<span role=\"status\" aria-live=\"polite\">Uploading ' + escapeHtml(fileName) + '</span>' +\n        '</span>';\n      }\n      if (file && file.uploadFailed && file.uploadFailureCode === UPLOAD_TOO_LARGE_CODE) {\n        return '<div class=\"bg-designer-storefront__upload-recovery\" role=\"alert\" data-bg-upload-recovery>' +\n          '<p>' + escapeHtml(file.uploadFailureMessage || STOREFRONT_FILE_TOO_LARGE_MESSAGE) + '</p>' +\n          '<div class=\"bg-designer-storefront__upload-recovery-actions\">' + removeButton + '</div></div>';\n      }\n      if (isUploadFileTypeRefused(file)) {\n        // Retrying cannot help a refused file type: the customer removes it.\n        return '<div class=\"bg-designer-storefront__upload-recovery\" role=\"alert\" data-bg-upload-recovery data-bg-upload-file-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-file-index=\"' + fileIndex + '\">' +\n          '<strong>File type not accepted</strong>' +\n          '<p>' + escapeHtml(fileName) + ' is a file type we can\u2019t use here. Remove it and choose another file.</p>' +\n          '<div class=\"bg-designer-storefront__upload-recovery-actions\">' + removeButton + '</div>' +\n        '</div>';\n      }\n      if (isUploadNotAccepted(file)) {\n        return '<div class=\"bg-designer-storefront__upload-recovery\" role=\"alert\" data-bg-upload-recovery data-bg-upload-file-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-file-index=\"' + fileIndex + '\">' +\n          '<strong>Upload not accepted</strong>' +\n          '<p>' + UPLOAD_NOT_ACCEPTED_MESSAGE + '</p>' +\n          '<div class=\"bg-designer-storefront__upload-recovery-actions\">' + removeButton + '</div>' +\n        '</div>';\n      }\n      if (file && file.uploadFailed) {\n        return '<div class=\"bg-designer-storefront__upload-recovery\" role=\"alert\" data-bg-upload-recovery data-bg-upload-file-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-file-index=\"' + fileIndex + '\">' +\n          '<strong>Upload interrupted</strong>' +\n          '<p>' + escapeHtml(fileName) + (findDetailUploadField(store, field.id)\n            ? ' didn\u2019t finish uploading. Try again, or remove the file to continue.'\n            : ' didn\u2019t finish uploading. Check your connection and try again \u2014 your other file is safe.') + '</p>' +\n          '<div class=\"bg-designer-storefront__upload-recovery-actions\">' +\n            '<button type=\"button\" class=\"button button--secondary\" data-bg-artwork-action=\"retry-upload-file\" data-bg-upload-file-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-file-index=\"' + fileIndex + '\">Retry</button>' +\n            removeButton +\n          '</div>' +\n        '</div>';\n      }\n      return '<span class=\"bg-designer-storefront__upload-chip\"><span>' + escapeHtml(fileName) + '</span>' + removeButton + '</span>';\n    }).join('');\n    var fieldUploading = fileList.some(function (file) { return !!(file && file.uploading); });\n    return '<div class=\"bg-designer-storefront__upload-files\">' + filesMarkup + '</div>' +\n      '<div class=\"bg-designer-storefront__upload-actions\" role=\"group\" aria-label=\"Uploaded file actions\">' +\n        '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"replace-upload\" data-bg-upload-replace=\"' + escapeHtml(field.id) + '\"' + (fieldUploading ? ' disabled aria-disabled=\"true\"' : '') + '>Replace files</button>' +\n        '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"remove-upload\" data-bg-upload-remove=\"' + escapeHtml(field.id) + '\"' + (fieldUploading ? ' disabled aria-disabled=\"true\"' : '') + '>Remove all</button>' +\n      '</div>';\n  }\n\n  function getUploadDropzoneTitle(store, field) {\n    if (!getUploadFieldFiles(store, field.id).length) return 'Choose files';\n    return field.multiple ? 'Add more files' : 'Replace files';\n  }\n\n  function buildUploadCanvaNoticeMarkup(store, field) {\n    var surface = text(field && field.surface);\n    var availability = getStoreArtworkAvailability(store);\n    if (surface !== 'primary' || !availability.uploadcanva) return '';\n    return '' +\n      '<div class=\"bg-designer-storefront__upload-canva-notice\" role=\"note\" data-bg-upload-canva-notice=\"' + escapeHtml(field.id) + '\"' + (getUploadFieldFiles(store, field.id).length ? ' hidden' : '') + '>' +\n        '<span class=\"bg-designer-storefront__upload-canva-title\">Made in Canva?</span>' +\n        '<p>Share the Canva design link instead so we can export it at full print quality.</p>' +\n        '<button type=\"button\" class=\"bg-designer-storefront__upload-canva-button\" data-bg-artwork-action=\"share-canva\">Use Canva Link' + buildArtworkMethodPriceSuffixMarkup(store, 'uploadcanva') + '</button>' +\n      '</div>';\n  }\n\n  function buildUploadFieldMarkup(store, field, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var prefix = text(settings.idPrefix) || 'bg-designer-upload-';\n    var inputId = prefix + escapeHtml(field.id);\n    var dropLabel = field.multiple ? 'Choose files or drag them here' : 'Choose a file or drag it here';\n    var uploadStatusText = buildUploadStatusText(store, field);\n    // Only a detail field shows its required mark here; the artwork upload\n    // field states its own requirement in the artwork step.\n    var requiredDetailField = isDetailUploadField(field) && field.required === true;\n    return '' +\n      '<div class=\"bg-designer-storefront__upload-card bg-designer-storefront__upload-card--' + escapeHtml(field.surface || 'file') + '\" data-bg-upload-card=\"' + escapeHtml(field.id) + '\">' +\n        (settings.hideLabel ? '' : '<label for=\"' + inputId + '\">' + escapeHtml(field.label) + (requiredDetailField ? ' <span aria-hidden=\"true\">*</span>' : '') + '</label>') +\n        '<div class=\"bg-designer-storefront__upload-dropzone\" data-bg-upload-dropzone=\"' + escapeHtml(field.id) + '\" role=\"button\" tabindex=\"0\" aria-controls=\"' + inputId + '\" aria-label=\"' + escapeHtml(dropLabel) + '\">' +\n          '<span class=\"bg-designer-storefront__upload-dropzone-title\" data-bg-upload-dropzone-title=\"' + escapeHtml(field.id) + '\">' + escapeHtml(getUploadDropzoneTitle(store, field)) + '</span>' +\n          '<span class=\"bg-designer-storefront__upload-dropzone-copy\">' + escapeHtml(field.multiple ? 'Drag and drop files here' : 'Drag and drop a file here') + '</span>' +\n        '</div>' +\n        '<input class=\"bg-designer-storefront__upload-input\" type=\"file\" id=\"' + inputId + '\" aria-label=\"' + escapeHtml(field.label) + '\" data-bg-upload-field=\"' + escapeHtml(field.id) + '\" data-bg-upload-property-name=\"' + escapeHtml(field.label) + '\"' +\n          (text(store.config.formId) ? ' form=\"' + escapeHtml(store.config.formId) + '\"' : '') +\n          (field.accept ? ' accept=\"' + escapeHtml(field.accept) + '\"' : '') +\n          (field.multiple ? ' multiple' : '') +\n          (requiredDetailField ? ' aria-required=\"true\"' : '') +\n        '>' +\n        '<p class=\"bg-designer-storefront__upload-limit\">Files up to 200 MB</p>' +\n        buildUploadCanvaNoticeMarkup(store, field) +\n        '<div class=\"bg-guided-artwork__upload-status' + (isUploadValidationAttempted(store, field.id) && !getUploadFieldFiles(store, field.id).length ? ' is-required' : '') + '\" data-bg-upload-status=\"' + escapeHtml(field.id) + '\" aria-live=\"polite\"' + (uploadStatusText ? '' : ' hidden') + '>' + escapeHtml(uploadStatusText) + '</div>' +\n        '<div class=\"bg-designer-storefront__upload-list\" data-bg-upload-list=\"' + escapeHtml(field.id) + '\">' + buildUploadListMarkup(store, field) + '</div>' +\n      '</div>';\n  }\n\n  function getUploadFieldFiles(store, fieldId) {\n    return store && store.state && store.state.uploads ? (store.state.uploads[fieldId] || []) : [];\n  }\n\n  function isUploadValidationAttempted(store, fieldId) {\n    return !!(store && store.uploadValidationAttempted && store.uploadValidationAttempted[fieldId]);\n  }\n\n  function buildUploadStatusText(store, field) {\n    var files = getUploadFieldFiles(store, field.id);\n    if (!files.length) {\n      if (!isUploadValidationAttempted(store, field.id)) return '';\n      var detailField = findDetailUploadField(store, field.id);\n      return detailField && !detailField.multiple\n        ? 'Choose a file to continue.'\n        : 'Choose at least one file to continue.';\n    }\n    return buildUploadedFileCountLabel(files);\n  }\n\n  function syncUploadFieldInputs(store, scope, fields) {\n    if (!store || !scope || !Array.isArray(fields) || !fields.length) return;\n    fields.forEach(function (field) {\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-list=\"' + field.id + '\"]')).forEach(function (list) {\n        list.innerHTML = buildUploadListMarkup(store, field);\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-status=\"' + field.id + '\"]')).forEach(function (status) {\n        var statusText = buildUploadStatusText(store, field);\n        status.textContent = statusText;\n        status.hidden = !statusText;\n        status.classList.toggle('is-required', isUploadValidationAttempted(store, field.id) && !getUploadFieldFiles(store, field.id).length);\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-canva-notice=\"' + field.id + '\"]')).forEach(function (notice) {\n        notice.hidden = getUploadFieldFiles(store, field.id).length > 0;\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-dropzone-title=\"' + field.id + '\"]')).forEach(function (title) {\n        title.textContent = getUploadDropzoneTitle(store, field);\n      });\n    });\n    function findRenderedUploadField(fieldId) {\n      return fields.find(function (field) {\n        return text(field && field.id) === text(fieldId);\n      }) || { id: fieldId };\n    }\n    function refreshUploadFieldList(fieldId) {\n      notifyMobileArtwork(store);\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-list=\"' + fieldId + '\"]')).forEach(function (list) {\n        list.innerHTML = buildUploadListMarkup(store, { id: fieldId });\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-status=\"' + fieldId + '\"]')).forEach(function (status) {\n        var statusText = buildUploadStatusText(store, findRenderedUploadField(fieldId));\n        status.textContent = statusText;\n        status.hidden = !statusText;\n        status.classList.toggle('is-required', isUploadValidationAttempted(store, fieldId) && !getUploadFieldFiles(store, fieldId).length);\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-canva-notice=\"' + fieldId + '\"]')).forEach(function (notice) {\n        notice.hidden = getUploadFieldFiles(store, fieldId).length > 0;\n      });\n      Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-dropzone-title=\"' + fieldId + '\"]')).forEach(function (title) {\n        title.textContent = getUploadDropzoneTitle(store, findRenderedUploadField(fieldId));\n      });\n    }\n    function commitUploadFiles(fieldId, selectedFiles, options) {\n      if (!fieldId) return;\n      var field = findRenderedUploadField(fieldId);\n      var nextFiles = Array.prototype.slice.call(selectedFiles || []).map(function (file) {\n        return buildUploadFileState(file);\n      });\n      if (store.mobileArtworkUploadPickers) delete store.mobileArtworkUploadPickers[fieldId];\n      if (!nextFiles.length) { notifyMobileArtwork(store); return; }\n      store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n      store.uploadValidationAttempted[fieldId] = false;\n      store.uploadClearedFieldIds = store.uploadClearedFieldIds || {};\n      store.uploadClearedFieldIds[fieldId] = false;\n      emitStorefrontEvent(store, 'file_selected', 'upload', {\n        fieldId: text(fieldId),\n        uploadFieldId: text(fieldId),\n        fileCount: nextFiles.length,\n        source: text(options && options.source) || 'unknown',\n        files: summarizeUploadFiles(selectedFiles || [])\n      }, 'normal');\n      if (store.uploadReplaceFieldId === fieldId) {\n        store.state.uploads[fieldId] = nextFiles;\n        var replacement = (store.mobileArtworkUploadReplacements || {})[fieldId];\n        if (replacement) {\n          replacement.newIds = nextFiles.map(function (file) { return file.clientId; });\n        }\n        store.uploadReplaceFieldId = '';\n      } else if (field.multiple) {\n        store.state.uploads[fieldId] = (store.state.uploads[fieldId] || []).concat(nextFiles);\n      } else {\n        store.state.uploads[fieldId] = nextFiles.slice(0, 1);\n      }\n      if (field.maxFiles && store.state.uploads[fieldId].length > field.maxFiles) {\n        store.state.uploads[fieldId] = store.state.uploads[fieldId].slice(0, field.maxFiles);\n      }\n      syncFormState(store);\n      syncSubmitButton(store);\n      refreshUploadFieldList(fieldId);\n      syncGuidedArtworkCompletionUi(store);\n      scheduleGuidedProductFormPresentation(store);\n      if (\n        getProductFormPresentation(store) === 'guided'\n        && text(store.state.artworkMode).toLowerCase() === 'uploadfiles'\n        && getPrimaryArtworkUploadFiles(store).length\n      ) {\n        render(store);\n      }\n      if (getActiveArtworkUploadFields(store).length) {\n        void ensureArtworkUploadsDrained(store).then(function () {\n          refreshUploadFieldList(fieldId);\n          syncSubmitButton(store);\n          void maybeRunGuidedSlotFill(store);\n        }).catch(function () {\n          syncSubmitButton(store);\n        });\n      }\n    }\n    function handleUploadFieldChange(input) {\n      var fieldId = text(input.getAttribute('data-bg-upload-field'));\n      commitUploadFiles(fieldId, input.files || [], { source: 'input' });\n      try { input.value = ''; } catch (_) {}\n    }\n    Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-field]')).forEach(function (input) {\n      if (input.__bgDesignerUploadBoundStore === store) return;\n      input.__bgDesignerUploadBoundStore = store;\n      input.dataset.bgUploadBound = '1';\n      input.addEventListener('change', function () {\n        handleUploadFieldChange(input);\n      });\n    });\n    Array.prototype.slice.call(scope.querySelectorAll('[data-bg-upload-dropzone]')).forEach(function (dropzone) {\n      if (dropzone.__bgDesignerUploadDropBoundStore === store) return;\n      dropzone.__bgDesignerUploadDropBoundStore = store;\n      dropzone.dataset.bgUploadDropBound = '1';\n      var fieldId = text(dropzone.getAttribute('data-bg-upload-dropzone'));\n      var input = fieldId ? scope.querySelector('[data-bg-upload-field=\"' + fieldId + '\"]') : null;\n      dropzone.addEventListener('click', function () {\n        if (input && typeof input.click === 'function') input.click();\n      });\n      dropzone.addEventListener('keydown', function (event) {\n        if (event.key !== 'Enter' && event.key !== ' ') return;\n        event.preventDefault();\n        if (input && typeof input.click === 'function') input.click();\n      });\n      ['dragenter', 'dragover'].forEach(function (eventName) {\n        dropzone.addEventListener(eventName, function (event) {\n          event.preventDefault();\n          dropzone.classList.add('is-drag-over');\n        });\n      });\n      ['dragleave', 'dragend', 'drop'].forEach(function (eventName) {\n        dropzone.addEventListener(eventName, function () {\n          dropzone.classList.remove('is-drag-over');\n        });\n      });\n      dropzone.addEventListener('drop', function (event) {\n        event.preventDefault();\n        var droppedFiles = event.dataTransfer && event.dataTransfer.files ? event.dataTransfer.files : [];\n        commitUploadFiles(fieldId, droppedFiles, { source: 'drop' });\n      });\n    });\n  }\n\n  function getInlineArtworkUploadFields(store) {\n    return normalizeUploadFields(store.binding).map(function (field) {\n      return Object.assign({ surface: 'primary' }, field, { multiple: true });\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Guided slot fill (slots arc, batch 3b): a template whose empty image slots\n  // are rect/cover with uploads allowed can be personalized right on the\n  // product page \u2014 the customer uploads per-slot images and the designer API\n  // fills the template server-side into an ordinary saved project (full cart\n  // and completion parity with an editor save). Shaped slots keep routing to\n  // the editor.\n  var GUIDED_SLOT_FIELD_PREFIX = 'slot:';\n  var GUIDED_SLOT_FILL_ACCEPT = 'image/jpeg,image/png,image/webp,image/gif,image/svg+xml,.jpg,.jpeg,.png,.webp,.gif,.svg';\n  var GUIDED_SLOT_ROLE_LABELS = {\n    logo: 'Your logo',\n    headshot: 'Your headshot',\n    photo: 'Your photo',\n    background: 'Background image'\n  };\n\n  function isGuidedFillArmed(store) {\n    return !!(store && store.state && store.state.guidedFillArmed);\n  }\n\n  // Only a Studio template lookup names a design document. A legacy row's\n  // imported-design row id (foundationTemplateId) never has one, so asking the\n  // template-document route for it only ever answered 404.\n  function getTemplateGuidedFillLookup(template) {\n    return text(template && (template.templateLookup || template.templatePublicId));\n  }\n\n  function parseGuidedFillSlots(document) {\n    var slots = [];\n    var boards = document && Array.isArray(document.boards) ? document.boards : [];\n    function visitObject(board, object, nested, depth) {\n      if (!object || typeof object !== 'object' || depth > 6) return;\n      var metadata = object.metadata && typeof object.metadata === 'object' ? object.metadata : {};\n      var slot = metadata.imageSlot && typeof metadata.imageSlot === 'object' ? metadata.imageSlot : null;\n      var objectId = text(object.id);\n      if (slot && slot.enabled === true && objectId) {\n        var type = text(object.type).toLowerCase();\n        var shapeKind = text(metadata.shapeKind).toLowerCase();\n        // Mirrors isRectDocumentImageSlot in @qps/designer-contracts: a\n        // clip-free rect fills as a pure crop window; anything else is shaped.\n        // Grouped (nested) slots are never guided-fillable \u2014 their coordinates\n        // live in the group plane \u2014 but a nested REQUIRED slot must still be\n        // seen so guided fill stands down (only the editor can complete it).\n        var rect = !nested\n          && type === 'shape'\n          && (!shapeKind || shapeKind === 'rect' || shapeKind === 'rectangle' || shapeKind === 'square')\n          && !(Number(metadata.cornerRadius) > 0);\n        var allowedSources = Array.isArray(slot.allowedSources)\n          ? slot.allowedSources.map(function (entry) { return text(entry).toLowerCase(); }).filter(Boolean)\n          : [];\n        slots.push({\n          objectId: objectId,\n          boardId: text(board.id),\n          required: slot.required === true,\n          promptText: text(slot.promptText),\n          role: text(slot.role).toLowerCase().replace(/[\\s_-]+/g, ''),\n          filled: type === 'image',\n          rect: rect,\n          uploadsAllowed: !allowedSources.length || allowedSources.indexOf('uploads') !== -1\n        });\n      }\n      var children = Array.isArray(object.objects) ? object.objects : [];\n      children.forEach(function (child) { visitObject(board, child, true, depth + 1); });\n      var fabricGroup = metadata.fabricGroup && typeof metadata.fabricGroup === 'object' ? metadata.fabricGroup : {};\n      var fabricChildren = Array.isArray(fabricGroup.objects) ? fabricGroup.objects : [];\n      fabricChildren.forEach(function (child) { visitObject(board, child, true, depth + 1); });\n    }\n    boards.forEach(function (board) {\n      var objects = board && Array.isArray(board.objects) ? board.objects : [];\n      objects.forEach(function (object) { visitObject(board, object, false, 0); });\n    });\n    return slots;\n  }\n\n  function getGuidedFillStateMap(store) {\n    if (!store.guidedSlotFillStates || typeof store.guidedSlotFillStates !== 'object') {\n      store.guidedSlotFillStates = {};\n    }\n    return store.guidedSlotFillStates;\n  }\n\n  function getGuidedFillSlotStateFor(store, template) {\n    var lookup = getTemplateGuidedFillLookup(template);\n    return lookup ? (getGuidedFillStateMap(store)[lookup] || null) : null;\n  }\n\n  function getGuidedFillSlotState(store) {\n    return getGuidedFillSlotStateFor(store, store && store.state && store.state.template);\n  }\n\n  function getGuidedFillableSlots(state) {\n    if (!state || state.status !== 'ready') return [];\n    return (state.slots || []).filter(function (slot) {\n      return !slot.filled && slot.rect && slot.uploadsAllowed;\n    });\n  }\n\n  function isGuidedFillAvailableFor(store, templateAvailability, template) {\n    if (!store || !template) return false;\n    if (isOptionTemplateArtworkFlow(store)) return false;\n    // Slot uploads ride the storefront upload lane, which the server refuses\n    // when the binding disallows uploads \u2014 never offer a dead-end. The flag is\n    // stashed from the product-editor-config top level at load.\n    if (store.bindingUploadEnabled !== true) return false;\n    if (!templateAvailability || !templateAvailability.designonline) return false;\n    var state = getGuidedFillSlotStateFor(store, template);\n    var fillable = getGuidedFillableSlots(state);\n    if (!fillable.length) return false;\n    // Every required empty slot must be guided-fillable; otherwise only the\n    // editor can complete the design and the guided path would dead-end.\n    var blockedRequired = (state.slots || []).some(function (slot) {\n      return slot.required && !slot.filled && !(slot.rect && slot.uploadsAllowed);\n    });\n    return !blockedRequired;\n  }\n\n  function isGuidedFillAvailable(store, templateAvailability) {\n    return isGuidedFillAvailableFor(store, templateAvailability, store && store.state && store.state.template);\n  }\n\n  function ensureGuidedFillSlotStateLoadedFor(store, template) {\n    if (!store || !template) return;\n    var lookup = getTemplateGuidedFillLookup(template);\n    if (!lookup) return;\n    var map = getGuidedFillStateMap(store);\n    var existing = map[lookup];\n    if (existing && (existing.status === 'ready' || existing.status === 'loading')) return;\n    // A failed fetch stays sticky after two attempts \u2014 render-driven callers\n    // must never turn one bad response into an unbounded refetch loop.\n    var attempts = (existing && Number(existing.attempts)) || 0;\n    if (existing && existing.status === 'error' && attempts >= 2) return;\n    if (typeof window.fetch !== 'function') return;\n    map[lookup] = { lookup: lookup, status: 'loading', slots: [], attempts: attempts + 1 };\n    var designerConfig = store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    var proxyRoot = text(window.BG_DESIGNER_PROXY_ROOT || designerConfig.proxyRoot || '/apps/qps-commerce-control-plane/designer').replace(/\\/+$/, '');\n    var slotDocumentRequest;\n    try {\n      slotDocumentRequest = window.fetch(proxyRoot + '/template-document?lookup=' + encodeURIComponent(lookup), {\n        credentials: 'same-origin',\n        cache: 'no-store',\n        headers: { accept: 'application/json' }\n      });\n    } catch (_) {\n      map[lookup] = { lookup: lookup, status: 'error', slots: [], attempts: attempts + 1 };\n      return;\n    }\n    slotDocumentRequest.then(function (response) {\n      if (!response.ok) throw new Error('template-document ' + response.status);\n      return response.json();\n    }).then(function (payload) {\n      var document = payload && payload.ok === true && payload.document && typeof payload.document === 'object'\n        ? payload.document\n        : null;\n      map[lookup] = {\n        lookup: lookup,\n        status: document ? 'ready' : 'error',\n        slots: document ? parseGuidedFillSlots(document) : [],\n        // Board dims back the size mapper for native templates that carry no\n        // legacy catalog size strings (the template preview commit needs a\n        // size match before it will select the template).\n        boardDimensions: document && Array.isArray(document.boards)\n          ? document.boards.map(function (board) {\n            return { width: Number(board && board.width) || 0, height: Number(board && board.height) || 0 };\n          }).filter(function (row) { return row.width > 0 && row.height > 0; })\n          : [],\n        attempts: attempts + 1\n      };\n      render(store);\n      // Refresh an OPEN template preview showing this template so the guided\n      // finish option appears without reopening (render(store) does not touch\n      // the modal, and re-rendering a closed modal would pop it open).\n      if (store.templatePreviewTemplateRef\n        && getTemplateGuidedFillLookup(store.templatePreviewTemplateRef) === lookup\n        && store.templatePreviewOverlayRef\n        && store.templatePreviewOverlayRef.classList\n        && store.templatePreviewOverlayRef.classList.contains('is-open')) {\n        renderTemplatePreviewModal(store, store.templatePreviewTemplateRef);\n      }\n    }).catch(function () {\n      map[lookup] = { lookup: lookup, status: 'error', slots: [], attempts: attempts + 1 };\n      render(store);\n    });\n  }\n\n  function ensureGuidedFillSlotStateLoaded(store) {\n    ensureGuidedFillSlotStateLoadedFor(store, store && store.state && store.state.template);\n  }\n\n  function getGuidedFillUploadFields(store) {\n    if (!isGuidedFillArmed(store)) return [];\n    var fillable = getGuidedFillableSlots(getGuidedFillSlotState(store));\n    return fillable.map(function (slot, index) {\n      return {\n        id: GUIDED_SLOT_FIELD_PREFIX + slot.objectId,\n        label: slot.promptText || GUIDED_SLOT_ROLE_LABELS[slot.role] || ('Image ' + (index + 1) + ' of ' + fillable.length),\n        kind: 'file',\n        required: slot.required,\n        accept: GUIDED_SLOT_FILL_ACCEPT,\n        multiple: false,\n        maxFiles: 1,\n        surface: 'slot'\n      };\n    });\n  }\n\n  function clearGuidedFillUploads(store) {\n    if (!store || !store.state || !store.state.uploads) return;\n    Object.keys(store.state.uploads).forEach(function (fieldId) {\n      if (text(fieldId).indexOf(GUIDED_SLOT_FIELD_PREFIX) === 0) {\n        delete store.state.uploads[fieldId];\n      }\n    });\n  }\n\n  function disarmGuidedFill(store) {\n    if (!store || !store.state) return;\n    store.state.guidedFillArmed = false;\n    store.guidedSlotFillRequestKey = '';\n  }\n\n  function collectGuidedFillRequests(store) {\n    var fields = getGuidedFillUploadFields(store);\n    var fills = [];\n    var requiredMissing = false;\n    var pendingUploads = false;\n    fields.forEach(function (field) {\n      var files = getUploadFieldFiles(store, field.id);\n      var file = files.length ? files[files.length - 1] : null;\n      if (!file) {\n        if (field.required) requiredMissing = true;\n        return;\n      }\n      var uploadRef = text(file && file.uploadRef);\n      var uploadId = uploadRef.indexOf('storefront-upload:') === 0\n        ? uploadRef.slice('storefront-upload:'.length)\n        : text(file && file.id);\n      if (uploadId && getUploadFilePublicUrl(file)) {\n        fills.push({ objectId: field.id.slice(GUIDED_SLOT_FIELD_PREFIX.length), uploadId: uploadId });\n      } else {\n        // Picked but not yet finalized: this is PENDING, not missing \u2014 the\n        // submit-time wait branch drains it instead of the artwork-later modal.\n        pendingUploads = true;\n      }\n    });\n    return { fills: fills, requiredMissing: requiredMissing, pendingUploads: pendingUploads };\n  }\n\n  function refreshGuidedFillProjectPreview(store, projectId, attempt) {\n    var tries = Number(attempt) || 0;\n    if (tries > 4) return;\n    if (text(store.state.project && store.state.project.projectId) !== projectId) return;\n    void refreshProjectPreview(store, projectId).then(function () {\n      var hasPreview = !!text(store.state.project && store.state.project.previewUrl);\n      render(store);\n      if (!hasPreview) {\n        // The server-side preview is generated by the deferred outbox worker\n        // (~2s drain interval) \u2014 poll briefly instead of leaving a blank tile.\n        window.setTimeout(function () {\n          refreshGuidedFillProjectPreview(store, projectId, tries + 1);\n        }, 1500 + (tries * 2000));\n      }\n    }).catch(function () {});\n  }\n\n  function runGuidedSlotFill(store, slotState, fills) {\n    setMessage(store, fills.length > 1 ? 'Placing your images...' : 'Placing your image...', '');\n    return ensureDesignerBootstrapLoaded(store).then(function (bootstrap) {\n      var apiBaseUrl = getDesignerApiBaseUrlFromBootstrap(bootstrap);\n      var sessionToken = getDesignerSessionTokenFromBootstrap(bootstrap);\n      if (!apiBaseUrl || !sessionToken) {\n        throw new Error('The design service is not ready yet on this page. Try again in a moment.');\n      }\n      var sizePayload = buildSelectedSizePayload(store);\n      var editorSelectionSync = buildEditorSelectionSyncPayload(store);\n      var payload = {\n        storeKey: text(store.config && (store.config.storeKey || store.config.storefront) || window.__siteCfg && window.__siteCfg.brand_slug),\n        productId: text(store.config && store.config.productId),\n        productHandle: getEditorProductHandle(store),\n        templateLookup: slotState.lookup,\n        fills: fills,\n        // Same selection block as the completion payload: the server's policy\n        // hash matcher uses it for the bounded selection-echo substitution.\n        // STUDIO-GUIDED-SAVE-NO-LOOKUP: a guided fill saves a design from the\n        // card, so its binding names the card like a Studio save from it: the\n        // card lookup and title, and through the same identity writer the\n        // card design id and number. My Designs then reopens it on the card.\n        metadata: {\n          storefrontBinding: withTemplateCardIdentity({\n            productId: text(store.config && store.config.productId),\n            productHandle: text(store.config && store.config.handle),\n            templateLookup: slotState.lookup,\n            templateTitle: text(store.state.template && store.state.template.title),\n            selection: {\n              selectedSizeId: text(sizePayload.selectedSizeId),\n              selectedSizeLabel: text(sizePayload.selectedSizeLabel),\n              selectedWidth: text(sizePayload.selectedWidth),\n              selectedHeight: text(sizePayload.selectedHeight),\n              selectedUnit: text(sizePayload.selectedUnit),\n              selectedOrientation: text(sizePayload.selectedOrientation),\n              selectedSidesId: text(editorSelectionSync.selectedSidesId),\n              selectedSidesLabel: text(editorSelectionSync.selectedSidesLabel),\n              selectedSidesTargetingId: text(editorSelectionSync.selectedSidesTargetingId),\n              sidesPolicy: editorSelectionSync.sidesPolicy || undefined,\n              selectedPrintingId: text(editorSelectionSync.selectedPrintingId),\n              selectedPrintingLabel: text(editorSelectionSync.selectedPrintingLabel),\n              selectedPrintingTargetingId: text(editorSelectionSync.selectedPrintingTargetingId),\n              backer: text(store.state.template && store.state.template.backer),\n              printQuantity: resolveDesignerLaunchQuantity(store),\n              channelOffer: core.normalizeChannelOfferOrigin(store.state.channelOffer) || undefined,\n              optionSelections: buildCurrentOptionSelections(store)\n            }\n          }, store.state.template)\n        }\n      };\n      var priorProjectId = text(store.state.guidedFillProjectId);\n      if (priorProjectId) payload.projectId = priorProjectId;\n      if (bootstrap && bootstrap.resolvedSettings && typeof bootstrap.resolvedSettings === 'object') {\n        payload.resolvedSettings = bootstrap.resolvedSettings;\n      }\n      return window.fetch(buildDesignerApiEndpoint(apiBaseUrl, '/api/storefront/template-slot-fill'), {\n        method: 'POST',\n        body: JSON.stringify(payload),\n        credentials: 'omit',\n        headers: {\n          'content-type': 'application/json',\n          'x-designer-session-token': sessionToken\n        }\n      });\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (payload) {\n        if (!response.ok || !payload || payload.ok !== true || !payload.project) {\n          throw new Error(payload && payload.error ? String(payload.error) : ('Guided fill failed (' + response.status + ')'));\n        }\n        return payload;\n      });\n    }).then(function (payload) {\n      // Staleness guard: the customer may have disarmed, switched templates,\n      // or moved to another artwork mode while the fill was in flight \u2014 a\n      // stale response must never resurrect cleared state.\n      if (!isGuidedFillArmed(store)\n        || text(store.state.artworkMode).toLowerCase() !== 'designonline'\n        || getTemplateGuidedFillLookup(store.state.template) !== slotState.lookup) {\n        return false;\n      }\n      var project = payload.project && typeof payload.project === 'object' ? payload.project : {};\n      var projectId = text(project.publicId || project.id);\n      if (!projectId) throw new Error('Guided fill did not return a design.');\n      store.state.guidedFillProjectId = projectId;\n      store.state.project = {\n        projectId: projectId,\n        designId: text(store.state.template && store.state.template.designId),\n        designNumber: text(store.state.template && store.state.template.designNumber),\n        previewUrl: text(project.previewUrl),\n        previews: text(project.previewUrl) ? [text(project.previewUrl)] : [],\n        numPages: Number(project.boardCount || 0) || 0,\n        refreshToken: String(Date.now())\n      };\n      clearCompletionState(store);\n      syncFormState(store);\n      emitStorefrontEvent(store, 'guided_slot_fill_succeeded', 'upload', {\n        projectId: projectId,\n        fillCount: Array.isArray(payload.filled) ? payload.filled.length : 0,\n        refusedCount: Array.isArray(payload.refused) ? payload.refused.length : 0\n      }, 'high');\n      setMessage(store, 'Your design is ready. Review the preview below.', 'success');\n      render(store);\n      refreshGuidedFillProjectPreview(store, projectId, 0);\n      return true;\n    });\n  }\n\n  function maybeRunGuidedSlotFill(store) {\n    if (!isGuidedFillArmed(store)) return Promise.resolve(false);\n    // Serialize: a second fill while one is in flight would race project\n    // creation (two projects, last-resolved wins). Chain onto the in-flight\n    // run and re-collect once it settles.\n    if (store.guidedSlotFillPromise) {\n      return store.guidedSlotFillPromise.then(function () {\n        return maybeRunGuidedSlotFill(store);\n      });\n    }\n    var slotState = getGuidedFillSlotState(store);\n    if (!slotState || slotState.status !== 'ready') return Promise.resolve(false);\n    var collected = collectGuidedFillRequests(store);\n    if (!collected.fills.length || collected.pendingUploads) return Promise.resolve(false);\n    // Missing required uploads only block the CREATE lane \u2014 refills patch the\n    // existing guided project, whose document already holds the other slots.\n    if (collected.requiredMissing && !text(store.state.guidedFillProjectId)) return Promise.resolve(false);\n    var requestKey = JSON.stringify([slotState.lookup, collected.fills, text(store.state.guidedFillProjectId)]);\n    if (store.guidedSlotFillRequestKey === requestKey) return Promise.resolve(false);\n    var promise = runGuidedSlotFill(store, slotState, collected.fills).then(function (applied) {\n      // Only a successfully APPLIED response consumes the request key \u2014\n      // failures and stale-discarded responses stay retryable.\n      if (applied) store.guidedSlotFillRequestKey = requestKey;\n      return applied;\n    }).catch(function (error) {\n      emitStorefrontError(store, 'guided_slot_fill_failed', 'guided_slot_fill_failed', error, {\n        templateLookup: slotState.lookup,\n        fillCount: collected.fills.length\n      });\n      setMessage(store, 'We could not place your image automatically. Try again, or open the editor to finish your design.', 'error');\n      return false;\n    }).finally(function () {\n      if (store.guidedSlotFillPromise === promise) store.guidedSlotFillPromise = null;\n      syncSubmitButton(store);\n    });\n    store.guidedSlotFillPromise = promise;\n    return promise;\n  }\n\n  function buildGuidedFillPanelMarkup(store, templateAvailability) {\n    var fields = getGuidedFillUploadFields(store);\n    if (!fields.length) {\n      var slotState = getGuidedFillSlotState(store);\n      if (slotState && slotState.status === 'loading') {\n        return '<div class=\"bg-guided-artwork__action-detail\"><p class=\"bg-guided-artwork__detail-copy\">Loading template details...</p></div>';\n      }\n      return '';\n    }\n    var hasProject = !!text(store.state.project && store.state.project.projectId);\n    var intro = hasProject\n      ? 'Your design is ready. Replace an image below to update it.'\n      : 'Add your image' + (fields.length > 1 ? 's' : '') + ' and we\u2019ll place ' + (fields.length > 1 ? 'them' : 'it') + ' in the template for you.';\n    var editorSwitch = templateAvailability && templateAvailability.designonline\n      ? '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-artwork__finish-switch\" data-bg-artwork-action=\"template-customize-online\">Want finer control? Open the design editor' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</button>'\n      : '';\n    return '' +\n      '<div class=\"bg-guided-artwork__action-detail bg-guided-artwork__slot-fill\" data-bg-guided-slot-fill>' +\n        '<p class=\"bg-guided-artwork__detail-copy\">' + escapeHtml(intro) + '</p>' +\n        '<div class=\"bg-designer-storefront__upload-grid bg-designer-storefront__upload-grid--inline\">' +\n          fields.map(function (field) {\n            return buildUploadFieldMarkup(store, field, { idPrefix: 'bg-designer-slot-upload-' });\n          }).join('') +\n        '</div>' +\n        editorSwitch +\n      '</div>';\n  }\n\n  function buildTemplateFinishChoicesMarkup(store, templateAvailability) {\n    if (!store.state.template || text(store.state.project && store.state.project.projectId)) return '';\n    if (isOptionTemplateArtworkFlow(store)) return '';\n    var mode = text(store.state.artworkMode).toLowerCase();\n    if ((getProductFormPresentation(store) === 'guided' || getArtworkSectionConfig(store).templateFinishInModal) && (mode === 'designonline' || mode === 'editservice')) {\n      // Finish already chosen inside the template modal: render a single quiet\n      // switch to the other mode instead of the symmetric fork. When no mode is\n      // set (restored/legacy state) fall through to the standard fork so the\n      // flow cannot dead-end.\n      var switchMarkup = '';\n      if (mode === 'designonline' && templateAvailability.editservice) {\n        switchMarkup = '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-artwork__finish-switch\" data-bg-artwork-action=\"template-personalize\">Prefer we do it? ' + buildTemplatePersonalizationChoiceTitleMarkup(store, store.state.template) + '</button>';\n      } else if (mode === 'editservice' && templateAvailability.designonline) {\n        switchMarkup = '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-artwork__finish-switch\" data-bg-artwork-action=\"template-customize-online\">Want to edit it yourself? Customize online' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</button>';\n      }\n      // The guided-fill path stays reachable after an in-modal mode choice \u2014\n      // without this switch the modal flow could never discover it.\n      var guidedSwitchMarkup = !isGuidedFillArmed(store) && isGuidedFillAvailable(store, templateAvailability)\n        ? '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-artwork__finish-switch\" data-bg-artwork-action=\"template-guided-fill\">Just need your photo placed? Add it here' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</button>'\n        : '';\n      if (!switchMarkup && !guidedSwitchMarkup) return '';\n      return '' +\n        '<div class=\"bg-guided-artwork__template-finish bg-guided-artwork__template-finish--switch\" data-bg-artwork-template-finish>' +\n          guidedSwitchMarkup +\n          switchMarkup +\n        '</div>';\n    }\n    var choices = [];\n    if (isGuidedFillAvailable(store, templateAvailability)) {\n      var guidedSlotCount = getGuidedFillableSlots(getGuidedFillSlotState(store)).length;\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-guided-artwork__finish-choice\" data-bg-artwork-action=\"template-guided-fill\">' +\n          '<span class=\"bg-guided-artwork__finish-title\">' + escapeHtml(guidedSlotCount > 1 ? 'Add your photos here' : 'Add your photo here') + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</span>' +\n          '<span class=\"bg-guided-artwork__finish-copy\">Upload ' + escapeHtml(guidedSlotCount > 1 ? 'your images' : 'your image') + ' and we\u2019ll place ' + escapeHtml(guidedSlotCount > 1 ? 'them' : 'it') + ' in the template \u2014 no editor needed.</span>' +\n        '</button>');\n    }\n    if (templateAvailability.designonline) {\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-guided-artwork__finish-choice' + (mode === 'designonline' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-customize-online\">' +\n          '<span class=\"bg-guided-artwork__finish-title\">' + escapeHtml(text(store.state.project && store.state.project.projectId) ? 'Edit Artwork' : 'Customize online') + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</span>' +\n          '<span class=\"bg-guided-artwork__finish-copy\">Open the editor and save before checkout.</span>' +\n        '</button>');\n    }\n    if (templateAvailability.editservice) {\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-guided-artwork__finish-choice' + (mode === 'editservice' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-personalize\">' +\n          '<span class=\"bg-guided-artwork__finish-title\">' + buildTemplatePersonalizationChoiceTitleMarkup(store, store.state.template) + '</span>' +\n          '<span class=\"bg-guided-artwork__finish-copy\">We collect details after checkout and send a proof.</span>' +\n        '</button>');\n    }\n    if (!choices.length) return '';\n    return '' +\n      '<div class=\"bg-guided-artwork__template-finish\" data-bg-artwork-template-finish>' +\n        '<div class=\"bg-guided-artwork__finish-grid\">' + choices.join('') + '</div>' +\n      '</div>';\n  }\n\n  function buildArtworkActionItems(store, availability) {\n    var customDesignCost = getArtworkFeeAmounts(store).customDesignAmount;\n    var items = [];\n    if (availability.uploadfiles) {\n      items.push({\n        key: 'upload-files',\n        action: 'upload-files',\n        title: 'Upload Artwork File',\n        quickLabel: 'Upload a file',\n        copy: 'Send a finished print-ready file now.',\n        mode: 'uploadfiles'\n      });\n    }\n    if (availability.uploadcanva) {\n      items.push({\n        key: 'share-canva',\n        action: 'share-canva',\n        title: 'Share a Canva Design',\n        quickLabel: 'Share a Canva link',\n        copy: 'Have a design built in Canva? We can print it.',\n        mode: 'uploadcanva'\n      });\n    }\n    if (availability.reorder) {\n      var reorderChooser = isReorderChooserPresentation(store);\n      items.push({\n        key: 'reorder',\n        action: 'reorder',\n        // Honest Stage-1 placeholder (OP-06): plain reorder loads nothing from\n        // the account, so the tile promises only the real follow-up. The PX-04\n        // chooser presentation keeps its genuine saved-designs flow copy.\n        title: reorderChooser ? 'Your designs' : 'Place a reorder',\n        copy: reorderChooser ? 'Start from a design you saved or ordered before' : 'We will reach out to you after checkout.',\n        mode: 'reorder'\n      });\n    }\n    if (availability.recreate) {\n      items.push({\n        key: 'recreate-design',\n        action: 'recreate-design',\n        title: 'Recreate a Design',\n        copy: 'Send a sample design or low resolution file and we will rebuild it for print production.',\n        mode: 'recreate'\n      });\n    }\n    if (availability.designonline || availability.editservice || isOptionTemplateArtworkFlow(store)) {\n      items.push({\n        key: 'use-template',\n        action: 'use-template',\n        title: 'Use a template',\n        quickLabel: 'Use a template',\n        copy: 'Pick a proven design, then customize it or have us personalize it.',\n        mode: 'template'\n      });\n    }\n    if (availability.customdesign) {\n      items.push({\n        key: 'custom-design',\n        action: 'custom-design',\n        title: 'Professional Custom Design',\n        quickLabel: 'Have us design it',\n        priceCost: customDesignCost,\n        copy: \"Don't like our templates or want something custom?\",\n        mode: 'customdesign'\n      });\n    }\n    if (availability.freesetup) {\n      items.push({\n        key: 'free-setup',\n        action: 'free-setup',\n        title: 'Free Setup',\n        copy: 'We will setup a free design for you.',\n        mode: 'freesetup'\n      });\n    }\n    if (availability.youhaveart) {\n      items.push({\n        key: 'send-later',\n        action: 'send-later',\n        title: 'Handle artwork after checkout',\n        quickLabel: 'Handle it later',\n        copy: '',\n        mode: 'youhaveart'\n      });\n    }\n    items = items.filter(function (item) { return item.mode === 'template'\n      ? canApplyArtworkMethod(store, 'designonline') || canApplyArtworkMethod(store, 'editservice') : canApplyArtworkMethod(store, item.mode); });\n    items.forEach(function (item) {\n      var display = getArtworkMethodDisplayConfig(store, item.mode);\n      if (!display) return;\n      if (display.label) {\n        // The live charge stays structured so relabeling keeps sale treatment.\n        item.title = display.label;\n        item.quickLabel = display.label;\n      }\n      if (display.description) item.copy = display.description;\n    });\n    if (getArtworkSectionConfig(store).restQuickLinks) {\n      // Refined chooser: each method states itself once \u2014 the row copy absorbs\n      // what the detail intro used to repeat beneath it.\n      var refinedCopy = {\n        'share-canva': 'Paste an unlocked Canva share link \u2014 we\u2019ll export the right print file.',\n        'upload-files': 'Send a print-ready file \u2014 we review it before production.',\n        'custom-design': 'Our designers create it from scratch \u2014 we collect details after checkout and send a proof.',\n        'send-later': 'We\u2019ll follow up after you order \u2014 nothing else needed now. Sale-price orders enter production within 10 business days.'\n      };\n      // Once a template and finish are chosen, the row states the decision\n      // instead of re-pitching the choice.\n      var refinedTemplateMode = text(store.state && store.state.artworkMode).toLowerCase();\n      if (store.state && text(store.state.project && store.state.project.projectId)) {\n        refinedCopy['use-template'] = 'Your design is saved \u2014 you can still edit it before checkout.';\n      } else if (store.state && store.state.template && refinedTemplateMode === 'editservice') {\n        refinedCopy['use-template'] = 'We personalize your chosen template after checkout and send a proof.';\n      } else if (store.state && store.state.template && refinedTemplateMode === 'designonline') {\n        refinedCopy['use-template'] = 'Customize your chosen template online \u2014 save it before checkout.';\n      }\n      items.forEach(function (item) {\n        if (!refinedCopy[item.key]) return;\n        // The static refined defaults only fill methods the admin left\n        // unwritten \u2014 a staff-authored description is a deliberate choice\n        // (GUIDED-PDP-TOKENIZE-01 T0). The use-template entries stay\n        // unconditional: they are live state lines (saved/personalize/edit),\n        // not default copy.\n        if (item.key !== 'use-template') {\n          var refinedAdminDisplay = getArtworkMethodDisplayConfig(store, item.mode);\n          if (refinedAdminDisplay && refinedAdminDisplay.description) return;\n        }\n        item.copy = refinedCopy[item.key];\n      });\n    }\n    var defaultOrder = ['use-template', 'share-canva', 'upload-files', 'free-setup', 'recreate-design', 'reorder', 'custom-design', 'send-later'];\n    var configuredOrder = getArtworkSectionConfig(store).artworkMethodOrder;\n    var order = configuredOrder.length ? configuredOrder : defaultOrder;\n    if (order.length) {\n      var rank = Object.create(null);\n      order.forEach(function (entry, index) {\n        rank[normalizeArtworkChooserItemKey(entry)] = index;\n      });\n      items.sort(function (a, b) {\n        var rankA = Object.prototype.hasOwnProperty.call(rank, a.key) ? rank[a.key] : 999;\n        var rankB = Object.prototype.hasOwnProperty.call(rank, b.key) ? rank[b.key] : 999;\n        return rankA - rankB;\n      });\n    }\n    return items;\n  }\n\n  function getArtworkActionVisualClass(item) {\n    var key = text(item && item.key).toLowerCase().replace(/[^a-z0-9-]+/g, '-');\n    return key || 'default';\n  }\n\n  function isArtworkActionSelected(store, item) {\n    if (store && store.guidedArtworkMethodChooserExpanded === true) return false;\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var secondary = text(store.state.artworkSecondaryChoice);\n    if (item.key === 'use-template') {\n      return secondary === 'use-template' || mode === 'designonline' || mode === 'editservice' || !!store.state.template || !!text(store.state.project && store.state.project.projectId);\n    }\n    return mode === item.mode;\n  }\n\n  function buildArtworkOptionSupportingUploadMarkup(store, item) {\n    var supportingField = getArtworkOptionSupportingUploadField(store, item.mode);\n    if (!supportingField) return '';\n    return '' +\n      '<div class=\"bg-designer-storefront__upload-grid bg-designer-storefront__upload-grid--inline\">' +\n        buildUploadFieldMarkup(store, supportingField, { idPrefix: 'bg-designer-artwork-upload-' }) +\n      '</div>';\n  }\n\n  // Load-time artwork-mode restores (URL echo, authored default, session\n  // restore) select the upload method without popping its panel open: the\n  // dropzone/editor detail only expands after the customer picks the upload\n  // option this session. Cart-line edits and stores that already hold upload\n  // files keep the panel so uploaded-file chips stay visible. Boguna-only\n  // presentation change; legacy hybrid pages keep their current behavior.\n  function shouldCollapseRestoredUploadDetail(store) {\n    if (!isBogunaArtworkPage(store)) return false;\n    if (store.artworkUploadPanelEngaged || store.editingLineKey) return false;\n    var uploads = store.state && store.state.uploads ? store.state.uploads : {};\n    return !Object.keys(uploads).some(function (fieldId) {\n      return (uploads[fieldId] || []).length;\n    });\n  }\n\n  // --- PX-04 previous-design chooser (\"Your designs\" artwork source) ---\n  // Listing previews are capability-signed with a short TTL, so the list is\n  // fetched when the pane opens (never at page boot) and cached per session.\n\n  // RE2 open chooser: every design in the account lists (one fetch, capped at\n  // 200 most-recent under the hood); \"Show more\" only expands what is already\n  // fetched, so no pick is ever hidden behind a failed second request.\n  var REORDER_CHOOSER_FETCH_CAP = 200;\n  var REORDER_CHOOSER_PAGE_SIZE = 24;\n\n  function getReorderChooserState(store) {\n    if (!store.reorderChooser || typeof store.reorderChooser !== 'object') {\n      store.reorderChooser = {\n        status: 'idle',\n        items: [],\n        error: '',\n        busyLookup: '',\n        total: 0,\n        visibleCount: REORDER_CHOOSER_PAGE_SIZE\n      };\n    }\n    return store.reorderChooser;\n  }\n\n  function getReorderChooserProxyRoot(store) {\n    var designer = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    return (text(designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer').replace(/\\/+$/, '');\n  }\n\n  function normalizeReorderChooserItem(raw) {\n    var item = raw && typeof raw === 'object' ? raw : {};\n    var selection = item.selection && typeof item.selection === 'object' ? item.selection : {};\n    return {\n      lookup: text(item.lookup || item.publicId || item.projectId || item.id),\n      title: text(item.title) || 'Untitled design',\n      status: text(item.status).toLowerCase() === 'ordered' ? 'ordered' : 'saved',\n      updatedAt: text(item.updatedAt),\n      previewUrl: text(item.previewUrl),\n      // The reorder cart mark speaks the customer vocabulary (design number +\n      // title, never raw ids); carry the number through from the unified\n      // my-designs record when the summary has one.\n      designNumber: text(item.designNumber),\n      // RE2 open chooser: product + size signals rank the account-wide list\n      // (tier 1 this product, tier 2 size match, tier 3 everything else).\n      // All optional and fail-open \u2014 a design with no signals ranks tier 3.\n      productHandle: text(item.productHandle).toLowerCase(),\n      productId: normalizeStorefrontProductIdentity(item.productId),\n      sizeLabel: text(selection.selectedSizeLabel || selection.size),\n      sizeWidth: numberValue(selection.selectedWidth, 0),\n      sizeHeight: numberValue(selection.selectedHeight, 0),\n      // The unified source emits only directly-resumable rows today\n      // (sourceType 'self-hosted'/'service-assignment'); a future legacy row\n      // marked un-importable must not render as a dead end \u2014 the fallback\n      // absorbs it (RE1 ruling: no new legacy fetch, import lane only).\n      importable: item.importable !== false\n    };\n  }\n\n  // A design from another product states where it came from in plain words.\n  // The record carries only the handle, so the label is handle-derived.\n  function formatReorderChooserProductLabel(handle) {\n    return text(handle).split('-').filter(Boolean).map(function (word) {\n      return word.charAt(0).toUpperCase() + word.slice(1);\n    }).join(' ');\n  }\n\n  function isReorderChooserItemForThisProduct(store, item) {\n    if (!item) return false;\n    var currentHandle = text(store && store.config && store.config.handle).toLowerCase();\n    var currentProductId = normalizeStorefrontProductIdentity(store && store.config && store.config.productId);\n    if (item.productHandle && currentHandle && item.productHandle === currentHandle) return true;\n    if (item.productId && currentProductId && item.productId === currentProductId) return true;\n    return false;\n  }\n\n  // Size grammar mirrors findSizeOptionForTemplateSwitch: exact label match\n  // (case-insensitive) or dimensions equal within 0.01 in either orientation.\n  function reorderChooserSizeSignalsMatch(item, signal) {\n    if (!item || !signal) return false;\n    var itemLabel = text(item.sizeLabel).toLowerCase();\n    var signalLabel = text(signal.label).toLowerCase();\n    if (itemLabel && signalLabel && itemLabel === signalLabel) return true;\n    var itemWidth = numberValue(item.sizeWidth, 0);\n    var itemHeight = numberValue(item.sizeHeight, 0);\n    var signalWidth = numberValue(signal.width, 0);\n    var signalHeight = numberValue(signal.height, 0);\n    if (itemWidth > 0 && itemHeight > 0 && signalWidth > 0 && signalHeight > 0) {\n      var same = Math.abs(itemWidth - signalWidth) < 0.01 && Math.abs(itemHeight - signalHeight) < 0.01;\n      var rotated = Math.abs(itemWidth - signalHeight) < 0.01 && Math.abs(itemHeight - signalWidth) < 0.01;\n      if (same || rotated) return true;\n    }\n    return false;\n  }\n\n  // The size signals this page offers: the currently selected size first,\n  // then every size option the product carries (derived through the existing\n  // normalize helpers \u2014 synced commerce values, then parsed labels).\n  function getReorderChooserSizeSignals(store) {\n    var signals = { selected: null, offered: [] };\n    var selectedPayload = buildSelectedSizePayload(store);\n    if (text(selectedPayload.selectedSizeLabel) || (numberValue(selectedPayload.selectedWidth, 0) > 0 && numberValue(selectedPayload.selectedHeight, 0) > 0)) {\n      signals.selected = {\n        label: text(selectedPayload.selectedSizeLabel),\n        width: numberValue(selectedPayload.selectedWidth, 0),\n        height: numberValue(selectedPayload.selectedHeight, 0)\n      };\n    }\n    try {\n      var sync = getProductCommerceEditorSync(store);\n      var holder = findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n      if (holder) {\n        getVisibleOptions(store, holder).forEach(function (option) {\n          if (!option) return;\n          var syncedValue = findProductCommerceSizeValue(store, holder, option);\n          var width = numberValue(syncedValue && syncedValue.width, 0);\n          var height = numberValue(syncedValue && syncedValue.height, 0);\n          if (!(width > 0 && height > 0)) {\n            var parsed = parseOptionSizeToken(option, syncedValue && syncedValue.label);\n            width = numberValue(parsed && parsed.width, 0);\n            height = numberValue(parsed && parsed.height, 0);\n          }\n          var label = text(buildDisplayLabel(option)) || text(syncedValue && syncedValue.label);\n          if (label || (width > 0 && height > 0)) {\n            signals.offered.push({ label: label, width: width, height: height });\n          }\n        });\n      }\n    } catch (_) {}\n    return signals;\n  }\n\n  // Operator ranking (2026-08-31): this product's designs first, then designs\n  // whose size fits this product (currently selected size leading), then the\n  // whole account \u2014 each region most-recently-updated first. Every design in\n  // the account is selectable; ranking only orders the single list.\n  function rankReorderChooserItems(store, items) {\n    var signals = getReorderChooserSizeSignals(store);\n    var byRecency = function (left, right) {\n      return (Date.parse(text(right && right.updatedAt)) || 0) - (Date.parse(text(left && left.updatedAt)) || 0);\n    };\n    var tierOne = [];\n    var tierTwoSelected = [];\n    var tierTwoOffered = [];\n    var tierThree = [];\n    (Array.isArray(items) ? items : []).forEach(function (item) {\n      if (isReorderChooserItemForThisProduct(store, item)) {\n        item.tier = 1;\n        tierOne.push(item);\n        return;\n      }\n      if (signals.selected && reorderChooserSizeSignalsMatch(item, signals.selected)) {\n        item.tier = 2;\n        tierTwoSelected.push(item);\n        return;\n      }\n      if (signals.offered.some(function (signal) { return reorderChooserSizeSignalsMatch(item, signal); })) {\n        item.tier = 2;\n        tierTwoOffered.push(item);\n        return;\n      }\n      item.tier = 3;\n      tierThree.push(item);\n    });\n    tierOne.sort(byRecency);\n    tierTwoSelected.sort(byRecency);\n    tierTwoOffered.sort(byRecency);\n    tierThree.sort(byRecency);\n    return tierOne.concat(tierTwoSelected, tierTwoOffered, tierThree);\n  }\n\n  function formatReorderChooserDate(isoValue) {\n    var value = text(isoValue);\n    if (!value) return '';\n    try {\n      return new Intl.DateTimeFormat(undefined, { month: 'short', day: 'numeric', year: 'numeric' })\n        .format(new Date(value));\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function buildReorderChooserSignInUrl() {\n    try {\n      var loginUrl = new URL('/account/login', window.location.origin);\n      loginUrl.searchParams.set('return_url', window.location.pathname);\n      return loginUrl.toString();\n    } catch (_) {\n      return '/account/login';\n    }\n  }\n\n  // RE1 fallback resolution: \"I don't see my design\" is a first-class chooser\n  // outcome present in EVERY reorder state (guest, listing, empty, error).\n  // Arming it completes the artwork step with the exact operator promise \u2014\n  // checkout proceeds ungated and staff reach out afterwards.\n  function isReorderFallbackSelected(store) {\n    return !!(store && store.state && store.state.reorderFallback === true);\n  }\n\n  // RE2 reference attach: any chooser pick the native resume contract cannot\n  // serve (cross-product designs always; a rejected same-product resume too)\n  // resolves the artwork step as an honest reorder REFERENCE \u2014 the design is\n  // attached to the order for staff to fit, never loaded into this page's\n  // editor. Purchase proceeds ungated at this page's configured price.\n  function isReorderReferenceSelected(store) {\n    if (!store || !store.state) return false;\n    if (text(store.state.artworkMode).toLowerCase() !== 'reorder') return false;\n    var context = store.state.reorderContext;\n    return !!(context && typeof context === 'object' && text(context.source) === 'reference');\n  }\n\n  // The honest adapt promise for a reference attach. Distinct from the\n  // fallback's reach-out promise, which stays reserved for the fallback.\n  function getReorderReferenceAdaptCopy() {\n    return 'We will fit this design to your new order. Proof before print.';\n  }\n\n  function armReorderReference(store, item) {\n    if (!store || !store.state || !item) return;\n    var sourceLabel = isReorderChooserItemForThisProduct(store, item)\n      ? ''\n      : formatReorderChooserProductLabel(item.productHandle);\n    store.state.reorderContext = {\n      source: 'reference',\n      designNumber: text(item.designNumber),\n      title: text(item.title),\n      sourceRef: text(item.lookup),\n      sourceProduct: sourceLabel,\n      previewUrl: text(item.previewUrl)\n    };\n    store.state.reorderFallback = false;\n    emitStorefrontEvent(store, 'artwork_reorder_reference_selected', 'artwork', {\n      crossProduct: sourceLabel ? 1 : 0\n    }, 'normal');\n    syncFormState(store);\n    render(store);\n  }\n\n  function buildReorderFallbackControlMarkup(store) {\n    var selected = isReorderFallbackSelected(store);\n    return '' +\n      '<button type=\"button\" class=\"bg-reorder-chooser__fallback' + (selected ? ' is-selected' : '') + '\"' +\n        ' data-bg-artwork-action=\"reorder-fallback\" aria-pressed=\"' + (selected ? 'true' : 'false') + '\">' +\n        '<span class=\"bg-reorder-chooser__fallback-title\">' + (selected ? '\u2713 ' : '') + 'I don&rsquo;t see my design</span>' +\n        '<span class=\"bg-reorder-chooser__fallback-copy\">Order now \u2014 we will reach out to you after checkout.</span>' +\n      '</button>';\n  }\n\n  // The reorder cart mark rides the full designer state + one staff-visible\n  // property. It never enters the SIGNED compact transform state (that\n  // whitelist is untouched) and never carries raw internal ids in visible\n  // copy \u2014 the design number/title are the customer vocabulary.\n  function getSerializedReorderState(store) {\n    if (!store || !store.state) return null;\n    var mode = text(store.state.artworkMode).toLowerCase();\n    if (mode === 'reorder' && isReorderChooserPresentation(store) && isReorderFallbackSelected(store)) {\n      return { source: 'fallback' };\n    }\n    var context = store.state.reorderContext;\n    if (!context || typeof context !== 'object') return null;\n    // RE2 reference attach: the mark rides the reorder mode itself \u2014 no\n    // project is loaded, so there is no projectRef to bind to.\n    if (mode === 'reorder' && isReorderChooserPresentation(store) && text(context.source) === 'reference') {\n      var reference = { source: 'reference' };\n      if (text(context.designNumber)) reference.designNumber = text(context.designNumber);\n      if (text(context.title)) reference.title = text(context.title);\n      if (text(context.sourceRef)) reference.sourceRef = text(context.sourceRef);\n      if (text(context.sourceProduct)) reference.sourceProduct = text(context.sourceProduct);\n      return reference;\n    }\n    var projectId = text(store.state.project && store.state.project.projectId);\n    if (mode !== 'designonline' || !projectId || text(context.projectRef) !== projectId) return null;\n    var serialized = { source: text(context.source) || 'saved' };\n    if (text(context.designNumber)) serialized.designNumber = text(context.designNumber);\n    if (text(context.title)) serialized.title = text(context.title);\n    if (text(context.sourceRef)) serialized.sourceRef = text(context.sourceRef);\n    return serialized;\n  }\n\n  function setReorderContextFromResumedProject(store, source, chosenItem) {\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    store.state.reorderContext = {\n      source: text(source) || 'saved',\n      designNumber: text((chosenItem && chosenItem.designNumber) || project.designNumber),\n      title: text((chosenItem && chosenItem.title) || project.title),\n      projectRef: text(project.projectId),\n      sourceRef: text(chosenItem && chosenItem.lookup)\n    };\n    store.state.reorderFallback = false;\n  }\n\n  // RE3: the loaded design's genuine reorder origin \u2014 'saved'/'ordered' ONLY\n  // when the RE1/RE2 chooser pick marked THIS project (projectRef match, the\n  // same predicate the cart serializer uses). A design the customer created,\n  // edited, or resumed outside the chooser has no reorder origin and must\n  // never be presented or serialized as a reorder.\n  function getContextualReorderOrigin(store) {\n    if (!store || !store.state) return '';\n    var projectId = text(store.state.project && store.state.project.projectId);\n    var context = store.state.reorderContext;\n    if (!projectId || !context || typeof context !== 'object') return '';\n    var source = text(context.source);\n    if ((source === 'saved' || source === 'ordered') && text(context.projectRef) === projectId) return source;\n    return '';\n  }\n\n  // RE3 proof-copy lane (operator rule 2026-08-31: \"We do not provide proofs\n  // if a customer designs online\"). The design-online lane \u2014 a design made or\n  // edited in OUR editor, approved by the customer in the editor's\n  // review-and-approve step \u2014 gets NO staff-proof promise. Upload, edit\n  // service, reorder (chooser pick/reference), fallback, and undetermined\n  // lanes keep their proof language: staff genuinely proof those, and an\n  // unknown lane fails toward the proof copy, never away from it.\n  // A loaded project IS the design-online signal even when the render-time\n  // mode normalizer cleared the mode for a template without online\n  // availability \u2014 projects only exist through our editor. An explicit\n  // non-online mode (the customer switched lanes) keeps its own copy.\n  function isDesignOnlineNoProofLane(store) {\n    if (!store || !store.state) return false;\n    if (getContextualReorderOrigin(store)) return false;\n    var mode = text(store.state.artworkMode).toLowerCase();\n    if (mode && mode !== 'designonline') return false;\n    if (text(store.state.project && store.state.project.projectId)) return true;\n    return mode === 'designonline';\n  }\n\n  // The armed reference renders as its own summary card (thumbnail + title +\n  // the honest adapt promise) in place of the list \u2014 the decision is made;\n  // \"Choose a different design\" reopens the ranked list.\n  function buildReorderReferenceCardMarkup(store) {\n    var context = store.state && store.state.reorderContext ? store.state.reorderContext : {};\n    var title = text(context.title) || 'Your design';\n    var sourceProduct = text(context.sourceProduct);\n    return '' +\n      '<div class=\"bg-reorder-chooser__reference\" data-bg-reorder-reference role=\"status\">' +\n        (text(context.previewUrl)\n          ? '<img class=\"bg-reorder-chooser__thumb\" src=\"' + escapeHtml(text(context.previewUrl)) + '\" alt=\"\" loading=\"lazy\">'\n          : '<span class=\"bg-reorder-chooser__thumb bg-reorder-chooser__thumb--empty\" aria-hidden=\"true\"></span>') +\n        '<span class=\"bg-reorder-chooser__meta\">' +\n          '<span class=\"bg-reorder-chooser__title\">\u2713 ' + escapeHtml(title) + '</span>' +\n          (sourceProduct ? '<span class=\"bg-reorder-chooser__source\">From ' + escapeHtml(sourceProduct) + '</span>' : '') +\n          '<span class=\"bg-reorder-chooser__reference-copy\">' + escapeHtml(getReorderReferenceAdaptCopy()) + '</span>' +\n        '</span>' +\n        '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-reorder-chooser__reference-change\" data-bg-artwork-action=\"reorder-reference-change\">Choose a different design</button>' +\n      '</div>';\n  }\n\n  function buildReorderChooserMarkup(store) {\n    var state = getReorderChooserState(store);\n    if (isReorderReferenceSelected(store)) {\n      return buildReorderReferenceCardMarkup(store);\n    }\n    if (state.status === 'idle' || state.status === 'loading') {\n      return '<p class=\"bg-guided-artwork__detail-copy\" role=\"status\">Loading your designs\u2026</p>';\n    }\n    if (state.status === 'error') {\n      return '' +\n        '<p class=\"bg-guided-artwork__detail-copy\">' + escapeHtml(state.error || 'We could not load your designs.') + '</p>' +\n        '<button type=\"button\" class=\"button button--secondary bg-guided-artwork__inline-action\" data-bg-artwork-action=\"reorder-retry\">Try again</button>';\n    }\n    if (!state.items.length) {\n      return '<p class=\"bg-guided-artwork__detail-copy\">No saved designs yet. Design online and your work saves here.</p>';\n    }\n    var busy = text(state.busyLookup);\n    var visibleItems = state.items.slice(0, Math.max(1, state.visibleCount || REORDER_CHOOSER_PAGE_SIZE));\n    var hiddenCount = state.items.length - visibleItems.length;\n    // Light region labels only when both regions exist: this product's\n    // designs lead, then the rest of the account (size matches first).\n    var hasTierOne = state.items.length && state.items[0].tier === 1;\n    var hasOthers = state.items.some(function (item) { return item.tier !== 1; });\n    var showLabels = hasTierOne && hasOthers;\n    var renderedOtherLabel = false;\n    var rows = visibleItems.map(function (item, index) {\n      var isBusy = !!busy && busy === item.lookup;\n      var label = '';\n      if (showLabels) {\n        if (index === 0) label = 'For this product';\n        else if (!renderedOtherLabel && item.tier !== 1) {\n          label = 'All your designs';\n          renderedOtherLabel = true;\n        }\n      }\n      var sourceLabel = item.tier !== 1 ? formatReorderChooserProductLabel(item.productHandle) : '';\n      return '' +\n        (label ? '<li class=\"bg-reorder-chooser__group-label\" role=\"presentation\">' + escapeHtml(label) + '</li>' : '') +\n        '<li class=\"bg-reorder-chooser__entry\">' +\n          '<button type=\"button\" class=\"bg-reorder-chooser__item' + (isBusy ? ' is-busy' : '') + '\"' +\n            ' data-bg-artwork-action=\"reorder-choose\"' +\n            ' data-bg-reorder-lookup=\"' + escapeHtml(item.lookup) + '\"' +\n            (busy ? ' disabled' : '') + '>' +\n            (item.previewUrl\n              ? '<img class=\"bg-reorder-chooser__thumb\" src=\"' + escapeHtml(item.previewUrl) + '\" alt=\"\" loading=\"lazy\">'\n              : '<span class=\"bg-reorder-chooser__thumb bg-reorder-chooser__thumb--empty\" aria-hidden=\"true\"></span>') +\n            '<span class=\"bg-reorder-chooser__meta\">' +\n              '<span class=\"bg-reorder-chooser__title\">' + escapeHtml(item.title) + '</span>' +\n              '<span class=\"bg-reorder-chooser__sub\">' +\n                '<span class=\"bg-reorder-chooser__badge' + (item.status === 'ordered' ? ' bg-reorder-chooser__badge--ordered' : '') + '\">' +\n                  (item.status === 'ordered' ? 'Ordered' : 'Saved') +\n                '</span>' +\n                (formatReorderChooserDate(item.updatedAt)\n                  ? '<span class=\"bg-reorder-chooser__date\">' + escapeHtml(formatReorderChooserDate(item.updatedAt)) + '</span>'\n                  : '') +\n                (sourceLabel\n                  ? '<span class=\"bg-reorder-chooser__source\">From ' + escapeHtml(sourceLabel) + '</span>'\n                  : '') +\n              '</span>' +\n            '</span>' +\n            (isBusy ? '<span class=\"bg-reorder-chooser__busy\" role=\"status\">Loading\u2026</span>' : '') +\n          '</button>' +\n        '</li>';\n    }).join('');\n    return '' +\n      '<ul class=\"bg-reorder-chooser__list\" role=\"list\">' + rows + '</ul>' +\n      (hiddenCount > 0\n        ? '<button type=\"button\" class=\"button button--secondary bg-guided-artwork__inline-action bg-reorder-chooser__more\" data-bg-artwork-action=\"reorder-show-more\">Show more designs (' + String(hiddenCount) + ' more)</button>'\n        : '') +\n      (state.total > state.items.length\n        ? '<p class=\"bg-guided-artwork__detail-copy bg-reorder-chooser__cap-note\">Showing your ' + String(state.items.length) + ' most recent designs.</p>'\n        : '');\n  }\n\n  function renderReorderChooserSlot(store) {\n    notifyMobileArtwork(store);\n    var blocks = readBlocks(store);\n    var slot = blocks.artwork && blocks.artwork.querySelector('[data-bg-artwork-reorder-slot]');\n    if (!slot) return;\n    var state = getReorderChooserState(store);\n    if (state.status === 'idle' || state.status === 'loading') slot.setAttribute('aria-busy', 'true');\n    else slot.removeAttribute('aria-busy');\n    slot.innerHTML = buildReorderChooserMarkup(store);\n    // Capability-signed previews expire (TTL \u2264300s): a thumb that fails to\n    // load degrades to the designed empty placeholder, never a broken image.\n    Array.prototype.slice.call(slot.querySelectorAll('img.bg-reorder-chooser__thumb')).forEach(function (image) {\n      image.onerror = function () {\n        var placeholder = document.createElement('span');\n        placeholder.className = 'bg-reorder-chooser__thumb bg-reorder-chooser__thumb--empty';\n        placeholder.setAttribute('aria-hidden', 'true');\n        if (image.parentNode) image.parentNode.replaceChild(placeholder, image);\n      };\n    });\n  }\n\n  function fetchReorderChooserItems(store) {\n    var state = getReorderChooserState(store);\n    if (state.status === 'loading') return;\n    state.status = 'loading';\n    state.error = '';\n    var requestUrl;\n    try {\n      requestUrl = new URL(getReorderChooserProxyRoot(store) + '/my-designs', window.location.origin);\n    } catch (_) {\n      state.status = 'error';\n      state.error = 'We could not load your designs.';\n      renderReorderChooserSlot(store);\n      return;\n    }\n    // RE2 (operator direction 2026-08-31): the chooser lists EVERY design in\n    // the account \u2014 no product scoping; ranking happens here, where the page\n    // knows its own product and size options.\n    requestUrl.searchParams.set('limit', String(REORDER_CHOOSER_FETCH_CAP));\n    requestUrl.searchParams.set('offset', '0');\n    requestUrl.searchParams.set('includeOrdered', '1');\n    fetch(requestUrl.toString(), {\n      credentials: 'same-origin',\n      headers: { accept: 'application/json' }\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        return { ok: response.ok, body: body };\n      });\n    }).then(function (result) {\n      var detail = result.body && result.body.ok === true && result.body.detail && typeof result.body.detail === 'object'\n        ? result.body.detail\n        : null;\n      if (!result.ok || !detail) throw new Error('reorder chooser list failed');\n      state.items = rankReorderChooserItems(store, (Array.isArray(detail.items) ? detail.items : [])\n        .map(normalizeReorderChooserItem)\n        .filter(function (item) { return !!item.lookup && item.importable; }));\n      state.total = Math.max(state.items.length, Math.round(Number(detail.total)) || 0);\n      state.visibleCount = REORDER_CHOOSER_PAGE_SIZE;\n      state.status = 'loaded';\n    }).catch(function () {\n      state.status = 'error';\n      state.error = 'We could not load your designs.';\n    }).then(function () {\n      renderReorderChooserSlot(store);\n    });\n  }\n\n  function applyReorderChooserResumeParams(lookup, origin, keepHistory) {\n    try {\n      var url = new URL(window.location.href);\n      url.searchParams.set('bg_saved_project_id', text(lookup));\n      url.searchParams.set('bg_saved_source', 'product-page');\n      if (text(origin)) url.searchParams.set('bg_reorder_origin', text(origin));\n      window.history.replaceState(keepHistory ? window.history.state : {}, document.title, url.toString());\n    } catch (_) {}\n  }\n\n  function chooseReorderDesign(store, target) {\n    var state = getReorderChooserState(store);\n    if (state.busyLookup) return;\n    var lookup = text(target && target.getAttribute && target.getAttribute('data-bg-reorder-lookup'));\n    var item = state.items.find(function (entry) { return entry.lookup === lookup; });\n    if (!item) return;\n    // RE2: a design from another product never implies an editor load \u2014 it\n    // resolves immediately as an honest reorder reference (staff fit the\n    // artwork to this order). No network, no dead end.\n    if (!isReorderChooserItemForThisProduct(store, item)) {\n      armReorderReference(store, item);\n      return;\n    }\n    if (lookup === store.artworkResumedLookup && text(store.state.project.projectId) === store.artworkResumedProjectId) {\n      if (applyArtworkMethodOption(store, 'reorder', 'customer')) { syncFormState(store); render(store); }\n      return Promise.resolve(true);\n    }\n    var token = captureArtworkOperation(store);\n    state.busyLookup = lookup;\n    state.error = '';\n    renderReorderChooserSlot(store);\n    var reorderOrigin = item.status === 'ordered' ? 'ordered' : 'saved';\n    var resumeWith = function (resumeLookup) {\n      if (!isArtworkOperationFresh(store, token)) return Promise.resolve(false);\n      applyReorderChooserResumeParams(resumeLookup, reorderOrigin, target.getAttribute('data-bg-mobile-artwork') === 'true');\n      return restoreFromSavedProjectResume(store, token).then(function (restored) {\n        if (!restored && !isArtworkOperationFresh(store, token)) { if (state.busyLookup === lookup) state.busyLookup = ''; return false; }\n        if (!restored) throw new Error('reorder chooser resume failed');\n        // The line stays identifiable as a reorder after the canonical resume\n        // flips the mode to designonline: keep the chosen design's number and\n        // title as the customer-visible reference.\n        store.artworkResumedLookup = lookup;\n        setReorderContextFromResumedProject(store, reorderOrigin, item);\n        syncFormState(store);\n        state.busyLookup = '';\n        render(store);\n      });\n    };\n    var flow;\n    if (item.status === 'ordered') {\n      // Ordered designs stay immutable: clone to a fresh draft first, then\n      // resume the draft through the same saved-design contract.\n      flow = fetch(getReorderChooserProxyRoot(store) + '/my-designs/reorder-copy', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: { accept: 'application/json', 'content-type': 'application/json' },\n        body: JSON.stringify({ projectId: lookup })\n      }).then(function (response) {\n        return response.json().catch(function () { return null; }).then(function (body) {\n          return { ok: response.ok, body: body };\n        });\n      }).then(function (result) {\n        if (!isArtworkOperationFresh(store, token)) return false;\n      var copyResult = result.body && result.body.ok === true && result.body.result && typeof result.body.result === 'object'\n          ? result.body.result\n          : null;\n        var draftLookup = text(copyResult && (copyResult.publicId || copyResult.projectId));\n        if (!result.ok || !draftLookup) throw new Error('reorder copy failed');\n        return resumeWith(draftLookup);\n      });\n    } else {\n      flow = resumeWith(lookup);\n    }\n    return flow.catch(function () {\n      if (!isArtworkOperationFresh(store, token)) { if (state.busyLookup === lookup) state.busyLookup = ''; return false; }\n      // RE2 no-dead-end guarantee: a pick the native contract rejects (size\n      // or template no longer resolvable, record fetch failure, clone\n      // failure) lands as the honest reference attach \u2014 silently correct.\n      state.busyLookup = '';\n      clearSavedProjectResumeParams();\n      store.pendingUrlStateErrorMessage = '';\n      setMessage(store, '', '');\n      armReorderReference(store, item);\n    });\n  }\n\n  function syncArtworkReorderChooser(store) {\n    if (!isReorderChooserPresentation(store) || !isCustomerLoggedIn(store)) return;\n    var blocks = readBlocks(store);\n    var slot = blocks.artwork && blocks.artwork.querySelector('[data-bg-artwork-reorder-slot]');\n    if (!slot) return;\n    var state = getReorderChooserState(store);\n    if (state.status === 'idle') fetchReorderChooserItems(store);\n  }\n\n  function buildArtworkActionDetail(store, item, templateAvailability, artworkRuleState) {\n    var hasSavedProject = !!text(store.state.project && store.state.project.projectId);\n    var isGuidedPresentation = getProductFormPresentation(store) === 'guided';\n    if (item.key === 'upload-files') {\n      if (shouldCollapseRestoredUploadDetail(store)) return '';\n      if (shouldLaunchEditorForArtworkUpload(store)) {\n        var uploadEditorNote = getArtworkUploadEditorNote(store);\n        return '' +\n          '<div class=\"bg-guided-artwork__action-detail\">' +\n            (uploadEditorNote ? '<p class=\"bg-guided-artwork__detail-copy\">' + escapeHtml(uploadEditorNote) + '</p>' : '') +\n            '<button type=\"button\" class=\"button button--secondary bg-guided-artwork__inline-action\" data-bg-artwork-action=\"upload-in-editor\">Upload Design' + buildArtworkMethodPriceSuffixMarkup(store, 'uploadfiles') + '</button>' +\n          '</div>';\n      }\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          (getArtworkSectionConfig(store).restQuickLinks || isGuidedPresentation ? '' : '<p class=\"bg-guided-artwork__detail-copy\">Upload files here. We review before production.</p>') +\n          '<div class=\"bg-designer-storefront__upload-grid bg-designer-storefront__upload-grid--inline\">' +\n            getInlineArtworkUploadFields(store).map(function (field) {\n              return buildUploadFieldMarkup(store, field, {\n                idPrefix: 'bg-designer-artwork-upload-',\n                hideLabel: isGuidedPresentation\n              });\n            }).join('') +\n          '</div>' +\n        '</div>';\n    }\n    if (item.key === 'share-canva') {\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          '<p class=\"bg-guided-artwork__detail-copy\">We will use our Pro account to export your Canva design for proper print production. You will receive a proof before we go to print.</p>' +\n          buildCanvaLinkInputMarkup(store) +\n        '</div>';\n    }\n    if (item.key === 'use-template') {\n      if (store.state.template) ensureGuidedFillSlotStateLoaded(store);\n      var guidedPanelMarkup = isGuidedFillArmed(store) ? buildGuidedFillPanelMarkup(store, templateAvailability) : '';\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          (!store.state.template && !hasSavedProject ? (\n            '<div class=\"bg-guided-artwork__template-empty-state\">' +\n              '<button type=\"button\" class=\"button button--secondary bg-guided-artwork__inline-action\" data-bg-artwork-action=\"browse-templates\">Choose template</button>' +\n              '<span class=\"bg-guided-artwork__detail-copy\">Select a template to continue.</span>' +\n            '</div>'\n          ) : (getArtworkSectionConfig(store).restQuickLinks && store.state.template && !hasSavedProject && !guidedPanelMarkup ? (\n            // Refined compact chooser: the collapsed row already names the\n            // template, so the detail is a flat thumb + text actions instead\n            // of a second nested card repeating the name.\n            buildCompactSelectedTemplateMarkup(store, templateAvailability)\n          ) : (\n            buildSelectedTemplateCard(store, artworkRuleState) +\n            (guidedPanelMarkup || buildTemplateFinishChoicesMarkup(store, templateAvailability))\n          ))) +\n        '</div>';\n    }\n    if (item.key === 'custom-design') {\n      var customDesignApprovalMarkup = buildArtworkApprovalMarkup(store, artworkRuleState, {\n        embedded: true,\n        suppressDesignApproval: true\n      });\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail bg-guided-artwork__action-detail--custom-helper\">' +\n          '<p class=\"bg-guided-artwork__detail-copy bg-guided-workbench__custom-helper\">After checkout, we\u2019ll reach out to get all the details needed. No orders are printed without proof approvals.</p>' +\n          customDesignApprovalMarkup +\n        '</div>';\n    }\n    if (item.key === 'reorder') {\n      if (isReorderChooserPresentation(store)) {\n        // The fallback control renders OUTSIDE the chooser slot so listing\n        // re-renders (loading/error/empty/loaded) can never drop it \u2014 it is\n        // present in every reorder-outcome state, guests included.\n        if (!isCustomerLoggedIn(store)) {\n          // A BUTTON, deliberately not an anchor: the customer-hub app\n          // intercepts account-login anchors in the capture phase (rewriting\n          // them to its own account view and dropping the return URL), so an\n          // <a> here can never reliably complete the PDP round trip. The\n          // delegated action navigates to the canonical login URL directly.\n          return '' +\n            '<div class=\"bg-guided-artwork__action-detail\">' +\n              '<p class=\"bg-guided-artwork__detail-copy\">Sign in to start from a design you saved or ordered before.</p>' +\n              '<button type=\"button\" class=\"button button--secondary bg-guided-artwork__inline-action\" data-bg-artwork-action=\"reorder-signin\">Sign in</button>' +\n              buildReorderFallbackControlMarkup(store) +\n            '</div>';\n        }\n        return '' +\n          '<div class=\"bg-guided-artwork__action-detail\">' +\n            '<div class=\"bg-reorder-chooser\" data-bg-artwork-reorder-slot>' + buildReorderChooserMarkup(store) + '</div>' +\n            buildReorderFallbackControlMarkup(store) +\n          '</div>';\n      }\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          '<p class=\"bg-guided-artwork__detail-copy\">We will reach out to you after checkout.</p>' +\n          '<div data-bg-artwork-reorder-slot hidden></div>' +\n        '</div>';\n    }\n    if (item.key === 'recreate-design') {\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          '<p class=\"bg-guided-artwork__detail-copy\">We will contact you for reference files or notes and send a proof for approval before production.</p>' +\n          buildArtworkOptionSupportingUploadMarkup(store, item) +\n        '</div>';\n    }\n    if (item.key === 'free-setup') {\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          '<p class=\"bg-guided-artwork__detail-copy\">We will setup your design for free and send you a proof for approval. If you have supporting files, upload them below.</p>' +\n          buildArtworkOptionSupportingUploadMarkup(store, item) +\n        '</div>';\n    }\n    if (item.key === 'send-later') {\n      // Refined chooser: the row copy already carries the follow-up terms.\n      if (getArtworkSectionConfig(store).restQuickLinks) return '';\n      return '' +\n        '<div class=\"bg-guided-artwork__action-detail\">' +\n          '<p class=\"bg-guided-artwork__detail-copy\">' + escapeHtml(getGuidedCopy(store, 'laterPanelNote')) + '</p>' +\n        '</div>';\n    }\n    return '';\n  }\n\n  function renderArtworkActionRow(store, item, availability, templateAvailability, artworkRuleState) {\n    var selected = isArtworkActionSelected(store, item);\n    var detail = selected ? buildArtworkActionDetail(store, item, templateAvailability, artworkRuleState) : '';\n    return '' +\n      '<div class=\"bg-guided-artwork__action' + (selected ? ' is-selected' : '') + '\" data-bg-artwork-row=\"' + escapeHtml(item.key) + '\">' +\n        '<button type=\"button\" class=\"bg-guided-artwork__action-row\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n          '<span class=\"bg-guided-artwork__action-main\">' +\n            '<span class=\"bg-guided-artwork__action-title\">' + escapeHtml(item.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</span>' +\n            (item.copy ? '<span class=\"bg-guided-artwork__action-copy\">' + escapeHtml(item.copy) + '</span>' : '') +\n          '</span>' +\n          (item.badge ? '<span class=\"bg-guided-artwork__badge\">' + escapeHtml(item.badge) + '</span>' : '') +\n        '</button>' +\n        detail +\n      '</div>';\n  }\n\n  function renderArtworkActionCard(store, item) {\n    var selected = isArtworkActionSelected(store, item);\n    var visualClass = getArtworkActionVisualClass(item);\n    return '' +\n      '<button type=\"button\" class=\"bg-guided-artwork__visual-card bg-guided-artwork__visual-card--' + escapeHtml(visualClass) + (selected ? ' is-selected' : '') + '\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n        '<span class=\"bg-guided-artwork__visual bg-guided-artwork__visual--' + escapeHtml(visualClass) + '\" aria-hidden=\"true\"></span>' +\n        '<span class=\"bg-guided-artwork__visual-card-copy\">' +\n          '<span class=\"bg-guided-artwork__visual-card-title\">' + escapeHtml(item.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</span>' +\n          (item.copy ? '<span class=\"bg-guided-artwork__visual-card-subcopy\">' + escapeHtml(item.copy) + '</span>' : '') +\n        '</span>' +\n        (item.badge ? '<span class=\"bg-guided-artwork__badge\">' + escapeHtml(item.badge) + '</span>' : '') +\n        '<span class=\"bg-guided-artwork__action-check\" aria-hidden=\"true\">\u2713</span>' +\n      '</button>';\n  }\n\n  function getActiveArtworkActionItem(store, actionItems) {\n    return (actionItems || []).find(function (item) {\n      return isArtworkActionSelected(store, item);\n    }) || null;\n  }\n\n  var GUIDED_ARTWORK_INTENTS = {\n    have: ['upload-files', 'share-canva', 'reorder'],\n    help: ['use-template', 'custom-design', 'free-setup', 'recreate-design'],\n    later: ['send-later']\n  };\n\n  function getGuidedArtworkIntent(store, activeItem) {\n    var rootIntent = text(store && store.root && store.root.getAttribute('data-bg-guided-artwork-intent'));\n    if (rootIntent === 'have' || rootIntent === 'help' || rootIntent === 'later') return rootIntent;\n    var uiIntent = text(store && store.uiState && store.uiState.guidedArtworkIntent);\n    if (uiIntent === 'have' || uiIntent === 'help' || uiIntent === 'later') return uiIntent;\n    var primary = text(store && store.state && store.state.artworkPrimaryChoice);\n    if (primary === 'have-design') return 'have';\n    if (primary === 'send-later') return 'later';\n    if (primary === 'need-design') return 'help';\n    // Older restored reorder state used the generic `service` primary choice.\n    // Keep those links/carts under the corrected Have artwork intent too.\n    if (primary === 'service' && activeItem && activeItem.key === 'reorder') return 'have';\n    if (primary === 'service') return 'help';\n    if (activeItem && GUIDED_ARTWORK_INTENTS.have.indexOf(activeItem.key) !== -1) return 'have';\n    if (activeItem && activeItem.key === 'send-later') return 'later';\n    return 'help';\n  }\n\n  function selectSoleGuidedFreeSetup(store, actionItems) {\n    var helpItems = (actionItems || []).filter(function (item) {\n      return GUIDED_ARTWORK_INTENTS.help.indexOf(item.key) !== -1;\n    });\n    if (helpItems.length !== 1 || helpItems[0].key !== 'free-setup') return false;\n    if (!isArtworkActionSelected(store, helpItems[0])) {\n      // The help tab has no price. Paid setup needs its priced method row.\n      if (mappedArtworkPathPrice(store, 'freesetup')) return false;\n      if (!applyArtworkMethodOption(store, 'freesetup')) return false;\n      setArtworkChoice(store, 'service', 'freesetup', 'freesetup');\n    }\n    return true;\n  }\n\n  function selectGuidedArtworkIntent(store, choice) {\n    if (!store || !store.root || ['have-design', 'need-design', 'send-later'].indexOf(choice) === -1) return false;\n    store.uiState = store.uiState || {};\n    store.guidedArtworkMethodChooserExpanded = false;\n    store.guidedArtworkIntentSelected = true;\n    if (choice === 'send-later') {\n      if (!applyArtworkMethodOption(store, 'youhaveart', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'send-later', '', 'youhaveart');\n    } else {\n      var nextIntent = choice === 'have-design' ? 'have' : 'help';\n      var currentIntent = getGuidedArtworkIntent(store, getActiveArtworkActionItem(store, buildArtworkActionItems(store, getStoreArtworkAvailability(store))));\n      if (nextIntent !== currentIntent) {\n        clearArtworkAuxiliaryState(store);\n        if (nextIntent === 'have') {\n          writeArtworkTemplate(store, null);\n          clearProjectState(store);\n        } else {\n          clearUploadState(store);\n          clearCanvaState(store);\n        }\n      }\n      setArtworkIntent(store, choice, '');\n      commitArtworkChoice(store, { mode: '', source: 'clear' });\n      store.uiState.guidedArtworkIntent = nextIntent;\n      if (nextIntent === 'help') {\n        selectSoleGuidedFreeSetup(store, buildArtworkActionItems(store, getStoreArtworkAvailability(store)));\n      }\n    }\n    store.root.setAttribute('data-bg-guided-artwork-intent', store.uiState.guidedArtworkIntent);\n    render(store);\n    return true;\n  }\n\n  function bindGuidedArtworkIntentDocumentDelegate(store) {\n    if (!store || !store.root) return;\n    store.root.__bgDesignerStore = store;\n    if (document.__bgDesignerGuidedArtworkIntentDelegateV1 === '1') return;\n    document.__bgDesignerGuidedArtworkIntentDelegateV1 = '1';\n    document.addEventListener('click', function (event) {\n      if (event.__bgDesignerGuidedArtworkIntentHandled) return;\n      var button = event.target && typeof event.target.closest === 'function'\n        ? event.target.closest('[data-bg-artwork-primary]')\n        : null;\n      var root = button && button.closest('[data-bg-designer-storefront-root]');\n      var activeStore = root && root.__bgDesignerStore;\n      var choice = text(button && button.getAttribute('data-bg-artwork-primary'));\n      if (!activeStore || getProductFormPresentation(activeStore) !== 'guided') return;\n      event.__bgDesignerGuidedArtworkIntentHandled = true;\n      selectGuidedArtworkIntent(activeStore, choice);\n    });\n    document.addEventListener('keydown', function (event) {\n      if (event.defaultPrevented || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' && event.key !== 'Home' && event.key !== 'End')) return;\n      var button = event.target && typeof event.target.closest === 'function'\n        ? event.target.closest('[data-bg-artwork-primary]')\n        : null;\n      var root = button && button.closest('[data-bg-designer-storefront-root]');\n      var activeStore = root && root.__bgDesignerStore;\n      if (!activeStore || getProductFormPresentation(activeStore) !== 'guided') return;\n      var artworkBlock = button.closest('[data-bg-designer-block=\"artwork\"]');\n      var tabs = Array.prototype.slice.call(artworkBlock ? artworkBlock.querySelectorAll('[data-bg-artwork-primary]') : []);\n      if (tabs.length < 2) return;\n      event.preventDefault();\n      var index = tabs.indexOf(button);\n      var nextIndex = event.key === 'Home'\n        ? 0\n        : event.key === 'End'\n          ? tabs.length - 1\n          : (index + (event.key === 'ArrowRight' ? 1 : -1) + tabs.length) % tabs.length;\n      var nextChoice = text(tabs[nextIndex].getAttribute('data-bg-artwork-primary'));\n      tabs[nextIndex].click();\n      window.requestAnimationFrame(function () {\n        var liveArtworkBlock = root.querySelector('[data-bg-designer-block=\"artwork\"]');\n        var nextTab = liveArtworkBlock && liveArtworkBlock.querySelector('[data-bg-artwork-primary=\"' + nextChoice + '\"]');\n        if (nextTab) nextTab.focus();\n      });\n    });\n  }\n\n  function getGuidedArtworkMethodDisplay(store, item) {\n    var personalizationChoice = getTemplatePersonalizationChoiceLabel(store);\n    var displayByKey = {\n      'upload-files': {\n        title: 'Upload a print-ready file',\n        copy: ''\n      },\n      'share-canva': {\n        title: 'Share a Canva Design',\n        copy: 'Have a design built in Canva? We can print it.'\n      },\n      'use-template': {\n        title: 'Start with a template',\n        copy: 'Pick a design. ' + personalizationChoice + ' after checkout, or edit it online yourself.'\n      },\n      'custom-design': {\n        title: 'Create me a custom design',\n        copy: \"Don't like our templates or want something custom?\"\n      },\n      'send-later': {\n        title: 'Handle artwork after checkout',\n        copy: ''\n      }\n    };\n    // The guided defaults replace the generic card wording, but a staff-authored\n    // label/description from Admin Design Options always wins \u2014 this map used to\n    // clobber the admin overrides for its five keys (GUIDED-PDP-TOKENIZE-01 T0).\n    var guided = displayByKey[item.key] || {};\n    var admin = getArtworkMethodDisplayConfig(store, item.mode);\n    var display = { title: item.title, copy: item.copy };\n    if (guided.title !== undefined && !(admin && admin.label)) display.title = guided.title;\n    if (guided.copy !== undefined && !(admin && admin.description)) display.copy = guided.copy;\n    return display;\n  }\n\n  function getFocusedGuidedArtworkMethodKey(store) {\n    if (!store || !store.state || store.guidedArtworkMethodChooserExpanded === true) return '';\n    var mode = text(store.state.artworkMode).toLowerCase();\n    if (\n      store.state.template\n      && mode === 'editservice'\n      && !text(store.state.project && store.state.project.projectId)\n    ) {\n      return 'use-template';\n    }\n    if (mode === 'uploadcanva' && isValidCanvaUrl(store.state.canvaUrl)) return 'share-canva';\n    if (mode === 'uploadfiles' && getPrimaryArtworkUploadFiles(store).length > 0) return 'upload-files';\n    return '';\n  }\n\n  function rememberGuidedArtworkMethodState(store, methodKey) {\n    if (!store || !store.state || !methodKey) return;\n    store.guidedArtworkMethodRestoreCache = store.guidedArtworkMethodRestoreCache || {};\n    if (methodKey === 'share-canva' && isValidCanvaUrl(store.state.canvaUrl)) {\n      store.guidedArtworkMethodRestoreCache[methodKey] = {\n        canvaUrl: text(store.state.canvaUrl)\n      };\n      return;\n    }\n    if (methodKey === 'upload-files' && getPrimaryArtworkUploadFiles(store).length) {\n      var rememberedUploads = {};\n      Object.keys(store.state.uploads || {}).forEach(function (fieldId) {\n        rememberedUploads[fieldId] = (store.state.uploads[fieldId] || []).slice();\n      });\n      store.guidedArtworkMethodRestoreCache[methodKey] = {\n        uploads: rememberedUploads\n      };\n    }\n  }\n\n  function clearGuidedArtworkMethodRestore(store, methodKey) {\n    if (!store || !store.guidedArtworkMethodRestoreCache) return;\n    if (methodKey) {\n      delete store.guidedArtworkMethodRestoreCache[methodKey];\n      return;\n    }\n    store.guidedArtworkMethodRestoreCache = {};\n  }\n\n  function buildGuidedSelectedTemplateOutcomesMarkup(store, templateAvailability) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var editServiceAmount = Math.max(0, numberValue(getArtworkFeeAmounts(store).templatePersonalizationAmount, 0));\n    var mappedServicePrice = mappedArtworkPathPrice(store, 'editservice', store.state.template);\n    var mappedOnlinePrice = mappedArtworkPathPrice(store, 'designonline', store.state.template);\n    if (mappedServicePrice) editServiceAmount = mappedServicePrice.amount;\n    var editServiceSaving = roundMoney(editServiceAmount - (mappedOnlinePrice ? mappedOnlinePrice.amount : 0));\n    var editServiceIsFree = editServiceAmount === 0;\n    var editBrandLabel = getTemplatePersonalizationBrandLabel(store);\n    var editServiceTitle = editBrandLabel ? 'Let ' + editBrandLabel + ' Edit' : 'Let Us Edit';\n    var editServiceCompareLabel = editBrandLabel ? editBrandLabel + ' Edit' : 'our edit service';\n    var choices = [];\n    if (templateAvailability.editservice) {\n      choices.push(\n        '<div class=\"bg-guided-artwork__finish-option\">' +\n          '<button type=\"button\" class=\"bg-guided-artwork__finish-choice' + (mode === 'editservice' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-personalize\" aria-pressed=\"' + (mode === 'editservice' ? 'true' : 'false') + '\">' +\n            '<span class=\"bg-guided-artwork__finish-title\">' + escapeHtml(editServiceTitle) + buildArtworkMethodPriceSuffixMarkup(store, 'editservice', editServiceAmount, store.state.template) + '</span>' +\n          '</button>' +\n          (editServiceIsFree ? '<span class=\"bg-guided-artwork__finish-note bg-guided-workbench__outcome-price bg-guided-workbench__outcome-price--free\">FREE</span>' : '') +\n          '<span class=\"bg-guided-artwork__finish-note bg-guided-workbench__outcome-proof\">Proof included</span>' +\n        '</div>'\n      );\n    }\n    if (templateAvailability.designonline) {\n      choices.push(\n        '<div class=\"bg-guided-artwork__finish-option\">' +\n          '<button type=\"button\" class=\"bg-guided-artwork__finish-choice' + (mode === 'designonline' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-customize-online\" aria-pressed=\"' + (mode === 'designonline' ? 'true' : 'false') + '\">' +\n            '<span class=\"bg-guided-artwork__finish-title\">Edit online now' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</span>' +\n          '</button>' +\n          (editServiceSaving > 0 ? '<span class=\"bg-guided-artwork__finish-note bg-guided-workbench__outcome-price\" aria-label=\"Save ' + escapeHtml(core.formatMoney(editServiceSaving)) + ' compared with ' + escapeHtml(editServiceCompareLabel) + '\">\u2212' + escapeHtml(core.formatMoney(editServiceSaving)) + '</span>' : '') +\n        '</div>'\n      );\n    }\n    if (!choices.length) return '';\n    return '<div class=\"bg-guided-artwork__template-finish bg-guided-workbench__selected-template-outcomes\" data-bg-artwork-template-finish><div class=\"bg-guided-artwork__finish-grid\">' + choices.join('') + '</div></div>';\n  }\n\n  function buildGuidedArtworkTemplateDetail(store, templateAvailability, artworkRuleState) {\n    if (store.state.template) ensureGuidedFillSlotStateLoaded(store);\n    var hasSavedProject = !!text(store.state.project && store.state.project.projectId);\n    if (hasSavedProject) {\n      return buildSelectedTemplateCard(store, artworkRuleState)\n        + (isGuidedFillArmed(store) ? buildGuidedFillPanelMarkup(store, templateAvailability) : '');\n    }\n    var template = store.state.template;\n    if (!template) {\n      return '' +\n        '<div class=\"bg-guided-workbench__template-selection bg-guided-workbench__template-selection--empty\">' +\n          '<div class=\"bg-guided-workbench__template-details\">' +\n            '<div class=\"bg-guided-workbench__button-row\">' +\n              '<button type=\"button\" class=\"button button--primary\" data-bg-artwork-action=\"browse-templates\">Browse all templates</button>' +\n            '</div>' +\n          '</div>' +\n        '</div>';\n    }\n    var previewUrl = getTemplateFrontPreview(template);\n    return '' +\n      '<div class=\"bg-guided-workbench__template-selection\">' +\n        '<div class=\"bg-guided-workbench__template-art\">' +\n          (previewUrl ? '<img src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(text(template.title) || 'Selected template') + '\" loading=\"lazy\" decoding=\"async\">' : '') +\n        '</div>' +\n        '<div class=\"bg-guided-workbench__template-details\">' +\n          '<h3>' + escapeHtml(text(template.title) || 'Selected template') + '</h3>' +\n          buildGuidedSelectedTemplateOutcomesMarkup(store, templateAvailability) +\n          '<div class=\"bg-guided-workbench__button-row\">' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-workbench__template-change\" data-bg-artwork-action=\"change-template\">Change Template</button>' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-workbench__template-review\" data-bg-artwork-action=\"review-template\">Review Template</button>' +\n          '</div>' +\n        '</div>' +\n      '</div>' +\n      (isTemplateFinishInModalFlow(store) && !isGuidedFillArmed(store)\n        ? ''\n        : (isGuidedFillArmed(store)\n          ? (buildGuidedFillPanelMarkup(store, templateAvailability) || buildTemplateFinishChoicesMarkup(store, templateAvailability))\n          : buildTemplateFinishChoicesMarkup(store, templateAvailability)));\n  }\n\n  function buildGuidedArtworkMethodDetail(store, item, templateAvailability, artworkRuleState) {\n    if (item.key === 'send-later') return '';\n    if (item.key === 'use-template') {\n      return buildGuidedArtworkTemplateDetail(store, templateAvailability, artworkRuleState);\n    }\n    return buildArtworkActionDetail(store, item, templateAvailability, artworkRuleState);\n  }\n\n  // The badge target is per-product settable (artworkSection.recommendedArtworkMethod,\n  // schema artwork.recommendedMethod). Unset keeps the historical use-template\n  // recommendation; 'none' suppresses the badge entirely. The badge itself only\n  // renders on a visible, unselected method row.\n  function getRecommendedGuidedArtworkMethodKey(store) {\n    var configured = text(getArtworkSectionConfig(store).recommendedArtworkMethod);\n    if (!configured) return 'use-template';\n    var key = normalizeArtworkChooserItemKey(configured);\n    return key === 'none' ? '' : key;\n  }\n\n  function renderGuidedArtworkMethod(store, item, templateAvailability, artworkRuleState) {\n    var selected = isArtworkActionSelected(store, item);\n    var complete = selected && isGuidedArtworkMethodComplete(store, item);\n    var display = getGuidedArtworkMethodDisplay(store, item);\n    var visualClass = getArtworkActionVisualClass(item);\n    var detail = selected ? buildGuidedArtworkMethodDetail(store, item, templateAvailability, artworkRuleState) : '';\n    var recommended = !selected && item.key === getRecommendedGuidedArtworkMethodKey(store);\n    var canChangeArtworkMethod = item.key === getFocusedGuidedArtworkMethodKey(store);\n    return '' +\n      '<article class=\"bg-guided-workbench__method' + (item.key === 'send-later' ? ' bg-guided-workbench__method--checkout' : '') + (selected ? ' is-selected' : '') + (complete ? ' is-complete' : '') + (canChangeArtworkMethod ? ' has-change-artwork-method' : '') + '\" data-bg-guided-workbench-method=\"' + escapeHtml(item.key) + '\" data-bg-artwork-method-complete=\"' + (complete ? 'true' : 'false') + '\">' +\n        // aria-expanded is not permitted on role=\"radio\" (axe aria-allowed-attr,\n        // critical): selection state is aria-checked; the expansion is implied\n        // by the selected method's detail rendering after it.\n        '<button type=\"button\" class=\"bg-guided-workbench__method-trigger\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n          '<span class=\"bg-guided-workbench__method-icon bg-guided-artwork__visual--' + escapeHtml(visualClass) + '\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-guided-workbench__method-copy\">' +\n            '<strong>' + escapeHtml(display.title) +\n            // Quick win 1 (2026-08 artwork restyle): the free template path\n            // states its price so it compares against the custom-design chip.\n            (item.key === 'use-template' && !(numberValue(item.priceCost, 0) > 0) && !mappedArtworkPathPrice(store, 'editservice', store.state.template) ? '<span class=\"bg-guided-workbench__free-chip\">FREE</span>' : '') +\n            (recommended ? '<span class=\"bg-guided-workbench__recommendation\">' + escapeHtml(getGuidedCopy(store, 'recommendedBadgeLabel')) + '</span>' : '') + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</strong>' +\n            (display.copy ? '<span>' + escapeHtml(display.copy) + '</span>' : '') +\n          '</span>' +\n          (canChangeArtworkMethod ? '<span class=\"bg-guided-workbench__change-artwork-method-space\" aria-hidden=\"true\"></span>' : '') +\n          '<span class=\"bg-guided-workbench__radio-dot\" aria-hidden=\"true\"></span>' +\n        '</button>' +\n        (canChangeArtworkMethod ? '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-guided-workbench__change-artwork-method\" data-bg-artwork-action=\"change-artwork-method\">Change Artwork Method</button>' : '') +\n        (detail ? '<div class=\"bg-guided-workbench__method-expansion\">' + detail + '</div>' : '') +\n      '</article>';\n  }\n\n  function isGuidedArtworkMethodComplete(store, item) {\n    if (!item) return false;\n    if (item.key === 'share-canva') return isValidCanvaUrl(store.state.canvaUrl);\n    if (item.key === 'upload-files') return isArtworkUploadProvided(store);\n    if (item.key === 'use-template') {\n      if (text(store.state.artworkMode).toLowerCase() === 'designonline' && text(store.state.project && store.state.project.projectId)) return hasSavedProjectArtwork(store);\n      return !!(store.state.template || text(store.state.project && store.state.project.projectId));\n    }\n    return item.key === 'custom-design' || item.key === 'send-later';\n  }\n\n  function buildGuidedArtworkWorkbench(store, actionItems, activeItem, templateAvailability, artworkRuleState) {\n    var itemsByIntent = { have: [], help: [], later: [] };\n    (actionItems || []).forEach(function (item) {\n      Object.keys(GUIDED_ARTWORK_INTENTS).some(function (intentKey) {\n        if (GUIDED_ARTWORK_INTENTS[intentKey].indexOf(item.key) === -1) return false;\n        itemsByIntent[intentKey].push(item);\n        return true;\n      });\n    });\n    var focusedMethodKey = getFocusedGuidedArtworkMethodKey(store);\n    var availableIntents = ['have', 'help', 'later'].filter(function (intentKey) {\n      return itemsByIntent[intentKey].length > 0;\n    });\n    var intent = getGuidedArtworkIntent(store, activeItem);\n    if (!itemsByIntent[intent].length) {\n      intent = itemsByIntent.help.length ? 'help' : (itemsByIntent.have.length ? 'have' : 'later');\n    }\n    if (availableIntents.length === 1 && intent === 'help') {\n      selectSoleGuidedFreeSetup(store, actionItems);\n    }\n    // Quick win 3 (2026-08 artwork restyle): the deferred path is no longer a\n    // third equal-weight tab \u2014 the method list keeps showing a real intent's\n    // choices while \"handle it later\" renders as a quiet row underneath.\n    var listIntent = intent === 'later'\n      ? (itemsByIntent.help.length ? 'help' : 'have')\n      : intent;\n    var intentItems = focusedMethodKey\n      ? (actionItems || []).filter(function (item) { return item.key === focusedMethodKey; })\n      : itemsByIntent[listIntent];\n    var controlSuffix = core.slugify(text(store && store.root && store.root.id) || 'product');\n    var panelId = 'bg-guided-artwork-panel-' + controlSuffix;\n    var intentMeta = {\n      have: { choice: 'have-design', label: getGuidedCopy(store, 'intentHaveLabel'), className: '' },\n      help: { choice: 'need-design', label: getGuidedCopy(store, 'intentHelpLabel'), className: '' },\n      later: { choice: 'send-later', label: getGuidedCopy(store, 'intentLaterLabel'), className: ' bg-guided-workbench__intent-button--later' }\n    };\n    var tabIntents = availableIntents.filter(function (intentKey) { return intentKey !== 'later'; });\n    var intentSwitch = !focusedMethodKey && tabIntents.length > 1\n      ? '<div class=\"bg-guided-workbench__intent-switch bg-guided-workbench__intent-switch--' + tabIntents.length + '\" role=\"tablist\" aria-label=\"Artwork starting point\">' + tabIntents.map(function (intentKey) {\n          var meta = intentMeta[intentKey];\n          return '<button type=\"button\" role=\"tab\" class=\"bg-guided-workbench__intent-button' + meta.className + '\" data-bg-artwork-primary=\"' + meta.choice + '\" aria-controls=\"' + escapeHtml(panelId) + '\" aria-selected=\"' + (intent === intentKey ? 'true' : 'false') + '\" tabindex=\"' + (intent === intentKey ? '0' : '-1') + '\"><span class=\"bg-guided-workbench__intent-lead\">' + escapeHtml(meta.label) + '</span></button>';\n        }).join('') + '</div>'\n      : '';\n    var panelAccessibility = !focusedMethodKey && tabIntents.length > 1\n      ? ' role=\"tabpanel\" aria-label=\"Artwork methods\"'\n      : ' aria-label=\"Artwork methods\"';\n    var laterLabel = getGuidedCopy(store, 'intentLaterLabel');\n    var laterRowMarkup = itemsByIntent.later.length && !focusedMethodKey\n      ? '<button type=\"button\" class=\"bg-guided-workbench__later-row' + (intent === 'later' ? ' is-selected' : '') + '\" data-bg-artwork-primary=\"send-later\" aria-pressed=\"' + (intent === 'later' ? 'true' : 'false') + '\">' + escapeHtml('Or ' + laterLabel.charAt(0).toLowerCase() + laterLabel.slice(1)) + buildArtworkMethodPriceSuffixMarkup(store, 'youhaveart') + '</button>' +\n        (intent === 'later' ? '<p class=\"bg-guided-workbench__later-note\">' + escapeHtml(getGuidedCopy(store, 'laterPanelNote')) + '</p>' : '')\n      : '';\n    return '' +\n      '<div class=\"bg-guided-workbench__body\">' +\n        intentSwitch +\n        '<div class=\"bg-guided-workbench__method-options\">' +\n          '<section class=\"bg-guided-workbench__choice-panel\" id=\"' + escapeHtml(panelId) + '\"' + panelAccessibility + '>' +\n            '<div class=\"bg-guided-workbench__choice-list\" role=\"radiogroup\" aria-label=\"Artwork method\">' + intentItems.map(function (item) {\n              return renderGuidedArtworkMethod(store, item, templateAvailability, artworkRuleState);\n            }).join('') + '</div>' +\n          '</section>' +\n          laterRowMarkup +\n        '</div>' +\n      '</div>';\n  }\n\n  // --- Versioned artwork-section layouts (artworkSection.sectionLayout) ---\n  // v2 \"Three outcomes\", v3 \"Template-forward\", v4 \"One question at a time\".\n  // Alternate presentations over the same artwork state machine: every control\n  // routes through data-bg-artwork-action into handleArtworkAction, so state,\n  // pricing, summary rows, and cart properties stay identical to Version 1.\n\n  var VERSIONED_ARTWORK_GROUPS = {\n    template: ['use-template'],\n    have: ['upload-files', 'share-canva', 'reorder'],\n    service: ['custom-design', 'free-setup', 'recreate-design']\n  };\n\n  function getThreeOutcomesState(store) {\n    if (!store.threeOutcomesState) {\n      var hasRestoredEvidence = !!(store && store.state && (\n        store.state.template\n        || text(store.state.project && store.state.project.projectId)\n        || isValidCanvaUrl(store.state.canvaUrl)\n        || getPrimaryArtworkUploadFiles(store).length\n        || store.editingLineKey\n      ));\n      store.threeOutcomesState = {\n        engaged: hasRestoredEvidence,\n        outcomeGroup: '',\n        laterExpanded: false,\n        changeExpanded: false,\n        changeSignature: ''\n      };\n    }\n    return store.threeOutcomesState;\n  }\n\n  function getThreeOutcomesCompletionCopy(store, actionItems) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var template = store && store.state && store.state.template;\n    var project = plainObject(store && store.state && store.state.project) || {};\n    var templateTitle = text(template && template.title) || 'Selected template';\n    var projectTitle = text(project.title || project.designName)\n      || (text(project.designNumber) ? 'Design ' + text(project.designNumber) : templateTitle);\n    if (mode === 'editservice' && template) {\n      return {\n        line: 'Template: \u201C' + templateTitle + '\u201D \u2014 we personalize it free',\n        subline: 'We\\'ll collect your details after checkout and send a proof before printing.'\n      };\n    }\n    if (mode === 'designonline' && text(project.projectId)) {\n      return {\n        line: 'Your design: \u201C' + projectTitle + '\u201D',\n        subline: 'Saved to My Designs. You can still edit it before checkout.'\n      };\n    }\n    if (mode === 'uploadfiles') {\n      var files = getPrimaryArtworkUploadFiles(store);\n      if (!files.length && hasEditorUploadedArtwork(store)) {\n        // Upload-in-editor lane: the file was placed and approved on the\n        // canvas, so the summary names the saved design, not a page file.\n        var uploadedTitle = text(project.title || project.designName)\n          || (text(project.designNumber) ? 'Design ' + text(project.designNumber) : 'Uploaded artwork');\n        return {\n          line: 'Your design: \u201C' + uploadedTitle + '\u201D',\n          subline: 'Saved to My Designs. You can still edit it before checkout.'\n        };\n      }\n      var counts = countUploadedArtworkFiles(files);\n      if (counts.failed > 0) {\n        // BUG-02: interrupted files must not collapse into the green all-good\n        // summary. Surface honest counts and point at the retry rows.\n        return {\n          line: (counts.uploaded > 0\n            ? counts.uploaded + ' file' + (counts.uploaded === 1 ? '' : 's') + ' uploaded - ' + counts.failed + ' need' + (counts.failed === 1 ? 's' : '') + ' attention'\n            : 'No files uploaded yet - ' + counts.failed + ' need' + (counts.failed === 1 ? 's' : '') + ' attention'),\n          subline: counts.failed === 1\n            ? 'One file did not finish uploading. Retry it or remove it before checkout.'\n            : 'Some files did not finish uploading. Retry them or remove them before checkout.',\n          attention: true\n        };\n      }\n      var firstName = text(files[0] && (files[0].name || files[0].fileName)) || 'Uploaded artwork';\n      return {\n        line: 'Your file: ' + firstName + (files.length > 1 ? ' +' + String(files.length - 1) + ' more' : ''),\n        subline: 'We review every file and send a proof before printing.'\n      };\n    }\n    if (mode === 'uploadcanva') {\n      return {\n        line: 'Canva link added',\n        subline: 'We export it at full print quality \u2014 proof before print.'\n      };\n    }\n    if (mode === 'reorder') {\n      // RE2 reference attach: the completed summary names the chosen design\n      // and the honest adapt promise \u2014 never a loaded-design claim.\n      if (isReorderReferenceSelected(store)) {\n        var referenceContext = plainObject(store.state && store.state.reorderContext) || {};\n        var referenceTitle = text(referenceContext.title) || 'Your design';\n        return {\n          line: 'Reorder: \u201C' + referenceTitle + '\u201D',\n          subline: getReorderReferenceAdaptCopy()\n        };\n      }\n      // Honest Stage-1 placeholder (OP-06): nothing is loaded from the\n      // account yet, so the summary must never claim a loaded design.\n      return {\n        line: 'Place a reorder',\n        subline: 'We will reach out to you after checkout.'\n      };\n    }\n    var items = Array.isArray(actionItems) ? actionItems : buildArtworkActionItems(store, getStoreArtworkAvailability(store));\n    var activeItem = getActiveArtworkActionItem(store, items);\n    var rawServiceAmount = numberValue(activeItem && activeItem.priceCost, 0);\n    var serviceAmount = applyDisplayDiscount(rawServiceAmount, getShownSalePercentage(store));\n    var servicePrice = serviceAmount > 0 ? ' \u2014 +' + core.formatMoney(serviceAmount) : '';\n    if (mode === 'customdesign') {\n      var customAmount = Math.max(0, numberValue(getPricePresentation(store).designFeeTotal, serviceAmount));\n      return {\n        line: 'Professional custom design' + (customAmount > 0 ? ' \u2014 +' + core.formatMoney(customAmount) : ''),\n        subline: 'Our team reaches out within 1 business day.'\n      };\n    }\n    if (mode === 'recreate' || mode === 'recreatedesign') {\n      return {\n        line: 'Recreate a design' + (servicePrice || ' \u2014 FREE'),\n        subline: 'Send your reference after checkout \u2014 proof before print.'\n      };\n    }\n    if (mode === 'freesetup') {\n      return {\n        line: 'Free design setup',\n        subline: 'We set it up after checkout and send a proof.'\n      };\n    }\n    if (mode === 'youhaveart') {\n      return {\n        line: 'Artwork after checkout',\n        subline: 'We email you right after checkout to collect it.'\n      };\n    }\n    if (template) {\n      return {\n        line: 'Template: \u201C' + templateTitle + '\u201D',\n        subline: 'Choose how to finish this design before checkout.'\n      };\n    }\n    return { line: 'Artwork option selected', subline: '' };\n  }\n\n  function getThreeOutcomesCompletionSignature(store, actionItems) {\n    var copy = getThreeOutcomesCompletionCopy(store, actionItems);\n    return JSON.stringify([copy.line, copy.subline]);\n  }\n\n  function isThreeOutcomesArtworkComplete(store) {\n    if (!store || getArtworkSectionConfig(store).sectionLayout !== 'v2') return false;\n    if (text(store.state && store.state.artworkMode).toLowerCase() === 'designonline'\n      && !text(store.state && store.state.project && store.state.project.projectId)) return false;\n    return getThreeOutcomesState(store).engaged && getGuidedArtworkStepCompleteCore(store);\n  }\n\n  function getThreeOutcomesActiveGroup(store, groups, activeItem) {\n    var state = getThreeOutcomesState(store);\n    var selected = text(state.outcomeGroup);\n    if (['template', 'have', 'service'].indexOf(selected) !== -1 && groups[selected].length) return selected;\n    if (!state.engaged) return '';\n    return getVersionedArtworkGroupKey(groups, activeItem);\n  }\n\n  function renderThreeOutcomesSummary(store, actionItems) {\n    var copy = getThreeOutcomesCompletionCopy(store, actionItems);\n    var signature = getThreeOutcomesCompletionSignature(store, actionItems);\n    if (store.threeOutcomesSummaryEventSignature !== signature) {\n      store.threeOutcomesSummaryEventSignature = signature;\n      emitStorefrontEvent(store, 'artwork_completed_summary_rendered', 'artwork', {\n        method: text(store && store.state && store.state.artworkMode).toLowerCase()\n      }, 'normal');\n    }\n    return '<div class=\"bg-artwork-vx__summary-row' + (copy.attention ? ' bg-artwork-vx__summary-row--attention' : '') + '\" role=\"status\">' +\n      (copy.attention\n        ? '<span class=\"bg-artwork-vx__summary-alert\" aria-hidden=\"true\">!</span>'\n        : '<span class=\"bg-artwork-vx__summary-check\" aria-hidden=\"true\">\u2713</span>') +\n      '<span class=\"bg-artwork-vx__summary-copy\">' +\n        '<strong>' + escapeHtml(copy.line) + '</strong>' +\n        (copy.subline ? '<span>' + escapeHtml(copy.subline) + '</span>' : '') +\n      '</span>' +\n      '<button type=\"button\" class=\"bg-artwork-vx__change-pill\" data-bg-artwork-action=\"change-versioned-artwork\">Change</button>' +\n    '</div>';\n  }\n\n  function groupVersionedArtworkItems(actionItems) {\n    var groups = { template: [], have: [], service: [], later: [] };\n    (actionItems || []).forEach(function (item) {\n      if (item.key === 'send-later') groups.later.push(item);\n      else if (VERSIONED_ARTWORK_GROUPS.template.indexOf(item.key) !== -1) groups.template.push(item);\n      else if (VERSIONED_ARTWORK_GROUPS.have.indexOf(item.key) !== -1) groups.have.push(item);\n      else groups.service.push(item);\n    });\n    return groups;\n  }\n\n  function getVersionedArtworkGroupKey(groups, activeItem) {\n    if (!activeItem) return '';\n    if (activeItem.key === 'send-later') return 'later';\n    var groupKey = '';\n    ['template', 'have', 'service'].forEach(function (key) {\n      if (groupKey) return;\n      if (groups[key].some(function (item) { return item.key === activeItem.key; })) groupKey = key;\n    });\n    return groupKey;\n  }\n\n  function getVersionedArtworkDisplayCopy(store, item, fallbackTitle, fallbackCopy) {\n    var display = item ? getArtworkMethodDisplayConfig(store, item.mode) : null;\n    return {\n      title: text(display && display.label) || fallbackTitle,\n      copy: text(display && display.description) || fallbackCopy\n    };\n  }\n\n  function buildVersionedArtworkChip(markup, isFree) {\n    // SF-18 (2026-09-13): no FREE chips on the artwork cards/rows \u2014 free is\n    // the norm and the chip only spent space. Priced chips stay.\n    if (isFree && !markup) return '';\n    return markup ? '<span class=\"bg-artwork-vx__chip\">' + markup + '</span>' : '';\n  }\n\n  function buildVersionedHaveSubcopy(groups) {\n    var parts = [];\n    VERSIONED_ARTWORK_GROUPS.have.forEach(function (key) {\n      var item = groups.have.find(function (entry) { return entry.key === key; });\n      if (!item) return;\n      if (item.key === 'upload-files') parts.push('upload a file');\n      else if (item.key === 'share-canva') parts.push('share a Canva link');\n      else if (item.key === 'reorder') parts.push('place a reorder');\n    });\n    if (!parts.length) return '';\n    if (parts.length === 1) return parts[0].charAt(0).toUpperCase() + parts[0].slice(1) + '.';\n    var tail = parts.pop();\n    var lead = parts.join(', ');\n    return lead.charAt(0).toUpperCase() + lead.slice(1) + (parts.length > 1 ? ', or ' : ' or ') + tail + '.';\n  }\n\n  function getVersionedHaveActiveItem(store, groups) {\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var preferredKey = mode === 'uploadcanva' ? 'share-canva' : (mode === 'reorder' ? 'reorder' : 'upload-files');\n    return groups.have.find(function (item) { return item.key === preferredKey; }) || groups.have[0] || null;\n  }\n\n  function buildVersionedHaveDetail(store, groups, templateAvailability, artworkRuleState) {\n    var activeItem = getVersionedHaveActiveItem(store, groups);\n    if (!activeItem) return '';\n    var quietLabels = {\n      'upload-files': 'Have a print-ready file? Upload it instead',\n      'share-canva': 'Made in Canva? Paste a link instead',\n      reorder: isReorderChooserPresentation(store) ? 'Start from a past design instead' : 'Place a reorder instead'\n    };\n    var quietLinks = groups.have.filter(function (item) { return item.key !== activeItem.key; }).map(function (item) {\n      return '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-artwork-vx__quiet-link\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\">' + escapeHtml(quietLabels[item.key] || item.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</button>';\n    }).join('');\n    return buildArtworkActionDetail(store, activeItem, templateAvailability, artworkRuleState) +\n      (quietLinks ? '<div class=\"bg-artwork-vx__quiet-links\">' + quietLinks + '</div>' : '');\n  }\n\n  function buildVersionedServiceDetail(store, groups, templateAvailability, artworkRuleState) {\n    if (!groups.service.length) return '';\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var activeItem = groups.service.find(function (item) { return item.mode === mode; }) || groups.service[0];\n    var rows = '';\n    if (groups.service.length > 1) {\n      rows = '<div class=\"bg-artwork-vx__service-rows\" role=\"radiogroup\" aria-label=\"Design service\">' + groups.service.map(function (item) {\n        var selected = item.mode === mode;\n        return '<button type=\"button\" class=\"bg-artwork-vx__row' + (selected ? ' is-selected' : '') + '\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n          '<span class=\"bg-artwork-vx__row-title\">' + escapeHtml(item.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</span>' +\n          '<span class=\"bg-artwork-vx__radio-dot\" aria-hidden=\"true\"></span>' +\n        '</button>';\n      }).join('') + '</div>';\n    }\n    var detail = activeItem && activeItem.mode === mode\n      ? buildArtworkActionDetail(store, activeItem, templateAvailability, artworkRuleState)\n      : (groups.service.length === 1 ? buildArtworkActionDetail(store, activeItem, templateAvailability, artworkRuleState) : '');\n    return rows + (detail ? '<div class=\"bg-artwork-vx__info-box\">' + detail + '</div>' : '');\n  }\n\n  function buildThreeOutcomesTemplateFinishMarkup(store, templateAvailability) {\n    if (!store.state.template || text(store.state.project && store.state.project.projectId)) return '';\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var choices = [];\n    if (templateAvailability.designonline) {\n      choices.push('<button type=\"button\" class=\"bg-artwork-vx__finish' + (mode === 'designonline' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-customize-online\" role=\"radio\" aria-checked=\"' + (mode === 'designonline' ? 'true' : 'false') + '\">' +\n        '<strong>Customize it online' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</strong><span>Open this design in the editor and make it yours.</span></button>');\n    }\n    if (templateAvailability.editservice) {\n      choices.push('<button type=\"button\" class=\"bg-artwork-vx__finish' + (mode === 'editservice' ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-personalize\" role=\"radio\" aria-checked=\"' + (mode === 'editservice' ? 'true' : 'false') + '\">' +\n        '<strong>' + buildTemplatePersonalizationChoiceTitleMarkup(store, store.state.template, { threeOutcomes: true }) + '</strong><span>Order now, tell us your details, approve the proof.</span></button>');\n    }\n    if (isGuidedFillAvailable(store, templateAvailability)) {\n      choices.push('<button type=\"button\" class=\"bg-artwork-vx__finish' + (isGuidedFillArmed(store) ? ' is-selected' : '') + '\" data-bg-artwork-action=\"template-guided-fill\" role=\"radio\" aria-checked=\"' + (isGuidedFillArmed(store) ? 'true' : 'false') + '\">' +\n        '<strong>Add your photo here' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</strong><span>Upload your image and we\u2019ll place it in the template.</span></button>');\n    }\n    return choices.length\n      ? '<div class=\"bg-artwork-vx__finish-grid\" role=\"radiogroup\" aria-label=\"Finish this design\">' + choices.join('') + '</div>'\n      : '';\n  }\n\n  function buildVersionedTemplateDetail(store, groups, templateAvailability, artworkRuleState) {\n    var templateItem = groups.template[0];\n    if (!templateItem) return '';\n    if (!store.state.template && !text(store.state.project && store.state.project.projectId)) {\n      var stripTemplates = getArtworkStripTemplates(store);\n      if (stripTemplates.length) {\n        var settings = getExperimentalPresentationSettings(store, 'intentFirst');\n        var stripLimit = Math.max(2, Math.min(8, Math.round(numberValue(settings.templateCardLimit, 4))));\n        var headShown = Math.min(stripTemplates.length, stripLimit);\n        scheduleTemplateBrowserTotal(store, 0);\n        return '<div class=\"bg-artwork-vx__strip-head\"><strong>Pick a starting design</strong>' +\n          '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"browse-templates\" data-bg-see-all-shown=\"' + headShown + '\">' + escapeHtml(buildSeeAllTemplatesLabel(readTemplateBrowserTotal(store), headShown)) + '</button></div>' +\n          buildArtworkTemplateStripMarkup(store, { limit: stripLimit });\n      }\n      var knownTemplateCount = getIntentFirstEligibleTemplates(store).length;\n      var countCopy = knownTemplateCount > 0\n        ? knownTemplateCount.toLocaleString() + ' industry designs'\n        : 'Industry designs';\n      return '<div class=\"bg-artwork-vx__browse\">' +\n        '<button type=\"button\" class=\"button button--secondary bg-artwork-vx__browse-button\" data-bg-artwork-action=\"browse-templates\">Browse templates</button>' +\n        '<span class=\"bg-artwork-vx__caption\">' + escapeHtml(countCopy + ' \u00B7 personalized free \u00B7 proof before print') + '</span>' +\n      '</div>';\n    }\n    return '<div class=\"bg-guided-artwork__action-detail\">' +\n      buildCompactSelectedTemplateMarkup(store, templateAvailability, { suppressTemplateFinishChoices: true }) +\n      buildThreeOutcomesTemplateFinishMarkup(store, templateAvailability) +\n    '</div>';\n  }\n\n  // SF-17 / OBS-10 (2026-09-13): the quiet link selects \"handle artwork\n  // after checkout\" in ONE click and turns into a selected outcome card (same\n  // radio dot and accent border as the other cards); clicking the selected\n  // card, or any other artwork path, turns it back into the link. There is\n  // no separate \"Order this way\" confirmation step.\n  function isArtworkLaterSelected(store) {\n    // A silently configured \"after checkout\" default is not a shopper\n    // decision: the card only shows once the shopper engaged the chooser\n    // (the click, a cart-line edit, or other restored evidence).\n    return text(store && store.state && store.state.artworkMode).toLowerCase() === 'youhaveart'\n      && getThreeOutcomesState(store).engaged === true;\n  }\n\n  function buildVersionedLaterMarkup(store, groups) {\n    var laterItem = groups.later[0];\n    if (!laterItem) return '';\n    if (isArtworkLaterSelected(store)) {\n      return '<div class=\"bg-artwork-vx__later bg-artwork-vx__later--selected\">' +\n        '<button type=\"button\" class=\"bg-artwork-vx__outcome-card bg-artwork-vx__outcome-card--later is-selected\" data-bg-artwork-action=\"deselect-artwork-later\" role=\"radio\" aria-checked=\"true\">' +\n          '<span class=\"bg-artwork-vx__radio-dot\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-artwork-vx__outcome-icon bg-guided-artwork__visual--send-later\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-artwork-vx__outcome-title\">Handle artwork after checkout' + buildArtworkMethodPriceSuffixMarkup(store, 'youhaveart') + '</span>' +\n          '<span class=\"bg-artwork-vx__outcome-copy\">Place your order now. We\u2019ll email you after checkout to collect your artwork. Production can\u2019t begin until we receive it.</span>' +\n        '</button>' +\n      '</div>';\n    }\n    // PDP-PITCHPRINT-RETURN-APPROVAL (OD-370): no after-checkout link while a saved design with artwork is attached.\n    return hasSavedProjectArtwork(store) ? '' : '<div class=\"bg-artwork-vx__later\"><button type=\"button\" class=\"bg-designer-storefront__text-action bg-artwork-vx__later-link\" data-bg-artwork-action=\"send-later\">Prefer to handle artwork after checkout?' + buildArtworkMethodPriceSuffixMarkup(store, 'youhaveart') + '</button></div>';\n  }\n\n  // v2 \u2014 Three outcomes: one flat choice of grouped cards with cost visible.\n  function renderArtworkThreeOutcomesLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState) {\n    var groups = groupVersionedArtworkItems(actionItems);\n    var threeOutcomes = getThreeOutcomesState(store);\n    // SF-17: \"handle artwork after checkout\" stays visible as a selected card\n    // among the other paths instead of collapsing to the summary row; a PitchPrint design owing the approval box stays expanded (OD-370).\n    var complete = isThreeOutcomesArtworkComplete(store) && !isArtworkLaterSelected(store) && !shouldShowPitchPrintDesignApproval(store, artworkRuleState);\n    var completionSignature = complete ? getThreeOutcomesCompletionSignature(store, actionItems) : '';\n    var keepExpanded = complete && threeOutcomes.changeExpanded === true\n      && threeOutcomes.changeSignature === completionSignature;\n    if (complete && !keepExpanded) {\n      threeOutcomes.changeExpanded = false;\n      threeOutcomes.changeSignature = '';\n      return renderThreeOutcomesSummary(store, actionItems);\n    }\n    var activeGroup = getThreeOutcomesActiveGroup(store, groups, activeItem);\n    var recommendedKey = getRecommendedGuidedArtworkMethodKey(store);\n    var cards = [];\n    var buildCard = function (groupKey, item, title, copy, iconKey, chipMarkup, leadAction) {\n      var selected = activeGroup === groupKey;\n      var recommended = groups[groupKey].some(function (entry) { return entry.key === recommendedKey; });\n      cards.push('<button type=\"button\" class=\"bg-artwork-vx__outcome-card' + (selected ? ' is-selected' : '') + '\" data-bg-artwork-action=\"select-artwork-outcome\" data-bg-artwork-outcome=\"' + escapeHtml(groupKey) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n        '<span class=\"bg-artwork-vx__radio-dot\" aria-hidden=\"true\"></span>' +\n        '<span class=\"bg-artwork-vx__outcome-icon bg-guided-artwork__visual--' + escapeHtml(iconKey) + '\" aria-hidden=\"true\"></span>' +\n        '<span class=\"bg-artwork-vx__outcome-title\">' + escapeHtml(title) +\n          (recommended ? '<span class=\"bg-artwork-vx__badge\">' + escapeHtml(getGuidedCopy(store, 'recommendedBadgeLabel')) + '</span>' : '') +\n        '</span>' +\n        (copy ? '<span class=\"bg-artwork-vx__outcome-copy\">' + escapeHtml(copy) + '</span>' : '') +\n        chipMarkup +\n      '</button>');\n    };\n    if (groups.template.length) {\n      var isBoguna = text(store && store.config && (store.config.storefront || store.config.storeKey)).toLowerCase() === 'boguna';\n      var templateCopy = getVersionedArtworkDisplayCopy(store, groups.template[0], 'Start with a template', isBoguna\n        ? 'Pick a proven design and make it yours in Boguna Studio.'\n        : 'Pick a proven design \u2014 we personalize it free, or you edit it online.');\n      buildCard('template', groups.template[0], templateCopy.title, templateCopy.copy, 'use-template', buildVersionedArtworkChip('', true), groups.template[0].action);\n    }\n    if (groups.have.length) {\n      var haveLead = getVersionedHaveActiveItem(store, groups);\n      var haveCopy = getVersionedArtworkDisplayCopy(store, haveLead, 'I already have a design', buildVersionedHaveSubcopy(groups));\n      buildCard('have', haveLead, haveCopy.title, haveCopy.copy, haveLead.key === 'share-canva' ? 'share-canva' : (haveLead.key === 'reorder' ? 'reorder' : 'upload-files'), buildVersionedArtworkChip(buildArtworkMethodPriceSuffixMarkup(store, haveLead.mode, haveLead.priceCost), !mappedArtworkPathPrice(store, haveLead.mode)), haveLead.action);\n    }\n    if (groups.service.length) {\n      var serviceLead = groups.service.find(function (item) { return item.key === 'custom-design'; }) || groups.service[0];\n      var serviceCopy = groups.service.length === 1\n        ? getVersionedArtworkDisplayCopy(store, serviceLead, 'Create a design for me', 'Our designers build it for you \u2014 exact prices shown before you decide.')\n        : { title: 'Create a design for me', copy: 'Our designers build it for you \u2014 exact prices shown before you decide.' };\n      var serviceCost = numberValue(serviceLead.priceCost, 0);\n      var freeService = groups.service.some(function (item) { return !(numberValue(item.priceCost, 0) > 0); });\n      buildCard('service', serviceLead, serviceCopy.title, serviceCopy.copy, serviceLead.key === 'custom-design' ? 'custom-design' : (serviceLead.key === 'free-setup' ? 'free-setup' : 'recreate-design'), buildVersionedArtworkChip(buildArtworkMethodPriceSuffixMarkup(store, serviceLead.mode, serviceCost), freeService && !(serviceCost > 0)), serviceLead.action);\n    }\n    var detail = '';\n    if (activeGroup === 'template') detail = buildVersionedTemplateDetail(store, groups, templateAvailability, artworkRuleState);\n    else if (activeGroup === 'have') detail = buildVersionedHaveDetail(store, groups, templateAvailability, artworkRuleState);\n    else if (activeGroup === 'service') detail = buildVersionedServiceDetail(store, groups, templateAvailability, artworkRuleState);\n    return (cards.length ? '<div class=\"bg-artwork-vx__outcome-grid bg-artwork-vx__outcome-grid--' + cards.length + '\" role=\"radiogroup\" aria-label=\"Artwork options\" tabindex=\"-1\">' + cards.join('') + '</div>' : '') +\n      (detail ? '<div class=\"bg-artwork-vx__detail\">' + detail + '</div>' : '') +\n      buildVersionedLaterMarkup(store, groups);\n  }\n\n  // v3 \u2014 Template-forward: real template thumbnails lead; other methods are\n  // compact rows below an OR divider.\n  // PP-1 (2026-09-13): presentation.intentFirst.startingTemplates\n  // { mode: 'linked' | 'manual' | 'most_popular' | 'newest', publicIds: [] }\n  // (Admin control added by the settings lane; absent = linked = today's\n  // behavior). manual = the authored public ids lead in that order (max 8);\n  // newest = by the feed's created date; most_popular = by the feed's\n  // popularity count when the feed carries one, otherwise linked order.\n  var STARTING_TEMPLATE_MODES = ['linked', 'manual', 'most_popular', 'newest'];\n  var STARTING_TEMPLATE_MAX_MANUAL = 8;\n\n  function getStartingTemplatesSetting(store) {\n    var raw = plainObject(getExperimentalPresentationSettings(store, 'intentFirst').startingTemplates) || {};\n    var mode = text(raw.mode).toLowerCase().replace(/-/g, '_');\n    if (STARTING_TEMPLATE_MODES.indexOf(mode) === -1) mode = 'linked';\n    var publicIds = (Array.isArray(raw.publicIds) ? raw.publicIds : []).map(text).filter(Boolean).slice(0, STARTING_TEMPLATE_MAX_MANUAL);\n    return { mode: mode, publicIds: publicIds };\n  }\n\n  function templateMatchesStartingId(template, id) {\n    var wanted = text(id);\n    if (!wanted || !template) return false;\n    var raw = plainObject(template.raw) || {};\n    return [\n      template.templateLookup,\n      template.templatePublicId,\n      raw.publicId,\n      raw.__foundationNativeTemplatePublicId,\n      template.designNumber,\n      template.designId,\n      template.sourceDesignId,\n      template.foundationTemplateId\n    ].some(function (candidate) { return text(candidate) === wanted; });\n  }\n\n  function parseTemplateCreatedAt(template) {\n    var stamp = Date.parse(text(template && template.createdAt));\n    return Number.isFinite(stamp) ? stamp : 0;\n  }\n\n  function stableSortTemplates(templates, scoreOf) {\n    return templates.map(function (template, index) {\n      return { template: template, index: index, score: scoreOf(template) };\n    }).sort(function (left, right) {\n      return (right.score - left.score) || (left.index - right.index);\n    }).map(function (entry) { return entry.template; });\n  }\n\n  function orderStartingTemplates(store, templates, setting) {\n    if (setting.mode === 'newest') {\n      return stableSortTemplates(templates, parseTemplateCreatedAt);\n    }\n    if (setting.mode === 'most_popular') {\n      var hasPopularity = templates.some(function (template) { return numberValue(template && template.popularity, 0) > 0; });\n      if (!hasPopularity) return templates;\n      return stableSortTemplates(templates, function (template) { return numberValue(template && template.popularity, 0); });\n    }\n    return templates;\n  }\n\n  function getArtworkStripTemplates(store) {\n    var availability = getStoreArtworkAvailability(store);\n    var baseTemplates = getTemplateModalBaseTemplates(store);\n    var eligible = (Array.isArray(baseTemplates) ? baseTemplates : []).filter(function (template) {\n      if (!template || isStartBlankTemplate(template)) return false;\n      var modeAvailability = getTemplateModeAvailability(availability, template);\n      return !!(modeAvailability.designonline || modeAvailability.editservice);\n    });\n    var starting = getStartingTemplatesSetting(store);\n    if (starting.mode === 'manual' && starting.publicIds.length) {\n      // The authored order leads exactly; everything else follows in the\n      // OP-05 order below so \"See all\" still reveals the whole catalog.\n      var remaining = eligible.slice();\n      var lead = [];\n      starting.publicIds.forEach(function (id) {\n        var index = remaining.findIndex(function (template) { return templateMatchesStartingId(template, id); });\n        if (index !== -1) lead.push(remaining.splice(index, 1)[0]);\n      });\n      eligible = remaining;\n      if (lead.length) return lead.concat(partitionStripTemplatesByFit(store, eligible, starting));\n    }\n    return partitionStripTemplatesByFit(store, eligible, starting);\n  }\n\n  function partitionStripTemplatesByFit(store, eligible, starting) {\n    // OP-05: designs compatible with the CURRENT selections lead the strip;\n    // non-matching representatives only backfill when matches cannot fill it.\n    // Stable partition \u2014 relative order inside each group is preserved, and\n    // \"See all\" keeps revealing everything. Re-evaluated on every render, so\n    // a size or style change reorders the strip immediately.\n    var matching = [];\n    var backfill = [];\n    eligible.forEach(function (template) {\n      var configuration = getTemplateModalConfiguration(store, template);\n      (configuration && configuration.mappable && configuration.matchesCurrent ? matching : backfill).push(template);\n    });\n    var setting = starting || getStartingTemplatesSetting(store);\n    return orderStartingTemplates(store, matching, setting).concat(orderStartingTemplates(store, backfill, setting));\n  }\n\n  function ensureArtworkStripDataLoaded(store) {\n    if (store.__bgArtworkStripRefreshKicked) return;\n    store.__bgArtworkStripRefreshKicked = true;\n    var refreshPromise = refreshTemplateModalDataIfNeeded(store);\n    if (refreshPromise && typeof refreshPromise.then === 'function') {\n      refreshPromise.then(function () { render(store); });\n    }\n  }\n\n  function buildArtworkTemplateStripMarkup(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var templates = getArtworkStripTemplates(store);\n    if (!templates.length) ensureArtworkStripDataLoaded(store);\n    var selectedKey = store.state.template ? getTemplateSelectionKey(store.state.template) : '';\n    var limit = Math.max(1, Math.round(numberValue(settings.limit, 6)));\n    var tiles = templates.slice(0, limit).map(function (template) {\n      var key = getTemplateSelectionKey(template);\n      var preview = getTemplateFrontPreview(template);\n      var title = text(template.title) || 'Design template';\n      var selected = !!selectedKey && key === selectedKey;\n      return '<button type=\"button\" class=\"bg-artwork-vx__strip-tile' + (selected ? ' is-selected' : '') + '\" data-bg-artwork-action=\"strip-template\" data-bg-template-key=\"' + escapeHtml(key) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n        '<span class=\"bg-artwork-vx__strip-thumb\">' + (preview ? '<img src=\"' + escapeHtml(preview) + '\" alt=\"' + escapeHtml(title + ' template') + '\" loading=\"lazy\" decoding=\"async\">' : '<span class=\"bg-artwork-vx__strip-thumb-empty\" aria-hidden=\"true\"></span>') + '</span>' +\n        '<span class=\"bg-artwork-vx__strip-name\">' + escapeHtml(title) + '</span>' +\n      '</button>';\n    }).join('');\n    var stripShown = Math.min(templates.length, limit);\n    var seeAllLabel = buildSeeAllTemplatesLabel(readTemplateBrowserTotal(store), stripShown);\n    scheduleTemplateBrowserTotal(store, 0);\n    var seeAll = '<button type=\"button\" class=\"bg-artwork-vx__strip-tile bg-artwork-vx__strip-tile--see-all\" data-bg-artwork-action=\"browse-templates\" data-bg-see-all-shown=\"' + stripShown + '\">' +\n      '<span class=\"bg-artwork-vx__strip-plus\" aria-hidden=\"true\">+</span>' +\n      '<span class=\"bg-artwork-vx__strip-name\">' + escapeHtml(seeAllLabel) + '</span>' +\n    '</button>';\n    return '<div class=\"bg-artwork-vx__strip\" role=\"radiogroup\" aria-label=\"Design templates\">' + tiles + seeAll + '</div>';\n  }\n\n  function renderArtworkTemplateForwardLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState) {\n    var groups = groupVersionedArtworkItems(actionItems);\n    var activeGroup = getVersionedArtworkGroupKey(groups, activeItem);\n    var recommendedKey = getRecommendedGuidedArtworkMethodKey(store);\n    var stripMarkup = groups.template.length ? buildArtworkTemplateStripMarkup(store) : '';\n    var templateDetail = activeGroup === 'template'\n      ? buildArtworkActionDetail(store, groups.template[0], templateAvailability, artworkRuleState)\n      : '';\n    var rows = [];\n    var buildRow = function (groupKey, item, title, chipMarkup, leadAction, detailMarkup) {\n      var selected = activeGroup === groupKey && (groupKey !== 'service' || item.mode === text(store.state.artworkMode).toLowerCase() || groups.service.length === 1);\n      var recommended = item.key === recommendedKey;\n      rows.push('<div class=\"bg-artwork-vx__row-wrap' + (selected ? ' is-selected' : '') + '\">' +\n        '<button type=\"button\" class=\"bg-artwork-vx__row\" data-bg-artwork-action=\"' + escapeHtml(leadAction) + '\" role=\"radio\" aria-checked=\"' + (selected ? 'true' : 'false') + '\">' +\n          '<span class=\"bg-artwork-vx__row-icon bg-guided-artwork__visual--' + escapeHtml(getArtworkActionVisualClass(item)) + '\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-artwork-vx__row-title\">' + escapeHtml(title) +\n            (recommended ? '<span class=\"bg-artwork-vx__badge\">' + escapeHtml(getGuidedCopy(store, 'recommendedBadgeLabel')) + '</span>' : '') +\n          '</span>' +\n          chipMarkup +\n          '<span class=\"bg-artwork-vx__radio-dot\" aria-hidden=\"true\"></span>' +\n        '</button>' +\n        (selected && detailMarkup ? '<div class=\"bg-artwork-vx__row-detail\">' + detailMarkup + '</div>' : '') +\n      '</div>');\n    };\n    if (groups.have.length) {\n      var haveLead = getVersionedHaveActiveItem(store, groups);\n      var haveSub = buildVersionedHaveSubcopy(groups).replace(/\\.$/, '');\n      var haveTitle = 'I have artwork \u2014 ' + haveSub.charAt(0).toLowerCase() + haveSub.slice(1);\n      buildRow('have', haveLead, haveTitle, buildArtworkMethodPriceSuffixMarkup(store, haveLead.mode, haveLead.priceCost), haveLead.action, buildVersionedHaveDetail(store, groups, templateAvailability, artworkRuleState));\n    }\n    groups.service.forEach(function (item) {\n      var serviceTitle = item.key === 'custom-design' ? 'Design it for me from scratch' : item.title;\n      var serviceCopy = getVersionedArtworkDisplayCopy(store, item, serviceTitle, '');\n      buildRow('service', item, serviceCopy.title, buildVersionedArtworkChip(buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost), !(numberValue(item.priceCost, 0) > 0)), item.action, buildArtworkActionDetail(store, item, templateAvailability, artworkRuleState));\n    });\n    if (groups.later.length) {\n      buildRow('later', groups.later[0], 'Decide after checkout', buildArtworkMethodPriceSuffixMarkup(store, 'youhaveart'), 'send-later', '<div class=\"bg-artwork-vx__info-box\" role=\"status\">' + escapeHtml(getGuidedCopy(store, 'laterPanelNote')) + '</div>');\n    }\n    return stripMarkup +\n      (templateDetail ? '<div class=\"bg-artwork-vx__detail\">' + templateDetail + '</div>' : '') +\n      (rows.length && (stripMarkup || templateDetail) ? '<div class=\"bg-artwork-vx__divider\" aria-hidden=\"true\"><span>OR</span></div>' : '') +\n      (rows.length ? '<div class=\"bg-artwork-vx__rows\" role=\"radiogroup\" aria-label=\"Artwork options\">' + rows.join('') + '</div>' : '');\n  }\n\n  // v4 \u2014 One question at a time: a mini-wizard over the same state machine.\n  function getArtworkWizardStorageKey(store) {\n    return 'bg-artwork-wizard:' + core.slugify(text(store && store.root && store.root.id) || 'product');\n  }\n\n  function readArtworkWizardPersistedState(store) {\n    try {\n      var raw = window.sessionStorage.getItem(getArtworkWizardStorageKey(store));\n      if (!raw) return null;\n      var parsed = JSON.parse(raw);\n      if (!parsed || typeof parsed !== 'object') return null;\n      return {\n        step: text(parsed.step) || 'q1',\n        active: parsed.active !== false,\n        engaged: parsed.engaged === true\n      };\n    } catch (error) {\n      return null;\n    }\n  }\n\n  function saveArtworkWizardState(store) {\n    var wizard = store && store.uiState && store.uiState.artworkWizard;\n    if (!wizard) return;\n    try {\n      window.sessionStorage.setItem(getArtworkWizardStorageKey(store), JSON.stringify({\n        step: wizard.step,\n        active: wizard.active,\n        engaged: wizard.engaged\n      }));\n    } catch (error) {\n      /* per-session convenience only */\n    }\n  }\n\n  function getArtworkWizardState(store) {\n    store.uiState = store.uiState || {};\n    if (!store.uiState.artworkWizard) {\n      // uiState can be rebuilt between renders, so sessionStorage is the\n      // wizard's durable carrier: a persisted record wins outright (it already\n      // reflects real interactions). The evidence override applies only on the\n      // very first init, so a restored template/upload/cart-edit opens on the\n      // resolved summary instead of re-asking the question.\n      var persisted = readArtworkWizardPersistedState(store);\n      if (persisted) {\n        store.uiState.artworkWizard = persisted;\n      } else {\n        var evidence = !!(store.state && (\n          store.state.template\n          || text(store.state.project && store.state.project.projectId)\n          || isValidCanvaUrl(store.state.canvaUrl)\n          || getPrimaryArtworkUploadFiles(store).length\n          || store.editingLineKey\n        ));\n        store.uiState.artworkWizard = { step: 'q1', active: !evidence, engaged: evidence };\n        saveArtworkWizardState(store);\n      }\n    }\n    return store.uiState.artworkWizard;\n  }\n\n  function isVersionedArtworkWizardUnresolved(store) {\n    if (!store || !store.state) return false;\n    if (getArtworkSectionConfig(store).sectionLayout !== 'v4') return false;\n    var wizard = getArtworkWizardState(store);\n    return !(wizard.engaged && !wizard.active && getGuidedArtworkStepCompleteCore(store));\n  }\n\n  function getArtworkWizardResolutionSubline(store) {\n    var mode = text(store.state.artworkMode).toLowerCase();\n    if (mode === 'editservice') return 'We personalize it free \u00B7 proof included';\n    if (mode === 'designonline') return 'Edit it online \u2014 save your design before checkout';\n    if (mode === 'uploadfiles') return 'We review every file before print';\n    if (mode === 'uploadcanva') return 'We export it at full print quality \u2014 proof before print';\n    if (mode === 'customdesign') return 'Our designer reaches out after checkout \u2014 proof before print';\n    if (mode === 'youhaveart') return getGuidedCopy(store, 'laterPanelNote');\n    // Honest Stage-1 reorder placeholder (OP-06): promise only the follow-up.\n    // An armed RE2 reference states the adapt promise instead.\n    if (mode === 'reorder') {\n      return isReorderReferenceSelected(store)\n        ? getReorderReferenceAdaptCopy()\n        : 'We will reach out to you after checkout.';\n    }\n    if (mode === 'freesetup' || mode === 'recreate') return 'We follow up after checkout \u2014 proof before print';\n    if (store.state.template || text(store.state.project && store.state.project.projectId)) return 'We personalize it free \u00B7 proof included';\n    return '';\n  }\n\n  function buildArtworkWizardRow(store, item, title, chipMarkup, wizardNext, badgeMarkup) {\n    return '<button type=\"button\" class=\"bg-artwork-vx__row bg-artwork-vx__row--wizard\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\"' + (wizardNext ? ' data-bg-artwork-wizard-next=\"' + escapeHtml(wizardNext) + '\"' : '') + '>' +\n      '<span class=\"bg-artwork-vx__row-icon bg-guided-artwork__visual--' + escapeHtml(getArtworkActionVisualClass(item)) + '\" aria-hidden=\"true\"></span>' +\n      '<span class=\"bg-artwork-vx__row-title\">' + escapeHtml(title) + (badgeMarkup || '') + '</span>' +\n      chipMarkup +\n      '<span class=\"bg-artwork-vx__row-chevron\" aria-hidden=\"true\">&rsaquo;</span>' +\n    '</button>';\n  }\n\n  function renderArtworkWizardLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState) {\n    var wizard = getArtworkWizardState(store);\n    var groups = groupVersionedArtworkItems(actionItems);\n    var recommendedKey = getRecommendedGuidedArtworkMethodKey(store);\n    var resolvedCore = getGuidedArtworkStepCompleteCore(store);\n    if (!wizard.active && !(wizard.engaged && resolvedCore)) wizard.active = true;\n    if (wizard.active && wizard.engaged && resolvedCore\n      && (wizard.step === 'upload' || wizard.step === 'canva' || wizard.step === 'reorder')) {\n      wizard.active = false;\n      saveArtworkWizardState(store);\n    }\n    if (!wizard.active) {\n      var summaryLine = getGuidedArtworkStepSummary(store) || 'Artwork option selected';\n      var subline = getArtworkWizardResolutionSubline(store);\n      return '<div class=\"bg-artwork-vx__summary-row\" role=\"status\">' +\n        '<span class=\"bg-artwork-vx__summary-check\" aria-hidden=\"true\">\u2713</span>' +\n        '<span class=\"bg-artwork-vx__summary-copy\">' +\n          '<strong>' + escapeHtml(summaryLine) + '</strong>' +\n          (subline ? '<span>' + escapeHtml(subline) + '</span>' : '') +\n        '</span>' +\n        '<button type=\"button\" class=\"bg-artwork-vx__change-pill\" data-bg-artwork-action=\"artwork-wizard-nav\" data-bg-artwork-wizard-step=\"q1\">Change</button>' +\n      '</div>';\n    }\n    var hasHaveBranch = groups.have.length > 0;\n    var hasNeedBranch = groups.template.length > 0 || groups.service.length > 0;\n    var step = wizard.step;\n    if (step === 'q1' && (!hasHaveBranch || !hasNeedBranch)) step = hasHaveBranch ? 'have' : 'need';\n    if (step === 'have' && !hasHaveBranch) step = 'q1';\n    if (step === 'need' && !hasNeedBranch) step = 'q1';\n    var backLink = '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-artwork-vx__back-link\" data-bg-artwork-action=\"artwork-wizard-nav\" data-bg-artwork-wizard-step=\"q1\">&lsaquo; Back</button>';\n    var startOverLink = '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-artwork-vx__back-link\" data-bg-artwork-action=\"artwork-wizard-nav\" data-bg-artwork-wizard-step=\"q1\">&lsaquo; Start over</button>';\n    if (step === 'upload' || step === 'canva' || step === 'reorder') {\n      var resolveItemKey = step === 'upload' ? 'upload-files' : (step === 'canva' ? 'share-canva' : 'reorder');\n      var resolveItem = groups.have.find(function (item) { return item.key === resolveItemKey; });\n      if (resolveItem) {\n        var resolveTitle = step === 'upload' ? 'Send us your file' : (step === 'canva' ? 'Paste your Canva link' : 'Pick a past design');\n        return '<div class=\"bg-artwork-vx__wizard-step\" data-bg-artwork-wizard-pane=\"' + escapeHtml(step) + '\">' +\n          '<p class=\"bg-artwork-vx__question\">' + escapeHtml(resolveTitle) + '</p>' +\n          buildArtworkActionDetail(store, resolveItem, templateAvailability, artworkRuleState) +\n          startOverLink +\n        '</div>';\n      }\n      // Availability changed under a persisted step: fall back to the question.\n      wizard.step = 'q1';\n      step = 'q1';\n      saveArtworkWizardState(store);\n    }\n    if (step === 'have') {\n      var haveTitles = {\n        'upload-files': 'Upload a print-ready file',\n        'share-canva': 'Share a Canva design link',\n        reorder: isReorderChooserPresentation(store) ? 'Reorder a past design' : 'Place a reorder'\n      };\n      return '<div class=\"bg-artwork-vx__wizard-step\" data-bg-artwork-wizard-pane=\"have\">' +\n        '<p class=\"bg-artwork-vx__question\">Great \u2014 how would you like to send it?</p>' +\n        '<div class=\"bg-artwork-vx__rows\">' + groups.have.map(function (item) {\n          var copy = getVersionedArtworkDisplayCopy(store, item, haveTitles[item.key] || item.title, '');\n          var wizardNext = item.key === 'upload-files' ? 'upload' : (item.key === 'share-canva' ? 'canva' : (isReorderChooserPresentation(store) ? 'reorder' : 'close'));\n          return buildArtworkWizardRow(store, item, copy.title, buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost), wizardNext, '');\n        }).join('') + '</div>' +\n        (hasNeedBranch ? backLink : '') +\n      '</div>';\n    }\n    if (step === 'need') {\n      var needRows = [];\n      if (groups.template.length) {\n        var templateCopy = getVersionedArtworkDisplayCopy(store, groups.template[0], 'Start from a template', '');\n        var templateBadge = groups.template[0].key === recommendedKey || recommendedKey === 'use-template'\n          ? '<span class=\"bg-artwork-vx__badge\">' + escapeHtml(getGuidedCopy(store, 'recommendedBadgeLabel')) + '</span>'\n          : '';\n        needRows.push(buildArtworkWizardRow(store, groups.template[0], templateCopy.title, buildVersionedArtworkChip('', true), 'close', templateBadge));\n      }\n      groups.service.forEach(function (item) {\n        var serviceCopy = getVersionedArtworkDisplayCopy(store, item, item.key === 'custom-design' ? 'Custom design by our team' : item.title, '');\n        needRows.push(buildArtworkWizardRow(store, item, serviceCopy.title, buildVersionedArtworkChip(buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost), !(numberValue(item.priceCost, 0) > 0)), 'close', ''));\n      });\n      return '<div class=\"bg-artwork-vx__wizard-step\" data-bg-artwork-wizard-pane=\"need\">' +\n        '<p class=\"bg-artwork-vx__question\">No problem \u2014 how should we create it?</p>' +\n        '<div class=\"bg-artwork-vx__rows\">' + needRows.join('') + '</div>' +\n        (hasHaveBranch ? backLink : '') +\n      '</div>';\n    }\n    var laterLink = groups.later.length\n      ? '<button type=\"button\" class=\"bg-designer-storefront__text-action bg-artwork-vx__later-link\" data-bg-artwork-action=\"send-later\" data-bg-artwork-wizard-next=\"close\">I&rsquo;d rather handle artwork after checkout' + buildArtworkMethodPriceSuffixMarkup(store, 'youhaveart') + '</button>'\n      : '';\n    return '<div class=\"bg-artwork-vx__wizard-step\" data-bg-artwork-wizard-pane=\"q1\">' +\n      '<p class=\"bg-artwork-vx__question\">Do you already have print-ready artwork?</p>' +\n      '<div class=\"bg-artwork-vx__wizard-cards\">' +\n        '<button type=\"button\" class=\"bg-artwork-vx__wizard-card\" data-bg-artwork-wizard-card data-bg-artwork-action=\"artwork-wizard-nav\" data-bg-artwork-wizard-step=\"have\">' +\n          '<span class=\"bg-artwork-vx__outcome-icon bg-guided-artwork__visual--upload-files\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-artwork-vx__outcome-title\">Yes, I have artwork</span>' +\n          '<span class=\"bg-artwork-vx__outcome-copy\">A file, a Canva design, or a past order</span>' +\n        '</button>' +\n        '<button type=\"button\" class=\"bg-artwork-vx__wizard-card\" data-bg-artwork-wizard-card data-bg-artwork-action=\"artwork-wizard-nav\" data-bg-artwork-wizard-step=\"need\">' +\n          '<span class=\"bg-artwork-vx__outcome-icon bg-guided-artwork__visual--use-template\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-artwork-vx__outcome-title\">No, I need a design</span>' +\n          '<span class=\"bg-artwork-vx__outcome-copy\">Start from a template or go fully custom</span>' +\n        '</button>' +\n      '</div>' +\n      laterLink +\n    '</div>';\n  }\n\n  function renderVersionedArtworkLayout(store, layoutVersion, actionItems, activeItem, templateAvailability, artworkRuleState) {\n    var inner = '';\n    if (layoutVersion === 'v2') inner = renderArtworkThreeOutcomesLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState);\n    else if (layoutVersion === 'v3') inner = renderArtworkTemplateForwardLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState);\n    else inner = renderArtworkWizardLayout(store, actionItems, activeItem, templateAvailability, artworkRuleState);\n    return '<div class=\"bg-artwork-vx bg-artwork-vx--' + escapeHtml(layoutVersion) + ' bg-designer-storefront__guided-artwork\" id=\"bgGuidedArtworkFlow\" data-bg-artwork-layout=\"' + escapeHtml(layoutVersion) + '\">' + inner + '</div>';\n  }\n\n  function renderArtworkCardsFlow(store, actionItems, selectedActionItem, templateAvailability, artworkRuleState, artworkFlags) {\n    var detail = selectedActionItem ? buildArtworkActionDetail(store, selectedActionItem, templateAvailability, artworkRuleState) : '';\n    var useGuidedPrototypeLayout = getProductFormPresentation(store) === 'guided';\n    return '' +\n      '<div class=\"bg-guided-artwork bg-guided-artwork--flat bg-guided-artwork--cards bg-guided-artwork--expanded' + (useGuidedPrototypeLayout ? ' bg-guided-artwork--prototype' : '') + ' bg-designer-storefront__guided-artwork' + (artworkFlags.artworkDescriptionPane ? ' bg-designer-storefront__guided-artwork--description-pane' : '') + '\" id=\"bgGuidedArtworkFlow\">' +\n        (useGuidedPrototypeLayout\n          ? buildGuidedArtworkWorkbench(store, actionItems, selectedActionItem, templateAvailability, artworkRuleState)\n          : '<div class=\"bg-guided-artwork__cards-groups\" role=\"radiogroup\" aria-label=\"Artwork options\"><div class=\"bg-guided-artwork__cards-grid\">' + actionItems.map(function (item) {\n              return renderArtworkActionCard(store, item);\n            }).join('') + '</div></div>' +\n            (detail ? '<div class=\"bg-guided-artwork__cards-detail\" data-bg-artwork-cards-detail=\"' + escapeHtml(selectedActionItem.key) + '\">' + detail + '</div>' : '')) +\n      '</div>';\n  }\n\n  function getSelectedArtworkActionItem(store, actionItems) {\n    if (store.artworkChoiceNotice) return null;\n    return (actionItems || []).find(function (item) {\n      return isArtworkActionSelected(store, item);\n    }) || actionItems[0] || null;\n  }\n\n  // Grouping is presentational only: labels are aria-hidden separators inside\n  // the existing radiogroup, keyed off the same primary-choice families the\n  // state model already uses (have-design / need-design / send-later).\n  var ARTWORK_ACTION_GROUPS = [\n    { key: 'have-design', label: 'Send artwork you have', keys: ['upload-files', 'share-canva', 'reorder'] },\n    { key: 'need-design', label: 'Get a design', keys: ['use-template', 'custom-design', 'recreate-design', 'free-setup'] },\n    // The trailing single-row group reads cleaner without a header.\n    { key: 'send-later', label: '', keys: ['send-later'] }\n  ];\n\n  function buildGroupedArtworkActionRows(store, actionItems, availability, templateAvailability, artworkRuleState) {\n    var remaining = (actionItems || []).slice();\n    var markup = '';\n    var renderGroupRows = function (items) {\n      return '<div class=\"bg-guided-artwork__action-group\">' + items.map(function (item) {\n        return renderArtworkActionRow(store, item, availability, templateAvailability, artworkRuleState);\n      }).join('') + '</div>';\n    };\n    ARTWORK_ACTION_GROUPS.forEach(function (group) {\n      var groupItems = remaining.filter(function (item) {\n        return group.keys.indexOf(item.key) !== -1;\n      });\n      if (!groupItems.length) return;\n      remaining = remaining.filter(function (item) {\n        return group.keys.indexOf(item.key) === -1;\n      });\n      if (group.label) {\n        markup += '<div class=\"bg-guided-artwork__action-group-label\" aria-hidden=\"true\">' + escapeHtml(group.label) + '</div>';\n      }\n      markup += renderGroupRows(groupItems);\n    });\n    if (remaining.length) markup += renderGroupRows(remaining);\n    return markup;\n  }\n\n  function buildCompactSelectedTemplateMarkup(store, templateAvailability, options) {\n    if (text(store.state.project && store.state.project.projectId)) return buildSelectedTemplateCard(store);\n    var template = store.state.template;\n    if (!template) return '';\n    // Versioned layouts (v2+) render their own bg-artwork-vx finish fork next\n    // to this row; emitting the guided fork here too stacked both pairs\n    // (BUG-01), so those callers suppress the guided fallback.\n    var suppressFinishChoices = !!(options && options.suppressTemplateFinishChoices);\n    var previewUrl = getTemplateFrontPreview(template);\n    var backerLabel = text(template.backerLabel || template.backer);\n    var canChangeBacker = Array.isArray(template.backers) && template.backers.length > 0;\n    return '' +\n      '<div class=\"bg-guided-artwork__selected-template-row\">' +\n        (previewUrl ? '<img class=\"bg-guided-artwork__selected-template-mini\" src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(template.title || 'Selected template') + '\" loading=\"lazy\">' : '') +\n        '<span class=\"bg-guided-artwork__selected-template-meta\">' +\n          (backerLabel ? '<span class=\"bg-guided-artwork__selected-template-backer-note\">Backer: ' + escapeHtml(backerLabel) + '</span>' : '') +\n          '<span class=\"bg-guided-artwork__selected-template-links\">' +\n            '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"change-template\">Change template</button>' +\n            (canChangeBacker ? '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-artwork-action=\"change-backer\">Change backer</button>' : '') +\n          '</span>' +\n        '</span>' +\n      '</div>' +\n      (isGuidedFillArmed(store)\n        ? (buildGuidedFillPanelMarkup(store, templateAvailability) || (suppressFinishChoices ? '' : buildTemplateFinishChoicesMarkup(store, templateAvailability)))\n        : (suppressFinishChoices ? '' : buildTemplateFinishChoicesMarkup(store, templateAvailability)));\n  }\n\n  function buildArtworkQuickLinksMarkup(store, actionItems, selectedItem) {\n    var links = (actionItems || []).filter(function (item) {\n      return !selectedItem || item.key !== selectedItem.key;\n    });\n    if (!links.length) return '';\n    return '' +\n      '<div class=\"bg-guided-artwork__quick-links bg-guided-artwork__quick-links--in-card\" role=\"group\" aria-label=\"Add artwork now\">' +\n        '<span class=\"bg-guided-artwork__quick-links-label\">Add artwork now</span>' +\n        '<span class=\"bg-guided-artwork__quick-links-row\">' +\n          links.map(function (item) {\n            return '<button type=\"button\" class=\"bg-guided-artwork__quick-link\" data-bg-artwork-action=\"' + escapeHtml(item.action) + '\">' + escapeHtml(text(item.quickLabel) || item.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, item.priceCost) + '</button>';\n          }).join('') +\n        '</span>' +\n      '</div>';\n  }\n\n  function getSelectedArtworkChoiceDisplay(store, item) {\n    var display = { title: item.title, copy: item.copy, priceCost: item.priceCost };\n    if (!getArtworkSectionConfig(store).restQuickLinks) return display;\n    if (item.key !== 'use-template') return display;\n    var hasSavedProject = !!text(store.state.project && store.state.project.projectId);\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var templateTitle = text(store.state.template && store.state.template.title);\n    if (hasSavedProject) {\n      display.title = templateTitle ? 'Template: ' + templateTitle : 'Your saved design';\n      display.copy = 'Saved to My Designs. You can still edit it before checkout.';\n      return display;\n    }\n    if (!store.state.template) return display;\n    display.title = 'Template: ' + templateTitle;\n    if (mode === 'designonline') {\n      display.copy = 'Customize online. Open the editor and save before checkout.';\n    } else if (mode === 'editservice') {\n      display.copy = 'We personalize it after checkout and send a proof.';\n    }\n    return display;\n  }\n\n  function renderSelectedArtworkChoice(store, item, templateAvailability, artworkRuleState, options) {\n    if (!item) return '';\n    var display = getSelectedArtworkChoiceDisplay(store, item);\n    var quickLinksMarkup = options && options.quickLinksMarkup ? options.quickLinksMarkup : '';\n    // The refined send-later status line already carries the follow-up terms,\n    // so its separate detail pane would just repeat them.\n    var suppressDetail = getArtworkSectionConfig(store).restQuickLinks && item.key === 'send-later';\n    return '' +\n      '<div class=\"bg-guided-artwork__selected-choice\" data-bg-artwork-selected-choice=\"' + escapeHtml(item.key) + '\">' +\n        '<div class=\"bg-guided-artwork__selected-choice-row\">' +\n          '<span class=\"bg-guided-artwork__selected-choice-check\" aria-hidden=\"true\">\u2713</span>' +\n          '<span class=\"bg-guided-artwork__selected-choice-main\">' +\n            '<span class=\"bg-guided-artwork__selected-choice-label\">Artwork method</span>' +\n            '<span class=\"bg-guided-artwork__selected-choice-title\">' + escapeHtml(display.title) + buildArtworkMethodPriceSuffixMarkup(store, item.mode, display.priceCost) + '</span>' +\n            (display.copy ? '<span class=\"bg-guided-artwork__selected-choice-copy\">' + escapeHtml(display.copy) + '</span>' : '') +\n          '</span>' +\n          '<button type=\"button\" class=\"bg-guided-artwork__change-button\" data-bg-artwork-action=\"toggle-artwork-options\">Change</button>' +\n        '</div>' +\n        (suppressDetail ? '' : buildArtworkActionDetail(store, item, templateAvailability, artworkRuleState)) +\n        quickLinksMarkup +\n      '</div>';\n  }\n\n  function syncCanvaLinkInputs(store) {\n    if (!store || !store.state) return;\n    var scope = store.root && store.root.closest ? (store.root.closest('product-info') || store.root) : document;\n    var inputs = Array.prototype.slice.call(scope.querySelectorAll('[data-bg-canva-link-input]'));\n    if (!inputs.length) return;\n    var updateStatus = function (input) {\n      var card = input.closest ? (input.closest('[data-bg-canva-link-card]') || input.parentElement) : input.parentElement;\n      var status = card ? card.querySelector('[data-bg-canva-link-status]') : null;\n      var editor = card ? card.querySelector('[data-bg-canva-link-editor]') : null;\n      var completed = card ? card.querySelector('[data-bg-canva-link-complete]') : null;\n      var displayLink = card ? card.querySelector('[data-bg-canva-link-display]') : null;\n      var shareHelp = card ? card.querySelector('[data-bg-canva-help]') : null;\n      if (shareHelp && getCanvaShareHelp()) getCanvaShareHelp().setViewOnly(shareHelp, isCanvaViewOnlyLink(store.state.canvaUrl));\n      var hasValue = !!text(store.state.canvaUrl);\n      var isValid = isValidCanvaUrl(store.state.canvaUrl);\n      var attempted = store.canvaValidationAttempted === true;\n      var showCompleted = isValid && store.canvaEditingLink !== true;\n      if (editor) editor.hidden = showCompleted;\n      if (completed) completed.hidden = !showCompleted;\n      if (displayLink) {\n        displayLink.textContent = getReadableCanvaLink(store.state.canvaUrl);\n        displayLink.setAttribute('href', isValid ? text(store.state.canvaUrl) : '#');\n        displayLink.setAttribute('title', text(store.state.canvaUrl));\n      }\n      if (status) {\n        var validationMessage = attempted && !isValid\n          ? (hasValue ? getCanvaLinkValidationMessage(store.state.canvaUrl) : 'Enter a Canva link to continue.')\n          : '';\n        status.hidden = !validationMessage;\n        status.textContent = validationMessage;\n        status.classList.remove('is-success');\n        status.classList.toggle('is-required', attempted && !isValid);\n      }\n    };\n    inputs.forEach(function (input) {\n      // A redraw while the customer types never rewrites the text under the caret.\n      if (!(store.canvaEditingLink === true && input === document.activeElement)) input.value = text(store.state.canvaUrl);\n      updateStatus(input);\n      if (input.dataset.bgCanvaBound === '1') return;\n      input.dataset.bgCanvaBound = '1';\n      var updateCanvaState = function () {\n        store.canvaEditingLink = true;\n        var enteredUrl = text(input.value);\n        var normalizedUrl = normalizeCanvaUrl(enteredUrl);\n        store.state.canvaUrl = isValidCanvaUrl(normalizedUrl) ? normalizedUrl : enteredUrl;\n        // CANVA-EDIT-LINK: the field being typed in gets at most a missing\n        // \"https://\" in front; any other tidying waits for blur (a tidied\n        // \"https://www.\" became \"https://www./\" and the next keys landed\n        // after the slash). Peers follow the tidied link.\n        inputs.forEach(function (peer) {\n          var tidied = text(store.state.canvaUrl);\n          if (peer !== input) peer.value = tidied;\n          else if (tidied !== enteredUrl && tidied === 'https://' + enteredUrl) peer.value = tidied;\n          updateStatus(peer);\n        });\n        syncFormState(store);\n        syncSubmitButton(store);\n        syncGuidedArtworkCompletionUi(store);\n        scheduleGuidedProductFormPresentation(store);\n        scheduleDesignerUrlStateSync(store);\n      };\n      input.addEventListener('input', updateCanvaState);\n      input.addEventListener('change', updateCanvaState);\n      input.addEventListener('blur', function (event) {\n        // Opening \"See how\" is not leaving the field: no \"Enter a Canva link\"\n        // warning for an empty field the customer is about to fill.\n        var nextFocus = event && event.relatedTarget;\n        if (!text(store.state.canvaUrl) && nextFocus && nextFocus.closest && nextFocus.closest('[data-bg-canva-help-open]')) return;\n        var normalizedUrl = normalizeCanvaUrl(store.state.canvaUrl);\n        if (normalizedUrl !== text(store.state.canvaUrl)) store.state.canvaUrl = normalizedUrl;\n        // The typed field shows its own text until now; blur tidies it once.\n        inputs.forEach(function (peer) {\n          if (text(peer.value) !== normalizedUrl) peer.value = normalizedUrl;\n        });\n        if (isValidCanvaUrl(store.state.canvaUrl)) {\n          store.canvaEditingLink = false;\n          store.canvaValidationAttempted = false;\n          inputs.forEach(updateStatus);\n        } else {\n          store.canvaValidationAttempted = true;\n          inputs.forEach(updateStatus);\n        }\n        syncFormState(store);\n        syncSubmitButton(store);\n        syncGuidedArtworkCompletionUi(store);\n        scheduleGuidedProductFormPresentation(store);\n        scheduleDesignerUrlStateSync(store);\n        if (\n          isValidCanvaUrl(store.state.canvaUrl)\n          && (getProductFormPresentation(store) === 'guided' || getArtworkSectionConfig(store).sectionLayout === 'v2')\n          && text(store.state.artworkMode).toLowerCase() === 'uploadcanva'\n        ) {\n          render(store);\n        }\n      });\n    });\n  }\n\n  function syncGuidedArtworkCompletionUi(store) {\n    if (!store || !store.root || getProductFormPresentation(store) !== 'guided') return;\n    Array.prototype.slice.call(store.root.querySelectorAll('[data-bg-guided-workbench-method]')).forEach(function (method) {\n      var key = text(method.getAttribute('data-bg-guided-workbench-method'));\n      var item = buildArtworkActionItems(store, getStoreArtworkAvailability(store)).find(function (candidate) {\n        return candidate.key === key;\n      });\n      var complete = !!(item && isArtworkActionSelected(store, item) && isGuidedArtworkMethodComplete(store, item));\n      method.classList.toggle('is-complete', complete);\n      method.setAttribute('data-bg-artwork-method-complete', complete ? 'true' : 'false');\n    });\n  }\n\n  function buildArtworkRuleInfoMarkup(store, artworkRuleState, options) {\n    artworkRuleState = artworkRuleState || getArtworkRuleState(store);\n    var settings = options && typeof options === 'object' ? options : {};\n    var infoBlocks = [];\n    var compactFlow = !!settings.compactFlow;\n    if (!compactFlow && (artworkRuleState.showCanvaInstructions || artworkRuleState.showCanvaLink)) {\n      infoBlocks.push(buildCanvaGuidedInfoMarkup(store, artworkRuleState.showCanvaInstructions));\n    }\n    if (!compactFlow && artworkRuleState.showCustomDesignInfo) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'What happens next',\n        '<div>After checkout, we\u2019ll contact you to collect your design details. You\u2019ll receive a proof before anything prints.</div>'\n      ));\n    }\n    if (!compactFlow && artworkRuleState.showUploadInfo) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Upload guidance',\n        '<div>Upload your files now. If anything needs adjustment for print, we\u2019ll contact you before production.</div>'\n      ));\n    }\n    if (!compactFlow && (artworkRuleState.showSendLaterInfo || artworkRuleState.showArtworkLaterInfo)) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Handle Artwork Later',\n        '<ul class=\"bg-guided-artwork__info-list\"><li>Lock in today\u2019s price now.</li><li>Send artwork, Canva link, or design details within 10 days after checkout.</li><li>We\u2019ll follow up after your order.</li></ul>'\n      ));\n    }\n    if (!compactFlow && artworkRuleState.showFreeSetupInfo) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Free setup',\n        '<div>Our online designer is not available for this product yet, so we will set it up for you for free. Upload any files below and include any imprint information you want on the design. We will send a risk-free proof before anything prints.</div>'\n      ));\n    }\n    if (!compactFlow && artworkRuleState.showNewDesignInfo) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Proof included',\n        '<div>We will send you a proof for approval before your order goes into production.</div>'\n      ));\n    }\n    if (!compactFlow && (artworkRuleState.showEditServiceBlock || artworkRuleState.showEditServiceInfo)) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Template personalization',\n        '<ul class=\"bg-guided-artwork__info-list\"><li>Place your order today.</li><li>We\u2019ll contact you right after checkout to collect your details.</li><li>You\u2019ll receive a risk-free proof before anything prints.</li><li>Nothing goes to print until you approve it.</li></ul>'\n      ));\n    }\n    if (!compactFlow && artworkRuleState.showCustomDesignApprovalBox) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Risk-free custom design',\n        '<div>Once we receive your design request, we\u2019ll review it and provide an estimated turnaround time. No work begins without your approval, and you may cancel any time before the project starts for a full refund.</div>'\n      ));\n    }\n    if (artworkRuleState.showDesignApprovalBox && !settings.suppressDesignApproval) {\n      infoBlocks.push(buildGuidedInfoBox(\n        'Design approval',\n        '<ul class=\"bg-guided-artwork__info-list\"><li>Your artwork will be printed exactly as submitted.</li><li>Review text, images, bleed, and safety areas carefully.</li><li>If your design includes a QR code, you are responsible for verifying it works correctly.</li></ul>',\n        settings.designApprovalMarkup\n      ));\n    }\n    return infoBlocks.join('');\n  }\n\n  function buildArtworkApprovalMarkup(store, artworkRuleState, options) {\n    artworkRuleState = artworkRuleState || getArtworkRuleState(store);\n    var settings = options && typeof options === 'object' ? options : {};\n    var approvalBlocks = [];\n    var embeddedClass = settings.embedded ? ' bg-designer-storefront__approval-card--embedded' : '';\n    if (!settings.suppressCustomDesignApproval && artworkRuleState.showCustomDesignApprovalChoice && text(store.state.artworkMode).toLowerCase() === 'customdesign') {\n      approvalBlocks.push('' +\n        '<label class=\"bg-designer-storefront__approval-card' + embeddedClass + '\">' +\n          '<input type=\"checkbox\" class=\"bg-designer-storefront__approval-input\" data-bg-artwork-approval=\"custom-design\"' + (store.state.approvals.customDesignApproved ? ' checked' : '') + '>' +\n          '<span class=\"bg-designer-storefront__approval-copy\">I acknowledge the custom design disclaimer.</span>' +\n        '</label>');\n    }\n    if (!settings.suppressDesignApproval && artworkRuleState.showDesignApprovalChoice) {\n      approvalBlocks.push('' +\n        '<label class=\"bg-designer-storefront__approval-card' + embeddedClass + '\">' +\n          '<input type=\"checkbox\" class=\"bg-designer-storefront__approval-input\" data-bg-artwork-approval=\"design-review\"' + (store.state.approvals.designReviewApproved ? ' checked' : '') + '>' +\n          '<span class=\"bg-designer-storefront__approval-copy\">I have reviewed and approve my design.</span>' +\n        '</label>');\n    }\n    return approvalBlocks.join('');\n  }\n\n  function focusArtworkTarget(scope, selector) {\n    if (!scope) return;\n    var target = scope.querySelector(selector);\n    if (!target) return;\n    if (typeof target.scrollIntoView === 'function') {\n      target.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n    if (typeof target.focus === 'function') {\n      target.focus({ preventScroll: true });\n    }\n  }\n\n  function isMobileArtworkViewport() {\n    if (window.matchMedia) return window.matchMedia('(max-width: 749px)').matches;\n    return (window.innerWidth || document.documentElement.clientWidth || 0) < 750;\n  }\n\n  // Phone width only: one scroll puts the first shown target 12px under the top after the render (no animation under\n  // reduced motion, focus never moves). A delay coalesces repeated calls (the PitchPrint return in 210, owner 2026-10-27).\n  function scheduleMobileArtworkCardsDetailScroll(store, selector, delay) {\n    if (!isMobileArtworkViewport()) return;\n    var root = store && store.root ? store.root : document;\n    var scrollToDetail = function () {\n      var target = Array.prototype.filter.call(root.querySelectorAll(selector || '.bg-guided-artwork__cards-detail'), function (node) { return !node.closest('[hidden], [aria-hidden=\"true\"]'); })[0];\n      if (target) window.scrollTo({ top: Math.max(0, target.getBoundingClientRect().top + window.scrollY - 12), behavior: window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth' });\n    };\n    var afterRender = function () {\n      if (!window.requestAnimationFrame) return window.setTimeout(scrollToDetail, 0);\n      window.requestAnimationFrame(function () { window.requestAnimationFrame(scrollToDetail); });\n    };\n    window.clearTimeout(store.mobileArtworkScrollTimer);\n    if (delay) store.mobileArtworkScrollTimer = window.setTimeout(afterRender, delay);\n    else afterRender();\n  }\n\n  function openChangeTemplateChooser(store) {\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n    var browseRefreshPromise = refreshTemplateModalDataIfNeeded(store);\n    if (browseRefreshPromise && typeof browseRefreshPromise.then === 'function') {\n      render(store);\n      browseRefreshPromise.then(function () {\n        render(store);\n        if (isOptionTemplateArtworkFlow(store)) {\n          openOptionTemplateModal(store);\n          return;\n        }\n        openTemplateModal(store, 'templatebrowse');\n      });\n      return;\n    }\n    if (isOptionTemplateArtworkFlow(store)) {\n      openOptionTemplateModal(store);\n      return;\n    }\n    openTemplateModal(store, 'templatebrowse');\n  }\n\n  function handleArtworkAction(store, blocks, action, actionTarget) {\n    action = text(action);\n    if (!action) return;\n    if (action === 'select-artwork-outcome') {\n      var outcomeState = getThreeOutcomesState(store);\n      var outcomeGroup = text(actionTarget && actionTarget.getAttribute && actionTarget.getAttribute('data-bg-artwork-outcome'));\n      if (['template', 'have', 'service'].indexOf(outcomeGroup) === -1) return;\n      var completedOutcomeItems = isThreeOutcomesArtworkComplete(store)\n        ? buildArtworkActionItems(store, getStoreArtworkAvailability(store))\n        : null;\n      if (completedOutcomeItems) {\n        outcomeState.changeExpanded = true;\n        outcomeState.changeSignature = getThreeOutcomesCompletionSignature(store, completedOutcomeItems);\n      }\n      // A silent configured default is not a shopper decision. Clear it only\n      // on the first explicit outcome choice; restored evidence and Change\n      // keep their canonical state intact.\n      if (isArtworkLaterSelected(store)) {\n        // SF-17: picking any artwork path drops a selected \"after checkout\"\n        // choice (the two are exclusive), so its card reverts to the link.\n        setArtworkChoice(store, '', '', '');\n      } else if (!outcomeState.engaged && !store.state.template\n        && !text(store.state.project && store.state.project.projectId)\n        && !isValidCanvaUrl(store.state.canvaUrl)\n        && !getPrimaryArtworkUploadFiles(store).length\n        && !store.editingLineKey) {\n        commitArtworkChoice(store, { mode: '', source: 'clear' });\n        setArtworkIntent(store, '', '');\n      }\n      outcomeState.engaged = true;\n      outcomeState.outcomeGroup = outcomeGroup;\n      outcomeState.laterExpanded = false;\n      emitStorefrontEvent(store, 'artwork_outcome_selected', 'artwork', { group: outcomeGroup }, 'normal');\n      if (outcomeGroup === 'have' || outcomeGroup === 'service') {\n        var outcomeItems = buildArtworkActionItems(store, getStoreArtworkAvailability(store));\n        var outcomeGroups = groupVersionedArtworkItems(outcomeItems);\n        var outcomeLead = outcomeGroup === 'have'\n          ? getVersionedHaveActiveItem(store, outcomeGroups)\n          : (outcomeGroups.service.length === 1 ? outcomeGroups.service[0] : null);\n        if (outcomeLead) {\n          handleArtworkAction(store, blocks, outcomeLead.action, actionTarget);\n          return;\n        }\n      }\n      syncFormState(store);\n      render(store);\n      window.requestAnimationFrame(function () {\n        focusArtworkTarget(blocks.artwork, '[data-bg-artwork-outcome=\"' + outcomeGroup + '\"]');\n      });\n      return;\n    }\n    if (action === 'toggle-artwork-later') {\n      // SF-17: the expansion step is gone; the link now selects directly.\n      handleArtworkAction(store, blocks, 'send-later', actionTarget);\n      return;\n    }\n    if (action === 'deselect-artwork-later') {\n      // SF-17: clicking the selected \"after checkout\" card turns it back\n      // into the quiet link and leaves every artwork path unselected.\n      var deselectState = getThreeOutcomesState(store);\n      setArtworkChoice(store, '', '', '');\n      deselectState.outcomeGroup = '';\n      deselectState.laterExpanded = false;\n      store.uiState.artworkChooserExpanded = true;\n      render(store);\n      window.requestAnimationFrame(function () {\n        focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"send-later\"]');\n      });\n      return;\n    }\n    if (action === 'change-versioned-artwork') {\n      var changeState = getThreeOutcomesState(store);\n      var changeItems = buildArtworkActionItems(store, getStoreArtworkAvailability(store));\n      var changeGroups = groupVersionedArtworkItems(changeItems);\n      changeState.engaged = true;\n      changeState.changeExpanded = true;\n      changeState.changeSignature = getThreeOutcomesCompletionSignature(store, changeItems);\n      changeState.outcomeGroup = getVersionedArtworkGroupKey(\n        changeGroups,\n        getActiveArtworkActionItem(store, changeItems)\n      );\n      changeState.laterExpanded = changeState.outcomeGroup === 'later';\n      emitStorefrontEvent(store, 'artwork_changed', 'artwork', {\n        method: text(store.state && store.state.artworkMode).toLowerCase()\n      }, 'normal');\n      render(store);\n      window.requestAnimationFrame(function () {\n        focusArtworkTarget(blocks.artwork, '[data-bg-artwork-outcome=\"' + changeState.outcomeGroup + '\"], .bg-artwork-vx__outcome-card');\n      });\n      return;\n    }\n    // Chooser-internal actions are not artwork-method selections; keep them\n    // out of the method-selected telemetry stream.\n    if (action === 'reorder-choose') {\n      chooseReorderDesign(store, actionTarget);\n      return;\n    }\n    if (action === 'reorder-retry') {\n      getReorderChooserState(store).status = 'idle';\n      syncArtworkReorderChooser(store);\n      return;\n    }\n    if (action === 'reorder-show-more') {\n      var moreState = getReorderChooserState(store);\n      moreState.visibleCount = Math.min(\n        moreState.items.length,\n        (moreState.visibleCount || REORDER_CHOOSER_PAGE_SIZE) + REORDER_CHOOSER_PAGE_SIZE\n      );\n      renderReorderChooserSlot(store);\n      return;\n    }\n    if (action === 'reorder-reference-change') {\n      // Un-arm the reference and reopen the ranked list. Listing previews are\n      // capability-signed with a short TTL, so reopening re-fetches instead\n      // of re-rendering stale URLs; the fallback stays available as always.\n      store.state.reorderContext = null;\n      getReorderChooserState(store).status = 'idle';\n      syncFormState(store);\n      render(store);\n      syncArtworkReorderChooser(store);\n      return;\n    }\n    if (action === 'reorder-signin') {\n      window.location.assign(buildReorderChooserSignInUrl());\n      return;\n    }\n    if (action === 'reorder-fallback') {\n      // First-class chooser resolution: completes the artwork step with the\n      // operator promise. Picking a design later clears it (the resume path\n      // resets the flag); Change reopens the chooser with it still armed.\n      store.state.reorderFallback = true;\n      store.state.reorderContext = null;\n      emitStorefrontEvent(store, 'artwork_reorder_fallback_selected', 'artwork', {}, 'normal');\n      syncFormState(store);\n      render(store);\n      return;\n    }\n    // v4 wizard navigation moves between questions without selecting a\n    // method, so it stays out of the method-selected telemetry stream too.\n    if (action === 'artwork-wizard-nav') {\n      var wizardNav = getArtworkWizardState(store);\n      wizardNav.step = text(actionTarget && actionTarget.getAttribute && actionTarget.getAttribute('data-bg-artwork-wizard-step')) || 'q1';\n      wizardNav.active = true;\n      wizardNav.engaged = true;\n      saveArtworkWizardState(store);\n      render(store);\n      return;\n    }\n    if (getArtworkSectionConfig(store).sectionLayout === 'v2') {\n      var threeOutcomesState = getThreeOutcomesState(store);\n      var actionGroup = '';\n      if (['use-template', 'browse-templates', 'change-template', 'strip-template', 'template-customize-online', 'template-personalize', 'template-guided-fill'].indexOf(action) !== -1) actionGroup = 'template';\n      else if (['upload-files', 'share-canva', 'reorder'].indexOf(action) !== -1) actionGroup = 'have';\n      else if (['custom-design', 'recreate-design', 'free-setup'].indexOf(action) !== -1) actionGroup = 'service';\n      if (actionGroup || action === 'send-later') {\n        threeOutcomesState.engaged = true;\n        threeOutcomesState.outcomeGroup = actionGroup;\n        threeOutcomesState.laterExpanded = false;\n      }\n    }\n    // Method buttons inside the v4 wizard forward the wizard to its next pane\n    // (or close it) before the shared action logic mutates artwork state.\n    var wizardNext = text(actionTarget && actionTarget.getAttribute && actionTarget.getAttribute('data-bg-artwork-wizard-next'));\n    if (wizardNext) {\n      var wizardState = getArtworkWizardState(store);\n      wizardState.engaged = true;\n      if (wizardNext === 'close') {\n        wizardState.active = false;\n      } else {\n        wizardState.active = true;\n        wizardState.step = wizardNext;\n      }\n      saveArtworkWizardState(store);\n    }\n    emitStorefrontEvent(store, 'artwork_method_selected', 'artwork', {\n      action: action\n    }, 'normal');\n    if (action === 'change-artwork-method') {\n      var focusedMethodKey = getFocusedGuidedArtworkMethodKey(store);\n      if (focusedMethodKey === 'use-template' && store.state && store.state.template) {\n        store.guidedArtworkTemplateSelectionCache = {\n          template: store.state.template,\n          artworkMode: text(store.state.artworkMode).toLowerCase() || 'editservice'\n        };\n      }\n      rememberGuidedArtworkMethodState(store, focusedMethodKey);\n      store.guidedArtworkMethodChooserExpanded = true;\n      store.guidedArtworkIntentSelected = true;\n      store.uiState = store.uiState || {};\n      var focusedIntent = focusedMethodKey === 'use-template' ? 'help' : 'have';\n      store.uiState.guidedArtworkIntent = focusedIntent;\n      if (store.root) store.root.setAttribute('data-bg-guided-artwork-intent', focusedIntent);\n      render(store);\n      window.requestAnimationFrame(function () {\n        focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"' + focusedMethodKey + '\"]');\n      });\n      return;\n    }\n    if ([\n      'use-template', 'custom-design', 'reorder', 'recreate-design', 'free-setup',\n      'share-canva', 'upload-files', 'send-later'\n    ].indexOf(action) !== -1) {\n      store.guidedArtworkMethodChooserExpanded = false;\n    }\n    if (action === 'change-canva-link') {\n      store.canvaEditingLink = true;\n      store.canvaValidationAttempted = false;\n      syncCanvaLinkInputs(store);\n      window.requestAnimationFrame(function () {\n        var input = blocks.artwork && blocks.artwork.querySelector('[data-bg-canva-link-input]');\n        if (!input) return;\n        input.focus();\n        if (typeof input.select === 'function') input.select();\n      });\n      return;\n    }\n    if (action === 'remove-canva-link') {\n      clearCanvaState(store);\n      clearGuidedArtworkMethodRestore(store, 'share-canva');\n      syncCanvaLinkInputs(store);\n      syncFormState(store);\n      syncSubmitButton(store);\n      syncGuidedArtworkCompletionUi(store);\n      scheduleGuidedProductFormPresentation(store);\n      scheduleDesignerUrlStateSync(store);\n      if (getProductFormPresentation(store) === 'guided') render(store);\n      return;\n    }\n    // UPLOAD-SURFACES-NEVER-SENT-01: a file control acts on the block that\n    // draws it (the artwork block, or the uploads block for a detail field).\n    var uploadActionScope = actionTarget && blocks.uploads && blocks.uploads.contains(actionTarget)\n      ? blocks.uploads\n      : blocks.artwork;\n    if (action === 'replace-upload') {\n      var replaceFieldId = text(actionTarget && actionTarget.getAttribute('data-bg-upload-replace'));\n      var replaceInput = uploadActionScope && uploadActionScope.querySelector('[data-bg-upload-field=\"' + replaceFieldId + '\"]');\n      store.uploadReplaceFieldId = replaceFieldId;\n      if (replaceInput && typeof replaceInput.click === 'function') replaceInput.click();\n      return;\n    }\n    if (action === 'retry-upload-file') {\n      var retryFieldId = text(actionTarget && actionTarget.getAttribute('data-bg-upload-file-field'));\n      var retryFileIndex = Number(actionTarget && actionTarget.getAttribute('data-bg-upload-file-index'));\n      if (!retryFieldId || !Number.isInteger(retryFileIndex) || retryFileIndex < 0) return;\n      retryArtworkUploadFile(store, retryFieldId, retryFileIndex).catch(function () {\n        // The inline alert owns the retryable failure. Keep the successful\n        // sibling files and the original File object intact for another try.\n      });\n      return;\n    }\n    if (action === 'remove-upload-file') {\n      var fileFieldId = text(actionTarget && actionTarget.getAttribute('data-bg-upload-file-field'));\n      var fileIndex = Number(actionTarget && actionTarget.getAttribute('data-bg-upload-file-index'));\n      var fieldFiles = fileFieldId && store.state.uploads ? (store.state.uploads[fileFieldId] || []) : [];\n      if (!fileFieldId || !Number.isInteger(fileIndex) || fileIndex < 0 || fileIndex >= fieldFiles.length) return;\n      store.state.uploads[fileFieldId] = fieldFiles.filter(function (_, index) { return index !== fileIndex; });\n      if (!findDetailUploadField(store, fileFieldId) && !getPrimaryArtworkUploadFiles(store).length) clearGuidedArtworkMethodRestore(store, 'upload-files');\n      store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n      store.uploadValidationAttempted[fileFieldId] = false;\n      store.uploadClearedFieldIds = store.uploadClearedFieldIds || {};\n      store.uploadClearedFieldIds[fileFieldId] = store.state.uploads[fileFieldId].length === 0;\n      var fileField = getInlineArtworkUploadFields(store).find(function (field) {\n        return text(field && field.id) === fileFieldId;\n      }) || findDetailUploadField(store, fileFieldId) || { id: fileFieldId, multiple: true };\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-list=\"' + fileFieldId + '\"]')).forEach(function (list) {\n        list.innerHTML = buildUploadListMarkup(store, fileField);\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-status=\"' + fileFieldId + '\"]')).forEach(function (status) {\n        var statusText = buildUploadStatusText(store, fileField);\n        status.textContent = statusText;\n        status.hidden = !statusText;\n        status.classList.remove('is-required');\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-canva-notice=\"' + fileFieldId + '\"]')).forEach(function (notice) {\n        notice.hidden = getUploadFieldFiles(store, fileFieldId).length > 0;\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-dropzone-title=\"' + fileFieldId + '\"]')).forEach(function (title) {\n        title.textContent = getUploadDropzoneTitle(store, fileField);\n      });\n      syncFormState(store);\n      syncSubmitButton(store);\n      syncGuidedArtworkCompletionUi(store);\n      scheduleGuidedProductFormPresentation(store);\n      if (getProductFormPresentation(store) === 'guided' && !getPrimaryArtworkUploadFiles(store).length) render(store);\n      return;\n    }\n    if (action === 'remove-upload') {\n      var removeFieldId = text(actionTarget && actionTarget.getAttribute('data-bg-upload-remove'));\n      if (!removeFieldId) return;\n      store.state.uploads[removeFieldId] = [];\n      if (!findDetailUploadField(store, removeFieldId) && !getPrimaryArtworkUploadFiles(store).length) clearGuidedArtworkMethodRestore(store, 'upload-files');\n      store.uploadValidationAttempted = store.uploadValidationAttempted || {};\n      store.uploadValidationAttempted[removeFieldId] = false;\n      store.uploadClearedFieldIds = store.uploadClearedFieldIds || {};\n      store.uploadClearedFieldIds[removeFieldId] = true;\n      store.uploadReplaceFieldId = '';\n      var removeField = getInlineArtworkUploadFields(store).find(function (field) {\n        return text(field && field.id) === removeFieldId;\n      }) || findDetailUploadField(store, removeFieldId) || { id: removeFieldId };\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-list=\"' + removeFieldId + '\"]')).forEach(function (list) {\n        list.innerHTML = buildUploadListMarkup(store, removeField);\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-status=\"' + removeFieldId + '\"]')).forEach(function (status) {\n        var statusText = buildUploadStatusText(store, removeField);\n        status.textContent = statusText;\n        status.hidden = !statusText;\n        status.classList.remove('is-required');\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-canva-notice=\"' + removeFieldId + '\"]')).forEach(function (notice) {\n        notice.hidden = false;\n      });\n      Array.prototype.slice.call(uploadActionScope.querySelectorAll('[data-bg-upload-dropzone-title=\"' + removeFieldId + '\"]')).forEach(function (title) {\n        title.textContent = getUploadDropzoneTitle(store, removeField);\n      });\n      syncFormState(store);\n      syncSubmitButton(store);\n      syncGuidedArtworkCompletionUi(store);\n      scheduleGuidedProductFormPresentation(store);\n      if (getProductFormPresentation(store) === 'guided' && !getPrimaryArtworkUploadFiles(store).length) render(store);\n      return;\n    }\n    if (action === 'toggle-artwork-options') {\n      store.uiState.artworkChooserExpanded = true;\n      render(store);\n      return;\n    }\n    if (action === 'collapse-artwork-options') {\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'change-backer') {\n      var selectedTemplate = store.state && store.state.template ? store.state.template : null;\n      var hasSavedProject = !!text(store.state && store.state.project && store.state.project.projectId);\n      if (!selectedTemplate || hasSavedProject || !Array.isArray(selectedTemplate.backers) || !selectedTemplate.backers.length) return;\n      var currentBacker = getTemplateModalBackerId(store, selectedTemplate);\n      store.templatePreviewState = {\n        designId: text(selectedTemplate.designId),\n        backerId: currentBacker,\n        view: currentBacker ? 'back' : 'front',\n        mode: 'change-backer'\n      };\n      renderTemplatePreviewModal(store, selectedTemplate);\n      return;\n    }\n    if (action === 'review-template') {\n      var reviewTemplate = store.state && store.state.template ? store.state.template : null;\n      if (!reviewTemplate) return;\n      store.templatePreviewState = {\n        designId: text(reviewTemplate.designId),\n        backerId: getTemplateModalBackerId(store, reviewTemplate),\n        view: 'front',\n        mode: '',\n        finishMode: text(store.state.artworkMode).toLowerCase() === 'designonline' ? 'designonline' : 'editservice'\n      };\n      renderTemplatePreviewModal(store, reviewTemplate);\n      return;\n    }\n    if (action === 'browse-templates' || action === 'change-template') {\n      openChangeTemplateChooser(store);\n      return;\n    }\n    // v3 template strip: apply the tapped template without forcing a finish\n    // mode or launching the editor \u2014 the on-page finish pills own that choice.\n    if (action === 'strip-template') {\n      var stripKey = text(actionTarget && actionTarget.getAttribute && actionTarget.getAttribute('data-bg-template-key'));\n      var stripTemplate = getArtworkStripTemplates(store).find(function (entry) {\n        return getTemplateSelectionKey(entry) === stripKey;\n      });\n      if (!stripTemplate) return;\n      store.templateModalMode = 'templatebrowse';\n      if (shouldForceTemplatePreviewOverlay(store, stripTemplate)) {\n        renderTemplatePreviewModal(store, stripTemplate);\n        return;\n      }\n      void chooseTemplateEntry(store, stripTemplate, '', { preserveUnresolvedFinish: true });\n      return;\n    }\n    if (action === 'focus-primary') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-artwork-primary]');\n      return;\n    }\n    if (action === 'focus-secondary-design') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"use-template\"], [data-bg-artwork-action=\"custom-design\"]');\n      return;\n    }\n    if (action === 'focus-template-browse') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"browse-templates\"]');\n      return;\n    }\n    if (action === 'focus-template-finish') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"template-customize-online\"], [data-bg-artwork-action=\"template-personalize\"]');\n      return;\n    }\n    if (action === 'focus-editor-launch') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-contextual-resume], [data-bg-artwork-action=\"edit-existing-art\"], [data-bg-artwork-action=\"upload-in-editor\"], [data-bg-artwork-action=\"template-customize-online\"]');\n      return;\n    }\n    if (action === 'focus-guided-slot-upload') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-guided-slot-fill] [data-bg-upload-field]');\n      return;\n    }\n    if (action === 'focus-secondary-have') {\n      focusArtworkTarget(blocks.artwork, '[data-bg-artwork-action=\"share-canva\"], [data-bg-artwork-action=\"upload-files\"], [data-bg-artwork-action=\"reorder\"]');\n      return;\n    }\n    if (action === 'use-template') {\n      clearArtworkAuxiliaryState(store);\n      setArtworkIntent(store, 'need-design', 'use-template');\n      // Browsing never selects a named artwork group's paid personalization.\n      // A template-picker trigger group that staff did not name as the\n      // artwork group keeps its pre-SB-09 selection of the trigger value.\n      if (!getConfiguredArtworkMethodHolder(store)) selectArtworkMethodOption(store, 'editservice');\n      store.uiState.artworkChooserExpanded = false;\n      if (text(store.state.artworkMode) !== 'designonline' && text(store.state.artworkMode) !== 'editservice') {\n        commitArtworkChoice(store, { mode: '', source: 'clear' });\n      }\n      clearUploadState(store);\n      clearCanvaState(store);\n      var rememberedTemplateSelection = store.guidedArtworkTemplateSelectionCache;\n      if (!store.state.template && rememberedTemplateSelection && rememberedTemplateSelection.template) {\n        var rememberedMode = rememberedTemplateSelection.artworkMode === 'designonline' ? 'designonline' : 'editservice';\n        commitArtworkChoice(store, { template: rememberedTemplateSelection.template, mode: mappedArtworkPathPrice(store, rememberedMode, rememberedTemplateSelection.template) ? '' : rememberedMode, source: 'clear' });\n        if (store.state.artworkMode && !applyArtworkMethodOption(store, store.state.artworkMode)) setArtworkChoice(store, '', '', '');\n      }\n      if (isOptionTemplateArtworkFlow(store)) {\n        var selectedOptionTemplate = getSelectedOptionTemplateEntry(store);\n        if (selectedOptionTemplate) {\n          commitArtworkChoice(store, { template: selectedOptionTemplate, mode: 'editservice', source: 'clear' });\n        }\n        render(store);\n        openOptionTemplateModal(store);\n        return;\n      }\n      if (!store.state.template) {\n        render(store);\n        var templateRefreshPromise = refreshTemplateModalDataIfNeeded(store);\n        if (templateRefreshPromise && typeof templateRefreshPromise.then === 'function') {\n          templateRefreshPromise.then(function () {\n            render(store);\n            if (isOptionTemplateArtworkFlow(store)) {\n              openOptionTemplateModal(store);\n              return;\n            }\n            openTemplateModal(store, 'templatebrowse');\n          });\n          return;\n        }\n        openTemplateModal(store, 'templatebrowse');\n        return;\n      }\n      render(store);\n      return;\n    }\n    if (action === 'artwork-start-over') {\n      disarmGuidedFill(store);\n      store.state.guidedFillProjectId = '';\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      writeArtworkTemplate(store, null);\n      store.guidedArtworkTemplateSelectionCache = null;\n      clearGuidedArtworkMethodRestore(store);\n      store.guidedArtworkMethodChooserExpanded = false;\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, '', '', '');\n      render(store);\n      return;\n    }\n    if (action === 'send-later') {\n      if (!applyArtworkMethodOption(store, 'youhaveart', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'send-later', '', 'youhaveart');\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'custom-design') {\n      if (!applyArtworkMethodOption(store, 'customdesign', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'need-design', 'custom-design', 'customdesign');\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'reorder') {\n      var resumedDesign = store.artworkResumedProjectId && text(store.state.project.projectId) === store.artworkResumedProjectId;\n      if (!applyArtworkMethodOption(store, 'reorder')) return false;\n      if (!resumedDesign) { writeArtworkTemplate(store, null); clearProjectState(store); }\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'have-design', 'reorder', 'reorder');\n      store.uiState.artworkChooserExpanded = false;\n      if (!(actionTarget && actionTarget.getAttribute('data-bg-mobile-artwork') === 'true')) render(store);\n      return;\n    }\n    if (action === 'recreate-design') {\n      if (!applyArtworkMethodOption(store, 'recreate', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'service', 'recreate', 'recreate');\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'free-setup') {\n      if (!applyArtworkMethodOption(store, 'freesetup', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'service', 'freesetup', 'freesetup');\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'share-canva') {\n      if (!applyArtworkMethodOption(store, 'uploadcanva', 'customer', null)) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'have-design', 'share-canva', 'uploadcanva');\n      var rememberedCanvaState = store.guidedArtworkMethodRestoreCache && store.guidedArtworkMethodRestoreCache['share-canva'];\n      if (!isValidCanvaUrl(store.state.canvaUrl) && rememberedCanvaState && isValidCanvaUrl(rememberedCanvaState.canvaUrl)) {\n        store.state.canvaUrl = rememberedCanvaState.canvaUrl;\n        store.canvaEditingLink = false;\n        store.canvaValidationAttempted = false;\n      }\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      if (!isValidCanvaUrl(store.state.canvaUrl)) {\n        window.requestAnimationFrame(function () {\n          focusArtworkTarget(blocks.artwork, '[data-bg-canva-link-input]');\n        });\n      }\n      return;\n    }\n    if (action === 'upload-files') {\n      if (!applyArtworkMethodOption(store, 'uploadfiles', 'customer', null)) return false;\n      disarmGuidedFill(store);\n      clearProjectState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'have-design', 'upload-files', 'uploadfiles');\n      var rememberedUploadState = store.guidedArtworkMethodRestoreCache && store.guidedArtworkMethodRestoreCache['upload-files'];\n      if (!getPrimaryArtworkUploadFiles(store).length && rememberedUploadState && rememberedUploadState.uploads) {\n        var rememberedArtworkUploads = {};\n        Object.keys(rememberedUploadState.uploads).forEach(function (fieldId) {\n          rememberedArtworkUploads[fieldId] = (rememberedUploadState.uploads[fieldId] || []).slice();\n        });\n        // The remembered method files come back; a detail file keeps its current state.\n        replaceArtworkUploads(store, rememberedArtworkUploads);\n      }\n      store.artworkUploadPanelEngaged = true;\n      store.uiState.artworkChooserExpanded = false;\n      render(store);\n      return;\n    }\n    if (action === 'upload-in-editor') {\n      if (!applyArtworkMethodOption(store, 'uploadfiles')) return false;\n      // Boguna upload-in-editor flow: the customer proofs their file on\n      // the canvas (bleed and safety visible) instead of a blind file field.\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'have-design', 'upload-files', 'uploadfiles');\n      store.artworkUploadPanelEngaged = true;\n      render(store);\n      return launchDesigner(store, { launchMode: 'upload' });\n    }\n    if (action === 'template-customize-online') {\n      if (!applyArtworkMethodOption(store, 'designonline')) return false;\n      // Switching to the editor keeps any guided-fill project (the editor\n      // resumes it) but the guided form stands down \u2014 after an editor save the\n      // editor owns the design and guided refills must never clobber it.\n      disarmGuidedFill(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'need-design', 'use-template', 'designonline');\n      render(store);\n      return launchDesigner(store, { authPrompt: 'customize-online' });\n    }\n    if (action === 'template-guided-fill') {\n      if (!applyArtworkMethodOption(store, 'designonline')) return false;\n      var guidedFillTemplate = store.state.template;\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      writeArtworkTemplate(store, guidedFillTemplate);\n      setArtworkChoice(store, 'need-design', 'use-template', 'designonline');\n      store.state.guidedFillArmed = true;\n      store.guidedSlotFillRequestKey = '';\n      store.uiState.artworkChooserExpanded = false;\n      ensureGuidedFillSlotStateLoaded(store);\n      render(store);\n      return;\n    }\n    if (action === 'template-personalize') {\n      // Returns the resolution promise so purchase-time promotions can wait\n      // for the (possibly dialog-gated) personalize choice to settle.\n      var personalizeOperation = captureArtworkOperation(store);\n      return confirmAiGeneratedEditServiceTemplate(store.state.template).then(function (accepted) {\n        if (!accepted || !isArtworkOperationFresh(store, personalizeOperation)) return false;\n        if (!applyArtworkMethodOption(store, 'editservice')) return false;\n        var personalizeTemplate = store.state.template;\n        disarmGuidedFill(store);\n        clearProjectState(store);\n        clearUploadState(store);\n        clearCanvaState(store);\n        clearArtworkAuxiliaryState(store);\n        writeArtworkTemplate(store, personalizeTemplate);\n        setArtworkChoice(store, 'need-design', 'use-template', 'editservice');\n        store.uiState.artworkChooserExpanded = false;\n        render(store);\n        return true;\n      });\n    }\n    if (action === 'edit-existing-art') {\n      if (!applyArtworkMethodOption(store, 'designonline')) return false;\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'need-design', 'use-template', 'designonline');\n      var hasExistingProject = !!text(store.state.project && store.state.project.projectId);\n      var isPitchPrintEdit = isPitchPrintLaunchProvider(store);\n      if (isPitchPrintEdit) {\n        showPitchPrintLaunchPreloader(store, { autoHideMs: 15000 });\n      }\n      render(store);\n      void launchDesigner(store, {\n        showPreloader: isPitchPrintEdit || !hasExistingProject,\n        preloaderAutoHideMs: isPitchPrintEdit ? 15000 : undefined,\n        authPrompt: hasExistingProject ? '' : 'customize-online'\n      });\n      return;\n    }\n    if (action === 'clear-design') {\n      var clearOperation = captureArtworkOperation(store);\n      void openStorefrontConfirmDialog({\n        title: 'Remove this design from the product?',\n        body: ['Your saved design will remain in My Designs.'],\n        confirmLabel: 'Remove design',\n        cancelLabel: 'Keep design'\n      }).then(function (confirmed) {\n        if (!isArtworkOperationFresh(store, clearOperation) || !confirmed) return;\n        disarmGuidedFill(store);\n        store.state.guidedFillProjectId = '';\n        clearProjectState(store);\n        clearUploadState(store);\n        clearCanvaState(store);\n        clearArtworkAuxiliaryState(store);\n        writeArtworkTemplate(store, null);\n        store.guidedArtworkTemplateSelectionCache = null;\n        clearGuidedArtworkMethodRestore(store);\n        store.guidedArtworkMethodChooserExpanded = false;\n        store.state.approvals.designReviewApproved = false;\n        setArtworkChoice(store, '', '', '');\n        render(store);\n        setMessage(store, 'The saved design was removed from this item. You can still access it from My Designs.', 'info');\n      });\n    }\n  }\n\n  // Restored projects (Approve & Return navigations, shared links, session\n  // restores, bfcache revivals) can carry a projectId with no preview URLs \u2014\n  // the editor-shell callbacks that normally hydrate previews never fire on\n  // those paths. One-shot per projectId: replay the durable preview cache\n  // (capability URLs, no fetch), then run a credentialed freshness pass\n  // (readRestoredProjectRecord). A load without a server-granted session\n  // never touches the protected project route.\n  function ensureRestoredProjectPreviewHydrated(store) {\n    var restoredProject = store && store.state && store.state.project ? store.state.project : {};\n    var restoredProjectId = text(restoredProject.projectId);\n    if (!restoredProjectId) return;\n    var hasPreview = readProjectPreviewList(restoredProject).length > 0;\n    var needsPreviewOrientation = !!getIntentFirstProductPreviewProjection(store)\n      && (!text(restoredProject.documentOrientation) || !Array.isArray(restoredProject.boardPreviews));\n    // EDITOR-LANES-EMPTY-SAVE-01: a self-hosted project without its artwork\n    // truth also needs the cache replay / credentialed read; the purchase\n    // gate stays closed until one of them answers.\n    var needsArtworkTruth = typeof restoredProject.hasArtwork !== 'boolean' && !isPitchPrintLaunchProvider(store);\n    if (hasPreview && text(restoredProject.title) && text(restoredProject.updatedAt) && !needsPreviewOrientation && !needsArtworkTruth) return;\n    if (store.previewHydrateAttemptKey === restoredProjectId) return;\n    store.previewHydrateAttemptKey = restoredProjectId;\n    var cachedEntry = readStoredProjectPreviewCacheEntry(restoredProjectId);\n    var replayedFromCache = false;\n    if (!hasPreview && cachedEntry.previews.length) {\n      store.state.project.previewUrl = cachedEntry.previews[0];\n      store.state.project.previews = cachedEntry.previews.slice();\n      store.state.project.refreshToken = text(store.state.project.refreshToken) || String(Date.now());\n      replayedFromCache = true;\n    }\n    // STOREFRONT-SAVED-EMPTY: a cached \"has artwork\" is replayed at once. A\n    // cached \"no artwork\" may be stale (the design can gain content on another\n    // device), so it is replayed only when no fresh read will run.\n    if (needsArtworkTruth && cachedEntry.hasArtwork === true) {\n      store.state.project.hasArtwork = true;\n      replayedFromCache = true;\n    }\n    var freshReadRuns = readRestoredProjectRecord(store, restoredProjectId);\n    if (needsArtworkTruth && cachedEntry.hasArtwork === false && !freshReadRuns) {\n      store.state.project.hasArtwork = false;\n      replayedFromCache = true;\n    }\n    if (replayedFromCache) render(store);\n  }\n\n  var SAVED_DESIGN_READ_WATCHDOG_MS = 12000;\n\n  // STOREFRONT-SAVED-EMPTY (2026-09-25): a saved-design link opened in a\n  // browser that never opened the design holds no read credential at boot.\n  // The page's own editor prewarm (the same request render() issues, shared\n  // in flight) asks the server for a session on this design. The server\n  // grants one only to someone allowed to open it: the signed-in owner, the\n  // guest's original session, or an unlisted guest link. The record read runs\n  // only after that grant, so a device without access still reads nothing and\n  // the readiness line says the design could not be loaded. Returns whether\n  // a fresh read will run.\n  function readRestoredProjectRecord(store, projectId) {\n    var hasReadCredential = function () {\n      return typeof core.hasStoredProjectReadCredential === 'function'\n        && core.hasStoredProjectReadCredential(projectId);\n    };\n    // A record read that already answered (the saved-design resume lane)\n    // keeps its answer when this freshness pass cannot run.\n    var markUnread = function (state) {\n      var read = store.savedDesignRead;\n      if (!(read && read.projectId === projectId && read.state === 'read')) setSavedDesignReadState(store, projectId, state);\n    };\n    var isCurrentProject = function () {\n      return text(store.state.project && store.state.project.projectId) === projectId;\n    };\n    // The session is asked for at most twice, so one brief failure (a weak\n    // phone network) does not end in \"could not load\" while the page's own\n    // retry succeeds. The core shares the request in flight with render().\n    var askForSession = function () {\n      if (!isCurrentProject() || !canPrewarmEditorSession(store)) return Promise.resolve(false);\n      try {\n        return Promise.resolve(store.editorShell.prewarm(buildEditorContext(store)));\n      } catch (_) {\n        return Promise.resolve(false);\n      }\n    };\n    var credentialReady = null;\n    if (hasReadCredential()) {\n      credentialReady = Promise.resolve(true);\n    } else if (canPrewarmEditorSession(store)) {\n      credentialReady = askForSession().then(function (ready) {\n        return ready && hasReadCredential() ? ready : askForSession();\n      });\n    }\n    if (!credentialReady) {\n      markUnread('failed');\n      return false;\n    }\n    markUnread('loading');\n    // A stalled connection neither answers nor refuses: after the watchdog\n    // the line says the design could not be loaded. A late answer still\n    // reads the design and settles the line.\n    var watchdog = window.setTimeout(function () {\n      var read = store.savedDesignRead;\n      if (!read || read.projectId !== projectId || read.state !== 'loading') return;\n      markUnread('failed');\n      renderAfterSavedDesignRead(store);\n    }, SAVED_DESIGN_READ_WATCHDOG_MS);\n    void credentialReady.then(function (ready) {\n      if (!isCurrentProject()) return null;\n      if (ready && hasReadCredential()) return refreshProjectPreview(store, projectId);\n      markUnread('failed');\n      return null;\n    }).catch(function () {\n      return null;\n    }).then(function () {\n      window.clearTimeout(watchdog);\n      renderAfterSavedDesignRead(store);\n    });\n    return true;\n  }\n\n  // The background read settles the readiness line only. An error the\n  // customer is reading in the message block (for example a failed add to\n  // cart) stays, even when the form is otherwise valid.\n  function renderAfterSavedDesignRead(store) {\n    var shown = readBlocks(store).message;\n    var keep = shown && !shown.hidden && shown.classList.contains('is-error') ? text(shown.textContent) : '';\n    render(store);\n    var after = readBlocks(store).message;\n    if (keep && after && (after.hidden || !text(after.textContent))) setMessage(store, keep, 'error');\n  }\n\n  function buildCustomerInputMarkup(store, field) {\n    var inputId = 'bg-customer-input-' + core.slugify(text(store.root && store.root.id) || 'product') + '-' + field.id;\n    var helpId = inputId + '-help';\n    var errorId = inputId + '-error';\n    var describedBy = [field.helpText ? helpId : '', errorId].filter(Boolean).join(' ');\n    var commonAttributes = '' +\n      ' id=\"' + escapeHtml(inputId) + '\"' +\n      ' data-bg-customer-input=\"' + escapeHtml(field.id) + '\"' +\n      ' aria-describedby=\"' + escapeHtml(describedBy) + '\"' +\n      (field.required ? ' required aria-required=\"true\"' : '') +\n      (field.placeholder ? ' placeholder=\"' + escapeHtml(field.placeholder) + '\"' : '');\n    var textLengthAttributes = field.type === 'short_text' || field.type === 'long_text'\n      ? (field.minLength !== null ? ' minlength=\"' + escapeHtml(String(field.minLength)) + '\"' : '')\n        + (field.maxLength !== null ? ' maxlength=\"' + escapeHtml(String(field.maxLength)) + '\"' : '')\n      : '';\n    var control = '';\n    if (field.type === 'long_text') {\n      control = '<textarea class=\"bg-designer-storefront__textarea bg-designer-storefront__customer-input-control\" rows=\"5\"' +\n        commonAttributes + textLengthAttributes + '></textarea>';\n    } else if (field.type === 'checkbox') {\n      control = '' +\n        '<label class=\"bg-designer-storefront__customer-input-checkbox\" for=\"' + escapeHtml(inputId) + '\">' +\n          '<input type=\"checkbox\"' + commonAttributes + '>' +\n          '<span>' + escapeHtml(field.label) + (field.required ? ' <span aria-hidden=\"true\">*</span>' : '') + '</span>' +\n        '</label>';\n    } else {\n      var htmlType = {\n        short_text: 'text',\n        number: 'number',\n        phone: 'tel',\n        email: 'email',\n        url: 'url',\n        date: 'date'\n      }[field.type] || 'text';\n      var inputMode = field.type === 'phone'\n        ? ' inputmode=\"tel\" autocomplete=\"tel\"'\n        : field.type === 'email'\n          ? ' inputmode=\"email\" autocomplete=\"email\"'\n          : field.type === 'url'\n            ? ' inputmode=\"url\" autocomplete=\"url\"'\n            : field.type === 'number'\n              ? ' inputmode=\"decimal\"'\n              : '';\n      var numberAttributes = field.type === 'number'\n        ? (field.min !== null ? ' min=\"' + escapeHtml(String(field.min)) + '\"' : '')\n          + (field.max !== null ? ' max=\"' + escapeHtml(String(field.max)) + '\"' : '')\n          + (field.step !== null ? ' step=\"' + escapeHtml(String(field.step)) + '\"' : '')\n        : '';\n      var dateAttributes = field.type === 'date'\n        ? (field.minDate ? ' min=\"' + escapeHtml(field.minDate) + '\"' : '')\n          + (field.maxDate ? ' max=\"' + escapeHtml(field.maxDate) + '\"' : '')\n        : '';\n      control = '<input class=\"bg-designer-storefront__select bg-designer-storefront__customer-input-control\" type=\"' +\n        htmlType + '\"' + commonAttributes + inputMode + textLengthAttributes + numberAttributes + dateAttributes + '>';\n    }\n    return '' +\n      '<div class=\"bg-designer-storefront__customer-input-field\" data-bg-customer-input-field=\"' + escapeHtml(field.id) + '\">' +\n        (field.type === 'checkbox' ? '' : (\n          '<label class=\"bg-designer-storefront__customer-input-label\" for=\"' + escapeHtml(inputId) + '\">' +\n            escapeHtml(field.label) + (field.required ? ' <span aria-hidden=\"true\">*</span>' : '') +\n          '</label>'\n        )) +\n        control +\n        (field.helpText ? '<p class=\"bg-designer-storefront__customer-input-help\" id=\"' + escapeHtml(helpId) + '\">' + escapeHtml(field.helpText) + '</p>' : '') +\n        '<p class=\"bg-designer-storefront__customer-input-error\" id=\"' + escapeHtml(errorId) + '\" data-bg-customer-input-error hidden></p>' +\n      '</div>';\n  }\n\n  function syncCustomerInputValidationUi(store) {\n    var blocks = readBlocks(store);\n    var config = getCustomerInputConfig(store);\n    if (!blocks.customerInputs || !config.enabled) return;\n    config.fields.forEach(function (field) {\n      var wrapper = blocks.customerInputs.querySelector('[data-bg-customer-input-field=\"' + field.id + '\"]');\n      var input = blocks.customerInputs.querySelector('[data-bg-customer-input=\"' + field.id + '\"]');\n      var error = wrapper && wrapper.querySelector('[data-bg-customer-input-error]');\n      if (!wrapper || !input || !error) return;\n      var validation = validateCustomerInputField(field, store.state.customerInputs[field.id]);\n      var showError = store.state.customerInputTouched[field.id] === true && !validation.valid;\n      wrapper.classList.toggle('is-invalid', showError);\n      input.setAttribute('aria-invalid', showError ? 'true' : 'false');\n      error.hidden = !showError;\n      error.textContent = showError ? validation.reason : '';\n    });\n  }\n\n  function renderCustomerInputs(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.customerInputs) return;\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n    var config = getCustomerInputConfig(store);\n    if (!config.enabled) {\n      blocks.customerInputs.innerHTML = '';\n      blocks.customerInputs.hidden = true;\n      return;\n    }\n    blocks.customerInputs.hidden = false;\n    var layoutSignature = JSON.stringify(config);\n    if (text(blocks.customerInputs.getAttribute('data-bg-customer-input-layout')) !== layoutSignature) {\n      blocks.customerInputs.setAttribute('data-bg-customer-input-layout', layoutSignature);\n      blocks.customerInputs.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__customer-input-section\" aria-labelledby=\"bg-customer-input-title-' + escapeHtml(core.slugify(text(store.root && store.root.id) || 'product')) + '\">' +\n          '<h3 class=\"bg-designer-storefront__section-label\" id=\"bg-customer-input-title-' + escapeHtml(core.slugify(text(store.root && store.root.id) || 'product')) + '\">' + escapeHtml(config.title) + '</h3>' +\n          (config.description ? '<p class=\"bg-designer-storefront__customer-input-description\">' + escapeHtml(config.description) + '</p>' : '') +\n          '<div class=\"bg-designer-storefront__customer-input-grid\">' +\n            config.fields.map(function (field) { return buildCustomerInputMarkup(store, field); }).join('') +\n          '</div>' +\n        '</section>';\n    }\n    config.fields.forEach(function (field) {\n      var input = blocks.customerInputs.querySelector('[data-bg-customer-input=\"' + field.id + '\"]');\n      if (!input) return;\n      var currentValue = store.state.customerInputs[field.id];\n      if (field.type === 'checkbox') input.checked = currentValue === true;\n      else if (input.value !== String(currentValue == null ? '' : currentValue)) input.value = String(currentValue == null ? '' : currentValue);\n      if (input.dataset.bgCustomerInputBound === '1') return;\n      input.dataset.bgCustomerInputBound = '1';\n      var updateValue = function () {\n        store.state.customerInputs[field.id] = field.type === 'checkbox' ? input.checked : input.value;\n        syncFormState(store);\n        syncSubmitButton(store);\n        syncCustomerInputValidationUi(store);\n      };\n      input.addEventListener(field.type === 'checkbox' ? 'change' : 'input', updateValue);\n      input.addEventListener('blur', function () {\n        store.state.customerInputTouched[field.id] = true;\n        syncCustomerInputValidationUi(store);\n        syncSubmitButton(store);\n      });\n    });\n    syncCustomerInputValidationUi(store);\n  }\n\n  function renderArtwork(store) {\n    ensureRestoredProjectPreviewHydrated(store);\n    var blocks = readBlocks(store);\n    if (!blocks.artwork) return;\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n    var artworkSectionConfig = getArtworkSectionConfig(store);\n    if (!shouldRenderArtworkSection(store, artworkSectionConfig)) {\n      blocks.artwork.innerHTML = '';\n      blocks.artwork.hidden = true;\n      return;\n    }\n    blocks.artwork.hidden = false;\n    var availability = getStoreArtworkAvailability(store);\n    syncArtworkUiState(store, availability);\n    var templateAvailability = getOfferedTemplateAvailability(store, store.state.template);\n    ensureDefaultArtworkChoice(store, availability, templateAvailability);\n    templateAvailability = getOfferedTemplateAvailability(store, store.state.template);\n    var incompleteState = getArtworkIncompleteState(store, availability, templateAvailability);\n    var hasSavedProject = !!text(store.state.project && store.state.project.projectId);\n    var artworkRuleState = getArtworkRuleState(store);\n    var templateSummary = buildSelectedTemplateCard(store, artworkRuleState);\n    var artworkFlags = store.uiState && store.uiState.rootFlags ? store.uiState.rootFlags : {};\n    var showGuidedFlow = artworkRuleState.showSelectionButtons && artworkRuleState.showArtworkDetails;\n    // RE3 \"Change artwork\" (operator direction 2026-08-31): an explicit\n    // customer request for the artwork questions outranks the kept legacy\n    // hide-the-chooser-once-designed chrome rule (admin-wins: the operator\n    // specified this escape for the admin-authored versioned layouts). Scoped\n    // to the explicit request on a versioned layout; the design stays\n    // attached, and every other render keeps the rule-driven collapse.\n    if (!showGuidedFlow && store.contextualArtworkChangeRequested\n      && artworkSectionConfig.sectionLayout !== 'v1') {\n      showGuidedFlow = true;\n    }\n    var actionItems = buildArtworkActionItems(store, availability);\n    var selectedActionItem = getSelectedArtworkActionItem(store, actionItems);\n    var activeActionItem = getActiveArtworkActionItem(store, actionItems);\n    var artworkLayoutVersion = artworkSectionConfig.sectionLayout;\n    var useVersionedArtworkLayout = artworkLayoutVersion !== 'v1';\n    var useCardsArtworkLayout = !useVersionedArtworkLayout && (artworkSectionConfig.layoutMode === 'cards' || getProductFormPresentation(store) === 'guided');\n    var actionChooserExpanded = !artworkSectionConfig.collapseArtworkChooser || !selectedActionItem || !!(store.uiState && store.uiState.artworkChooserExpanded);\n    var guidedFlowMarkup = showGuidedFlow ? (useVersionedArtworkLayout ? renderVersionedArtworkLayout(store, artworkLayoutVersion, actionItems, activeActionItem, templateAvailability, artworkRuleState) : useCardsArtworkLayout ? renderArtworkCardsFlow(store, actionItems, activeActionItem, templateAvailability, artworkRuleState, artworkFlags) : (\n      '<div class=\"bg-guided-artwork bg-guided-artwork--flat bg-guided-artwork--' + (actionChooserExpanded ? 'expanded' : 'collapsed') + (artworkSectionConfig.restQuickLinks ? ' bg-guided-artwork--refined' : '') + ' bg-designer-storefront__guided-artwork' + (artworkFlags.artworkDescriptionPane ? ' bg-designer-storefront__guided-artwork--description-pane' : '') + '\" id=\"bgGuidedArtworkFlow\">' +\n        (actionChooserExpanded ? (\n          '<div class=\"bg-guided-artwork__action-list\" role=\"radiogroup\" aria-label=\"Artwork options\">' +\n            (artworkSectionConfig.groupedChooser\n              ? buildGroupedArtworkActionRows(store, actionItems, availability, templateAvailability, artworkRuleState)\n              : (artworkSectionConfig.restQuickLinks\n                ? '<div class=\"bg-guided-artwork__action-group\">' + actionItems.map(function (item) {\n                  return renderArtworkActionRow(store, item, availability, templateAvailability, artworkRuleState);\n                }).join('') + '</div>'\n                : actionItems.map(function (item) {\n                  return renderArtworkActionRow(store, item, availability, templateAvailability, artworkRuleState);\n                }).join(''))) +\n          '</div>' +\n          (selectedActionItem ? '<button type=\"button\" class=\"bg-guided-artwork__collapse-button\" data-bg-artwork-action=\"collapse-artwork-options\">Done</button>' : '')\n        ) : renderSelectedArtworkChoice(store, selectedActionItem, templateAvailability, artworkRuleState, {\n          // Quick links exist for the undecided default state; once a method is\n          // chosen the customer has engaged and Change covers switching.\n          quickLinksMarkup: artworkSectionConfig.restQuickLinks && selectedActionItem && selectedActionItem.key === 'send-later'\n            ? buildArtworkQuickLinksMarkup(store, actionItems, selectedActionItem)\n            : ''\n        })) +\n      '</div>'\n    )) : '';\n\n    var editButtonsMarkup = artworkRuleState.showEditButtons && !text(store.state.project && store.state.project.projectId) ? (\n      '<div class=\"bg-guided-artwork__step bg-guided-artwork__panel bg-designer-storefront__artwork-review-panel\">' +\n        '<h4 class=\"bg-guided-artwork__subheading\">Your Artwork</h4>' +\n        '<div class=\"bg-guided-artwork__secondary-grid\">' +\n          '<button type=\"button\" class=\"bg-guided-artwork__child-action is-selected\" data-bg-artwork-action=\"edit-existing-art\">' +\n            '<span class=\"bg-guided-artwork__child-title\">Edit Artwork' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, store.state.template) + '</span>' +\n            '<span class=\"bg-guided-artwork__child-subcopy\">Open the saved design and keep working.</span>' +\n          '</button>' +\n          '<button type=\"button\" class=\"bg-guided-artwork__child-action\" data-bg-artwork-action=\"artwork-start-over\">' +\n            '<span class=\"bg-guided-artwork__child-title\">Start Over</span>' +\n            '<span class=\"bg-guided-artwork__child-subcopy\">Clear the current artwork choice and choose a different path.</span>' +\n          '</button>' +\n        '</div>' +\n      '</div>'\n    ) : '';\n\n    var inlineDesignApprovalMarkup = artworkRuleState.showDesignApprovalBox\n      ? buildArtworkApprovalMarkup(store, artworkRuleState, {\n        suppressCustomDesignApproval: true,\n        suppressDesignApproval: false\n      })\n      : '';\n    var designApprovalEmbeddedWithPreview = shouldShowPitchPrintDesignApproval(store, artworkRuleState);\n    var ruleInfoMarkup = buildArtworkRuleInfoMarkup(store, artworkRuleState, {\n      designApprovalMarkup: inlineDesignApprovalMarkup,\n      compactFlow: showGuidedFlow,\n      suppressDesignApproval: designApprovalEmbeddedWithPreview\n    });\n    var approvalMarkup = buildArtworkApprovalMarkup(store, artworkRuleState, {\n      suppressCustomDesignApproval: showGuidedFlow && text(store.state.artworkMode).toLowerCase() === 'customdesign',\n      suppressDesignApproval: designApprovalEmbeddedWithPreview ||\n        (artworkRuleState.showDesignApprovalBox && artworkRuleState.showDesignApprovalChoice) ||\n        (hasSavedProject && text(store.state.artworkMode).toLowerCase() === 'designonline')\n    });\n    // Batch 4 (3b residual): once a guided fill saves a project, the artwork\n    // rules collapse the guided flow (showGuidedFlow false) and this\n    // standalone card was the ONLY surface \u2014 without the slot panel a\n    // same-page photo replace was unreachable. The panel rides along here\n    // when the guided fill is armed; its uploads hit the server refill lane\n    // (PATCH on the existing guided project).\n    var standaloneGuidedPanelMarkup = '';\n    if (!showGuidedFlow && templateSummary && hasSavedProject\n      && isGuidedFillArmed(store)\n      && text(store.state.artworkMode).toLowerCase() === 'designonline') {\n      if (store.state.template) ensureGuidedFillSlotStateLoaded(store);\n      standaloneGuidedPanelMarkup = buildGuidedFillPanelMarkup(store, templateAvailability);\n    }\n    var standaloneTemplateMarkup = (!showGuidedFlow && templateSummary) ? (\n      '<div class=\"bg-guided-artwork__step bg-guided-artwork__panel bg-guided-artwork__selected-template\">' +\n        '<h4 class=\"bg-guided-artwork__subheading\">' + escapeHtml(hasSavedProject ? 'Your Design' : 'Selected template') + '</h4>' +\n        templateSummary +\n        standaloneGuidedPanelMarkup +\n      '</div>'\n    ) : '';\n\n    blocks.artwork.innerHTML = '' +\n      '<section class=\"bg-designer-storefront__section bg-designer-storefront__artwork-section bg-designer-storefront__artwork-section--flat' + (useCardsArtworkLayout && showGuidedFlow ? ' bg-designer-storefront__artwork-section--cards' : '') + (useVersionedArtworkLayout && showGuidedFlow ? ' bg-designer-storefront__artwork-section--versioned' : '') + '\">' +\n        '<h3 class=\"bg-designer-storefront__section-label bg-designer-storefront__artwork-label\">Artwork</h3>' +\n        guidedFlowMarkup +\n        standaloneTemplateMarkup +\n        editButtonsMarkup +\n        ruleInfoMarkup +\n        approvalMarkup +\n        (showGuidedFlow ? buildArtworkIncompleteNote(store, incompleteState) : '') +\n      '</section>';\n\n    if (blocks.artwork.__bgDesignerPrimaryDelegateV1 !== '1') {\n      blocks.artwork.__bgDesignerPrimaryDelegateV1 = '1';\n      blocks.artwork.addEventListener('click', function (event) {\n        var button = event.target && typeof event.target.closest === 'function'\n          ? event.target.closest('[data-bg-artwork-primary]')\n          : null;\n        if (!button || !blocks.artwork.contains(button)) return;\n        var choice = text(button.getAttribute('data-bg-artwork-primary'));\n        if (getProductFormPresentation(store) === 'guided' && (choice === 'need-design' || choice === 'have-design' || choice === 'send-later')) {\n          event.__bgDesignerGuidedArtworkIntentHandled = true;\n          selectGuidedArtworkIntent(store, choice);\n          return;\n        }\n        if (choice === 'need-design') {\n          clearArtworkAuxiliaryState(store);\n          setArtworkIntent(store, 'need-design', store.state.artworkSecondaryChoice);\n          if (text(store.state.artworkMode) === 'uploadfiles' || text(store.state.artworkMode) === 'uploadcanva' || text(store.state.artworkMode) === 'youhaveart') {\n            commitArtworkChoice(store, { mode: '', source: 'clear' });\n            setArtworkIntent(store, store.state.artworkPrimaryChoice, '');\n          }\n        } else if (choice === 'have-design') {\n          clearArtworkAuxiliaryState(store);\n          writeArtworkTemplate(store, null);\n          clearProjectState(store);\n          setArtworkIntent(store, 'have-design', store.state.artworkSecondaryChoice);\n          if (text(store.state.artworkMode) !== 'uploadfiles' && text(store.state.artworkMode) !== 'uploadcanva') {\n            commitArtworkChoice(store, { mode: '', source: 'clear' });\n            setArtworkIntent(store, store.state.artworkPrimaryChoice, '');\n          }\n        } else if (choice === 'send-later') {\n          if (!applyArtworkMethodOption(store, 'youhaveart', 'customer', null)) return;\n          clearProjectState(store);\n          clearUploadState(store);\n          clearCanvaState(store);\n          clearArtworkAuxiliaryState(store);\n          setArtworkChoice(store, 'send-later', '', 'youhaveart');\n        }\n        render(store);\n      });\n      blocks.artwork.addEventListener('keydown', function (event) {\n        var button = event.target && typeof event.target.closest === 'function'\n          ? event.target.closest('[data-bg-artwork-primary]')\n          : null;\n        if (!button || !blocks.artwork.contains(button) || getProductFormPresentation(store) !== 'guided') return;\n        if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' && event.key !== 'Home' && event.key !== 'End') return;\n        var tabs = Array.prototype.slice.call(blocks.artwork.querySelectorAll('[data-bg-artwork-primary]'));\n        if (tabs.length < 2) return;\n        event.preventDefault();\n        var index = tabs.indexOf(button);\n        var nextIndex = event.key === 'Home'\n          ? 0\n          : event.key === 'End'\n            ? tabs.length - 1\n            : (index + (event.key === 'ArrowRight' ? 1 : -1) + tabs.length) % tabs.length;\n        var nextChoice = text(tabs[nextIndex].getAttribute('data-bg-artwork-primary'));\n        tabs[nextIndex].click();\n        window.requestAnimationFrame(function () {\n          var nextTab = blocks.artwork.querySelector('[data-bg-artwork-primary=\"' + nextChoice + '\"]');\n          if (nextTab) nextTab.focus();\n        });\n      });\n    }\n\n    if (blocks.artwork.__bgDesignerActionDelegateV1 !== '1') {\n      blocks.artwork.__bgDesignerActionDelegateV1 = '1';\n      blocks.artwork.addEventListener('click', function (event) {\n        var target = event.target && typeof event.target.closest === 'function'\n          ? event.target.closest('[data-bg-artwork-action]')\n          : null;\n        if (!target || !blocks.artwork.contains(target)) return;\n        var actionName = target.getAttribute('data-bg-artwork-action');\n        // The customer-hub app rewrites /account/login anchor hrefs to its\n        // own account view, DROPPING the return_url. The sign-in action\n        // navigates itself to the canonical login URL instead of trusting\n        // the (possibly rewritten) href \u2014 preventDefault stops the anchor.\n        if (actionName === 'reorder-signin') event.preventDefault();\n        handleArtworkAction(store, blocks, actionName, target);\n      });\n    }\n\n    Array.prototype.slice.call(blocks.artwork.querySelectorAll('[data-bg-artwork-approval]')).forEach(function (input) {\n      if (input.dataset.bgArtworkApprovalBound === '1') return;\n      input.dataset.bgArtworkApprovalBound = '1';\n      input.addEventListener('change', function () {\n        var key = text(input.getAttribute('data-bg-artwork-approval'));\n        if (key === 'design-review') {\n          store.state.approvals.designReviewApproved = !!input.checked;\n        } else if (key === 'custom-design') {\n          store.state.approvals.customDesignApproved = !!input.checked;\n        }\n        syncFormState(store);\n        syncSubmitButton(store);\n        scheduleGuidedProductFormPresentation(store);\n      });\n    });\n    syncCanvaLinkInputs(store);\n    var artworkUploadFields = getInlineArtworkUploadFields(store);\n    var optionSupportingField = getArtworkOptionSupportingUploadField(store, store.state.artworkMode);\n    if (optionSupportingField) artworkUploadFields = artworkUploadFields.concat([optionSupportingField]);\n    var guidedSlotFields = getGuidedFillUploadFields(store);\n    if (guidedSlotFields.length) artworkUploadFields = artworkUploadFields.concat(guidedSlotFields);\n    syncUploadFieldInputs(store, blocks.artwork, artworkUploadFields);\n    syncArtworkReorderChooser(store);\n  }\n\n  function getSelectedOptionDisplayValue(option) {\n    if (!option) return '';\n    var label = getOptionLabel(option);\n    var flavor = getOptionFlavorText(option);\n    if (!label) return '';\n    return flavor ? (label + ' (' + flavor + ')') : label;\n  }\n\n  function getArtworkSummaryLabel(store) {\n    var mode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    if (mode === 'designonline') {\n      return text(store && store.state && store.state.project && store.state.project.projectId)\n        ? 'Customized online'\n        : 'Customize online';\n    }\n    if (mode === 'editservice') return 'Template personalization';\n    if (mode === 'customdesign') {\n      var customDesignAmount = Math.max(0, numberValue(getPricePresentation(store).designFeeTotal, 0));\n      return 'Custom design' + (customDesignAmount > 0 ? ' \u00B7 +' + core.formatMoney(customDesignAmount) : '');\n    }\n    if (mode === 'reorder') return 'Reorder';\n    if (mode === 'recreate') return 'Recreate a design';\n    if (mode === 'freesetup') return 'Free setup';\n    if (mode === 'uploadcanva') return isValidCanvaUrl(store.state.canvaUrl) ? 'Canva link added' : 'Share Canva link \u2014 Link required';\n    if (mode === 'uploadfiles') {\n      var files = getPrimaryArtworkUploadFiles(store);\n      return files.length ? buildUploadedFileCountLabel(files) : 'Upload print-ready file \u2014 File required';\n    }\n    if (mode === 'youhaveart') {\n      return getProductFormPresentation(store) === 'guided'\n        ? 'Artwork after checkout'\n        : 'Handle Artwork Later';\n    }\n    return '';\n  }\n\n  function buildCompactConfigurationParts(store) {\n    var parts = [];\n    var quantity = Math.max(1, Number(store && store.state && store.state.quantity || 0));\n    if (quantity) {\n      parts.push(String(quantity));\n    }\n    (store && Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      if (isHolderUnavailableByRules(store, holder)) return;\n      var option = getSelectedOption(store, holder);\n      var value = getOptionLabel(option);\n      if (value) {\n        parts.push(value);\n      }\n    });\n    return parts;\n  }\n\n  function buildCompactConfigurationSummary(store) {\n    return buildCompactConfigurationParts(store).join(' | ');\n  }\n\n  function buildCompactConfigurationSummaryMarkup(store, omitQuantity) {\n    var parts = buildCompactConfigurationParts(store).slice(omitQuantity ? 1 : 0);\n    if (!parts.length) {\n      parts = ['Choose your options to build your order.'];\n    }\n    return parts.map(function (part) {\n      return '<span class=\"bg-designer-storefront__summary-token\">' + escapeHtml(part) + '</span>';\n    }).join('');\n  }\n\n  function renderCtaMeta(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.ctaMeta) return;\n    var pricePresentation = getPricePresentation(store);\n    var priceRecord = getCurrentPriceRecord(store);\n    var estTurnaround = text(priceRecord && priceRecord.estTurnaround);\n    // EDDM-ROUTE-STEP: no installment price for a quantity that waits for routes.\n    var shopPayTotal = shownPrice(pricePresentation).total;\n    var installmentsEligible = !isEddmRouteQuantityPending(store) && !showsNoPriceRow(store) && isShopPayInstallmentsEligibleTotal(shopPayTotal);\n    var turnaroundSuffix = estTurnaround && !isDesignOnlineNoProofLane(store) ? ' after proof approval.' : '';\n    var showStandaloneTurnaround = !!estTurnaround && getProductFormPresentation(store) !== 'guided';\n    blocks.ctaMeta.hidden = !showStandaloneTurnaround;\n    blocks.ctaMeta.innerHTML = showStandaloneTurnaround\n      ? '<div class=\"estTurnaroundWrapper\"><span class=\"estTurnaroundLabel\">Est. Turnaround Time:</span><br><strong class=\"estTurnaround\">' + escapeHtml(estTurnaround) + '</strong><span class=\"estTurnaroundSuffix\">' + escapeHtml(turnaroundSuffix) + '</span></div>'\n      : '';\n\n    var shopPayBlock = ensureShopPayAfterNativeForm(store);\n    if (shopPayBlock) {\n      shopPayBlock.hidden = !installmentsEligible;\n      shopPayBlock.innerHTML = installmentsEligible ? buildShopPayInlineMarkup(shopPayTotal) : '';\n    }\n  }\n\n  // PDP-DISCLAIMERS (2026-09-29): staff notices before Add to cart\n  // (Admin > Products > Storefront page). productPageSettings.notices on the\n  // product-editor-config payload holds only the notices showing at request\n  // time, each with the instant it ends; a notice whose end has passed by this\n  // page's clock drops at the next render. The server-rendered block\n  // (snippets/bg-product-page-notices.liquid, from the metafield mirror) is\n  // the first-paint seed inside the native form; once the payload loaded the\n  // payload is the truth, reconciled in the same render that reveals the\n  // form, so a notice never pops in above a visible button. Display only:\n  // nothing here reaches the form data, a line-item property or the cart.\n  var PRODUCT_PAGE_NOTICE_MAX_COUNT = 12;\n  var PRODUCT_PAGE_NOTICE_MAX_LENGTH = 400;\n\n  function readProductPageNoticesPayload(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    var settings = plainObject(root.productPageSettings) || {};\n    var raw = Array.isArray(settings.notices) ? settings.notices : [];\n    var notices = [];\n    for (var index = 0; index < raw.length && notices.length < PRODUCT_PAGE_NOTICE_MAX_COUNT; index += 1) {\n      var entry = plainObject(raw[index]);\n      if (!entry) continue;\n      var noticeText = text(entry.text).slice(0, PRODUCT_PAGE_NOTICE_MAX_LENGTH);\n      if (!noticeText) continue;\n      var emphasis = text(entry.emphasis);\n      var endsAtMs = Date.parse(text(entry.endsAt));\n      notices.push({\n        text: noticeText,\n        emphasis: emphasis === 'strong' || emphasis === 'flash' ? emphasis : 'normal',\n        location: text(entry.location) === 'below_add_to_cart' ? 'below_add_to_cart' : 'above_add_to_cart',\n        endsAtMs: Number.isFinite(endsAtMs) ? endsAtMs : 0\n      });\n    }\n    return notices;\n  }\n\n  function getProductPageNotices(store, location) {\n    var now = Date.now();\n    var notices = store && Array.isArray(store.productPageNotices) ? store.productPageNotices : [];\n    return notices.filter(function (notice) {\n      return (!location || notice.location === location) && !(notice.endsAtMs && now >= notice.endsAtMs);\n    });\n  }\n\n  function buildProductPageNoticeItemsMarkup(notices, idPrefix, tagName) {\n    var tag = tagName === 'span' ? 'span' : 'p';\n    return notices.map(function (notice, index) {\n      // The class comes from the validated enum only, never from free text.\n      var emphasisClass = notice.emphasis === 'strong' || notice.emphasis === 'flash'\n        ? ' bg-pdp-notice--' + notice.emphasis\n        : '';\n      return '<' + tag + ' class=\"bg-pdp-notice' + emphasisClass + '\"' +\n        (idPrefix ? ' id=\"' + escapeHtml(idPrefix + '-' + (index + 1)) + '\"' : '') + '>' +\n        escapeHtml(notice.text) + '</' + tag + '>';\n    }).join('');\n  }\n\n  // One notices block beside its anchor: created before (above) or after\n  // (below) the anchor, its items replaced only when they change, removed\n  // when no notice shows.\n  function syncProductPageNoticeBlock(anchor, placement, notices, idPrefix) {\n    if (!anchor || !anchor.parentNode) return null;\n    var parent = anchor.parentNode;\n    var block = null;\n    Array.prototype.forEach.call(parent.children, function (child) {\n      if (!block && child.getAttribute && child.getAttribute('data-bg-pdp-notices') === placement) block = child;\n    });\n    if (!notices.length) {\n      if (block && block.parentNode) block.parentNode.removeChild(block);\n      return null;\n    }\n    var markup = buildProductPageNoticeItemsMarkup(notices, idPrefix);\n    if (!block) {\n      block = document.createElement('div');\n      block.className = 'bg-pdp-notices bg-pdp-notices--' + placement;\n      block.setAttribute('data-bg-pdp-notices', placement);\n      block.id = idPrefix;\n      parent.insertBefore(block, placement === 'below' ? anchor.nextSibling : anchor);\n    }\n    if (block.__bgPdpNoticesMarkup !== markup) {\n      block.innerHTML = markup;\n      block.__bgPdpNoticesMarkup = markup;\n    }\n    return block;\n  }\n\n  // The purchase button names the notices beside it (screen readers read\n  // them with the button). Other describedby ids stay.\n  function syncProductPageNoticeDescription(button, blocks) {\n    if (!button) return;\n    var current = text(button.getAttribute('aria-describedby'));\n    var ids = current.split(/\\s+/).filter(function (id) {\n      return id && id.indexOf('bg-pdp-notices-') !== 0;\n    });\n    blocks.forEach(function (block) {\n      if (!block) return;\n      Array.prototype.forEach.call(block.querySelectorAll('.bg-pdp-notice[id]'), function (item) {\n        ids.push(item.id);\n      });\n    });\n    var next = ids.join(' ');\n    if (next === current) return;\n    if (next) button.setAttribute('aria-describedby', next);\n    else button.removeAttribute('aria-describedby');\n  }\n\n  // The id ATTRIBUTE: a product form holds <input name=\"id\"> (the variant), and\n  // browsers resolve form.id to that input (PDP-NOTICES-A11Y).\n  function readProductPageNoticeSectionKey(store) {\n    var form = store && store.form;\n    var formId = text(form && form.getAttribute ? form.getAttribute('id') : '');\n    return formId.indexOf('product-form-') === 0 ? formId.slice('product-form-'.length) : (formId || 'designer');\n  }\n\n  function renderProductPageNotices(store) {\n    // Before the payload arrives (or when it failed) the server block stays.\n    if (!store || store.productPageNoticesLoaded !== true) return;\n    var buttons = store.form ? store.form.querySelector('.product-form__buttons') : null;\n    if (buttons) {\n      var prefix = 'bg-pdp-notices-' + readProductPageNoticeSectionKey(store);\n      var above = syncProductPageNoticeBlock(buttons, 'above', getProductPageNotices(store, 'above_add_to_cart'), prefix + '-above');\n      var below = syncProductPageNoticeBlock(buttons, 'below', getProductPageNotices(store, 'below_add_to_cart'), prefix + '-below');\n      syncProductPageNoticeDescription(getSubmitButton(store), [above, below]);\n    }\n    syncIntentFirstProductPageNotices(store);\n  }\n\n  function syncIntentFirstProductPageNotices(store) {\n    if (!store || store.productPageNoticesLoaded !== true || !store.root) return;\n    var hero = store.root.querySelector('[data-bg-intent-first-hero]');\n    var row = hero ? hero.querySelector('.bg-intent-first__purchase-row') : null;\n    if (!row) return;\n    var above = syncProductPageNoticeBlock(row, 'above', getProductPageNotices(store, 'above_add_to_cart'), 'bg-pdp-notices-intent-first-above');\n    var below = syncProductPageNoticeBlock(row, 'below', getProductPageNotices(store, 'below_add_to_cart'), 'bg-pdp-notices-intent-first-below');\n    syncProductPageNoticeDescription(hero.querySelector('[data-bg-presentation-purchase]'), [above, below]);\n  }\n\n  // Docked sticky bar: ONE line (the first above-button notice) on top of the\n  // bar, clamped; a tap shows every above-button notice in place.\n  function syncStickyPurchaseNotice(bar, store) {\n    var inner = bar ? bar.querySelector('.bg-designer-storefront-sticky-purchase__inner') : null;\n    if (!inner) return;\n    var notices = getProductPageNotices(store, 'above_add_to_cart');\n    var node = inner.querySelector('.bg-designer-storefront-sticky-purchase__notice');\n    if (!notices.length) {\n      if (node && node.parentNode) node.parentNode.removeChild(node);\n      bar.removeAttribute('data-bg-sticky-notice');\n      return;\n    }\n    if (!node) {\n      node = document.createElement('button');\n      node.type = 'button';\n      node.className = 'bg-designer-storefront-sticky-purchase__notice';\n      node.setAttribute('aria-expanded', 'false');\n      inner.insertBefore(node, inner.firstChild);\n    }\n    var markup = buildProductPageNoticeItemsMarkup(notices, '', 'span');\n    if (node.__bgPdpNoticesMarkup !== markup) {\n      node.innerHTML = markup;\n      node.__bgPdpNoticesMarkup = markup;\n    }\n    bar.setAttribute('data-bg-sticky-notice', 'true');\n  }\n\n  var UPLOAD_FILE_ACTIONS = ['replace-upload', 'retry-upload-file', 'remove-upload-file', 'remove-upload'];\n\n  function getRenderedUploadFields(store, artworkRuleState) {\n    var fields = [];\n    if (artworkRuleState.showPrimaryUpload) {\n      fields = fields.concat(normalizeUploadFields(store.binding).map(function (field) {\n        return Object.assign({ surface: 'primary' }, field, { multiple: true });\n      }));\n    }\n    if (artworkRuleState.showSupportingUpload) {\n      fields.push({\n        id: 'supporting_files',\n        label: 'Supporting Files',\n        kind: 'file',\n        required: false,\n        accept: 'image/*,.svg,.pdf,application/pdf,.ai,.eps,.zip,.doc,.docx',\n        multiple: true,\n        surface: 'supporting'\n      });\n    }\n    if (artworkRuleState.showQrUpload) {\n      fields.push({\n        id: 'qr_upload',\n        label: 'QR Code File',\n        kind: 'file',\n        required: artworkRuleState.requireQrUpload === true,\n        accept: 'image/*,.svg,.pdf,application/pdf',\n        multiple: false,\n        surface: 'qr'\n      });\n    }\n    if (artworkRuleState.showMailingListUpload) {\n      fields.push({\n        id: 'mailing_list_upload',\n        label: 'Mailing List File',\n        kind: 'file',\n        required: artworkRuleState.requireMailingListUpload === true,\n        accept: '.csv,.xlsx,.txt,.zip',\n        multiple: false,\n        surface: 'mailing-list'\n      });\n    }\n    return fields.filter(function (field, index, source) {\n      return source.findIndex(function (entry) {\n        return text(entry && entry.id) === text(field && field.id);\n      }) === index;\n    });\n  }\n\n  function renderUploads(store) {\n    var blocks = readBlocks(store);\n    if (!blocks.uploads) return;\n    scheduleGuidedProductFormPresentation(store);\n    scheduleVersion2ProductFormPresentation(store);\n    var mode = text(store.state.artworkMode).toLowerCase();\n    var artworkRuleState = getArtworkRuleState(store);\n    var showCanvaLink = artworkRuleState.showCanvaLink;\n    var showQrLink = artworkRuleState.showQrLink;\n    var showImprintInfo = artworkRuleState.showImprintInfo;\n    // The one list the upload path also drains (getActiveArtworkUploadFields).\n    var fields = getDetailUploadFields(store);\n    store.detailUploadFieldsDrawn = store.detailUploadFieldsDrawn || {};\n    fields.forEach(function (field) {\n      store.detailUploadFieldsDrawn[field.id] = true;\n    });\n    if (mode === 'editservice' || mode === 'freesetup') {\n      showImprintInfo = false;\n    }\n    var shouldShowSection = showQrLink || showImprintInfo || !!fields.length;\n    if (!shouldShowSection) {\n      blocks.uploads.innerHTML = '';\n      blocks.uploads.hidden = true;\n      // The block is empty now, so the same fields coming back must rebuild it.\n      blocks.uploads.removeAttribute('data-bg-upload-layout');\n      return;\n    }\n    blocks.uploads.hidden = false;\n    var layoutSignature = [\n      mode,\n      showCanvaLink ? 'canva' : '',\n      showQrLink ? 'qr-link' : '',\n      showImprintInfo ? 'imprint' : '',\n      fields.map(function (field) { return field.id + (field.required ? '*' : ''); }).join(',')\n    ].join('|');\n    var shouldRebuild = text(blocks.uploads.getAttribute('data-bg-upload-layout')) !== layoutSignature;\n    if (shouldRebuild) {\n      blocks.uploads.setAttribute('data-bg-upload-layout', layoutSignature);\n      blocks.uploads.innerHTML = '' +\n        '<section class=\"bg-designer-storefront__section bg-designer-storefront__upload-section\">' +\n          '<h3 class=\"bg-designer-storefront__section-label\">Artwork Details</h3>' +\n          (showQrLink ? (\n            '<div class=\"bg-designer-storefront__upload-card bg-designer-storefront__upload-card--text\">' +\n              '<label for=\"bg-designer-qr-link\">Link For Your QR Code</label>' +\n              '<input type=\"url\" id=\"bg-designer-qr-link\" class=\"bg-designer-storefront__select\" data-bg-qr-link-input placeholder=\"Paste the destination URL here...\" inputmode=\"url\" autocomplete=\"off\">' +\n            '</div>'\n          ) : '') +\n          (showImprintInfo ? (\n            '<div class=\"bg-designer-storefront__upload-card bg-designer-storefront__upload-card--textarea\">' +\n              '<label for=\"bg-designer-imprint-info\">Imprint Information</label>' +\n              '<textarea id=\"bg-designer-imprint-info\" class=\"bg-designer-storefront__textarea\" data-bg-imprint-input rows=\"5\" placeholder=\"Add any names, phone numbers, QR notes, or design instructions here.\"></textarea>' +\n            '</div>'\n          ) : '') +\n          (fields.length ? (\n            '<div class=\"bg-designer-storefront__upload-grid\">' +\n              fields.map(function (field) {\n                return buildUploadFieldMarkup(store, field);\n              }).join('') +\n            '</div>'\n          ) : '') +\n        '</section>';\n    }\n\n    syncCanvaLinkInputs(store);\n\n    var qrLinkInput = blocks.uploads.querySelector('[data-bg-qr-link-input]');\n    if (qrLinkInput) {\n      qrLinkInput.value = text(store.state.extraInputs.qrCodeLink);\n      if (qrLinkInput.dataset.bgQrLinkBound !== '1') {\n        qrLinkInput.dataset.bgQrLinkBound = '1';\n        qrLinkInput.addEventListener('input', function () {\n          store.state.extraInputs.qrCodeLink = text(qrLinkInput.value);\n          syncFormState(store);\n          syncSubmitButton(store);\n        });\n      }\n    }\n\n    var imprintInput = blocks.uploads.querySelector('[data-bg-imprint-input]');\n    if (imprintInput) {\n      imprintInput.value = text(store.state.extraInputs.imprintInformation);\n      if (imprintInput.dataset.bgImprintBound !== '1') {\n        imprintInput.dataset.bgImprintBound = '1';\n        imprintInput.addEventListener('input', function () {\n          store.state.extraInputs.imprintInformation = text(imprintInput.value);\n          syncFormState(store);\n          syncSubmitButton(store);\n        });\n      }\n    }\n\n    syncUploadFieldInputs(store, blocks.uploads, fields);\n    // UPLOAD-SURFACES-NEVER-SENT-01: the file controls of this block (remove\n    // one file, Remove all, Replace files, Retry) are the artwork block's own\n    // controls; its click delegate stops at the artwork block, so they need\n    // one here.\n    if (blocks.uploads.__bgDesignerUploadActionDelegateV1 !== '1') {\n      blocks.uploads.__bgDesignerUploadActionDelegateV1 = '1';\n      blocks.uploads.addEventListener('click', function (event) {\n        var target = event.target && typeof event.target.closest === 'function'\n          ? event.target.closest('[data-bg-artwork-action]')\n          : null;\n        if (!target || !blocks.uploads.contains(target)) return;\n        var actionName = text(target.getAttribute('data-bg-artwork-action'));\n        if (UPLOAD_FILE_ACTIONS.indexOf(actionName) === -1) return;\n        handleArtworkAction(store, readBlocks(store), actionName, target);\n      });\n    }\n  }\n\n  function findTemplateSelection(store, designId, designNumber, backer) {\n    var cleanNumber = text(designNumber);\n    var cleanId = text(designId);\n    var template = null;\n    if (cleanNumber) {\n      template = store.templates.find(function (entry) {\n        return text(entry.designNumber) === cleanNumber && templateMatchesStorePage(store, entry);\n      }) || null;\n    }\n    if (!template && cleanId) {\n      template = store.templates.find(function (entry) {\n        return text(entry.designId) === cleanId && templateMatchesStorePage(store, entry);\n      }) || null;\n    }\n    if (!template) {\n      template = getTemplateByDesignId(store, cleanId);\n      if (template && !templateMatchesStorePage(store, template)) template = null;\n    }\n    if (!template) return null;\n    var next = enrichTemplateWithLookupMap(deepClone(template, {}), store.templateLookupMap);\n    if (text(backer)) {\n      var matchedBacker = next.backers.find(function (entry) {\n        return text(entry.id) === text(backer);\n      });\n      if (matchedBacker) {\n        next.backer = text(matchedBacker.id);\n        next.backerLabel = text(matchedBacker.label);\n      } else {\n        next.backer = text(next.defaultBackerId);\n        var safeDefaultBacker = next.backers.find(function (entry) {\n          return text(entry.id) === next.backer;\n        });\n        next.backerLabel = safeDefaultBacker ? text(safeDefaultBacker.label) : '';\n      }\n    } else {\n      next.backer = text(next.defaultBackerId);\n      var defaultBacker = next.backers.find(function (entry) {\n        return text(entry.id) === next.backer;\n      });\n      next.backerLabel = defaultBacker ? text(defaultBacker.label) : '';\n    }\n    return next;\n  }\n\n  function getTemplateModeActionLabel(mode) {\n    var normalized = text(mode).toLowerCase();\n    if (normalized === 'designonline') return 'Customize Online';\n    if (normalized === 'editservice') return 'Have Us Personalize It';\n    return 'Select Template';\n  }\n\n  function getTemplateModeHelperCopy(mode) {\n    var normalized = text(mode).toLowerCase();\n    if (normalized === 'designonline') {\n      return 'Choose a proven design, then launch the live designer to make it your own.';\n    }\n    if (normalized === 'editservice') {\n      return 'Choose the template our design team should personalize after checkout.';\n    }\n    return 'Choose a template now, then decide whether to customize it online or have us personalize it.';\n  }\n\n  function getTemplateFinishInModalHelperCopy(template) {\n    var canOnline = !!(template && template.designOnlineAvailable);\n    var canEdit = !!(template && template.editServiceAvailable);\n    if (canOnline && canEdit) return 'Choose how to finish this template: customize it online yourself, or have us personalize it after checkout.';\n    if (canOnline) return 'This template opens in the online editor so you can make it your own.';\n    if (canEdit) return 'Our design team personalizes this template after checkout and sends a proof.';\n    return 'Preview this template.';\n  }\n\n  function buildTemplatePreviewFinishActionsMarkup(store, template, previewState) {\n    var availability = getOfferedTemplateAvailability(store, template);\n    var requiresBacker = Array.isArray(template && template.backers) && template.backers.length > 0;\n    var missingBacker = requiresBacker && !text(previewState && previewState.backerId);\n    var selectionKey = escapeHtml(getTemplateSelectionKey(template));\n    var disabledAttr = missingBacker ? ' disabled' : '';\n    if (getProductFormPresentation(store) !== 'guided') {\n      var legacyButtons = [];\n      if (availability.designonline) {\n        legacyButtons.push('<button type=\"button\" class=\"button button--primary\" data-bg-designer-template-preview-finish=\"designonline\" data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>Customize this template' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, template) + '</button>');\n      }\n      if (availability.editservice) {\n        legacyButtons.push('<button type=\"button\" class=\"bg-designer-storefront-preview-modal__finish-secondary\" data-bg-designer-template-preview-finish=\"editservice\" data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>' + buildTemplatePersonalizationChoiceTitleMarkup(store, template) + '<span class=\"bg-designer-storefront-preview-modal__finish-secondary-copy\">We set it up after checkout and send a proof.</span></button>');\n      }\n      if (!legacyButtons.length) {\n        return '<button type=\"button\" class=\"button button--primary\" data-bg-designer-template-preview-choose>Use this template</button>';\n      }\n      return '' +\n        '<div class=\"bg-designer-storefront-preview-modal__finish-actions\">' +\n          legacyButtons.join('') +\n          (missingBacker ? '<span class=\"bg-designer-storefront-preview-modal__finish-note\">Choose a back side first.</span>' : '') +\n        '</div>';\n    }\n    ensureGuidedFillSlotStateLoadedFor(store, template);\n    var guidedFillOffered = isGuidedFillAvailableFor(store, availability, template);\n  // Operator ruling 2026-08-26: self-serve online editing is the preferred\n    // default wherever the editor is offered; staff personalization and guided\n    // fill remain choices, never preselected over it.\n    var preferredMode = availability.designonline ? 'designonline' : (availability.editservice ? 'editservice' : 'guidedfill');\n    var selectedMode = text(previewState && previewState.finishMode).toLowerCase();\n    if ((selectedMode === 'editservice' && !availability.editservice)\n      || (selectedMode === 'designonline' && !availability.designonline)\n      || (selectedMode === 'guidedfill' && !guidedFillOffered)) {\n      selectedMode = '';\n    }\n    selectedMode = selectedMode || preferredMode;\n    previewState.finishMode = selectedMode;\n    var choices = [];\n    if (availability.designonline) {\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__finish-option' + (selectedMode === 'designonline' ? ' is-selected' : '') + '\" role=\"radio\" aria-checked=\"' + (selectedMode === 'designonline' ? 'true' : 'false') + '\" data-bg-designer-template-preview-finish=\"designonline\" data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-radio\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-copy\"><strong>Edit it online myself' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, template) + '</strong><span>Use our design editor to customize this template yourself.</span></span>' +\n        '</button>');\n    }\n    if (guidedFillOffered) {\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__finish-option' + (selectedMode === 'guidedfill' ? ' is-selected' : '') + '\" role=\"radio\" aria-checked=\"' + (selectedMode === 'guidedfill' ? 'true' : 'false') + '\" data-bg-designer-template-preview-finish=\"guidedfill\" data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-radio\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-copy\"><strong>Add my photo here' + buildArtworkMethodPriceSuffixMarkup(store, 'designonline', 0, template) + '</strong><span>Upload your image on this page and we place it in the template \u2014 no editor needed.</span></span>' +\n        '</button>');\n    }\n    if (availability.editservice) {\n      var editServicePrice = getTemplateEditServicePriceMeta(template);\n      var editServicePriceMarkup = editServicePrice.hasDeal\n        ? '<span class=\"bg-designer-storefront-preview-modal__finish-price\"><s>' + escapeHtml(core.formatMoney(editServicePrice.originalCost)) + '</s><strong>' + escapeHtml(editServicePrice.isFree ? 'FREE' : core.formatMoney(editServicePrice.effectiveCost)) + '</strong></span>'\n        : '<span class=\"bg-designer-storefront-preview-modal__finish-price\"><strong>' + escapeHtml(editServicePrice.isFree ? 'FREE' : core.formatMoney(editServicePrice.effectiveCost)) + '</strong></span>';\n      if (resolveArtworkMethodOption(store, 'editservice').status === 'eligible') {\n        editServicePriceMarkup = buildMappedArtworkPriceMarkup(mappedArtworkPrice(store, 'editservice', template, editServicePrice.originalCost, editServicePrice.effectiveCost));\n      }\n      choices.push('' +\n        '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__finish-option' + (selectedMode === 'editservice' ? ' is-selected' : '') + '\" role=\"radio\" aria-checked=\"' + (selectedMode === 'editservice' ? 'true' : 'false') + '\" data-bg-designer-template-preview-finish=\"editservice\" data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-radio\" aria-hidden=\"true\"></span>' +\n          '<span class=\"bg-designer-storefront-preview-modal__finish-copy\"><strong>' + escapeHtml(getTemplatePersonalizationChoiceLabel(store)) + '</strong><span>Send your logo and details after checkout. We send a proof before printing.</span></span>' +\n          editServicePriceMarkup +\n        '</button>');\n    }\n    if (!choices.length) {\n      // Unavailable in both modes (access-note template): keep the standard\n      // choose button so the overlay never dead-ends.\n      return '<button type=\"button\" class=\"button button--primary\" data-bg-designer-template-preview-choose>Use this template</button>';\n    }\n    var actionLabel = selectedMode === 'guidedfill'\n      ? 'Use This Template \u2014 Add My Photo'\n      : selectedMode === 'editservice'\n        ? (getTemplatePersonalizationBrandLabel(store)\n          ? 'Let ' + getTemplatePersonalizationBrandLabel(store) + ' Edit It for Me'\n          : 'Use this template with personalization')\n        : 'Customize This Template';\n    return '' +\n      '<div class=\"bg-designer-storefront-preview-modal__finish-actions\">' +\n        '<h4>Template Editing:</h4>' +\n        '<div class=\"bg-designer-storefront-preview-modal__finish-options\" role=\"radiogroup\" aria-label=\"Template completion method\">' + choices.join('') + '</div>' +\n        (missingBacker ? '<span class=\"bg-designer-storefront-preview-modal__finish-note\">Choose a back side first.</span>' : '') +\n        '<div class=\"bg-designer-storefront-preview-modal__finish-dock\" data-bg-designer-template-preview-finish-dock>' +\n          '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__back-link\" data-bg-designer-template-preview-back>Back to templates</button>' +\n          '<button type=\"button\" class=\"button button--primary bg-designer-storefront-preview-modal__use-template\" data-bg-designer-template-preview-use data-bg-designer-template-preview-selection-key=\"' + selectionKey + '\"' + disabledAttr + '>' + escapeHtml(actionLabel) + buildArtworkMethodPriceSuffixMarkup(store, selectedMode === 'guidedfill' ? 'designonline' : selectedMode, 0, template) + '</button>' +\n        '</div>' +\n      '</div>';\n  }\n\n  function getTemplateReturnHelperCopy(template) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source) {\n      return 'After you choose this template, you\u2019ll return to the product page to choose how you want to finish it.';\n    }\n    var canCustomizeOnline = !!source.designOnlineAvailable;\n    var canUseEditService = !!source.editServiceAvailable;\n    if (canCustomizeOnline && canUseEditService) {\n      return 'After you choose this template, you\u2019ll return to the product page to choose Customize Online or Have Us Personalize It.';\n    }\n    if (canCustomizeOnline) {\n      return 'After you choose this template, you\u2019ll return to the product page to continue with Customize Online.';\n    }\n    if (canUseEditService) {\n      return 'After you choose this template, you\u2019ll return to the product page to continue with Have Us Personalize It.';\n    }\n    return 'After you choose this template, you\u2019ll return to the product page to choose how you want to finish it.';\n  }\n\n  function getTemplateModalState(store) {\n    var state = store && store.templateModalState && typeof store.templateModalState === 'object'\n      ? store.templateModalState\n      : {};\n    if (!state.selectedFilters || typeof state.selectedFilters !== 'object') {\n      state.selectedFilters = {};\n    }\n    if (!state.showAllValuesByField || typeof state.showAllValuesByField !== 'object') {\n      state.showAllValuesByField = {};\n    }\n    if (!state.collapsedByField || typeof state.collapsedByField !== 'object') {\n      state.collapsedByField = {};\n    }\n    TEMPLATE_FILTER_FIELDS.forEach(function (entry) {\n      if (!Array.isArray(state.selectedFilters[entry.field])) {\n        state.selectedFilters[entry.field] = [];\n      }\n      if (typeof state.showAllValuesByField[entry.field] !== 'boolean') {\n        state.showAllValuesByField[entry.field] = false;\n      }\n      if (typeof state.collapsedByField[entry.field] !== 'boolean') {\n        state.collapsedByField[entry.field] = false;\n      }\n    });\n    if (!Number.isFinite(Number(state.page)) || Number(state.page) < 1) state.page = 1;\n    if (!Number.isFinite(Number(state.pageSize)) || Number(state.pageSize) < 1) state.pageSize = 48;\n    if (!Number.isFinite(Number(state.visibleLimit)) || Number(state.visibleLimit) < 1) {\n      state.visibleLimit = getTemplateModalBatchSize(state);\n    }\n    if (!text(state.sortMode)) state.sortMode = DEFAULT_TEMPLATE_MODAL_SORT_MODE;\n    if (typeof state.activeConfigurationKey !== 'string') state.activeConfigurationKey = '';\n    if (typeof state.query !== 'string') state.query = '';\n    store.templateModalState = state;\n    return state;\n  }\n\n  function rememberTemplateModalViewport(store, modal) {\n    var state = getTemplateModalState(store);\n    var grid = modal && modal.querySelector('[data-bg-designer-template-grid]');\n    if (grid) state.scrollTop = Math.max(0, Number(grid.scrollTop) || 0);\n  }\n\n  function returnToTemplateChooser(store) {\n    var previewOpenedFromChooser = !!(store && store.templatePreviewOpenedFromChooser);\n    closeTemplatePreviewModal(store);\n    var modal = document.querySelector('[data-bg-designer-template-modal]');\n    if (!modal) return;\n    var state = getTemplateModalState(store);\n    modal.hidden = false;\n    modal.classList.toggle('bg-designer-storefront-modal--guided-workbench', getProductFormPresentation(store) === 'guided');\n    modal.classList.add('is-open');\n    document.body.classList.add('bg-designer-template-modal--open');\n    if (!previewOpenedFromChooser) renderTemplateModal(store);\n    store.templatePreviewOpenedFromChooser = false;\n    window.requestAnimationFrame(function () {\n      var grid = modal.querySelector('[data-bg-designer-template-grid]');\n      if (grid) grid.scrollTop = Math.max(0, Number(state.scrollTop) || 0);\n      var returnFocusKey = text(store && store.templateModalReturnFocusKey);\n      var selectedCard = Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-card]')).find(function (card) {\n        return text(card.getAttribute('data-bg-designer-template-card')) === (returnFocusKey || text(store.templateModalActiveId));\n      });\n      if (selectedCard && typeof selectedCard.focus === 'function') {\n        try { selectedCard.focus({ preventScroll: true }); } catch (_) { selectedCard.focus(); }\n      }\n    });\n  }\n\n  function getTemplateModalBatchSize(state) {\n    var size = Number(state && state.pageSize);\n    return Number.isFinite(size) && size > 0 ? size : 48;\n  }\n\n  function resetTemplateModalResults(state, modal) {\n    if (!state) return;\n    state.page = 1;\n    state.visibleLimit = getTemplateModalBatchSize(state);\n    var grid = modal && modal.querySelector('[data-bg-designer-template-grid]');\n    if (grid) grid.scrollTop = 0;\n  }\n\n  function bindTemplateModalInfiniteScroll(store, modal, grid) {\n    if (!grid || grid.dataset.bgDesignerTemplateInfiniteBound === '1') return;\n    grid.dataset.bgDesignerTemplateInfiniteBound = '1';\n    grid.addEventListener('scroll', function () {\n      if (!modal || modal.hidden || !modal.classList.contains('is-open')) return;\n      if (grid.scrollTop + grid.clientHeight < grid.scrollHeight - 420) return;\n      var state = getTemplateModalState(store);\n      var filteredTemplates = getTemplateModalTemplates(store);\n      var baseTemplates = getTemplateModalBaseTemplates(store);\n      var configurations = getTemplateModalConfigurations(store, baseTemplates);\n      var activeConfiguration = getActiveTemplateModalConfiguration(store, configurations);\n      var startBlankTemplate = (!activeConfiguration || activeConfiguration.matchesCurrent)\n        ? getStartBlankTemplateForModal(store)\n        : null;\n      var totalCount = filteredTemplates.length + (startBlankTemplate ? 1 : 0);\n      if (!totalCount || Number(state.visibleLimit) >= totalCount) return;\n      var previousScrollTop = grid.scrollTop;\n      state.visibleLimit = Math.min(totalCount, Number(state.visibleLimit) + getTemplateModalBatchSize(state));\n      renderTemplateModal(store);\n      window.requestAnimationFrame(function () {\n        var nextGrid = modal.querySelector('[data-bg-designer-template-grid]');\n        if (nextGrid) nextGrid.scrollTop = previousScrollTop;\n      });\n    }, { passive: true });\n  }\n\n  function getTemplateModalBackerId(store, template) {\n    var selectionKey = getTemplateSelectionKey(template);\n    if (!selectionKey) return '';\n    var explicit = text(store.modalBackerSelections[selectionKey]);\n    if (explicit) return explicit;\n    if (text(template.defaultBackerId)) return text(template.defaultBackerId);\n    return text(template.backer);\n  }\n\n  function normalizeTemplateHandle(value) {\n    return text(value).toLowerCase();\n  }\n\n  function getUniqueTemplateHandles(values) {\n    var seen = Object.create(null);\n    return (Array.isArray(values) ? values : []).map(normalizeTemplateHandle).filter(function (handle) {\n      if (!handle || seen[handle]) return false;\n      seen[handle] = true;\n      return true;\n    });\n  }\n\n  function readTemplateProductUrlHandle(value) {\n    var url = text(value);\n    if (!url) return '';\n    var match = url.match(/\\/products\\/([^/?#]+)/i);\n    return match ? normalizeTemplateHandle(match[1]) : '';\n  }\n\n  function templateHasFoundationRouteData(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : {};\n    return !!(\n      text(source.foundationProductUrl || raw.__foundationProductUrl)\n      || text(source.foundationReturnProductHandle || raw.__foundationReturnProductHandle)\n      || text(source.foundationTargetProductHandle || raw.__foundationTargetProductHandle)\n      || text(source.foundationTemplateSourceHandle || raw.__foundationTemplateSourceHandle)\n    );\n  }\n\n  function foundationTemplateMatchesStorePage(store, template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var raw = source.raw && typeof source.raw === 'object' ? source.raw : {};\n    var config = store && store.config && typeof store.config === 'object' ? store.config : {};\n    var mapping = config.editorMapping && typeof config.editorMapping === 'object' ? config.editorMapping : {};\n    var productHandles = getUniqueTemplateHandles([\n      getEditorProductHandle(store),\n      config.handle,\n      config.returnProductHandle,\n      mapping.returnProductHandle,\n      mapping.productHandle\n    ]);\n    var foundationProductHandle = readTemplateProductUrlHandle(source.foundationProductUrl || raw.__foundationProductUrl);\n    var foundationReturnHandle = normalizeTemplateHandle(source.foundationReturnProductHandle || raw.__foundationReturnProductHandle);\n    var foundationTargetHandle = normalizeTemplateHandle(source.foundationTargetProductHandle || raw.__foundationTargetProductHandle);\n    if (foundationProductHandle && productHandles.indexOf(foundationProductHandle) !== -1) return true;\n    if (foundationReturnHandle && productHandles.indexOf(foundationReturnHandle) !== -1) return true;\n    if (foundationTargetHandle && productHandles.indexOf(foundationTargetHandle) !== -1) return true;\n    return false;\n  }\n\n  function templateMatchesStorePage(store, template, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var titleKey = normalizeSearchValue(template && template.title);\n    var templateSourceHandle = getTemplateSourceHandle(store);\n    var filterProductName = getTemplateModalFilterProductName(store);\n    if (!settings.includeExcluded && titleKey && TEMPLATE_EXCLUDE_NAMES[titleKey]) return false;\n    if (templateHasFoundationRouteData(template)) {\n      return foundationTemplateMatchesStorePage(store, template);\n    }\n    if (store && store.templateCollectionDesignsPayload && store.templateCollectionDesignsPayload.source === 'foundation-template-collection-designs') {\n      return false;\n    }\n    var rawHandle = text(raw.handle);\n    if (rawHandle) return rawHandle === templateSourceHandle;\n    if (filterProductName && sameCanonicalTokenSet(raw.product, filterProductName)) {\n      return true;\n    }\n    return false;\n  }\n\n  function parseTemplateDesignNumber(value) {\n    var parsed = parseInt(text(value), 10);\n    return Number.isFinite(parsed) ? parsed : null;\n  }\n\n  function stableHash(value) {\n    var hash = 0x811c9dc5;\n    var input = String(value || '');\n    for (var index = 0; index < input.length; index += 1) {\n      hash ^= input.charCodeAt(index);\n      hash = Math.imul(hash, 0x01000193);\n    }\n    return hash >>> 0;\n  }\n\n  function pickStableArrayEntry(items, seed) {\n    var list = Array.isArray(items) ? items : [];\n    return list.length ? list[stableHash(seed) % list.length] : null;\n  }\n\n  function getTemplateConcreteSizeValues(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var values = normalizeStringList(raw.size).concat(normalizeStringList(raw.size_display_as),\n      normalizeStringList(raw.label_from_size), normalizeStringList(raw.size_targetingID));\n    // Native templates have no legacy catalog size strings; their structured\n    // dimensions (template summary metadata) map into the same size keys.\n    var dimensionRows = []\n      .concat(template && Array.isArray(template.dimensions) ? template.dimensions : [])\n      .concat(Array.isArray(raw.dimensions) ? raw.dimensions : []);\n    dimensionRows.forEach(function (row) {\n      var width = Number(row && row.width);\n      var height = Number(row && row.height);\n      if (Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0) values.push(width + ' x ' + height);\n    });\n    return values;\n  }\n\n  function getTemplateConcreteSizePairs(template) {\n    return getTemplateConcreteSizeValues(template).map(parseTemplateDimensionPair).filter(Boolean).map(function (pair) { return [pair.width, pair.height]; });\n  }\n\n  function getTemplateConcreteSizeKeys(template) {\n    return getTemplateDimensionKeys(getTemplateConcreteSizeValues(template));\n  }\n\n  function getOptionDimensionKey(store, holder, option) {\n    var syncedValue = findProductCommerceSizeValue(store, holder, option);\n    var syncedWidth = numberValue(syncedValue && syncedValue.width, NaN);\n    var syncedHeight = numberValue(syncedValue && syncedValue.height, NaN);\n    if (Number.isFinite(syncedWidth) && syncedWidth > 0 && Number.isFinite(syncedHeight) && syncedHeight > 0) {\n      return makeSizeKey([syncedWidth, syncedHeight]);\n    }\n    var parsed = parseOptionSizeToken(option, syncedValue && syncedValue.label);\n    return makeSizeKey(parsed ? [parsed.width, parsed.height] : null);\n  }\n\n  function getOptionConcreteOrientation(store, holder, option) {\n    var syncedValue = findProductCommerceSizeValue(store, holder, option);\n    var width = numberValue(syncedValue && syncedValue.width, NaN);\n    var height = numberValue(syncedValue && syncedValue.height, NaN);\n    if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0) {\n      var parsed = parseOptionSizeToken(option, syncedValue && syncedValue.label);\n      width = Number(parsed && parsed.width);\n      height = Number(parsed && parsed.height);\n    }\n    if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0) return '';\n    if (Math.abs(width - height) < 0.01) return 'square';\n    return width > height ? 'horizontal' : 'vertical';\n  }\n\n  function getOptionTemplatePrintingMode(option) {\n    // The typed process reference is authoritative when present: a choice\n    // named anything (\"Economy\", \"Eco 1-farbig\") maps by DATA. Words are the\n    // legacy fallback only.\n    var typedProcess = text(option && option.printProcess).toLowerCase();\n    if (typedProcess === 'spot_color') return '1-color';\n    if (typedProcess === 'full_color') return 'full-color';\n    var candidates = [\n      getOptionLabel(option),\n      option && option.targetingID,\n      option && option.targetingId,\n      option && option.friendlySku,\n      option && option.hvId,\n      option && option.id\n    ];\n    for (var index = 0; index < candidates.length; index += 1) {\n      var direct = normalizeTemplatePrintingMode(candidates[index]);\n      if (direct) return direct;\n      var normalized = text(candidates[index]).toLowerCase()\n        .replace(/[_-]+/g, ' ')\n        .replace(/\\s+/g, ' ')\n        .trim();\n      if (/(?:^|\\s)full(?:\\s+colou?r)?(?:\\s|$)/.test(normalized)) return 'full-color';\n      if (/(?:^|\\s)(?:1|one)(?:\\s+colou?r)?(?:\\s|$)/.test(normalized)) return '1-color';\n    }\n    return '';\n  }\n\n  function findPrintingOptionForTemplateConfiguration(store, holder, template) {\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    var current = getSelectedOptionFromAllOptions(store, holder);\n    var modes = getTemplatePrintingModes(template);\n    if (!modes.length) return current;\n    var currentMode = getOptionTemplatePrintingMode(current);\n    if (current && modes.indexOf(currentMode) !== -1) return current;\n    return options.find(function (option) {\n      return modes.indexOf(getOptionTemplatePrintingMode(option)) !== -1;\n    }) || null;\n  }\n\n  function findSizeOptionForTemplateConfiguration(store, holder, template, printingMode) {\n    var allOptions = holder && Array.isArray(holder.values) ? holder.values : [];\n    var modeSpecificOptions = text(printingMode)\n      ? allOptions.filter(function (option) {\n          var optionMode = getOptionTemplatePrintingMode(option);\n          return !optionMode || optionMode === printingMode;\n        })\n      : allOptions;\n    var options = modeSpecificOptions.length ? modeSpecificOptions : allOptions;\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var targetingValues = normalizeStringList(raw.size_targetingID).map(normalizeTargetingIdKey).filter(Boolean);\n    var directMatch = options.find(function (option) {\n      var optionValues = [option && option.hvId, option && option.id, option && option.targetingID, option && option.targetingId]\n        .map(normalizeTargetingIdKey)\n        .filter(Boolean);\n      return targetingValues.some(function (targetingValue) {\n        return optionValues.indexOf(targetingValue) !== -1;\n      });\n    });\n    if (directMatch) return directMatch;\n    var sizeKeys = getTemplateConcreteSizeKeys(template);\n    if (!Object.keys(sizeKeys).length) {\n      // Native guided-fill templates have no legacy catalog size strings; the\n      // slot-state document's board dims are the size truth.\n      var guidedState = getGuidedFillSlotStateFor(store, template);\n      var boardDims = guidedState && Array.isArray(guidedState.boardDimensions) ? guidedState.boardDimensions : [];\n      boardDims.forEach(function (row) {\n        var key = makeTemplateDimensionKey(row);\n        if (key) sizeKeys[key] = true;\n      });\n    }\n    // Read sizes_available only without an authoritative size, keeping a listed current choice.\n    if (!Object.keys(sizeKeys).length) {\n      sizeKeys = getTemplateDimensionKeys(raw.sizes_available);\n      var current = getSelectedOptionFromAllOptions(store, holder);\n      if (options.indexOf(current) !== -1 && sizeKeys[getOptionDimensionKey(store, holder, current)]) return current;\n    }\n    var wantedKeys = Object.keys(sizeKeys);\n    if (!wantedKeys.length) return null;\n    return options.find(function (option) {\n      var optionKey = getOptionDimensionKey(store, holder, option);\n      return !!optionKey && !!sizeKeys[optionKey];\n    }) || null;\n  }\n\n  function getTemplateConcreteOrientation(template) {\n    var pairs = getTemplateConcreteSizePairs(template);\n    if (pairs.length) {\n      var width = Number(pairs[0][0]);\n      var height = Number(pairs[0][1]);\n      if (Number.isFinite(width) && Number.isFinite(height) && Math.abs(width - height) < 0.01) {\n        // A square product has no meaningful portrait/landscape choice. Its\n        // size must remain selectable even when legacy metadata incorrectly\n        // carries a Vertical or Horizontal targeting value.\n        return 'square';\n      }\n    }\n    var explicitOrientation = getTemplateOrientation(template);\n    if (explicitOrientation) return explicitOrientation;\n    if (!pairs.length) return '';\n    var inferredWidth = Number(pairs[0][0]);\n    var inferredHeight = Number(pairs[0][1]);\n    if (!Number.isFinite(inferredWidth) || !Number.isFinite(inferredHeight)) return '';\n    return inferredWidth > inferredHeight ? 'horizontal' : 'vertical';\n  }\n\n  function findOrientationOptionForTemplateConfiguration(store, holder, template) {\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    var current = getSelectedOptionFromAllOptions(store, holder);\n    var orientation = getTemplateConcreteOrientation(template);\n    if (orientation === 'square') {\n      return options.find(function (option) {\n        return normalizeTemplateOrientation(buildDisplayLabel(option)) === 'square'\n          || normalizeTemplateOrientation(option && option.targetingID) === 'square';\n      }) || null;\n    }\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    var targetingValues = normalizeStringList(raw.orientation_targetingID).map(normalizeTargetingIdKey).filter(Boolean);\n    var directMatch = options.find(function (option) {\n      var optionValues = [option && option.hvId, option && option.id, option && option.targetingID, option && option.targetingId]\n        .map(normalizeTargetingIdKey)\n        .filter(Boolean);\n      return targetingValues.some(function (targetingValue) {\n        return optionValues.indexOf(targetingValue) !== -1;\n      });\n    });\n    if (directMatch) return directMatch;\n    if (!orientation) return current;\n    return options.find(function (option) {\n      return normalizeTemplateOrientation(buildDisplayLabel(option)) === orientation\n        || normalizeTemplateOrientation(option && option.targetingID) === orientation;\n    }) || null;\n  }\n\n  // A template with no size data on a product whose synced size holder carries\n  // no physical size (the apparel Fit holder, for example) cannot disagree with\n  // the current selection, so it maps to the current configuration. A holder\n  // with any physical size keeps strict size matching.\n  function isSizeNeutralTemplateForHolder(store, holder, template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    if (normalizeStringList(raw.size_targetingID).filter(Boolean).length) return false;\n    if (Object.keys(getTemplateConcreteSizeKeys(template)).length) return false;\n    if (Object.keys(getTemplateDimensionKeys(raw.sizes_available)).length) return false;\n    var guidedState = getGuidedFillSlotStateFor(store, template);\n    if (guidedState && Array.isArray(guidedState.boardDimensions) && guidedState.boardDimensions.length) return false;\n    var options = holder && Array.isArray(holder.values) ? holder.values : [];\n    return !options.some(function (option) { return !!getOptionDimensionKey(store, holder, option); });\n  }\n\n  function getTemplateModalConfiguration(store, template) {\n    var sync = getProductCommerceEditorSync(store);\n    var sizeHolder = findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n    var printingHolder = findSyncedOptionHolder(store, sync.printingHolderId, 'printing', 'printing');\n    var printingOption = printingHolder\n      ? findPrintingOptionForTemplateConfiguration(store, printingHolder, template)\n      : null;\n    var templatePrintingModes = getTemplatePrintingModes(template);\n    if (printingHolder && templatePrintingModes.length && !printingOption) return { mappable: false, matchesCurrent: false, targetKey: '', label: '', changes: [] };\n    var printingMode = getOptionTemplatePrintingMode(printingOption)\n      || templatePrintingModes[0]\n      || '';\n    var currentPrintingOption = printingHolder ? getSelectedOptionFromAllOptions(store, printingHolder) : null;\n    var printingChanged = !!printingHolder && !!printingOption\n      && text(printingOption && printingOption.hvId) !== text(currentPrintingOption && currentPrintingOption.hvId);\n    var printingLabel = printingOption ? buildDisplayLabel(printingOption) : '';\n    if (!sizeHolder) {\n      var printingChanges = printingChanged ? [{\n        holder: printingHolder,\n        holderLabel: text(printingHolder.displayName) || 'Printing',\n        from: buildDisplayLabel(currentPrintingOption),\n        to: printingLabel,\n        option: printingOption\n      }] : [];\n      return {\n        mappable: true,\n        matchesCurrent: !printingChanges.length,\n        targetKey: text(printingOption && printingOption.hvId) || 'current',\n        label: printingLabel,\n        primaryLabel: printingLabel || 'Current option',\n        secondaryLabel: '',\n        changes: printingChanges,\n        printingHolder: printingHolder,\n        printingOption: printingOption,\n        printingLabel: printingLabel,\n        sizeHolder: null,\n        sizeOption: null,\n        sizeLabel: ''\n      };\n    }\n    var currentSizeOption = getSelectedOptionFromAllOptions(store, sizeHolder);\n    var sizeOption = findSizeOptionForTemplateConfiguration(store, sizeHolder, template, printingMode)\n      || (isStartBlankTemplate(template) ? currentSizeOption : null)\n      || (isSizeNeutralTemplateForHolder(store, sizeHolder, template) ? currentSizeOption : null);\n    if (!sizeOption) return { mappable: false, matchesCurrent: false, targetKey: '', label: '', changes: [] };\n    var orientationHolder = findSyncedOptionHolder(store, '', 'orientation', 'orientation');\n    var orientationOption = orientationHolder\n      ? findOrientationOptionForTemplateConfiguration(store, orientationHolder, template)\n      : null;\n    var orientation = orientationHolder ? getTemplateConcreteOrientation(template) : '';\n    var orientationNeutral = !!orientationHolder && orientation === 'square' && !orientationOption;\n    if (orientationHolder && !orientationOption && !orientationNeutral) return { mappable: false, matchesCurrent: false, targetKey: '', label: '', changes: [] };\n    var currentOrientationOption = orientationHolder ? getSelectedOptionFromAllOptions(store, orientationHolder) : null;\n    var sizeChanged = text(sizeOption && sizeOption.hvId) !== text(currentSizeOption && currentSizeOption.hvId);\n    var orientationChanged = !!orientationHolder && !!orientationOption\n      && text(orientationOption && orientationOption.hvId) !== text(currentOrientationOption && currentOrientationOption.hvId);\n    var rotationRestricted = !orientationHolder && getTemplateBinding(store).allowRotate === false;\n    var templateFixedOrientation = rotationRestricted ? getTemplateConcreteOrientation(template) : '';\n    var currentFixedOrientation = rotationRestricted ? getOptionConcreteOrientation(store, sizeHolder, currentSizeOption) : '';\n    var fixedOrientationChanged = !!rotationRestricted\n      && !!templateFixedOrientation\n      && templateFixedOrientation !== 'square'\n      && !!currentFixedOrientation\n      && currentFixedOrientation !== 'square'\n      && templateFixedOrientation !== currentFixedOrientation;\n    var sizeLabel = buildDisplayLabel(sizeOption);\n    var orientationLabel = orientationOption ? buildDisplayLabel(orientationOption) : '';\n    if (!orientationLabel && rotationRestricted && templateFixedOrientation && templateFixedOrientation !== 'square') {\n      orientationLabel = templateFixedOrientation === 'horizontal' ? 'Horizontal' : 'Vertical';\n    }\n    var labelParts = [sizeLabel, printingLabel];\n    if (orientationLabel) labelParts.push(orientationLabel);\n    var changes = [];\n    if (printingChanged) {\n      changes.push({\n        holder: printingHolder,\n        holderLabel: text(printingHolder.displayName) || 'Printing',\n        from: buildDisplayLabel(currentPrintingOption),\n        to: printingLabel,\n        option: printingOption\n      });\n    }\n    if (sizeChanged) {\n      changes.push({\n        holder: sizeHolder,\n        holderLabel: text(sizeHolder.displayName) || 'Size',\n        from: buildDisplayLabel(currentSizeOption),\n        to: sizeLabel,\n        option: sizeOption\n      });\n    }\n    if (orientationChanged) {\n      changes.push({\n        holder: orientationHolder,\n        holderLabel: text(orientationHolder.displayName) || 'Orientation',\n        from: buildDisplayLabel(currentOrientationOption),\n        to: orientationLabel,\n        option: orientationOption\n      });\n    }\n    return {\n      mappable: true,\n      matchesCurrent: !changes.length && !fixedOrientationChanged,\n      targetKey: text(printingOption && printingOption.hvId) + '::' + text(sizeOption.hvId) + '::' + (orientationNeutral\n        ? 'square-neutral'\n        : (text(orientationOption && orientationOption.hvId)\n          || (rotationRestricted ? ('fixed-' + (templateFixedOrientation || currentFixedOrientation || 'unknown')) : ''))),\n      label: labelParts.filter(Boolean).join(' \u2022 '),\n      primaryLabel: sizeLabel,\n      secondaryLabel: [printingLabel, orientationLabel].filter(Boolean).join(' \u2022 '),\n      changes: changes,\n      printingHolder: printingHolder,\n      printingOption: printingOption,\n      printingLabel: printingLabel,\n      sizeHolder: sizeHolder,\n      sizeOption: sizeOption,\n      sizeLabel: sizeLabel,\n      orientationHolder: orientationHolder,\n      orientationOption: orientationOption,\n      orientationNeutral: orientationNeutral,\n      rotationRestricted: rotationRestricted,\n      fixedOrientationChanged: fixedOrientationChanged\n    };\n  }\n\n  function groupTemplatesForModal(store, templates) {\n    var input = Array.isArray(templates) ? templates.slice() : [];\n    var groupLinkedDesigns = getTemplateModalPageConfig(store).groupLinkedDesigns !== false;\n    var byDesignNumber = new Map();\n    var suiteIndex = new Map();\n    var repByDesignNumberKey = new Map();\n\n    if (!groupLinkedDesigns) return input;\n\n    input.forEach(function (template) {\n      var number = parseTemplateDesignNumber(template && template.designNumber);\n      if (number == null) return;\n      byDesignNumber.set(number, template);\n    });\n\n    input.forEach(function (template) {\n      var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n      var suiteKey = text(raw.design_suite);\n      var number = parseTemplateDesignNumber(template && template.designNumber);\n      if (!suiteKey || number == null) return;\n      var suiteValues = suiteIndex.get(suiteKey) || [];\n      suiteValues.push(number);\n      suiteIndex.set(suiteKey, suiteValues);\n    });\n\n    suiteIndex.forEach(function (values, key) {\n      suiteIndex.set(key, Array.from(new Set(values)));\n    });\n\n    var processedNumbers = new Set();\n    var representatives = [];\n\n    function resolveGroupNumbers(template) {\n      var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n      var number = parseTemplateDesignNumber(template && template.designNumber);\n      if (number == null) return [];\n      var suiteKey = text(raw.design_suite);\n      if (suiteKey && suiteIndex.has(suiteKey) && suiteIndex.get(suiteKey).length) {\n        return Array.from(new Set(suiteIndex.get(suiteKey).concat([number]))).filter(function (entry) {\n          return byDesignNumber.has(entry);\n        });\n      }\n      var linkedString = text(raw['linked designs string']);\n      if (linkedString) {\n        return Array.from(new Set([number].concat(linkedString.split(',').map(function (entry) {\n          return parseInt(text(entry), 10);\n        }).filter(function (entry) {\n          return Number.isFinite(entry) && byDesignNumber.has(entry);\n        })))).filter(function (entry) {\n          return byDesignNumber.has(entry);\n        });\n      }\n      return [number];\n    }\n\n    input.forEach(function (template) {\n      var number = parseTemplateDesignNumber(template && template.designNumber);\n      if (number == null) {\n        representatives.push(template);\n        return;\n      }\n      if (processedNumbers.has(number)) return;\n      var groupNumbers = resolveGroupNumbers(template);\n      groupNumbers.forEach(function (entry) {\n        processedNumbers.add(entry);\n      });\n      var productBuckets = new Map();\n      groupNumbers.forEach(function (entry) {\n        var matchedTemplate = byDesignNumber.get(entry);\n        if (!matchedTemplate) return;\n        var raw = matchedTemplate.raw && typeof matchedTemplate.raw === 'object' ? matchedTemplate.raw : {};\n        var productName = text(raw.product) || 'Unknown Product';\n        var bucket = productBuckets.get(productName) || [];\n        bucket.push(matchedTemplate);\n        productBuckets.set(productName, bucket);\n      });\n      productBuckets.forEach(function (bucket, productName) {\n        if (!bucket.length) return;\n        // A linked group is one visual family across product configurations.\n        // Keep one representative for every sellable size/orientation target.\n        // Otherwise the current member consumes the family and hides all of\n        // its legitimate alternatives from the \"other sizes\" section.\n        var configurationBuckets = new Map();\n        bucket.forEach(function (candidate) {\n          var configuration = getTemplateModalConfiguration(store, candidate);\n          if (!configuration.mappable) return;\n          var key = configuration.targetKey || 'current';\n          var values = configurationBuckets.get(key) || [];\n          values.push(candidate);\n          configurationBuckets.set(key, values);\n        });\n        var representativeBuckets = Array.from(configurationBuckets.values());\n        representativeBuckets.forEach(function (representativeCandidates) {\n          if (!representativeCandidates.length) return;\n          var representative = representativeCandidates.find(function (candidate) {\n            var raw = candidate.raw && typeof candidate.raw === 'object' ? candidate.raw : {};\n            var defaultNumber = parseTemplateDesignNumber(raw['linked design default']);\n            var candidateNumber = parseTemplateDesignNumber(candidate && candidate.designNumber);\n            return defaultNumber != null && candidateNumber != null && defaultNumber === candidateNumber;\n          });\n          if (!representative) {\n            var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n            var suiteKey = text(raw.design_suite);\n            var seed = getTemplateSourceHandle(store) + '::' + productName + '::' + (suiteKey || groupNumbers.slice().sort(function (a, b) {\n              return a - b;\n            }).join(',')) + '::' + getTemplateModalConfiguration(store, representativeCandidates[0]).targetKey;\n            representative = pickStableArrayEntry(representativeCandidates, seed) || representativeCandidates[0];\n          }\n          representatives.push(representative);\n          var representativeNumber = text(representative && representative.designNumber);\n          representativeCandidates.forEach(function (member) {\n            var memberNumber = text(member && member.designNumber);\n            if (!memberNumber || !representativeNumber) return;\n            repByDesignNumberKey.set(memberNumber, representativeNumber);\n            var parsedMember = parseTemplateDesignNumber(memberNumber);\n            if (parsedMember != null) repByDesignNumberKey.set(String(parsedMember), representativeNumber);\n          });\n        });\n      });\n    });\n\n    var seen = new Set();\n    return representatives.filter(function (template, index) {\n      var key = text(template && template.designNumber)\n        || text(template && template.designId)\n        || ('idx:' + String(index));\n      if (seen.has(key)) return false;\n      seen.add(key);\n      return true;\n    });\n  }\n\n  // Option-driven template scoping (templatePickerUi.optionSourceRules): when\n  // the customer's selected product choice matches an admin-authored rule\n  // (e.g. a die-cut sign style), the template chooser only shows templates\n  // from that rule's Admin > Templates categories (categoryIds) or imported\n  // legacy template groups (sourceHandles). Matching rules union; with no\n  // matching rule the chooser stays unrestricted.\n  function getTemplateOptionSourceRules(store) {\n    var productData = plainObject(store && store.productData) || {};\n    var configData = plainObject(store && store.productEditorConfigProductData) || {};\n    var pickerUi = plainObject(productData.templatePickerUi) || plainObject(configData.templatePickerUi) || {};\n    return Array.isArray(pickerUi.optionSourceRules) ? pickerUi.optionSourceRules : [];\n  }\n\n  function getSelectedOptionValueKeysForSourceRules(store) {\n    var keys = [];\n    var holders = store && Array.isArray(store.holders) ? store.holders : [];\n    holders.forEach(function (holder) {\n      var option = getSelectedOptionFromAllOptions(store, holder);\n      if (!option) return;\n      // targetingID joins the match keys (ST1): admin-authored rules name the\n      // stable per-value targeting slug, which survives customer-facing label\n      // renames \u2014 matching on labels alone silently detached those rules.\n      [option.label, option.valueLabel, option.value, option.targetingID, buildDisplayLabel(option)].forEach(function (entry) {\n        var key = normalizeSearchValue(entry);\n        if (key && keys.indexOf(key) === -1) keys.push(key);\n      });\n    });\n    return keys;\n  }\n\n  function getOptionSourceRuleCategoryIds(ruleRecord) {\n    return normalizeStringList(ruleRecord && ruleRecord.categoryIds).map(normalizeTemplateCategoryId).filter(Boolean);\n  }\n\n  function normalizeTemplateCategoryId(value) {\n    return String(value == null ? '' : value).trim().toLowerCase();\n  }\n\n  // The union of every rule the selected choices match: { handles,\n  // categoryIds }, or null when no rule applies (chooser unrestricted).\n  function getOptionSourceRuleAllowance(store) {\n    var rules = getTemplateOptionSourceRules(store);\n    if (!rules.length) return null;\n    var selectedKeys = getSelectedOptionValueKeysForSourceRules(store);\n    if (!selectedKeys.length) return null;\n    var allowance = { handles: [], categoryIds: [] };\n    var matched = false;\n    rules.forEach(function (rule) {\n      var ruleRecord = plainObject(rule) || {};\n      var optionValues = normalizeStringList(ruleRecord.optionValues).map(normalizeSearchValue).filter(Boolean);\n      var sourceHandles = normalizeStringList(ruleRecord.sourceHandles).map(normalizeTemplateHandle).filter(Boolean);\n      var categoryIds = getOptionSourceRuleCategoryIds(ruleRecord);\n      if (!optionValues.length || (!sourceHandles.length && !categoryIds.length)) return;\n      if (!optionValues.some(function (value) { return selectedKeys.indexOf(value) !== -1; })) return;\n      matched = true;\n      sourceHandles.forEach(function (handle) {\n        if (allowance.handles.indexOf(handle) === -1) allowance.handles.push(handle);\n      });\n      categoryIds.forEach(function (categoryId) {\n        if (allowance.categoryIds.indexOf(categoryId) === -1) allowance.categoryIds.push(categoryId);\n      });\n    });\n    return matched ? allowance : null;\n  }\n\n  function getTemplateSourceRuleHandles(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    return []\n      .concat(normalizeStringList(raw.__foundationTemplateSourceHandle))\n      .concat(normalizeStringList(raw.template_source_handle))\n      .concat(normalizeStringList(raw.template_source_handles))\n      .concat(normalizeStringList(raw.handle))\n      .map(normalizeTemplateHandle)\n      .filter(Boolean);\n  }\n\n  // A native template's Admin > Templates category plus its parent category\n  // (a rule naming a top-level category covers its sub-categories).\n  function getTemplateRuleCategoryIds(template) {\n    var raw = template && template.raw && typeof template.raw === 'object' ? template.raw : {};\n    return [raw.categoryId, raw.categoryParentId].map(normalizeTemplateCategoryId).filter(Boolean);\n  }\n\n  function templateMatchesRuleScope(template, handles, categoryIds) {\n    if (categoryIds.length && getTemplateRuleCategoryIds(template).some(function (categoryId) { return categoryIds.indexOf(categoryId) !== -1; })) return true;\n    return handles.length > 0 && getTemplateSourceRuleHandles(template).some(function (handle) { return handles.indexOf(handle) !== -1; });\n  }\n\n  function templateMatchesOptionSourceRules(store, template) {\n    var allowance = getOptionSourceRuleAllowance(store);\n    return !allowance || templateMatchesRuleScope(template, allowance.handles, allowance.categoryIds);\n  }\n\n  // A template whose shape_targetingID names a value of an option holder lists\n  // only while that holder's selected value is one of its shape targets.\n  function templateMatchesSelectedShape(store, template) {\n    var targets = getTemplateRawTargetingValues(template, 'shape_targetingID');\n    return !targets.length || (Array.isArray(store.holders) ? store.holders : []).every(function (holder) {\n      var keys = (holder && Array.isArray(holder.values) ? holder.values : []).map(function (option) { return normalizeTargetingIdKey(option && option.targetingID); });\n      var selected = normalizeTargetingIdKey((getSelectedOptionFromAllOptions(store, holder) || {}).targetingID);\n      return !selected || targets.indexOf(selected) !== -1 || !targets.some(function (target) { return keys.indexOf(target) !== -1; });\n    });\n  }\n\n  function optionMatchesSourceRuleKeys(option, ruleKeys) {\n    if (!option) return false;\n    return [option.label, option.valueLabel, option.value, option.targetingID, buildDisplayLabel(option)].some(function (entry) {\n      var key = normalizeSearchValue(entry);\n      return !!key && ruleKeys.indexOf(key) !== -1;\n    });\n  }\n\n  // STYLE-06: a template-page arrival selects the arriving template's\n  // compatible option values through the admin-authored optionSourceRules\n  // (category or family -> option value, the inverse of the picker's forward\n  // filter). Runs BEFORE the size/orientation configuration apply so\n  // rule-driven visibility (e.g. per-style size lists) sees the arriving\n  // template. Returns the prior selections snapshot when anything changed so\n  // a failed handoff can restore it, or null when nothing changed.\n  function applyTemplateOptionSourceRuleSelections(store, template) {\n    var rules = getTemplateOptionSourceRules(store);\n    if (!rules.length || !template) return null;\n    if (!getTemplateSourceRuleHandles(template).length && !getTemplateRuleCategoryIds(template).length) return null;\n    var previous = null;\n    var selections = Object.assign({}, store.state.selections);\n    rules.forEach(function (rule) {\n      var ruleRecord = plainObject(rule) || {};\n      var ruleHandles = normalizeStringList(ruleRecord.sourceHandles).map(normalizeTemplateHandle).filter(Boolean);\n      if (!templateMatchesRuleScope(template, ruleHandles, getOptionSourceRuleCategoryIds(ruleRecord))) return;\n      var ruleKeys = normalizeStringList(ruleRecord.optionValues).map(normalizeSearchValue).filter(Boolean);\n      if (!ruleKeys.length) return;\n      (Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n        if (isProductLinkHolder(holder)) return;\n        var selected = getSelectedOptionFromAllOptions(store, holder);\n        if (selected && optionMatchesSourceRuleKeys(selected, ruleKeys)) return;\n        var match = (holder && Array.isArray(holder.values) ? holder.values : []).find(function (candidate) {\n          return optionMatchesSourceRuleKeys(candidate, ruleKeys);\n        });\n        if (!match) return;\n        if (!previous) previous = Object.assign({}, store.state.selections);\n        selections[getHolderId(holder)] = text(match.hvId);\n      });\n    });\n    if (previous) {\n      if (commitArtworkConfiguration(store, { selections: selections, template: template }, { source: 'url' }).status === 'refused') return previous;\n      recalculate(store);\n    }\n    return previous;\n  }\n\n  function getTemplateModalBaseTemplates(store) {\n    if (isOptionTemplateModalMode(store)) {\n      return getOptionTemplateModalTemplates(store);\n    }\n    var printingMode = getTemplatePrintingFilterMode(store);\n    var sync = getProductCommerceEditorSync(store);\n    var printingHolder = findSyncedOptionHolder(store, sync.printingHolderId, 'printing', 'printing');\n    var candidates = store.templates.filter(function (template) {\n      if (!templateMatchesStorePage(store, template)) return false;\n      if (!templateMatchesOptionSourceRules(store, template)) return false;\n      if (!templateMatchesSelectedShape(store, template)) return false;\n      if (store.templateModalMode === 'designonline' && !template.designOnlineAvailable) return false;\n      if (store.templateModalMode === 'editservice' && !template.editServiceAvailable) return false;\n      // Products without a Printing holder cannot safely switch printing\n      // configurations from a template. Products with the holder keep every\n      // mapped mode so the modal can expose each one as an explicit tab.\n      if (!printingHolder && !templateMatchesPrintingMode(template, printingMode)) return false;\n      if (!getTemplateModalConfiguration(store, template).mappable) return false;\n      return true;\n    });\n    // Configuration-aware grouping keeps one representative per Printing,\n    // Size, and Orientation target so linked designs remain available without\n    // mixing those configurations in one result stream.\n    return groupTemplatesForModal(store, candidates);\n  }\n\n  function getTemplateSearchState(store) {\n    var modalState = getTemplateModalState(store);\n    var query = normalizeSearchValue(modalState.query);\n    if (!query) return { query: '', tokens: [] };\n    return {\n      query: query,\n      tokens: query.split(' ').filter(Boolean)\n    };\n  }\n\n  function matchesTemplateSearch(store, template) {\n    var searchState = getTemplateSearchState(store);\n    if (!searchState.query) return true;\n    var values = getTemplateSearchableValues(store, template && template.raw);\n    if (!values.length) return false;\n    if (values.some(function (value) { return value.indexOf(searchState.query) !== -1; })) return true;\n    return searchState.tokens.every(function (token) {\n      return values.some(function (value) {\n        return value.indexOf(token) !== -1;\n      });\n    });\n  }\n\n  function matchesTemplateFilters(store, template, excludeField) {\n    var modalState = getTemplateModalState(store);\n    var activeFields = getTemplateModalFieldDefs(store);\n    for (var index = 0; index < activeFields.length; index += 1) {\n      var field = activeFields[index].field;\n      if (field === excludeField) continue;\n      var selectedValues = Array.isArray(modalState.selectedFilters[field]) ? modalState.selectedFilters[field] : [];\n      if (!selectedValues.length) continue;\n      var normalizedValues = getTemplateFieldValues(template && template.raw, field).map(normalizeSearchValue);\n      if (!normalizedValues.length) return false;\n      var hasMatch = selectedValues.some(function (selectedValue) {\n        return normalizedValues.indexOf(normalizeSearchValue(selectedValue)) !== -1;\n      });\n      if (!hasMatch) return false;\n    }\n    return true;\n  }\n\n  function buildCurrentTemplateModalConfiguration(store) {\n    var sync = getProductCommerceEditorSync(store);\n    var sizeHolder = findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size');\n    var printingHolder = findSyncedOptionHolder(store, sync.printingHolderId, 'printing', 'printing');\n    var printingOption = printingHolder ? getSelectedOptionFromAllOptions(store, printingHolder) : null;\n    if (!sizeHolder) {\n      if (!printingOption) return null;\n      var printingOnlyLabel = buildDisplayLabel(printingOption);\n      return {\n        targetKey: text(printingOption.hvId) || 'current',\n        matchesCurrent: true,\n        primaryLabel: printingOnlyLabel || 'Current option',\n        secondaryLabel: '',\n        printingLabel: printingOnlyLabel,\n        sizeLabel: '',\n        templateCount: 0\n      };\n    }\n    var sizeOption = getSelectedOptionFromAllOptions(store, sizeHolder);\n    var orientationHolder = findSyncedOptionHolder(store, '', 'orientation', 'orientation');\n    var orientationOption = orientationHolder ? getSelectedOptionFromAllOptions(store, orientationHolder) : null;\n    var rotationRestricted = !orientationHolder && getTemplateBinding(store).allowRotate === false;\n    var fixedOrientation = rotationRestricted ? getOptionConcreteOrientation(store, sizeHolder, sizeOption) : '';\n    var sizeLabel = buildDisplayLabel(sizeOption);\n    var printingLabel = printingOption ? buildDisplayLabel(printingOption) : '';\n    var orientationLabel = orientationOption ? buildDisplayLabel(orientationOption) : '';\n    if (!orientationLabel && rotationRestricted && fixedOrientation && fixedOrientation !== 'square') {\n      orientationLabel = fixedOrientation === 'horizontal' ? 'Horizontal' : 'Vertical';\n    }\n    return {\n      targetKey: text(printingOption && printingOption.hvId) + '::' + text(sizeOption && sizeOption.hvId) + '::' + (\n        text(orientationOption && orientationOption.hvId)\n        || (rotationRestricted ? ('fixed-' + (fixedOrientation || 'unknown')) : '')\n      ),\n      matchesCurrent: true,\n      primaryLabel: sizeLabel || 'Current size',\n      secondaryLabel: [printingLabel, orientationLabel].filter(Boolean).join(' \u2022 '),\n      printingLabel: printingLabel,\n      sizeLabel: sizeLabel,\n      templateCount: 0\n    };\n  }\n\n  function getTemplateModalConfigurations(store, templates) {\n    var byKey = new Map();\n    (Array.isArray(templates) ? templates : []).forEach(function (template) {\n      var configuration = getTemplateModalConfiguration(store, template);\n      if (!configuration.mappable || !configuration.targetKey) return;\n      var existing = byKey.get(configuration.targetKey);\n      if (existing) {\n        existing.templateCount += 1;\n        if (configuration.matchesCurrent) existing.matchesCurrent = true;\n        return;\n      }\n      byKey.set(configuration.targetKey, {\n        targetKey: configuration.targetKey,\n        matchesCurrent: configuration.matchesCurrent,\n        primaryLabel: configuration.primaryLabel || configuration.sizeLabel || configuration.label || 'Current size',\n        secondaryLabel: configuration.secondaryLabel || '',\n        printingLabel: configuration.printingLabel || '',\n        sizeLabel: configuration.sizeLabel || '',\n        templateCount: 1\n      });\n    });\n    var current = Array.from(byKey.values()).find(function (entry) {\n      return entry.matchesCurrent;\n    }) || buildCurrentTemplateModalConfiguration(store);\n    if (current && !byKey.has(current.targetKey)) byKey.set(current.targetKey, current);\n    var currentPrinting = text(current && current.printingLabel);\n    var entries = Array.from(byKey.values());\n    entries.sort(function (left, right) {\n      if (left.matchesCurrent !== right.matchesCurrent) return left.matchesCurrent ? -1 : 1;\n      var leftCurrentPrinting = text(left.printingLabel) === currentPrinting;\n      var rightCurrentPrinting = text(right.printingLabel) === currentPrinting;\n      if (leftCurrentPrinting !== rightCurrentPrinting) return leftCurrentPrinting ? -1 : 1;\n      var leftSize = parseSizeInInches(left.sizeLabel);\n      var rightSize = parseSizeInInches(right.sizeLabel);\n      if (leftSize && rightSize) {\n        var leftKey = makeSizeKey(leftSize).split('x').map(Number);\n        var rightKey = makeSizeKey(rightSize).split('x').map(Number);\n        if (leftKey[0] !== rightKey[0]) return leftKey[0] - rightKey[0];\n        if (leftKey[1] !== rightKey[1]) return leftKey[1] - rightKey[1];\n      }\n      return (text(left.primaryLabel) + ' ' + text(left.secondaryLabel)).localeCompare(\n        text(right.primaryLabel) + ' ' + text(right.secondaryLabel),\n        undefined,\n        { numeric: true, sensitivity: 'base' }\n      );\n    });\n    return entries;\n  }\n\n  function getActiveTemplateModalConfiguration(store, configurations) {\n    var state = getTemplateModalState(store);\n    var entries = Array.isArray(configurations) ? configurations : [];\n    var requested = entries.find(function (entry) {\n      return entry.targetKey === text(state.activeConfigurationKey);\n    });\n    var current = entries.find(function (entry) { return entry.matchesCurrent; }) || entries[0] || null;\n    var active = requested || current;\n    state.activeConfigurationKey = active ? active.targetKey : '';\n    return active;\n  }\n\n  function getTemplatesForModalConfiguration(store, templates, configuration) {\n    if (!configuration || !configuration.targetKey) return Array.isArray(templates) ? templates.slice() : [];\n    return (Array.isArray(templates) ? templates : []).filter(function (template) {\n      return getTemplateModalConfiguration(store, template).targetKey === configuration.targetKey;\n    });\n  }\n\n  function getTemplateModalTemplates(store) {\n    var baseTemplates = getTemplateModalBaseTemplates(store);\n    var configurations = getTemplateModalConfigurations(store, baseTemplates);\n    var activeConfiguration = getActiveTemplateModalConfiguration(store, configurations);\n    var filteredTemplates = getTemplatesForModalConfiguration(store, baseTemplates, activeConfiguration).filter(function (template) {\n      return matchesTemplateSearch(store, template) && matchesTemplateFilters(store, template, '');\n    });\n    var sortMode = getTemplateModalState(store).sortMode;\n    return sortTemplateItems(filteredTemplates, sortMode);\n  }\n\n  function getTemplateConfigurationChangeHelperCopy(store, template) {\n    var configuration = getTemplateModalConfiguration(store, template);\n    if (!configuration.mappable || configuration.matchesCurrent || !configuration.changes.length) return '';\n    var changes = configuration.changes.map(function (change) {\n      return change.holderLabel + ' to ' + change.to;\n    });\n    return 'Selecting this template changes ' + changes.join(' and ') + '. You will confirm before the product is updated.';\n  }\n\n  function getTemplateModalFieldOptions(store, templates, field) {\n    var counts = Object.create(null);\n    templates.forEach(function (template) {\n      if (!matchesTemplateSearch(store, template)) return;\n      if (!matchesTemplateFilters(store, template, field)) return;\n      getTemplateFieldValues(template && template.raw, field).forEach(function (value) {\n        var key = normalizeSearchValue(value);\n        if (!key) return;\n        if (!counts[key]) {\n          counts[key] = { key: key, label: value, count: 0 };\n        }\n        counts[key].count += 1;\n      });\n    });\n    var modalState = getTemplateModalState(store);\n    (modalState.selectedFilters[field] || []).forEach(function (value) {\n      var key = normalizeSearchValue(value);\n      if (!key) return;\n      if (!counts[key]) {\n        counts[key] = { key: key, label: value, count: 0 };\n      }\n    });\n    return Object.keys(counts).map(function (key) {\n      return counts[key];\n    }).sort(function (left, right) {\n      if (field === 'size') {\n        var leftSize = parseSizeInInches(left.label);\n        var rightSize = parseSizeInInches(right.label);\n        if (leftSize && rightSize) {\n          var leftKey = makeSizeKey(leftSize).split('x').map(Number);\n          var rightKey = makeSizeKey(rightSize).split('x').map(Number);\n          if (leftKey[0] !== rightKey[0]) return leftKey[0] - rightKey[0];\n          if (leftKey[1] !== rightKey[1]) return leftKey[1] - rightKey[1];\n        }\n      }\n      return text(left.label).localeCompare(text(right.label), undefined, {\n        numeric: true,\n        sensitivity: 'base'\n      });\n    });\n  }\n\n  function requiresTemplatePreviewOverlay(template) {\n    if (!template) return false;\n    return (Array.isArray(template.backers) && template.backers.length > 0)\n      || (Array.isArray(template.previews) && template.previews.length > 1);\n  }\n\n  function shouldForceTemplatePreviewOverlay(store, template) {\n    if (isTemplateFinishInModalFlow(store)) return true;\n    if (requiresTemplatePreviewOverlay(template)) return true;\n    return !!text(getTemplateAccessNote(template));\n  }\n\n  function getTemplatePreviewUrls(template, backerId) {\n    var frontPreview = getTemplateFrontPreview(template);\n    var backPreview = '';\n    if (Array.isArray(template && template.backers) && template.backers.length) {\n      var matchedBacker = template.backers.find(function (entry) {\n        return text(entry && entry.id) === text(backerId);\n      }) || null;\n      if (matchedBacker) {\n        backPreview = getBackerPreviewUrl(matchedBacker);\n      }\n    }\n    if (!backPreview && Array.isArray(template && template.previews) && template.previews.length > 1) {\n      backPreview = text(template.previews[1]);\n    }\n    return {\n      front: frontPreview,\n      back: backPreview\n    };\n  }\n\n  function isTemplatePreviewFocusTargetAvailable(target) {\n    return !!(\n      target\n      && target.isConnected\n      && typeof target.focus === 'function'\n      && !(target.closest && target.closest('[hidden], [inert], [aria-hidden=\"true\"]'))\n    );\n  }\n\n  function getTemplatePreviewFocusableElements(overlay) {\n    if (!overlay) return [];\n    return Array.prototype.slice.call(overlay.querySelectorAll(\n      'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n    )).filter(function (node) {\n      return !node.hidden\n        && node.getAttribute('aria-hidden') !== 'true'\n        && !(node.closest && node.closest('[hidden], [inert], [aria-hidden=\"true\"]'));\n    });\n  }\n\n  function findTemplatePreviewReturnCard(store) {\n    var selectionKey = text(store && store.templatePreviewReturnSelectionKey);\n    var chooser = document.querySelector('[data-bg-designer-template-modal]');\n    if (!selectionKey || !chooser) return null;\n    return Array.prototype.slice.call(chooser.querySelectorAll('[data-bg-designer-template-card]')).find(function (card) {\n      return text(card.getAttribute('data-bg-designer-template-card')) === selectionKey;\n    }) || null;\n  }\n\n  function findTemplatePreviewCommittedReturnTarget(store) {\n    if (!store || !store.root) return null;\n    var preferredTarget = Array.prototype.slice.call(store.root.querySelectorAll(\n      '[data-bg-contextual-customize], [data-bg-contextual-resume], [data-bg-contextual-finish], '\n      + '[data-bg-artwork-action=\"change-template\"], [data-bg-artwork-action=\"change-backer\"], '\n      + '[data-bg-artwork-action=\"edit-existing-art\"], [data-bg-contextual-change], '\n      + '[data-bg-artwork-action=\"browse-templates\"], [data-bg-artwork-action=\"use-template\"]'\n    )).find(isTemplatePreviewFocusTargetAvailable) || null;\n    if (preferredTarget) return preferredTarget;\n    var artworkRegion = store.root.querySelector('[data-bg-designer-block=\"artwork\"]');\n    if (artworkRegion && !artworkRegion.hidden && !artworkRegion.closest('[hidden], [inert], [aria-hidden=\"true\"]')) {\n      artworkRegion.setAttribute('tabindex', '-1');\n      return artworkRegion;\n    }\n    store.root.setAttribute('tabindex', '-1');\n    return store.root;\n  }\n\n  function closeTemplatePreviewModal(store) {\n    var overlay = document.querySelector('[data-bg-designer-template-preview-modal]');\n    if (!overlay) return;\n    var intentFirstReturnFocus = store && store.intentFirstTemplatePreviewReturnFocus;\n    var intentFirstReturnIndex = text(store && store.intentFirstTemplatePreviewReturnIndex);\n    var templatePreviewReturnFocus = store && store.templatePreviewReturnFocus;\n    overlay.classList.remove('is-open');\n    overlay.hidden = true;\n    overlay.setAttribute('aria-hidden', 'true');\n    var templateModal = document.querySelector('[data-bg-designer-template-modal]');\n    if (templateModal) {\n      templateModal.removeAttribute('inert');\n      templateModal.removeAttribute('aria-hidden');\n    }\n    if (store) {\n      store.templatePreviewState = {\n        designId: '',\n        backerId: '',\n        view: 'front',\n        mode: '',\n        finishMode: ''\n      };\n      if ((!intentFirstReturnFocus || !document.body.contains(intentFirstReturnFocus)) && intentFirstReturnIndex) {\n        intentFirstReturnFocus = store.root && store.root.querySelector('[data-bg-intent-first-template-index=\"' + intentFirstReturnIndex + '\"]');\n      }\n      store.intentFirstTemplatePreviewReturnFocus = null;\n      store.intentFirstTemplatePreviewReturnIndex = '';\n      if (!isTemplatePreviewFocusTargetAvailable(intentFirstReturnFocus)) {\n        intentFirstReturnFocus = isTemplatePreviewFocusTargetAvailable(templatePreviewReturnFocus)\n          ? templatePreviewReturnFocus\n          : findTemplatePreviewReturnCard(store);\n      }\n      if (!isTemplatePreviewFocusTargetAvailable(intentFirstReturnFocus)) {\n        intentFirstReturnFocus = findTemplatePreviewCommittedReturnTarget(store);\n      }\n      store.templatePreviewReturnFocus = null;\n      store.templatePreviewReturnSelectionKey = '';\n    }\n    document.body.classList.remove('bg-designer-preview-lightbox--open');\n    if (isTemplatePreviewFocusTargetAvailable(intentFirstReturnFocus)) {\n      window.requestAnimationFrame(function () {\n        try { intentFirstReturnFocus.focus({ preventScroll: true }); } catch (_) { intentFirstReturnFocus.focus(); }\n      });\n    }\n  }\n\n  function ensureTemplatePreviewModal(store) {\n    var existing = document.querySelector('[data-bg-designer-template-preview-modal]');\n    if (existing) return existing;\n    var overlay = document.createElement('div');\n    overlay.className = 'bg-designer-storefront-preview-modal';\n    overlay.hidden = true;\n    overlay.setAttribute('data-bg-designer-template-preview-modal', '1');\n    overlay.setAttribute('aria-hidden', 'true');\n    overlay.innerHTML = '' +\n      '<div class=\"bg-designer-storefront-preview-modal__backdrop\" data-bg-designer-template-preview-close></div>' +\n      '<div class=\"bg-designer-storefront-preview-modal__panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Template preview\" tabindex=\"-1\">' +\n        '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__close\" aria-label=\"Close template preview\" data-bg-designer-template-preview-close>&times;</button>' +\n        '<div class=\"bg-designer-storefront-preview-modal__layout\">' +\n          '<div class=\"bg-designer-storefront-preview-modal__media\">' +\n            '<div class=\"bg-designer-storefront-preview-modal__frame\"><img src=\"\" alt=\"\" data-bg-designer-template-preview-image></div>' +\n            '<div class=\"bg-designer-storefront-preview-modal__toggle\" data-bg-designer-template-preview-toggle></div>' +\n          '</div>' +\n          '<div class=\"bg-designer-storefront-preview-modal__copy\">' +\n            '<h3 data-bg-designer-template-preview-title></h3>' +\n            '<div class=\"bg-designer-storefront-preview-modal__backers\" data-bg-designer-template-preview-backers hidden>' +\n              '<div class=\"bg-designer-storefront-preview-modal__backer-help\" data-bg-designer-template-preview-backer-help></div>' +\n              '<div class=\"bg-designer-storefront-preview-modal__backer-list\" data-bg-designer-template-preview-backer-list></div>' +\n            '</div>' +\n            '<div class=\"bg-designer-storefront-preview-modal__actions\">' +\n              '<button type=\"button\" class=\"button button--primary\" data-bg-designer-template-preview-choose>Use this template</button>' +\n            '</div>' +\n          '</div>' +\n        '</div>' +\n      '</div>';\n    document.body.appendChild(overlay);\n    Array.prototype.slice.call(overlay.querySelectorAll('[data-bg-designer-template-preview-close]')).forEach(function (button) {\n      button.addEventListener('click', function () {\n        closeTemplatePreviewModal(store);\n      });\n    });\n    overlay.addEventListener('keydown', function (event) {\n      if (!overlay.classList.contains('is-open')) return;\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        closeTemplatePreviewModal(store);\n        return;\n      }\n      if (event.key === 'Tab') {\n        var focusable = getTemplatePreviewFocusableElements(overlay);\n        if (!focusable.length) return;\n        var first = focusable[0];\n        var last = focusable[focusable.length - 1];\n        var active = document.activeElement;\n        if (focusable.indexOf(active) === -1) {\n          event.preventDefault();\n          (event.shiftKey ? last : first).focus();\n        } else if (event.shiftKey && active === first) {\n          event.preventDefault();\n          last.focus();\n        } else if (!event.shiftKey && active === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      }\n    });\n    return overlay;\n  }\n\n  function updateSelectedTemplateBacker(store, template, backerId) {\n    var source = store && store.state && store.state.template ? store.state.template : template;\n    if (!store || !source) return false;\n    var nextTemplate = enrichTemplateWithLookupMap(deepClone(source, {}), store.templateLookupMap);\n    var selectedBacker = text(backerId || nextTemplate.defaultBackerId || nextTemplate.backer);\n    if (!selectedBacker) return false;\n    nextTemplate.backer = selectedBacker;\n    var matchedBacker = Array.isArray(nextTemplate.backers)\n      ? nextTemplate.backers.find(function (entry) {\n        return text(entry && entry.id) === selectedBacker;\n      })\n      : null;\n    nextTemplate.backerLabel = matchedBacker ? text(matchedBacker.label) : text(nextTemplate.backerLabel || selectedBacker);\n    var selectionKey = getTemplateSelectionKey(nextTemplate);\n    if (selectionKey) store.modalBackerSelections[selectionKey] = selectedBacker;\n    store.templateModalActiveId = selectionKey;\n    writeArtworkTemplate(store, nextTemplate);\n    store.mobileArtworkTemplateDetached = false;\n    ensureContextualSelectedDesignCompatibility(store);\n    if (!text(store.state.project && store.state.project.projectId)) {\n      clearProjectState(store);\n    }\n    render(store);\n    return true;\n  }\n\n  function renderTemplatePreviewModal(store, template) {\n    var overlay = ensureTemplatePreviewModal(store);\n    if (!overlay.classList.contains('is-open')) {\n      var chooser = document.querySelector('[data-bg-designer-template-modal]');\n      store.templatePreviewOpenedFromChooser = !!(chooser && !chooser.hidden && chooser.classList.contains('is-open'));\n      store.templatePreviewReturnFocus = document.activeElement;\n      store.templatePreviewReturnSelectionKey = getTemplateSelectionKey(template);\n    }\n    // Guided slot fill: the slot-state fetch resolves AFTER the modal first\n    // renders; these refs let the fetch callback refresh an OPEN preview so\n    // the guided finish option appears without reopening.\n    store.templatePreviewOverlayRef = overlay;\n    store.templatePreviewTemplateRef = template;\n    var isGuidedPresentation = getProductFormPresentation(store) === 'guided';\n    overlay.classList.toggle('bg-designer-storefront-preview-modal--guided-workbench', isGuidedPresentation);\n    var previewState = store.templatePreviewState || {\n      designId: '',\n      backerId: '',\n      view: 'front',\n      mode: '',\n      finishMode: ''\n    };\n    if (text(previewState.designId) && text(previewState.designId) !== text(template && template.designId)) {\n      previewState = {\n        designId: '',\n        backerId: '',\n        view: 'front',\n        mode: '',\n        finishMode: ''\n      };\n    }\n    previewState.designId = text(template && template.designId);\n    if (!text(previewState.view)) previewState.view = 'front';\n    if (!text(previewState.backerId)) previewState.backerId = getTemplateModalBackerId(store, template);\n    store.templatePreviewState = previewState;\n    var previewUrls = getTemplatePreviewUrls(template, previewState.backerId);\n    var hasBackView = !!text(previewUrls.back);\n    if (previewState.view === 'back' && !hasBackView) previewState.view = 'front';\n    var image = overlay.querySelector('[data-bg-designer-template-preview-image]');\n    var title = overlay.querySelector('[data-bg-designer-template-preview-title]');\n    var helper = overlay.querySelector('[data-bg-designer-template-preview-helper]');\n    if (isGuidedPresentation && helper) {\n      helper.parentElement.removeChild(helper);\n      helper = null;\n    } else if (!isGuidedPresentation && !helper && title && title.parentElement) {\n      helper = document.createElement('p');\n      helper.setAttribute('data-bg-designer-template-preview-helper', '');\n      title.parentElement.insertBefore(helper, title.nextSibling);\n    }\n    var toggle = overlay.querySelector('[data-bg-designer-template-preview-toggle]');\n    var backersWrap = overlay.querySelector('[data-bg-designer-template-preview-backers]');\n    var backerHelp = overlay.querySelector('[data-bg-designer-template-preview-backer-help]');\n    var backerList = overlay.querySelector('[data-bg-designer-template-preview-backer-list]');\n    var hasBackers = Array.isArray(template && template.backers) && template.backers.length > 0;\n    var isChangeBackerMode = text(previewState.mode) === 'change-backer';\n    var actionsWrap = overlay.querySelector('.bg-designer-storefront-preview-modal__actions');\n    var useFinishChoices = isTemplateFinishInModalFlow(store) && !isChangeBackerMode && !(template && template.optionTemplate);\n    if (actionsWrap) {\n      if (useFinishChoices) {\n        actionsWrap.innerHTML = buildTemplatePreviewFinishActionsMarkup(store, template, previewState);\n      } else if (!actionsWrap.querySelector('[data-bg-designer-template-preview-choose]')) {\n        actionsWrap.innerHTML = '<button type=\"button\" class=\"button button--primary\" data-bg-designer-template-preview-choose>Use this template</button>';\n      }\n    }\n    var choose = overlay.querySelector('[data-bg-designer-template-preview-choose]');\n\n    if (image) {\n      var targetUrl = previewState.view === 'back' && text(previewUrls.back) ? text(previewUrls.back) : text(previewUrls.front);\n      image.src = targetUrl;\n      image.alt = text(template && template.title);\n    }\n    if (title) title.textContent = text(template && template.title);\n    if (helper) {\n      var accessNote = getTemplateAccessNote(template);\n      var helperCopy = isChangeBackerMode && hasBackers\n        ? 'Choose the backer for this selected template.'\n        : useFinishChoices\n        ? (accessNote || getTemplateFinishInModalHelperCopy(template))\n        : hasBackers\n        ? getTemplateReturnHelperCopy(template)\n        : (accessNote || getTemplateModeHelperCopy(store.templateModalMode));\n      var configurationCopy = getTemplateConfigurationChangeHelperCopy(store, template);\n      helper.textContent = [helperCopy, configurationCopy].filter(Boolean).join(' ');\n    }\n    if (toggle) {\n      toggle.innerHTML = hasBackView\n        ? '' +\n          '<button type=\"button\" class=\"' + (previewState.view === 'front' ? 'is-active' : '') + '\" data-bg-designer-template-preview-view=\"front\">Front</button>' +\n          '<button type=\"button\" class=\"' + (previewState.view === 'back' ? 'is-active' : '') + '\" data-bg-designer-template-preview-view=\"back\">Back</button>'\n        : '';\n    }\n    if (backersWrap && backerList) {\n      backersWrap.hidden = !hasBackers;\n      if (backerHelp) {\n        backerHelp.textContent = hasBackers\n          ? 'Pick what prints on the back - estimate form, coupons, photo gallery, or blank.'\n          : '';\n      }\n      if (hasBackers) {\n        var backerSignature = template.backers.map(function (backer) {\n          return [\n            text(backer && backer.id),\n            text(backer && backer.label),\n            getBackerThumbUrl(backer)\n          ].join('::');\n        }).join('|');\n        if (backerList.getAttribute('data-bg-designer-template-preview-backer-signature') !== backerSignature) {\n          backerList.innerHTML = template.backers.map(function (backer) {\n            var backerId = text(backer && backer.id);\n            var backerThumb = getBackerThumbUrl(backer);\n            var backerLabel = text(backer && backer.label) || backerId;\n            return '' +\n              '<button type=\"button\" class=\"bg-designer-storefront-preview-modal__backer\" data-bg-designer-template-preview-backer=\"' + escapeHtml(backerId) + '\" aria-pressed=\"false\">' +\n                (backerThumb ? '<span class=\"bg-designer-storefront-preview-modal__backer-thumb\"><img src=\"' + escapeHtml(backerThumb) + '\" alt=\"' + escapeHtml(backerLabel) + ' backer preview\" loading=\"lazy\"></span>' : '') +\n                '<span class=\"bg-designer-storefront-preview-modal__backer-label\">' + escapeHtml(backerLabel) + '</span>' +\n              '</button>';\n          }).join('');\n          backerList.setAttribute('data-bg-designer-template-preview-backer-signature', backerSignature);\n        }\n        Array.prototype.slice.call(backerList.querySelectorAll('[data-bg-designer-template-preview-backer]')).forEach(function (button) {\n          var isActiveBacker = text(button.getAttribute('data-bg-designer-template-preview-backer')) === text(previewState.backerId);\n          button.classList.toggle('is-active', isActiveBacker);\n          button.setAttribute('aria-pressed', isActiveBacker ? 'true' : 'false');\n        });\n      } else {\n        backerList.innerHTML = '';\n        backerList.removeAttribute('data-bg-designer-template-preview-backer-signature');\n      }\n    }\n    if (choose) {\n      var requiresBacker = Array.isArray(template && template.backers) && template.backers.length > 0;\n      choose.disabled = requiresBacker && !text(previewState.backerId);\n      choose.textContent = requiresBacker && !text(previewState.backerId)\n        ? 'Choose a back side'\n        : (isChangeBackerMode ? 'Update backer' : 'Use this template');\n      choose.setAttribute('data-bg-designer-template-preview-selection-key', getTemplateSelectionKey(template));\n    }\n\n    Array.prototype.slice.call(overlay.querySelectorAll('[data-bg-designer-template-preview-view]')).forEach(function (button) {\n      button.onclick = function () {\n        store.templatePreviewState.view = text(button.getAttribute('data-bg-designer-template-preview-view')) || 'front';\n        renderTemplatePreviewModal(store, template);\n      };\n    });\n    Array.prototype.slice.call(overlay.querySelectorAll('[data-bg-designer-template-preview-backer]')).forEach(function (button) {\n      button.onclick = function () {\n        var backerId = text(button.getAttribute('data-bg-designer-template-preview-backer'));\n        store.modalBackerSelections[getTemplateSelectionKey(template)] = backerId;\n        store.templatePreviewState.backerId = backerId;\n        store.templatePreviewState.view = 'back';\n        renderTemplatePreviewModal(store, template);\n      };\n    });\n    if (choose) {\n      choose.onclick = function () {\n        var selectionKey = text(choose.getAttribute('data-bg-designer-template-preview-selection-key'));\n        var previewTemplateKey = getTemplateSelectionKey(template);\n        var chosenTemplate = selectionKey && previewTemplateKey === selectionKey\n          ? template\n          : (getTemplateBySelectionKey(store, selectionKey) || template);\n        var currentTemplateKey = getTemplateSelectionKey(store.state && store.state.template);\n        if (text(store.templatePreviewState && store.templatePreviewState.mode) === 'change-backer'\n          && selectionKey\n          && selectionKey === currentTemplateKey) {\n          updateSelectedTemplateBacker(store, chosenTemplate, text(store.templatePreviewState && store.templatePreviewState.backerId));\n        } else {\n          var chooseOptions = getArtworkSectionConfig(store).sectionLayout === 'v2'\n            ? { preserveUnresolvedFinish: true }\n            : undefined;\n          void chooseTemplateEntry(store, chosenTemplate, text(store.templatePreviewState && store.templatePreviewState.backerId), chooseOptions).then(function (chosen) {\n            if (chosen === false) return;\n            closeTemplatePreviewModal(store);\n          });\n          return;\n        }\n        closeTemplatePreviewModal(store);\n      };\n    }\n    Array.prototype.slice.call(overlay.querySelectorAll('[data-bg-designer-template-preview-finish]')).forEach(function (button) {\n      button.onclick = function () {\n        if (button.disabled) return;\n        var finishMode = text(button.getAttribute('data-bg-designer-template-preview-finish')).toLowerCase();\n        if (getProductFormPresentation(store) !== 'guided') {\n          var selectionKey = text(button.getAttribute('data-bg-designer-template-preview-selection-key'));\n          var previewTemplateKey = getTemplateSelectionKey(template);\n          var chosenTemplate = selectionKey && previewTemplateKey === selectionKey\n            ? template\n            : getTemplateBySelectionKey(store, selectionKey) || template;\n          if (!chosenTemplate) return;\n          void chooseTemplateEntry(store, chosenTemplate, text(store.templatePreviewState && store.templatePreviewState.backerId), { finishMode: finishMode }).then(function (chosen) {\n            if (chosen === false) return;\n            closeTemplatePreviewModal(store);\n          });\n          return;\n        }\n        store.templatePreviewState.finishMode = finishMode;\n        renderTemplatePreviewModal(store, template);\n      };\n    });\n    var useTemplateButton = overlay.querySelector('[data-bg-designer-template-preview-use]');\n    if (useTemplateButton) {\n      useTemplateButton.onclick = function () {\n        if (useTemplateButton.disabled) return;\n        var finishMode = text(store.templatePreviewState && store.templatePreviewState.finishMode).toLowerCase();\n        var selectionKey = text(useTemplateButton.getAttribute('data-bg-designer-template-preview-selection-key'));\n        var previewTemplateKey = getTemplateSelectionKey(template);\n        var chosenTemplate = selectionKey && previewTemplateKey === selectionKey\n          ? template\n          : (getTemplateBySelectionKey(store, selectionKey) || template);\n        void chooseTemplateEntry(store, chosenTemplate, text(store.templatePreviewState && store.templatePreviewState.backerId), { finishMode: finishMode }).then(function (chosen) {\n          if (chosen === false) return;\n          closeTemplatePreviewModal(store);\n        });\n      };\n    }\n    var backToTemplatesButton = overlay.querySelector('[data-bg-designer-template-preview-back]');\n    if (backToTemplatesButton) {\n      backToTemplatesButton.onclick = function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (backToTemplatesButton.dataset.bgDesignerTemplateReturning === '1') return;\n        backToTemplatesButton.dataset.bgDesignerTemplateReturning = '1';\n        store.templateModalReturningUntil = Date.now() + 650;\n        if (useTemplateButton) useTemplateButton.disabled = true;\n        window.setTimeout(function () {\n          returnToTemplateChooser(store);\n        }, 0);\n      };\n    }\n\n    var templateModal = document.querySelector('[data-bg-designer-template-modal]');\n    if (templateModal && !templateModal.hidden) {\n      templateModal.setAttribute('inert', '');\n      templateModal.setAttribute('aria-hidden', 'true');\n    }\n    overlay.hidden = false;\n    overlay.setAttribute('aria-hidden', 'false');\n    overlay.classList.add('is-open');\n    document.body.classList.add('bg-designer-preview-lightbox--open');\n    var panel = overlay.querySelector('.bg-designer-storefront-preview-modal__panel');\n    if (panel && typeof panel.focus === 'function') {\n      window.requestAnimationFrame(function () {\n        try {\n          panel.focus({ preventScroll: true });\n        } catch (_) {\n          panel.focus();\n        }\n      });\n    }\n  }\n\n  var GUIDED_TEMPLATE_CARD_BACK_PREVIEW_HOVER_DELAY_MS = 250;\n\n  function bindGuidedTemplateCardHoverPreview(card) {\n    if (!card) return;\n    var backImage = card.querySelector('[data-bg-designer-template-back-preview]');\n    var backPreviewSrc = text(backImage && backImage.getAttribute('data-bg-designer-template-back-preview-src'));\n    if (!backImage || !backPreviewSrc) return;\n\n    var hoverDelayTimer = 0;\n    var hoverActive = false;\n    var hoverDelayElapsed = false;\n    var backPreviewReady = false;\n\n    function clearHoverDelay() {\n      if (!hoverDelayTimer) return;\n      window.clearTimeout(hoverDelayTimer);\n      hoverDelayTimer = 0;\n    }\n\n    function revealBackPreviewWhenReady() {\n      if (!hoverActive || !hoverDelayElapsed || !backPreviewReady) return;\n      card.classList.add('is-showing-back');\n    }\n\n    function loadBackPreview() {\n      if (!backImage.getAttribute('src')) {\n        backImage.setAttribute('src', backPreviewSrc);\n      }\n      if (backImage.complete && Number(backImage.naturalWidth) > 0) {\n        backPreviewReady = true;\n      }\n    }\n\n    backImage.addEventListener('load', function () {\n      backPreviewReady = true;\n      revealBackPreviewWhenReady();\n    });\n    backImage.addEventListener('error', function () {\n      backPreviewReady = false;\n      card.classList.remove('is-showing-back');\n    });\n    card.addEventListener('mouseenter', function () {\n      hoverActive = true;\n      hoverDelayElapsed = false;\n      card.classList.remove('is-showing-back');\n      clearHoverDelay();\n      loadBackPreview();\n      hoverDelayTimer = window.setTimeout(function () {\n        hoverDelayTimer = 0;\n        hoverDelayElapsed = true;\n        revealBackPreviewWhenReady();\n      }, GUIDED_TEMPLATE_CARD_BACK_PREVIEW_HOVER_DELAY_MS);\n    });\n    card.addEventListener('mouseleave', function () {\n      hoverActive = false;\n      hoverDelayElapsed = false;\n      clearHoverDelay();\n      card.classList.remove('is-showing-back');\n    });\n  }\n\n  function buildGuidedStartBlankVisualMarkup() {\n    return '' +\n      '<span class=\"bg-designer-storefront-modal__blank-canvas\" aria-hidden=\"true\">' +\n        '<svg class=\"bg-designer-storefront-modal__blank-canvas-svg\" viewBox=\"0 0 160 120\" focusable=\"false\">' +\n          '<rect class=\"bg-designer-storefront-modal__blank-canvas-sheet\" x=\"22\" y=\"14\" width=\"116\" height=\"92\" rx=\"6\"></rect>' +\n          '<rect class=\"bg-designer-storefront-modal__blank-canvas-safe\" x=\"32\" y=\"24\" width=\"96\" height=\"72\" rx=\"3\"></rect>' +\n          '<circle class=\"bg-designer-storefront-modal__blank-canvas-action\" cx=\"80\" cy=\"60\" r=\"17\"></circle>' +\n          '<path class=\"bg-designer-storefront-modal__blank-canvas-plus\" d=\"M80 51v18M71 60h18\"></path>' +\n        '</svg>' +\n      '</span>';\n  }\n\n  function renderTemplateModal(store) {\n    var modal = document.querySelector('[data-bg-designer-template-modal]');\n    if (!modal) return;\n    var isGuidedTemplateModal = getProductFormPresentation(store) === 'guided';\n    var state = getTemplateModalState(store);\n    var modalConfig = getTemplateModalPageConfig(store) || {};\n    var baseTemplates = getTemplateModalBaseTemplates(store);\n    var configurations = getTemplateModalConfigurations(store, baseTemplates);\n    var activeConfiguration = getActiveTemplateModalConfiguration(store, configurations);\n    var configurationTemplates = getTemplatesForModalConfiguration(store, baseTemplates, activeConfiguration);\n    buildTemplateSearchSuggestionIndex(store, configurationTemplates);\n    var filteredTemplates = getTemplateModalTemplates(store);\n    var startBlankTemplate = (!activeConfiguration || activeConfiguration.matchesCurrent)\n      ? getStartBlankTemplateForModal(store)\n      : null;\n    var activeFields = getTemplateModalFieldDefs(store).filter(function (entry) {\n      return getTemplateModalFieldOptions(store, configurationTemplates, entry.field).length > 0;\n    });\n    var grid = modal.querySelector('[data-bg-designer-template-grid]');\n    var results = modal.querySelector('[data-bg-designer-template-results]');\n    var search = modal.querySelector('[data-bg-designer-template-search]');\n    var searchSuggestions = modal.querySelector('[data-bg-designer-template-search-suggestions]');\n    var searchClear = modal.querySelector('[data-bg-designer-template-search-clear]');\n    var sort = modal.querySelector('[data-bg-designer-template-sort]');\n    var chips = modal.querySelector('[data-bg-designer-template-chips]');\n    var groups = modal.querySelector('[data-bg-designer-template-filters-groups]');\n    var count = modal.querySelector('[data-bg-designer-template-count]');\n    var prev = modal.querySelector('[data-bg-designer-template-prev]');\n    var next = modal.querySelector('[data-bg-designer-template-next]');\n    var title = modal.querySelector('#bg-designer-template-modal-title');\n    var copy = modal.querySelector('[data-bg-designer-template-modal-copy]');\n    var filtersPanel = modal.querySelector('[data-bg-designer-template-filters-panel]');\n    var filtersOpen = modal.querySelector('[data-bg-designer-template-filters-open]');\n    var filtersOverlay = modal.querySelector('[data-bg-designer-template-filters-overlay]');\n    var showResults = modal.querySelector('[data-bg-designer-template-show-results]');\n    var configurationSwitcher = modal.querySelector('[data-bg-designer-template-configurations]');\n    if (!configurationSwitcher && grid && grid.parentElement) {\n      configurationSwitcher = document.createElement('div');\n      configurationSwitcher.setAttribute('data-bg-designer-template-configurations', '');\n      configurationSwitcher.className = 'bg-designer-storefront-modal__configurations';\n      grid.parentElement.insertBefore(configurationSwitcher, grid);\n    }\n    bindTemplateModalInfiniteScroll(store, modal, grid);\n\n    if (title) {\n      title.textContent = text(modalConfig.modalTitle) || 'Choose a template';\n    }\n    if (copy && copy.parentElement) copy.parentElement.removeChild(copy);\n    if (search) search.value = state.query;\n    if (searchClear) searchClear.style.display = text(state.query) ? 'block' : 'none';\n    if (searchSuggestions && !text(state.query)) hideTemplateSearchSuggestions(modal, store);\n    if (sort) sort.value = text(state.sortMode) || DEFAULT_TEMPLATE_MODAL_SORT_MODE;\n    if (filtersPanel) filtersPanel.classList.toggle('is-open', !!state.filtersOpen);\n    if (filtersOverlay) filtersOverlay.classList.toggle('is-open', !!state.filtersOpen);\n    if (showResults) {\n      var showResultsCount = filteredTemplates.length + (startBlankTemplate ? 1 : 0);\n      showResults.textContent = showResultsCount === 1 ? 'Show 1 result' : ('Show ' + showResultsCount + ' results');\n    }\n    if (filtersOpen) filtersOpen.style.display = activeFields.length ? '' : 'none';\n    modal.classList.toggle('bg-designer-storefront-modal--no-filters', !activeFields.length);\n\n    if (configurationSwitcher) {\n      var configurationPanelId = text(grid && grid.id) || 'bg-designer-template-configuration-panel';\n      if (grid && !grid.id) grid.id = configurationPanelId;\n      var showConfigurationSwitcher = configurations.length > 1;\n      configurationSwitcher.hidden = !showConfigurationSwitcher;\n      configurationSwitcher.innerHTML = showConfigurationSwitcher\n        ? '<div class=\"bg-designer-storefront-modal__configuration-tabs\" role=\"tablist\" aria-label=\"Template size and options\">' +\n            configurations.map(function (configuration) {\n              var isActive = !!activeConfiguration && configuration.targetKey === activeConfiguration.targetKey;\n              var tabLabel = configuration.primaryLabel + (configuration.secondaryLabel ? (' \u2014 ' + configuration.secondaryLabel) : '');\n              return '' +\n                '<button type=\"button\" class=\"bg-designer-storefront-modal__configuration-tab' + (isActive ? ' is-selected' : '') + '\" role=\"tab\" tabindex=\"' + (isActive ? '0' : '-1') + '\" aria-selected=\"' + (isActive ? 'true' : 'false') + '\" aria-controls=\"' + escapeHtml(configurationPanelId) + '\" aria-label=\"' + escapeHtml(tabLabel) + '\" data-bg-designer-template-configuration-tab=\"' + escapeHtml(configuration.targetKey) + '\">' +\n                  '<span class=\"bg-designer-storefront-modal__configuration-primary\">' + escapeHtml(configuration.primaryLabel) + '</span>' +\n                  (configuration.secondaryLabel ? '<span class=\"bg-designer-storefront-modal__configuration-secondary\">' + escapeHtml(configuration.secondaryLabel) + '</span>' : '') +\n                '</button>';\n            }).join('') +\n          '</div>'\n        : '';\n    }\n\n    if (groups) {\n      groups.innerHTML = activeFields.map(function (entry) {\n        var field = entry.field;\n        var options = getTemplateModalFieldOptions(store, configurationTemplates, field);\n        var showAll = !!state.showAllValuesByField[field];\n        var isCollapsed = !!state.collapsedByField[field];\n        var visibleLimit = showAll ? options.length : 8;\n        var selectedValues = state.selectedFilters[field] || [];\n        var optionsHtml = options.map(function (option, index) {\n          var isChecked = selectedValues.some(function (value) {\n            return normalizeSearchValue(value) === option.key;\n          });\n          return '' +\n            '<label class=\"bg-designer-storefront-modal__filter-option' + (index >= visibleLimit ? ' is-hidden' : '') + '\">' +\n              '<input class=\"bg-designer-storefront-modal__filter-checkbox\" type=\"checkbox\" data-bg-designer-template-filter-field=\"' + escapeHtml(field) + '\" value=\"' + escapeHtml(option.label) + '\"' + (isChecked ? ' checked' : '') + '>' +\n              '<span class=\"bg-designer-storefront-modal__filter-option-text\">' + escapeHtml(option.label) + '</span>' +\n              '<span class=\"bg-designer-storefront-modal__filter-option-count\">' + option.count + '</span>' +\n            '</label>';\n        }).join('');\n        var toggleButton = options.length > 8\n          ? '<button type=\"button\" class=\"bg-designer-storefront-modal__show-more\" data-bg-designer-template-show-more=\"' + escapeHtml(field) + '\">' + (showAll ? '\u2212 LESS' : '+ MORE') + '</button>'\n          : '';\n        return '' +\n          '<div class=\"bg-designer-storefront-modal__filter-group\">' +\n            '<button type=\"button\" class=\"bg-designer-storefront-modal__filter-title\" data-bg-designer-template-toggle-group=\"' + escapeHtml(field) + '\">' +\n              '<span>' + escapeHtml(getTemplateFieldLabel(field)) + '</span>' +\n              '<span class=\"bg-designer-storefront-modal__filter-title-meta\">' + (selectedValues.length ? (selectedValues.length + ' selected') : '') + '<span>' + (isCollapsed ? '+' : '\u2212') + '</span></span>' +\n            '</button>' +\n            '<div class=\"bg-designer-storefront-modal__filter-options' + (isCollapsed ? ' is-collapsed' : '') + '\">' +\n              optionsHtml +\n              toggleButton +\n            '</div>' +\n          '</div>';\n      }).join('');\n    }\n\n    if (chips) {\n      var chipRows = [];\n      activeFields.forEach(function (entry) {\n        (state.selectedFilters[entry.field] || []).forEach(function (value) {\n          chipRows.push(\n            '<span class=\"bg-designer-storefront-modal__chip\">' +\n              '<span class=\"bg-designer-storefront-modal__chip-label\">' + escapeHtml(getTemplateFieldLabel(entry.field)) + ':</span>' +\n              '<span>' + escapeHtml(value) + '</span>' +\n              '<button type=\"button\" class=\"bg-designer-storefront-modal__chip-btn\" data-bg-designer-template-remove-filter=\"' + escapeHtml(entry.field) + '\" data-bg-designer-template-remove-value=\"' + escapeHtml(value) + '\">&times;</button>' +\n            '</span>'\n          );\n        });\n      });\n      chips.innerHTML = chipRows.join('');\n    }\n\n    if (results) {\n      var resultsCount = filteredTemplates.length + (startBlankTemplate ? 1 : 0);\n      results.textContent = resultsCount\n        ? (resultsCount + ' template' + (resultsCount === 1 ? '' : 's'))\n        : 'No templates match your filters yet.';\n    }\n\n    var totalTemplates = filteredTemplates.length + (startBlankTemplate ? 1 : 0);\n    var batchSize = getTemplateModalBatchSize(state);\n    if (!Number.isFinite(Number(state.visibleLimit)) || Number(state.visibleLimit) < 1) {\n      state.visibleLimit = batchSize;\n    }\n    if (totalTemplates) {\n      state.visibleLimit = Math.max(Math.min(batchSize, totalTemplates), Math.min(Number(state.visibleLimit), totalTemplates));\n    }\n    var templateVisibleLimit = Math.max(0, Number(state.visibleLimit) - (startBlankTemplate ? 1 : 0));\n    var pageTemplates = filteredTemplates.slice(0, templateVisibleLimit);\n    var visibleTemplates = startBlankTemplate ? [startBlankTemplate].concat(pageTemplates) : pageTemplates;\n    if (count) {\n      count.textContent = totalTemplates\n        ? ('Showing ' + visibleTemplates.length + ' of ' + totalTemplates + ' template' + (totalTemplates === 1 ? '' : 's'))\n        : '0 templates';\n    }\n    if (prev) prev.hidden = true;\n    if (next) next.hidden = true;\n\n    if (grid) {\n      var statusHtml = visibleTemplates.length\n        ? '<div class=\"bg-designer-storefront-modal__scroll-status\" data-bg-designer-template-scroll-status aria-live=\"polite\">' +\n            (visibleTemplates.length < totalTemplates\n              ? ('Showing ' + visibleTemplates.length + ' of ' + totalTemplates + ' templates. Scroll for more.')\n              : ('Showing all ' + totalTemplates + ' template' + (totalTemplates === 1 ? '.' : 's.'))) +\n          '</div>'\n        : '';\n      var hasSizeConfiguration = configurations.length > 0;\n      var templateTilesHtml = '';\n      visibleTemplates.forEach(function (template) {\n          var configuration = getTemplateModalConfiguration(store, template);\n          var selectionKey = getTemplateSelectionKey(template);\n          var preferredBackerId = text(store.modalBackerSelections[selectionKey] || template.defaultBackerId);\n          var previewUrls = getTemplatePreviewUrls(template, preferredBackerId);\n          var previewUrl = previewUrls.front;\n          var backPreviewUrl = firstSafePreviewUrl([previewUrls.back]);\n          var hasGuidedBackPreview = isGuidedTemplateModal && !!backPreviewUrl && backPreviewUrl !== previewUrl;\n          var previewLabel = Array.isArray(template.backers) && template.backers.length\n            ? 'Preview backers'\n            : ((Array.isArray(template.previews) && template.previews.length > 1) ? 'Preview front/back' : 'Preview');\n          var isBlankStart = isStartBlankTemplate(template);\n          if (isBlankStart) hasGuidedBackPreview = false;\n          var blankSizeLabel = isBlankStart ? getStartBlankTemplateSizeLabel(template) : '';\n          var accessNote = isBlankStart\n            ? (blankSizeLabel ? ('Starts with a blank ' + blankSizeLabel + ' design.') : 'Starts with the blank template for the selected product size.')\n            : getTemplateAccessNote(template);\n          var tileLabel = isBlankStart ? 'Start from Blank' : template.title;\n          var guidedCardTag = isGuidedTemplateModal ? 'button' : 'article';\n          var guidedContentTag = isGuidedTemplateModal ? 'span' : 'div';\n          var guidedTextTag = isGuidedTemplateModal ? 'span' : 'div';\n          var guidedCardAriaLabel = isBlankStart\n            ? 'Launch Design Editor with Start from Blank'\n            : ('Preview ' + tileLabel);\n          var isActiveTemplate = text(store.templateModalActiveId) === selectionKey;\n          var guidedCardAttributes = isGuidedTemplateModal\n            ? ' type=\"button\" aria-label=\"' + escapeHtml(guidedCardAriaLabel) + '\"' +\n              ' aria-pressed=\"' + (isActiveTemplate ? 'true' : 'false') + '\"' +\n              (!isBlankStart && shouldForceTemplatePreviewOverlay(store, template) ? ' aria-haspopup=\"dialog\"' : '')\n            : ' tabindex=\"0\"';\n          var primaryPreviewMarkup = isGuidedTemplateModal && isBlankStart\n            ? buildGuidedStartBlankVisualMarkup()\n            : (previewUrl ? '<img class=\"bg-designer-storefront-modal__tile-preview bg-designer-storefront-modal__tile-preview--front\" src=\"' + escapeHtml(previewUrl) + '\" alt=\"' + escapeHtml(tileLabel) + '\" loading=\"lazy\" decoding=\"async\">' : '');\n          templateTilesHtml += '' +\n            '<' + guidedCardTag + ' class=\"bg-designer-storefront-modal__tile' + (isBlankStart ? ' bg-designer-storefront-modal__tile--start-blank' : '') + (hasGuidedBackPreview ? ' has-back-preview' : '') + (isActiveTemplate ? ' is-selected' : '') + '\" data-bg-designer-template-card=\"' + escapeHtml(selectionKey) + '\" data-bg-designer-template-configuration=\"' + (configuration.matchesCurrent ? 'current' : 'alternative') + '\"' + guidedCardAttributes + '>' +\n              '<' + guidedContentTag + ' class=\"bg-designer-storefront-modal__tile-image\">' +\n                primaryPreviewMarkup +\n                (hasGuidedBackPreview ? '<img class=\"bg-designer-storefront-modal__tile-preview bg-designer-storefront-modal__tile-preview--back\" alt=\"\" aria-hidden=\"true\" loading=\"lazy\" decoding=\"async\" data-bg-designer-template-back-preview data-bg-designer-template-back-preview-src=\"' + escapeHtml(backPreviewUrl) + '\">' : '') +\n                (isActiveTemplate ? '<span class=\"bg-designer-storefront-modal__selected-indicator\" aria-hidden=\"true\">\u2713 Selected</span>' : '') +\n                (!isGuidedTemplateModal && previewUrl ? '<button type=\"button\" class=\"bg-designer-storefront-modal__zoom-button\" aria-label=\"' + escapeHtml(previewLabel) + '\" data-bg-designer-template-preview=\"' + escapeHtml(selectionKey) + '\">&#128269;</button>' : '') +\n              '</' + guidedContentTag + '>' +\n              '<' + guidedContentTag + ' class=\"bg-designer-storefront-modal__tile-copy\">' +\n                (!configuration.matchesCurrent && configuration.label ? '<' + guidedTextTag + ' class=\"bg-designer-storefront-modal__tile-configuration\">Changes product to ' + escapeHtml(configuration.label) + '</' + guidedTextTag + '>' : '') +\n                '<' + guidedTextTag + ' class=\"bg-designer-storefront-modal__tile-label\">' + escapeHtml(tileLabel) + '</' + guidedTextTag + '>' +\n                (accessNote ? '<' + guidedTextTag + ' class=\"bg-designer-storefront-modal__tile-note\">' + escapeHtml(accessNote) + '</' + guidedTextTag + '>' : '') +\n              '</' + guidedContentTag + '>' +\n            '</' + guidedCardTag + '>';\n        });\n      var otherConfigurations = configurations.filter(function (configuration) {\n        return !activeConfiguration || configuration.targetKey !== activeConfiguration.targetKey;\n      });\n      var otherConfigurationsHtml = otherConfigurations.length\n        ? '<div class=\"bg-designer-storefront-modal__other-configurations\" data-bg-designer-template-other-configurations>' +\n            '<div class=\"bg-designer-storefront-modal__other-configurations-label\">Other templates available</div>' +\n            '<div class=\"bg-designer-storefront-modal__other-configuration-buttons\">' +\n              otherConfigurations.map(function (configuration) {\n                var buttonLabel = configuration.primaryLabel + (configuration.secondaryLabel ? (' \u2014 ' + configuration.secondaryLabel) : '');\n                return '<button type=\"button\" class=\"bg-designer-storefront-modal__other-configuration\" aria-label=\"View templates for ' + escapeHtml(buttonLabel) + '\" data-bg-designer-template-other-configuration=\"' + escapeHtml(configuration.targetKey) + '\">' +\n                  '<span class=\"bg-designer-storefront-modal__configuration-primary\">' + escapeHtml(configuration.primaryLabel) + '</span>' +\n                  (configuration.secondaryLabel ? '<span class=\"bg-designer-storefront-modal__configuration-secondary\">' + escapeHtml(configuration.secondaryLabel) + '</span>' : '') +\n                '</button>';\n              }).join('') +\n            '</div>' +\n          '</div>'\n        : '';\n      grid.innerHTML = visibleTemplates.length\n        ? templateTilesHtml + statusHtml + otherConfigurationsHtml\n        : (hasSizeConfiguration\n          ? '<div class=\"bg-designer-storefront-modal__template-section-empty\">No templates match this size and option combination.</div>' + otherConfigurationsHtml\n          : '<div class=\"bg-designer-storefront__template-empty\">No templates match your filters yet.</div>');\n    }\n\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-configuration-tab]')).forEach(function (button) {\n      button.onclick = function () {\n        var targetKey = text(button.getAttribute('data-bg-designer-template-configuration-tab'));\n        if (!targetKey || targetKey === text(state.activeConfigurationKey)) return;\n        state.activeConfigurationKey = targetKey;\n        state.selectedFilters = {};\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n      };\n      button.onkeydown = function (event) {\n        var tabs = Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-configuration-tab]'));\n        var currentIndex = tabs.indexOf(button);\n        var nextIndex = currentIndex;\n        if (event.key === 'ArrowRight' || event.key === 'ArrowDown') nextIndex = (currentIndex + 1) % tabs.length;\n        else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n        else if (event.key === 'Home') nextIndex = 0;\n        else if (event.key === 'End') nextIndex = tabs.length - 1;\n        else return;\n        event.preventDefault();\n        var nextTargetKey = text(tabs[nextIndex] && tabs[nextIndex].getAttribute('data-bg-designer-template-configuration-tab'));\n        if (!nextTargetKey) return;\n        state.activeConfigurationKey = nextTargetKey;\n        state.selectedFilters = {};\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n        window.requestAnimationFrame(function () {\n          var selectedTab = modal.querySelector('[data-bg-designer-template-configuration-tab][aria-selected=\"true\"]');\n          if (selectedTab && typeof selectedTab.focus === 'function') selectedTab.focus();\n        });\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-other-configuration]')).forEach(function (button) {\n      button.onclick = function () {\n        var targetKey = text(button.getAttribute('data-bg-designer-template-other-configuration'));\n        if (!targetKey || targetKey === text(state.activeConfigurationKey)) return;\n        state.activeConfigurationKey = targetKey;\n        state.selectedFilters = {};\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n        window.requestAnimationFrame(function () {\n          var selectedTab = modal.querySelector('[data-bg-designer-template-configuration-tab][aria-selected=\"true\"]');\n          if (selectedTab && typeof selectedTab.focus === 'function') selectedTab.focus();\n        });\n      };\n    });\n\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-filter-field]')).forEach(function (input) {\n      input.onchange = function () {\n        var field = text(input.getAttribute('data-bg-designer-template-filter-field'));\n        if (!field) return;\n        var nextValues = (state.selectedFilters[field] || []).slice();\n        var value = text(input.value);\n        var key = normalizeSearchValue(value);\n        nextValues = nextValues.filter(function (entry) {\n          return normalizeSearchValue(entry) !== key;\n        });\n        if (input.checked) nextValues.push(value);\n        state.selectedFilters[field] = nextValues;\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-toggle-group]')).forEach(function (button) {\n      button.onclick = function () {\n        var field = text(button.getAttribute('data-bg-designer-template-toggle-group'));\n        state.collapsedByField[field] = !state.collapsedByField[field];\n        renderTemplateModal(store);\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-show-more]')).forEach(function (button) {\n      button.onclick = function () {\n        var field = text(button.getAttribute('data-bg-designer-template-show-more'));\n        state.showAllValuesByField[field] = !state.showAllValuesByField[field];\n        renderTemplateModal(store);\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-remove-filter]')).forEach(function (button) {\n      button.onclick = function () {\n        var field = text(button.getAttribute('data-bg-designer-template-remove-filter'));\n        var value = text(button.getAttribute('data-bg-designer-template-remove-value'));\n        state.selectedFilters[field] = (state.selectedFilters[field] || []).filter(function (entry) {\n          return normalizeSearchValue(entry) !== normalizeSearchValue(value);\n        });\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-preview]')).forEach(function (button) {\n      button.onclick = function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        rememberTemplateModalViewport(store, modal);\n        var selectionKey = text(button.getAttribute('data-bg-designer-template-preview'));\n        var template = getTemplateBySelectionKey(store, selectionKey);\n        if (!template) return;\n        if (shouldForceTemplatePreviewOverlay(store, template)) {\n          renderTemplatePreviewModal(store, template);\n          return;\n        }\n        core.openPreviewLightbox(resolveTemplatePreview(template), template.title);\n      };\n    });\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-template-card]')).forEach(function (card) {\n      if (isGuidedTemplateModal) {\n        bindGuidedTemplateCardHoverPreview(card);\n      }\n      card.onpointerdown = function () {\n        store.templateModalReturningUntil = 0;\n      };\n      card.onclick = function (event) {\n        if (event.target && event.target.closest && event.target.closest('[data-bg-designer-template-preview]')) return;\n        rememberTemplateModalViewport(store, modal);\n        var selectionKey = text(card.getAttribute('data-bg-designer-template-card'));\n        store.templateModalReturnFocusKey = selectionKey;\n        var template = getTemplateBySelectionKey(store, selectionKey);\n        if (template && typeof store.mobileArtworkTemplateReturn === 'function') {\n          var returnToArtwork = store.mobileArtworkTemplateReturn;\n          store.mobileArtworkTemplateReturn = null;\n          returnToArtwork(selectionKey);\n          return;\n        }\n        if (template && isGuidedTemplateModal && isStartBlankTemplate(template)) {\n          void chooseTemplateEntry(store, template, text(store.modalBackerSelections[selectionKey]), { finishMode: 'designonline' });\n          return;\n        }\n        if (template && shouldForceTemplatePreviewOverlay(store, template)) {\n          renderTemplatePreviewModal(store, template);\n          return;\n        }\n        void chooseTemplateEntry(store, template, text(store.modalBackerSelections[selectionKey]));\n      };\n      if (card.tagName !== 'BUTTON') {\n        card.onkeydown = function (event) {\n          if (event.key !== 'Enter' && event.key !== ' ') return;\n          event.preventDefault();\n          card.click();\n        };\n      }\n    });\n  }\n\n  function positionTemplateBrowserForPhone(modal) {\n    modal.style.removeProperty('--bg-template-header-clearance');\n    if (!window.matchMedia || !window.matchMedia('(max-width: 749px)').matches) return;\n    var bottom = 0;\n    Array.prototype.slice.call(document.querySelectorAll('#shopify-section-header, .section-header, sticky-header')).forEach(function (header) {\n      var box = header.getBoundingClientRect();\n      if (box.height > 0 && box.top < window.innerHeight && box.bottom > 0) bottom = Math.max(bottom, box.bottom);\n    });\n    modal.style.setProperty('--bg-template-header-clearance', Math.min(bottom, window.innerHeight / 3) + 'px');\n  }\n\n  function openTemplateModal(store, mode) {\n    var modal = document.querySelector('[data-bg-designer-template-modal]');\n    if (!modal) return;\n    store.templateModalPreviousFocus = document.activeElement;\n    var state = getTemplateModalState(store);\n    store.templateModalMode = text(mode).toLowerCase();\n    store.templatePreviewState = null;\n    if (isOptionTemplateModalMode(store)) {\n      var selectedOptionTemplate = getSelectedOptionTemplateEntry(store);\n      store.templateModalActiveId = selectedOptionTemplate ? getTemplateSelectionKey(selectedOptionTemplate) : '';\n      state.selectedFilters = {};\n      state.showAllValuesByField = {};\n      state.collapsedByField = {};\n      state.filtersOpen = false;\n    }\n    hideGlobalSwatchPreview();\n    positionTemplateBrowserForPhone(modal);\n    modal.hidden = false;\n    modal.classList.toggle('bg-designer-storefront-modal--guided-workbench', getProductFormPresentation(store) === 'guided');\n    modal.classList.add('is-open');\n    document.body.classList.add('bg-designer-template-modal--open');\n\n    var search = modal.querySelector('[data-bg-designer-template-search]');\n    var searchSuggestions = modal.querySelector('[data-bg-designer-template-search-suggestions]');\n    var searchClear = modal.querySelector('[data-bg-designer-template-search-clear]');\n    var sort = modal.querySelector('[data-bg-designer-template-sort]');\n    var prev = modal.querySelector('[data-bg-designer-template-prev]');\n    var next = modal.querySelector('[data-bg-designer-template-next]');\n    var clearAll = modal.querySelector('[data-bg-designer-template-clear-all]');\n    var filtersOpen = modal.querySelector('[data-bg-designer-template-filters-open]');\n    var filtersClose = modal.querySelector('[data-bg-designer-template-filters-close]');\n    var filtersOverlay = modal.querySelector('[data-bg-designer-template-filters-overlay]');\n    var showResults = modal.querySelector('[data-bg-designer-template-show-results]');\n    if (modal.dataset.bgDesignerKeyboardBound !== '1') {\n      modal.dataset.bgDesignerKeyboardBound = '1';\n      modal.addEventListener('keydown', function (event) {\n        if (modal.hidden) return;\n        if (event.key === 'Escape') {\n          var visibleSuggestions = modal.querySelector('[data-bg-designer-template-search-suggestions]:not([hidden])');\n          if (event.target === search && visibleSuggestions) {\n            event.preventDefault();\n            event.stopPropagation();\n            hideTemplateSearchSuggestions(modal, store);\n            return;\n          }\n          event.preventDefault();\n          event.stopPropagation();\n          closeTemplateModal(store);\n          return;\n        }\n        if (event.key !== 'Tab') return;\n        var focusable = Array.prototype.slice.call(modal.querySelectorAll(\n          'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n        )).filter(function (node) { return !node.hidden && node.getAttribute('aria-hidden') !== 'true'; });\n        if (!focusable.length) return;\n        var first = focusable[0];\n        var last = focusable[focusable.length - 1];\n        if (event.shiftKey && document.activeElement === first) {\n          event.preventDefault();\n          last.focus();\n        } else if (!event.shiftKey && document.activeElement === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      });\n    }\n    state.activeConfigurationKey = '';\n    resetTemplateModalResults(state, modal);\n\n    if (search && search.dataset.bgDesignerTemplateSearchBound !== '1') {\n      search.dataset.bgDesignerTemplateSearchBound = '1';\n      var debouncedSuggestionUpdate = debounce(function () {\n        updateTemplateSearchSuggestions(modal, store);\n      }, 250);\n      search.addEventListener('input', function () {\n        state.query = String(search.value || '');\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n        debouncedSuggestionUpdate();\n      });\n      search.addEventListener('keydown', function (event) {\n        var suggestionList = Array.isArray(store.templateSearchSuggestions) ? store.templateSearchSuggestions : [];\n        var hasSuggestions = !!(searchSuggestions && !searchSuggestions.hidden && suggestionList.length);\n        if (!hasSuggestions) {\n          if (event.key === 'Enter') {\n            event.preventDefault();\n            state.query = text(search.value);\n            resetTemplateModalResults(state, modal);\n            renderTemplateModal(store);\n            hideTemplateSearchSuggestions(modal, store);\n          } else if (event.key === 'Escape') {\n            hideTemplateSearchSuggestions(modal, store);\n          }\n          return;\n        }\n        if (event.key === 'ArrowDown') {\n          event.preventDefault();\n          var nextIndex = store.templateSearchActiveIndex + 1;\n          if (nextIndex >= suggestionList.length) nextIndex = 0;\n          setActiveTemplateSearchSuggestion(modal, store, nextIndex);\n          return;\n        }\n        if (event.key === 'ArrowUp') {\n          event.preventDefault();\n          var prevIndex = store.templateSearchActiveIndex - 1;\n          if (prevIndex < 0) prevIndex = suggestionList.length - 1;\n          setActiveTemplateSearchSuggestion(modal, store, prevIndex);\n          return;\n        }\n        if (event.key === 'Enter') {\n          event.preventDefault();\n          if (store.templateSearchActiveIndex >= 0 && suggestionList[store.templateSearchActiveIndex]) {\n            applyTemplateSearchSuggestion(modal, store, suggestionList[store.templateSearchActiveIndex]);\n          } else {\n            state.query = text(search.value);\n            resetTemplateModalResults(state, modal);\n            renderTemplateModal(store);\n            hideTemplateSearchSuggestions(modal, store);\n          }\n          return;\n        }\n        if (event.key === 'Escape') {\n          hideTemplateSearchSuggestions(modal, store);\n        }\n      });\n      search.addEventListener('blur', function () {\n        window.setTimeout(function () {\n          hideTemplateSearchSuggestions(modal, store);\n        }, 120);\n      });\n      search.addEventListener('search', function () {\n        state.query = text(search.value);\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n        hideTemplateSearchSuggestions(modal, store);\n      });\n    }\n    if (searchClear && searchClear.dataset.bgDesignerTemplateClearBound !== '1') {\n      searchClear.dataset.bgDesignerTemplateClearBound = '1';\n      searchClear.addEventListener('click', function () {\n        state.query = '';\n        resetTemplateModalResults(state, modal);\n        if (search) search.value = '';\n        renderTemplateModal(store);\n        hideTemplateSearchSuggestions(modal, store);\n        if (search) search.focus();\n      });\n    }\n    if (sort && sort.dataset.bgDesignerTemplateSortBound !== '1') {\n      sort.dataset.bgDesignerTemplateSortBound = '1';\n      sort.addEventListener('change', function () {\n        state.sortMode = text(sort.value) || DEFAULT_TEMPLATE_MODAL_SORT_MODE;\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n      });\n    }\n    if (clearAll && clearAll.dataset.bgDesignerTemplateClearAllBound !== '1') {\n      clearAll.dataset.bgDesignerTemplateClearAllBound = '1';\n      clearAll.addEventListener('click', function () {\n        TEMPLATE_FILTER_FIELDS.forEach(function (entry) {\n          state.selectedFilters[entry.field] = [];\n          state.showAllValuesByField[entry.field] = false;\n        });\n        resetTemplateModalResults(state, modal);\n        renderTemplateModal(store);\n      });\n    }\n    if (filtersOpen && filtersOpen.dataset.bgDesignerTemplateFiltersOpenBound !== '1') {\n      filtersOpen.dataset.bgDesignerTemplateFiltersOpenBound = '1';\n      filtersOpen.addEventListener('click', function () {\n        state.filtersOpen = true;\n        renderTemplateModal(store);\n      });\n    }\n    if (filtersClose && filtersClose.dataset.bgDesignerTemplateFiltersCloseBound !== '1') {\n      filtersClose.dataset.bgDesignerTemplateFiltersCloseBound = '1';\n      filtersClose.addEventListener('click', function () {\n        state.filtersOpen = false;\n        renderTemplateModal(store);\n      });\n    }\n    if (filtersOverlay && filtersOverlay.dataset.bgDesignerTemplateFiltersOverlayBound !== '1') {\n      filtersOverlay.dataset.bgDesignerTemplateFiltersOverlayBound = '1';\n      filtersOverlay.addEventListener('click', function () {\n        state.filtersOpen = false;\n        renderTemplateModal(store);\n      });\n    }\n    if (showResults && showResults.dataset.bgDesignerTemplateShowResultsBound !== '1') {\n      showResults.dataset.bgDesignerTemplateShowResultsBound = '1';\n      showResults.addEventListener('click', function () {\n        state.filtersOpen = false;\n        renderTemplateModal(store);\n      });\n    }\n\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-modal-close]')).forEach(function (button) {\n      if (button.dataset.bgDesignerModalBound === '1') return;\n      button.dataset.bgDesignerModalBound = '1';\n      button.addEventListener('click', function () {\n        closeTemplateModal(store);\n      });\n    });\n\n    var refreshPromise = refreshTemplateModalDataIfNeeded(store);\n    if (refreshPromise && typeof refreshPromise.then === 'function') {\n      refreshPromise.then(function () {\n        if (!modal.hidden && modal.classList.contains('is-open')) {\n          resetTemplateModalResults(state, modal);\n          renderTemplateModal(store);\n        }\n      });\n    }\n    renderTemplateModal(store);\n    window.requestAnimationFrame(function () {\n      if (modal.hidden || !modal.classList.contains('is-open')) return;\n      // BUG-05: the union selector used to resolve to the backdrop div (it\n      // also carries data-bg-designer-modal-close), which is not focusable,\n      // so keyboard focus never left the launcher. Focus the dialog panel\n      // itself (tabindex=\"-1\"), falling back to its first focusable control \u2014\n      // the same pattern the template preview overlay uses.\n      var target = modal.querySelector('.bg-designer-storefront-modal__dialog[tabindex], .bg-designer-storefront-modal__panel[tabindex], [role=\"dialog\"][tabindex]')\n        || getTemplatePreviewFocusableElements(modal)[0]\n        || null;\n      if (target && typeof target.focus === 'function') {\n        try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n      }\n    });\n  }\n\n  function restoreTemplateModalFocus(store, previousFocus) {\n    if (!store || !store.root) return;\n    var target = store.selectedDesignCompatibilityConflict\n      ? store.root.querySelector('[data-bg-contextual-recovery=\"pick-another\"]')\n      : null;\n    var isVisibleFocusTarget = function (candidate) {\n      // The stashed opener can degrade to <body> when the pre-open render\n      // rebuilt the artwork block and detached the clicked control; body is\n      // not a real focus home, so fall through to the artwork targets.\n      return !!(\n        candidate\n        && candidate !== document.body\n        && candidate !== document.documentElement\n        && candidate.isConnected\n        && !(candidate.closest && candidate.closest('[hidden], [inert], [aria-hidden=\"true\"]'))\n      );\n    };\n    var findVisibleFocusTarget = function (selector) {\n      return Array.prototype.slice.call(store.root.querySelectorAll(selector)).find(isVisibleFocusTarget) || null;\n    };\n    if (!isVisibleFocusTarget(target)) target = null;\n    if (!target && isVisibleFocusTarget(previousFocus)) target = previousFocus;\n    if (!target) {\n      target = findVisibleFocusTarget('[data-bg-contextual-change], [data-bg-artwork-action=\"browse-templates\"]');\n    }\n    if (!isVisibleFocusTarget(target)) {\n      target = findVisibleFocusTarget(\n        '[data-bg-artwork-action=\"review-template\"], [data-bg-artwork-action=\"change-template\"], '\n        + '[data-bg-artwork-action=\"template-customize-online\"], [data-bg-artwork-action=\"use-template\"], '\n        + '[data-bg-artwork-action], button, a[href], [tabindex]:not([tabindex=\"-1\"])'\n      );\n    }\n    if (!isVisibleFocusTarget(target)) {\n      target = store.root;\n      if (!target.hasAttribute('tabindex')) target.setAttribute('tabindex', '-1');\n    }\n    if (isVisibleFocusTarget(target) && typeof target.focus === 'function') {\n      // Never scroll the page when handing focus back after a template pick;\n      // the fallback targets sit at the top of the hero and a bare focus()\n      // yanked the viewport away from the artwork choices.\n      try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n    }\n  }\n\n  function closeTemplateModal(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var modal = document.querySelector('[data-bg-designer-template-modal]');\n    if (!modal) return;\n    hideGlobalSwatchPreview();\n    hideTemplateSearchSuggestions(modal, store);\n    store.mobileArtworkTemplateReturn = null;\n    if (store.mobileArtworkTemplateClose) store.mobileArtworkTemplateClose();\n    store.mobileArtworkTemplateClose = null;\n    modal.hidden = true;\n    modal.classList.remove('is-open');\n    if (store && store.templateModalState) {\n      store.templateModalState.filtersOpen = false;\n    }\n    document.body.classList.remove('bg-designer-template-modal--open');\n    if (store && !settings.skipRender) render(store);\n    if (store && settings.skipFocus !== true) {\n      var previousFocus = store.templateModalPreviousFocus;\n      window.requestAnimationFrame(function () {\n        restoreTemplateModalFocus(store, previousFocus);\n      });\n    }\n  }\n\n  function clearProjectState(store) {\n    var previousProjectId = text(store && store.state && store.state.project && store.state.project.projectId);\n    var template = store && store.state && store.state.template ? store.state.template : null;\n    // A dropped project can no longer be a reorder reference. An RE2\n    // reference attach is not project-bound and survives exactly like the\n    // armed fallback does (re-entering the chooser shows it still armed).\n    var reorderContext = store.state.reorderContext;\n    if (!(reorderContext && typeof reorderContext === 'object' && text(reorderContext.source) === 'reference')) {\n      store.state.reorderContext = null;\n    }\n    store.state.project = {\n      projectId: '',\n      designId: '',\n      designNumber: '',\n      title: '',\n      updatedAt: '',\n      previewUrl: '',\n      previews: [],\n      numPages: 0,\n      refreshToken: ''\n    };\n    store.suppressProjectRestoreOnce = true;\n    store.pitchPrintReuseMode = '';\n    store.pitchPrintReuseProjectKey = '';\n    if (isPitchPrintLaunchProvider(store)) {\n      clearPitchPrintSessionPointer(store, previousProjectId);\n      clearPitchPrintProjectRuntime(store, {\n        designId: text(template && template.designId),\n        designNumber: text(template && template.designNumber),\n        backer: text(template && template.backer)\n      });\n    }\n    clearCompletionState(store);\n  }\n\n  // Plain-language dialog copy for a template that needs different product\n  // options (BUG-04): no arrow notation, no technical phrasing.\n  function buildTemplateConfigurationConfirmationCopy(store, configuration) {\n    var changes = Array.isArray(configuration && configuration.changes) ? configuration.changes : [];\n    var title = changes.length === 1\n      ? 'This design uses a different ' + (text(changes[0].holderLabel) || 'option').toLowerCase() + '.'\n      : 'This design uses a different setup.';\n    var body = changes.map(function (change) {\n      return (text(change.holderLabel) || 'Option') + ': ' + text(change.to);\n    });\n    body.push('We will update your product to match. Pricing and options may change.');\n    var note = '';\n    var dependentHolder = (store && Array.isArray(store.holders) ? store.holders : []).find(function (holder) {\n      return /(?:frame|stand)/i.test(text(holder && holder.displayName));\n    });\n    if (dependentHolder) {\n      note = 'Your ' + (text(dependentHolder.displayName) || 'frame or stand') + ' selection may also change to stay compatible.';\n    }\n    return {\n      title: title,\n      body: body,\n      note: note,\n      confirmLabel: 'Update and continue',\n      cancelLabel: 'Keep my current setup'\n    };\n  }\n\n  function templateConfigurationAppliedSuccessfully(store, configuration) {\n    return configuration.changes.every(function (change) {\n      var selected = getSelectedOptionFromAllOptions(store, change.holder);\n      if (text(selected && selected.hvId) !== text(change.option && change.option.hvId)) return false;\n      return getVisibleOptions(store, change.holder).some(function (option) {\n        return text(option && option.hvId) === text(change.option && change.option.hvId)\n          && !isOptionDisabledByRules(store, option)\n          && !(option && option.outOfStock);\n      });\n    });\n  }\n\n  // Resolves true when the template's configuration is compatible/applied.\n  // Async because the configuration change now asks through the shared\n  // in-page confirmation dialog (BUG-04).\n  function applyTemplateModalConfiguration(store, template, token) {\n    var configuration = getTemplateModalConfiguration(store, template);\n    if (!configuration.mappable) return Promise.resolve(false);\n    var selections = Object.assign({}, store.state.selections);\n    (configuration.changes || []).forEach(function (change) { selections[getHolderId(change.holder)] = text(change.option && change.option.hvId); });\n    var confirm = configuration.matchesCurrent || !configuration.changes.length ? Promise.resolve(true)\n      : openStorefrontConfirmDialog(buildTemplateConfigurationConfirmationCopy(store, configuration));\n    return confirm.then(function (accepted) {\n      if (!accepted || !isArtworkOperationFresh(store, token)) return false;\n      var draft = artworkConfigurationDraft(store, { selections: selections, template: template });\n      if (!templateConfigurationAppliedSuccessfully(draft, configuration)) return false;\n      return draft.state.selections;\n    });\n  }\n\n  function chooseTemplateEntry(store, template, backerId, options) {\n    var source = template && typeof template === 'object' ? template : null;\n    if (!source) return Promise.resolve(false);\n    var token = options && options.operation || captureArtworkOperation(store);\n    if (!isArtworkOperationFresh(store, token)) return Promise.resolve(false);\n    if (Number(store && store.templateModalReturningUntil) > Date.now()) return Promise.resolve(false);\n    if (source.optionTemplate) {\n      return Promise.resolve(chooseOptionTemplateEntry(store, source));\n    }\n    var requestedFinishMode = text(options && options.finishMode).toLowerCase();\n    var preserveUnresolvedFinish = !!(options && options.preserveUnresolvedFinish === true);\n    var previousFinishMode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    var entryAvailability = getOfferedTemplateAvailability(store, source);\n    var intendedFinishMode = requestedFinishMode === 'guidedfill'\n      ? 'designonline'\n      : (requestedFinishMode === 'designonline' || requestedFinishMode === 'editservice'\n        ? requestedFinishMode\n        : text(store && store.templateModalMode).toLowerCase());\n    if (intendedFinishMode !== 'designonline' && intendedFinishMode !== 'editservice') intendedFinishMode = '';\n    // The selected template and product-level Admin toggles jointly own the\n    // available finish modes. Reject a stale/forged modal request before any\n    // configuration or template state mutates.\n    if (intendedFinishMode && !entryAvailability[intendedFinishMode]) return Promise.resolve(false);\n    if (!entryAvailability.designonline && !entryAvailability.editservice) return Promise.resolve(false);\n    if (!preserveUnresolvedFinish && !intendedFinishMode && !entryAvailability.designonline && entryAvailability.editservice) {\n      intendedFinishMode = 'editservice';\n    }\n    var disclaimerPromise = intendedFinishMode === 'editservice'\n      && entryAvailability.editservice\n      && !(options && options.aiDisclaimerConfirmed === true)\n      ? confirmAiGeneratedEditServiceTemplate(source)\n      : Promise.resolve(true);\n    return disclaimerPromise.then(function (disclaimerAccepted) {\n      if (!isArtworkOperationFresh(store, token) || !disclaimerAccepted) return false;\n      return applyTemplateModalConfiguration(store, source, token).then(function (configurationApplied) {\n        if (!configurationApplied) return false;\n        return finishChooseTemplateEntry(configurationApplied);\n      });\n    });\n\n    function finishChooseTemplateEntry(selections) {\n    if (!isArtworkOperationFresh(store, token)) return false;\n    var finishMode = requestedFinishMode;\n    var guidedFillFinish = finishMode === 'guidedfill';\n    if (guidedFillFinish) finishMode = 'designonline';\n    if (finishMode !== 'designonline' && finishMode !== 'editservice') finishMode = '';\n    var nextTemplate = enrichTemplateWithLookupMap(deepClone(source, {}), store.templateLookupMap);\n    if (text(backerId)) {\n      nextTemplate.backer = text(backerId);\n      var matchedBacker = nextTemplate.backers.find(function (entry) {\n        return text(entry.id) === nextTemplate.backer;\n      });\n      nextTemplate.backerLabel = matchedBacker ? text(matchedBacker.label) : '';\n    } else {\n      nextTemplate.backer = text(nextTemplate.defaultBackerId || nextTemplate.backer);\n      var defaultBacker = nextTemplate.backers.find(function (entry) {\n        return text(entry.id) === nextTemplate.backer;\n      });\n      nextTemplate.backerLabel = defaultBacker ? text(defaultBacker.label) : '';\n    }\n    store.templateModalActiveId = getTemplateSelectionKey(nextTemplate);\n    var templateModalPreviousFocus = store.templateModalPreviousFocus;\n    closeTemplateModal(store, { skipRender: true, skipFocus: true });\n    var selectedTemplateAvailability = entryAvailability;\n    var nextMode = '';\n    if (!preserveUnresolvedFinish && !selectedTemplateAvailability.designonline && selectedTemplateAvailability.editservice) nextMode = 'editservice';\n    else if (finishMode && selectedTemplateAvailability[finishMode]) nextMode = finishMode;\n    else if (preserveUnresolvedFinish) nextMode = !(options && options.mobileArtwork) && selectedTemplateAvailability[previousFinishMode] ? previousFinishMode : '';\n    else if (selectedTemplateAvailability[store.templateModalMode]) nextMode = store.templateModalMode;\n    else if (selectedTemplateAvailability[previousFinishMode]) nextMode = previousFinishMode;\n    // Read the armed guided template before the new one publishes: its slot\n    // uploads belong to the old document.\n    var previousGuidedLookup = isGuidedFillArmed(store)\n      ? getTemplateGuidedFillLookup(store.state.template)\n      : '';\n    var committed = commitArtworkConfiguration(store, { selections: selections, template: nextTemplate, artworkMode: nextMode }, { source: 'customer', token: token });\n    if (committed.status !== 'applied') { setMessage(store, committed.reason, 'error'); return false; }\n    setArtworkIntent(store, 'need-design', 'use-template');\n\n    if (store.selectedDesignCompatibilityConflict) {\n      store.selectedDesignCompatibilityConflict = null;\n      emitStorefrontEvent(store, 'selected_design_compatibility_resolved', 'artwork', {\n        recoveryAction: 'replacement_design'\n      }, 'high');\n    }\n    if (isGuidedFillArmed(store)) {\n      var nextGuidedLookup = getTemplateGuidedFillLookup(nextTemplate);\n      if (previousGuidedLookup && nextGuidedLookup !== previousGuidedLookup) {\n        // Template switched while the guided form is armed: slot uploads are\n        // keyed by the OLD document's object ids. The stable\n        // guidedFillProjectId is kept so the server UPDATES the same design\n        // instead of orphaning drafts.\n        clearGuidedFillUploads(store);\n        store.guidedSlotFillRequestKey = '';\n        if (text(store.state.guidedFillProjectId)\n          && text(store.state.project && store.state.project.projectId) === text(store.state.guidedFillProjectId)) {\n          clearProjectState(store);\n          clearCompletionState(store);\n        }\n      }\n      if (!guidedFillFinish && !isGuidedFillAvailableFor(store, selectedTemplateAvailability, nextTemplate)) {\n        disarmGuidedFill(store);\n      }\n    }\n    if (guidedFillFinish && selectedTemplateAvailability.designonline) {\n      store.state.guidedFillArmed = true;\n      store.guidedSlotFillRequestKey = '';\n      ensureGuidedFillSlotStateLoadedFor(store, nextTemplate);\n    }\n    if (store.state.artworkMode && !applyArtworkMethodOption(store, store.state.artworkMode)) {\n      setArtworkChoice(store, 'need-design', 'use-template', '');\n      render(store);\n      return false;\n    }\n    if (store.state.artworkMode) setArtworkChoice(store, 'need-design', 'use-template', store.state.artworkMode);\n    if (text(store.state.artworkMode) !== 'designonline') {\n      clearProjectState(store);\n    } else if (!store.editingLineKey) {\n      clearProjectState(store);\n    }\n    render(store);\n    if (!(options && options.mobileArtwork)) {\n      restoreTemplateModalFocus(store, templateModalPreviousFocus);\n      scheduleMobileArtworkCardsDetailScroll(store);\n    }\n    if (!guidedFillFinish\n      && (store.templateModalMode === 'designonline' || finishMode === 'designonline')\n      && text(store.state.artworkMode) === 'designonline') {\n      void launchDesigner(store, { authPrompt: 'customize-online' });\n    }\n    return true;\n    }\n  }\n\n  function chooseTemplate(store, designId, backerId) {\n    var template = findTemplateSelection(store, designId, '', backerId);\n    if (!template) return;\n    void chooseTemplateEntry(store, template, backerId);\n  }\n\n  function resolveEditorLaunchMode(store) {\n    if (text(store && store.state && store.state.project && store.state.project.projectId)) return '';\n    if (store && store.state && store.state.template) return '';\n    var artworkMode = text(store && store.state && store.state.artworkMode).toLowerCase();\n    if (artworkMode === 'uploadfiles' || artworkMode === 'uploadcanva') return 'upload';\n    return 'blank';\n  }\n\n  function buildProductPageExperimentEditorContext(store) {\n    var presentation = getProductFormPresentation(store);\n    if (!isPrototypeProductFormPresentation(presentation)) return null;\n    var price = shownPrice(getPricePresentation(store));\n    var total = numberValue(price && price.total, NaN);\n    if (!Number.isFinite(total) || total <= 0) return null;\n    var quantity = Math.max(1, Math.round(numberValue(price && price.quantity, numberValue(store && store.state && store.state.quantity, 1))));\n    var summaryParts = [quantity.toLocaleString()];\n    (Array.isArray(store && store.holders) ? store.holders : []).forEach(function (holder) {\n      if (summaryParts.length >= 6 || isHolderUnavailableByRules(store, holder)) return;\n      if (isArtworkMethodHolder(store, holder) || isOptionTemplateHolder(store, holder)) return;\n      var selected = getSelectedOption(store, holder);\n      var selectedLabel = getSelectedOptionDisplayValue(selected);\n      if (selectedLabel) summaryParts.push(selectedLabel);\n    });\n    return {\n      version: 1,\n      presentation: presentation,\n      formattedPrice: formatShownMoney(total),\n      summaryParts: summaryParts\n    };\n  }\n\n  // BD-STUDIO-SAVE-IDENTITY: the launch binding is what Studio saves as the\n  // design's storefront binding. Next to the card's lookup it carries the\n  // card's design id and number, each only when the card has one, so the\n  // design still reopens on its card after the card's lookup retires. A\n  // launch with no card adds nothing.\n  function withTemplateCardIdentity(binding, template) {\n    var designId = text(template && template.designId);\n    var designNumber = text(template && template.designNumber);\n    if (designId) binding.designId = designId;\n    if (designNumber) binding.designNumber = designNumber;\n    return binding;\n  }\n\n  function buildEditorContext(store) {\n    var sizePayload = buildSelectedSizePayload(store);\n    var optionSelections = buildCurrentOptionSelections(store);\n    var editorSelectionSync = buildEditorSelectionSyncPayload(store);\n    var launchMode = resolveEditorLaunchMode(store);\n    return {\n      source: 'product',\n      productHandle: store.config.handle,\n      productId: store.config.productId,\n      launchMode: launchMode,\n      // Direct-to-cart never applies to a cart-line edit session: the submit\n      // corridor re-injects _bg_update_line_key, so the \"add\" is an update and\n      // the landed-line poll would never resolve.\n      directToCart: isProductCommerceDirectToCart(store) && !text(store.editingLineKey),\n      productPageExperimentContext: buildProductPageExperimentEditorContext(store),\n      // STUDIO-SALE-SENTENCE (OD-122): every Studio price is before discounts,\n      // so the Studio says SALE_PENDING_NOTE exactly when this page says it.\n      // A verified sale owner (OD-113; nothing sets it today) gets neither:\n      // the page shows the exact sale price there, so the OD-113 slice must\n      // give the Studio that exact sale price too.\n      salePending: getSalePendingNote(store) !== '',\n      // SALE-DISPLAY-STRIKETHROUGH: where this page shows the tier sale, the\n      // Studio shows its prices crossed out with the price after that sale.\n      salePercent: getTierSalePercentage(store),\n      styleConversion: buildStyleConversionLaunchContext(store),\n      projectId: text(store.state.project && store.state.project.projectId),\n      projectRefreshToken: text(store.state.project && store.state.project.refreshToken),\n      designId: text(\n        store.state.project && store.state.project.designId\n        || store.state.template && store.state.template.designId\n      ),\n      designNumber: text(\n        store.state.project && store.state.project.designNumber\n        || store.state.template && store.state.template.designNumber\n      ),\n      templateLookup: text(store.state.template && (store.state.template.templateLookup || store.state.template.templatePublicId)),\n      templateTitle: text(store.state.template && store.state.template.title),\n      backer: text(store.state.template && store.state.template.backer),\n      template: store.state.template ? {\n        designId: store.state.template.designId,\n        designNumber: store.state.template.designNumber,\n        templateLookup: store.state.template.templateLookup,\n        templatePublicId: store.state.template.templatePublicId,\n        title: store.state.template.title,\n        backer: store.state.template.backer\n      } : null,\n      optionSelections: optionSelections,\n      size: sizePayload,\n      // S4 flow-back (ADR-021): the guided quantity and the configuration\n      // session from the last editor visit ride every launch. S6: when page\n      // state carries no id (a cross-product relaunch navigation), fall back\n      // to the editor's same-tab session handoff \u2014 the server adopt gate\n      // refuses mismatched bindings, so a stale carry safely mints fresh.\n      quantity: resolveDesignerLaunchQuantity(store),\n      configurationSessionId: text(store.state.designerConfigurationSessionId)\n        || text((readDesignerConfigurationSessionHandoff() || {}).id),\n      selectedSidesId: text(editorSelectionSync.selectedSidesId),\n      selectedSidesLabel: text(editorSelectionSync.selectedSidesLabel),\n      selectedSidesTargetingId: text(editorSelectionSync.selectedSidesTargetingId),\n      sidesPolicy: editorSelectionSync.sidesPolicy || null,\n      selectedPrintingId: text(editorSelectionSync.selectedPrintingId),\n      selectedPrintingLabel: text(editorSelectionSync.selectedPrintingLabel),\n      selectedPrintingTargetingId: text(editorSelectionSync.selectedPrintingTargetingId),\n      selectedOrientation: sizePayload.selectedOrientation,\n      storefrontBinding: withTemplateCardIdentity({\n        productId: store.config.productId,\n        productHandle: store.config.handle,\n        launchMode: launchMode,\n        templateLookup: text(store.state.template && (store.state.template.templateLookup || store.state.template.templatePublicId)),\n        templateTitle: text(store.state.template && store.state.template.title),\n        selection: {\n          selectedSizeId: text(sizePayload.selectedSizeId),\n          selectedSizeLabel: text(sizePayload.selectedSizeLabel),\n          selectedWidth: Number.isFinite(Number(sizePayload.selectedWidth)) ? Number(sizePayload.selectedWidth) : null,\n          selectedHeight: Number.isFinite(Number(sizePayload.selectedHeight)) ? Number(sizePayload.selectedHeight) : null,\n          selectedUnit: text(sizePayload.selectedUnit),\n          selectedOrientation: text(sizePayload.selectedOrientation),\n          size: text(sizePayload.selectedSizeLabel),\n          unfoldedSize: '',\n          selectedSidesId: text(editorSelectionSync.selectedSidesId),\n          selectedSidesLabel: text(editorSelectionSync.selectedSidesLabel),\n          selectedSidesTargetingId: text(editorSelectionSync.selectedSidesTargetingId),\n          sidesPolicy: editorSelectionSync.sidesPolicy || null,\n          selectedPrintingId: text(editorSelectionSync.selectedPrintingId),\n          selectedPrintingLabel: text(editorSelectionSync.selectedPrintingLabel),\n          selectedPrintingTargetingId: text(editorSelectionSync.selectedPrintingTargetingId),\n          backer: text(store.state.template && store.state.template.backer),\n          printQuantity: resolveDesignerLaunchQuantity(store),\n          channelOffer: core.normalizeChannelOfferOrigin(store.state.channelOffer) || undefined,\n          optionSelections: optionSelections\n        }\n      }, store.state.template)\n    };\n  }\n\n  function readProjectPreviewList(project) {\n    var source = project && typeof project === 'object' ? project : {};\n    var previews = [];\n    var primary = text(source.previewUrl);\n    if (primary) previews.push(primary);\n    if (Array.isArray(source.previews)) {\n      source.previews.map(text).filter(Boolean).forEach(function (entry) {\n        previews.push(entry);\n      });\n    }\n    return core.uniqueStrings(previews);\n  }\n\n  function buildPitchPrintProjectKey(projectId, designId) {\n    var cleanProjectId = text(projectId);\n    var cleanDesignId = text(designId);\n    if (!cleanProjectId && !cleanDesignId) return '';\n    return cleanProjectId + '::' + cleanDesignId;\n  }\n\n  function getPitchPrintRestoreSuppressionKey(store) {\n    var handle = text(\n      store && store.config && store.config.handle\n      || window.location && window.location.pathname\n    );\n    return 'bg_pitchprint_clear_suppressed_v1:' + (handle || 'default');\n  }\n\n  function setPitchPrintRestoreSuppressed(store, suppressed) {\n    var key = getPitchPrintRestoreSuppressionKey(store);\n    if (!key) return false;\n    try {\n      if (!suppressed) {\n        window.sessionStorage.removeItem(key);\n        return false;\n      }\n      window.sessionStorage.setItem(key, JSON.stringify({\n        handle: text(store && store.config && store.config.handle),\n        ts: Date.now()\n      }));\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function isPitchPrintRestoreSuppressed(store) {\n    var key = getPitchPrintRestoreSuppressionKey(store);\n    if (!key) return false;\n    try {\n      return !!text(window.sessionStorage.getItem(key));\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function hasExplicitPitchPrintRestoreRequest() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      return hasTemplateUrlHandoffParams(params) || hasExplicitPitchPrintProjectRestoreParams(params);\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function clearPitchPrintRestoreSessionKeys() {\n    ['bg_designer_bootstrap_v1', 'pp_pitch_auth_resume_v1', 'pp_pitch_auth_opened_v1'].forEach(function (key) {\n      try { window.sessionStorage.removeItem(key); } catch (_) {}\n    });\n  }\n\n  function setPitchPrintReuseState(store, mode, projectId, designId) {\n    if (!store) return '';\n    store.pitchPrintReuseMode = text(mode);\n    store.pitchPrintReuseProjectKey = buildPitchPrintProjectKey(projectId, designId);\n    return store.pitchPrintReuseProjectKey;\n  }\n\n  function readPitchPrintClientVar(client, key) {\n    var prop = text(key);\n    if (!client || !prop) return '';\n    return text(\n      client._vars && client._vars[prop]\n      || client.vars && client.vars[prop]\n    );\n  }\n\n  function hasLivePitchPrintClientFrame(client) {\n    var frame = client && client._ui && client._ui.frame;\n    var frameSrc = text(frame && ((typeof frame.getAttribute === 'function' && frame.getAttribute('src')) || frame.src));\n    if (!frame || !frame.isConnected) return false;\n    if (!frameSrc || frameSrc.indexOf('pitchprint.io') === -1) return false;\n    return true;\n  }\n\n  function canReuseLivePitchPrintClient(store) {\n    if (!store) return false;\n    if (text(store.pitchPrintReuseMode) !== 'live') return false;\n    var client = window.ppclient;\n    if (!client || typeof client.fire !== 'function') return false;\n    if (!hasLivePitchPrintClientFrame(client)) return false;\n    var project = store.state && store.state.project ? store.state.project : {};\n    var savedProjectId = text(project.projectId);\n    var savedDesignId = text(project.designId || store.state.template && store.state.template.designId);\n    var currentProjectId = readPitchPrintClientVar(client, 'projectId');\n    var currentDesignId = readPitchPrintClientVar(client, 'designId');\n    if (!savedProjectId || currentProjectId !== savedProjectId) return false;\n    if (savedDesignId && currentDesignId && currentDesignId !== savedDesignId) return false;\n    return buildPitchPrintProjectKey(savedProjectId, savedDesignId) === text(store.pitchPrintReuseProjectKey);\n  }\n\n  function syncPitchPrintProjectInputs(projectId, designNumber) {\n    var cleanProjectId = text(projectId);\n    var cleanDesignNumber = text(designNumber);\n    try {\n      if (window.BGDesignerBridge && typeof window.BGDesignerBridge.syncPitchPrintInputs === 'function') {\n        window.BGDesignerBridge.syncPitchPrintInputs({\n          projectId: cleanProjectId,\n          designNumber: cleanDesignNumber\n        });\n      }\n    } catch (_) {}\n    try {\n      if (typeof window.syncPitchPrintInputs === 'function') {\n        window.syncPitchPrintInputs({\n          projectId: cleanProjectId,\n          designNumber: cleanDesignNumber\n        });\n      }\n    } catch (_) {}\n    [\n      document.getElementById('_pitchprint'),\n      document.querySelector('input[name=\"properties[_pitchprint]\"]'),\n      document.querySelector('._pitchprint input')\n    ].forEach(function (input) {\n      if (!input || input.tagName !== 'INPUT') return;\n      input.value = cleanProjectId;\n      try { input.dispatchEvent(new Event('input', { bubbles: true })); } catch (_) {}\n      try { input.dispatchEvent(new Event('change', { bubbles: true })); } catch (_) {}\n    });\n    [\n      document.querySelector('input[name=\"properties[Design #]\"]'),\n      document.querySelector('._pitchprintdesignnumber input')\n    ].forEach(function (input) {\n      if (!input || input.tagName !== 'INPUT') return;\n      input.value = cleanDesignNumber;\n      try { input.dispatchEvent(new Event('input', { bubbles: true })); } catch (_) {}\n      try { input.dispatchEvent(new Event('change', { bubbles: true })); } catch (_) {}\n    });\n    return true;\n  }\n\n  function schedulePitchPrintProjectInputSync(projectId, designNumber, attempts) {\n    var remaining = Number(attempts || 0);\n    syncPitchPrintProjectInputs(projectId, designNumber);\n    if (remaining <= 0) return true;\n    window.setTimeout(function () {\n      schedulePitchPrintProjectInputSync(projectId, designNumber, remaining - 1);\n    }, 180);\n    return true;\n  }\n\n  function stripPitchPrintRestoreUrlParams(options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (!/^\\/products\\//i.test(text(window.location && window.location.pathname))) return '';\n    var nextUrl = '';\n    try {\n      var url = new URL(window.location.href);\n      var keys = [\n        'projectId',\n        'designonline',\n        'designnum',\n        'designNumber',\n        'id',\n        'backer',\n        'pp_resume',\n        'pp_resume_ticket',\n        HYBRID_PITCHPRINT_AUTH_RESUME_PARAM\n      ];\n      if (!settings.preserveExplicitRestore) {\n        keys = keys.concat([\n          'bg_saved_project_id',\n          'bg_saved_source',\n          'bg_saved_return',\n          'bg_cart_line_key',\n          'bg_project_id',\n          'bg_design_id',\n          'bg_cart_action'\n        ]);\n      }\n      keys.forEach(function (key) {\n        url.searchParams.delete(key);\n      });\n      nextUrl = url.toString();\n      window.history.replaceState({}, document.title, nextUrl);\n    } catch (_) {}\n    return nextUrl;\n  }\n\n  function clearPitchPrintClientResumeProject(store) {\n    var template = store && store.state && store.state.template ? store.state.template : null;\n    var designId = text(template && template.designId || window.ppDesignID || window.designIDFromTemplatePage);\n    var designNumber = text(template && template.designNumber || window.ppDesignNumber || window.designNumberFromTemplatePage);\n    [window.ppclient].forEach(function (client) {\n      if (!client || typeof client !== 'object') return;\n      try {\n        if (client._vars && typeof client._vars === 'object') {\n          client._vars.mode = 'new';\n          client._vars.projectId = '';\n          if (designId) client._vars.designId = designId;\n          if (designNumber) client._vars.designNumber = designNumber;\n        }\n        if (client.vars && typeof client.vars === 'object') {\n          client.vars.mode = 'new';\n          client.vars.projectId = '';\n          if (designId) client.vars.designId = designId;\n          if (designNumber) client.vars.designNumber = designNumber;\n        }\n        client._launchContext = null;\n        client._launchContextPromise = null;\n      } catch (_) {}\n    });\n    try { window.triggerDesignIDFlag = false; } catch (_) {}\n    try { window.designLoadedByIDNotSaved = false; } catch (_) {}\n    try { window.loadDesignByIDFlag = false; } catch (_) {}\n    try { window.templateModalCustomizeClicked = false; } catch (_) {}\n    try { window.pitchProjectSaved = false; } catch (_) {}\n    return true;\n  }\n\n  function resetPitchPrintProjectForTemplateLaunch(store) {\n    if (!store || !store.state || !store.state.template) return false;\n    var previousProjectId = text(store.state.project && store.state.project.projectId);\n    store.state.project = {\n      projectId: '',\n      designId: text(store.state.template.designId),\n      designNumber: text(store.state.template.designNumber),\n      previewUrl: '',\n      previews: [],\n      numPages: 0,\n      provider: 'pitchprint',\n      refreshToken: ''\n    };\n    store.suppressProjectRestoreOnce = true;\n    store.pitchPrintReuseMode = '';\n    store.pitchPrintReuseProjectKey = '';\n    if (isPitchPrintLaunchProvider(store)) {\n      clearPitchPrintSessionPointer(store, previousProjectId);\n      clearPitchPrintRestoreSessionKeys();\n      clearPitchPrintClientResumeProject(store);\n      syncPitchPrintProjectInputs('', text(store.state.template.designNumber));\n    }\n    clearCompletionState(store);\n    syncFormState(store);\n    return true;\n  }\n\n  function enforcePitchPrintRestoreSuppression(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    if (!isPitchPrintRestoreSuppressed(store)) return false;\n    if (hasExplicitPitchPrintRestoreRequest()) {\n      setPitchPrintRestoreSuppressed(store, false);\n      return false;\n    }\n    try { window.BG_DESIGNER_RETURN_CONTEXT = null; } catch (_) {}\n    try { window.__PP_AUTH_RESUME_CONTEXT = null; } catch (_) {}\n    try {\n      var bootstrap = window.BG_DESIGNER_BOOTSTRAP && typeof window.BG_DESIGNER_BOOTSTRAP === 'object'\n        ? window.BG_DESIGNER_BOOTSTRAP\n        : null;\n      if (bootstrap && text(bootstrap.projectId)) {\n        window.BG_DESIGNER_BOOTSTRAP = null;\n      }\n    } catch (_) {}\n    clearPitchPrintRestoreSessionKeys();\n    syncPitchPrintProjectInputs('', '');\n    stripPitchPrintRestoreUrlParams({ preserveExplicitRestore: true });\n    clearPitchPrintClientResumeProject(store);\n    if (settings.scheduleRetry !== false && store.__bgPitchPrintRestoreCleanupScheduled !== true) {\n      store.__bgPitchPrintRestoreCleanupScheduled = true;\n      [0, 120, 360].forEach(function (delay) {\n        window.setTimeout(function () {\n          if (!store) return;\n          if (text(store.state && store.state.artworkMode).toLowerCase() === 'designonline'\n            && !text(store.state && store.state.project && store.state.project.projectId)) {\n            return;\n          }\n          enforcePitchPrintRestoreSuppression(store, { scheduleRetry: false });\n        }, delay);\n      });\n      window.setTimeout(function () {\n        if (store) store.__bgPitchPrintRestoreCleanupScheduled = false;\n      }, 420);\n    }\n    return true;\n  }\n\n  function clearPitchPrintRestoreStateFallback() {\n    try { window.BG_DESIGNER_BOOTSTRAP = null; } catch (_) {}\n    try { window.BG_DESIGNER_RETURN_CONTEXT = null; } catch (_) {}\n    try { window.__PP_AUTH_RESUME_CONTEXT = null; } catch (_) {}\n    clearPitchPrintRestoreSessionKeys();\n    schedulePitchPrintProjectInputSync('', '', 12);\n    stripPitchPrintRestoreUrlParams();\n    return true;\n  }\n\n  function clearPitchPrintProjectRuntime(store, options) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    var settings = options && typeof options === 'object' ? options : {};\n    var designId = text(settings.designId);\n    var designNumber = text(settings.designNumber);\n    var backer = text(settings.backer);\n\n    try {\n      if (window.BGDesignerBridge && typeof window.BGDesignerBridge.clearPitchPrintRestoreState === 'function') {\n        window.BGDesignerBridge.clearPitchPrintRestoreState({\n          clearBootstrap: true,\n          clearReturnContext: true,\n          clearAuthResume: true,\n          clearInputs: true,\n          stripUrlParams: true\n        });\n      }\n    } catch (_) {}\n    setPitchPrintRestoreSuppressed(store, true);\n    clearPitchPrintRestoreStateFallback();\n    enforcePitchPrintRestoreSuppression(store);\n\n    try { window.BG_DESIGNER_RETURN_CONTEXT = null; } catch (_) {}\n    try { window.designIDFromTemplatePage = designId; } catch (_) {}\n    try { window.ppDesignID = designId; } catch (_) {}\n    try { window.designNumberFromTemplatePage = designNumber; } catch (_) {}\n    try { window.ppDesignNumber = designNumber; } catch (_) {}\n    try { window.selectedTemplateBackerFromPicker = backer; } catch (_) {}\n    try { window.designSelectedBacker = normalizePitchPrintLegacyBacker(backer); } catch (_) {}\n    try { window.triggerDesignIDFlag = false; } catch (_) {}\n    try { window.designLoadedByIDNotSaved = false; } catch (_) {}\n    try { window.loadDesignByIDFlag = false; } catch (_) {}\n    try { window.templateModalCustomizeClicked = false; } catch (_) {}\n    try { window.pitchProjectSaved = false; } catch (_) {}\n\n    try {\n      if (window.BGDesignerBridge && typeof window.BGDesignerBridge.syncPitchPrintInputs === 'function') {\n        window.BGDesignerBridge.syncPitchPrintInputs({\n          projectId: '',\n          designNumber: ''\n        });\n      }\n    } catch (_) {}\n\n    var seenClients = [];\n    [window.ppclient].forEach(function (client) {\n      if (!client || typeof client !== 'object') return;\n      if (seenClients.indexOf(client) !== -1) return;\n      seenClients.push(client);\n      try {\n        if (client._vars && typeof client._vars === 'object') {\n          client._vars.mode = 'new';\n          client._vars.projectId = '';\n          client._vars.designId = designId;\n          client._vars.designNumber = designNumber;\n        }\n        if (client.vars && typeof client.vars === 'object') {\n          client.vars.mode = 'new';\n          client.vars.projectId = '';\n          client.vars.designId = designId;\n          client.vars.designNumber = designNumber;\n        }\n        client._launchContext = null;\n        client._launchContextPromise = null;\n      } catch (_) {}\n    });\n    return true;\n  }\n\n  function buildPitchPrintPreviewFallbackUrl(projectId, pageNumber) {\n    var cleanProjectId = text(projectId);\n    var targetPage = Number(pageNumber || 1);\n    if (!cleanProjectId) return '';\n    if (!Number.isFinite(targetPage) || targetPage < 1) targetPage = 1;\n    return 'https://s3-eu-west-1.amazonaws.com/pitchprint.io/previews/' + encodeURIComponent(cleanProjectId) + '_' + String(targetPage) + '.jpg';\n  }\n\n  function normalizePitchPrintPreviewPayload(projectId, payload) {\n    var detail = payload && typeof payload === 'object'\n      ? (payload.data && typeof payload.data === 'object' ? payload.data : payload)\n      : {};\n    return {\n      projectId: text(detail.projectId || detail.publicId || detail.selfHostedProjectId || detail.id || projectId),\n      designId: text(detail.designId || detail.designID || detail.pitchPrintDesignId),\n      designNumber: text(detail.designNumber || detail.designnum || detail.designNum),\n      previewUrl: text(detail.previewUrl || detail.preview),\n      previews: Array.isArray(detail.previews) ? detail.previews.map(text).filter(Boolean) : [],\n      numPages: Number(detail.numPages || detail.pages || detail.pageCount || detail.pageLength || 0) || 0\n    };\n  }\n\n  function seedPitchPrintClientProjectState(projectId, designId) {\n    var cleanProjectId = text(projectId);\n    var cleanDesignId = text(designId);\n    var client = window.ppclient;\n    if (!client) return false;\n    if (client._vars) {\n      client._vars.projectId = cleanProjectId || '';\n      client._vars.designId = cleanDesignId || text(client._vars.designId);\n    }\n    if (client.vars) {\n      client.vars.projectId = cleanProjectId || '';\n      client.vars.designId = cleanDesignId || text(client.vars.designId);\n    }\n    return !!(client._vars || client.vars);\n  }\n\n  function schedulePitchPrintClientProjectStateSync(store, attempts) {\n    var remaining = Number(attempts || 0);\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var projectId = text(project.projectId);\n    var designId = text(project.designId || store && store.state && store.state.template && store.state.template.designId);\n    if (!projectId && !designId) return;\n    if (seedPitchPrintClientProjectState(projectId, designId) || remaining <= 0) return;\n    window.setTimeout(function () {\n      schedulePitchPrintClientProjectStateSync(store, remaining - 1);\n    }, 160);\n  }\n\n  function syncPitchPrintReturnContext(store) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    var template = store.state && store.state.template ? store.state.template : null;\n    var project = store.state && store.state.project ? store.state.project : {};\n    var previews = readProjectPreviewList(project);\n    var previewUrl = text(project.previewUrl || previews[0]);\n    var projectId = text(project.projectId);\n    var designId = text(project.designId || template && template.designId);\n    var designNumber = text(project.designNumber || template && template.designNumber);\n    var backer = text(template && template.backer);\n    if (!projectId && !designId && !designNumber) return false;\n    window.BG_DESIGNER_RETURN_CONTEXT = {\n      projectId: projectId,\n      designId: designId,\n      designNumber: designNumber,\n      designOnline: true,\n      artworkMode: 'designonline',\n      backer: backer,\n      previewUrl: previewUrl,\n      previews: previews,\n      numPages: Number(project.numPages || previews.length || 0) || 0\n    };\n    return true;\n  }\n\n  function fetchPitchPrintProjectPreview(store, projectId) {\n    var cleanProjectId = text(projectId);\n    if (!store || !cleanProjectId) return Promise.resolve(null);\n    return Promise.resolve().then(function () {\n      if (window.BGDesignerBridge && typeof window.BGDesignerBridge.fetchProjectData === 'function') {\n        return window.BGDesignerBridge.fetchProjectData(cleanProjectId);\n      }\n      return null;\n    }).catch(function () {\n      return null;\n    }).then(function (payload) {\n      var currentProject = store.state && store.state.project ? store.state.project : {};\n      var template = store.state && store.state.template ? store.state.template : null;\n      var normalized = normalizePitchPrintPreviewPayload(cleanProjectId, payload);\n      var previews = getPitchPrintPreviewUrls(\n        cleanProjectId,\n        normalized.previewUrl || text(currentProject.previewUrl),\n        normalized.previews.length ? normalized.previews : readProjectPreviewList(currentProject)\n      );\n      return {\n        projectId: cleanProjectId,\n        designId: text(normalized.designId || currentProject.designId || template && template.designId),\n        designNumber: text(normalized.designNumber || currentProject.designNumber || template && template.designNumber),\n        previewUrl: text(previews[0]),\n        previews: previews,\n        numPages: Number(normalized.numPages || currentProject.numPages || previews.length || 0) || 0\n      };\n    });\n  }\n\n  var PROJECT_PREVIEW_CACHE_KEY = 'bg_designer_project_previews_v1';\n  var PROJECT_PREVIEW_CACHE_LIMIT = 20;\n\n  // Durable per-browser cache of saved-design preview URLs, written whenever\n  // a fresh preview is resolved. Preview URLs are revision-addressed\n  // capability URLs, so replaying them needs no session credential \u2014 this is\n  // what lets a returning visit (new tab, next day) show the customer's own\n  // design without a protected project read.\n  // The entry also carries `hasArtwork` (EDITOR-LANES-EMPTY-SAVE-01), the\n  // last document-derived artwork truth, so a cold return keeps the gate\n  // honest without a protected project read.\n  function readStoredProjectPreviewCacheEntry(projectId) {\n    var cleanProjectId = text(projectId);\n    var empty = { previews: [], hasArtwork: undefined };\n    if (!cleanProjectId) return empty;\n    try {\n      var parsed = JSON.parse(window.localStorage.getItem(PROJECT_PREVIEW_CACHE_KEY) || 'null');\n      var entry = parsed && parsed[cleanProjectId];\n      if (!entry || typeof entry !== 'object') return empty;\n      return {\n        previews: Array.isArray(entry.previews) ? entry.previews.map(text).filter(Boolean) : [],\n        hasArtwork: typeof entry.hasArtwork === 'boolean' ? entry.hasArtwork : undefined\n      };\n    } catch (_) {\n      return empty;\n    }\n  }\n\n  // A save or close may have changed the saved document. The durable cache\n  // must not replay the older truth on a cold return before a record read\n  // has re-derived it, so the entry forgets `hasArtwork` (previews stay).\n  function dropStoredProjectArtworkTruth(projectId) {\n    var cleanProjectId = text(projectId);\n    if (!cleanProjectId) return;\n    try {\n      var parsed = JSON.parse(window.localStorage.getItem(PROJECT_PREVIEW_CACHE_KEY) || 'null');\n      var entry = parsed && typeof parsed === 'object' ? parsed[cleanProjectId] : null;\n      if (!entry || typeof entry !== 'object' || !('hasArtwork' in entry)) return;\n      delete entry.hasArtwork;\n      window.localStorage.setItem(PROJECT_PREVIEW_CACHE_KEY, JSON.stringify(parsed));\n    } catch (_) {}\n  }\n\n  function writeStoredProjectPreviewCache(projectId, previews, hasArtwork) {\n    var cleanProjectId = text(projectId);\n    var cleanPreviews = (Array.isArray(previews) ? previews : []).map(text).filter(Boolean);\n    var knownArtwork = typeof hasArtwork === 'boolean';\n    if (!cleanProjectId || (!cleanPreviews.length && !knownArtwork)) return;\n    try {\n      var parsed = JSON.parse(window.localStorage.getItem(PROJECT_PREVIEW_CACHE_KEY) || 'null');\n      var cache = parsed && typeof parsed === 'object' ? parsed : {};\n      var existing = cache[cleanProjectId] && typeof cache[cleanProjectId] === 'object' ? cache[cleanProjectId] : {};\n      var nextPreviews = cleanPreviews.length\n        ? cleanPreviews.slice(0, 8)\n        : (Array.isArray(existing.previews) ? existing.previews.map(text).filter(Boolean) : []);\n      var nextEntry = { previews: nextPreviews, at: Date.now() };\n      if (knownArtwork) nextEntry.hasArtwork = hasArtwork;\n      else if (typeof existing.hasArtwork === 'boolean') nextEntry.hasArtwork = existing.hasArtwork;\n      cache[cleanProjectId] = nextEntry;\n      var keys = Object.keys(cache);\n      if (keys.length > PROJECT_PREVIEW_CACHE_LIMIT) {\n        keys.sort(function (a, b) {\n          return Number(cache[a] && cache[a].at || 0) - Number(cache[b] && cache[b].at || 0);\n        });\n        keys.slice(0, keys.length - PROJECT_PREVIEW_CACHE_LIMIT).forEach(function (staleKey) {\n          delete cache[staleKey];\n        });\n      }\n      window.localStorage.setItem(PROJECT_PREVIEW_CACHE_KEY, JSON.stringify(cache));\n    } catch (_) {}\n  }\n\n  // Save completes before its deferred board renders. A bounded freshness pass\n  // updates the existing card, and a late response cannot restore an old project.\n  function scheduleProductPreviewRefresh(store, projectId) {\n    if (isPitchPrintLaunchProvider(store) || !projectId) return;\n    var key = projectId + ':' + text(store.state.project.refreshToken);\n    if (store.previewRefreshKey !== key) {\n      if (store.previewRefreshTimer) window.clearTimeout(store.previewRefreshTimer);\n      store.previewRefreshTimer = null; store.previewRefreshKey = key; store.previewRefreshAttempts = 0;\n    }\n    if (store.previewRefreshTimer) return;\n    var projection = getIntentFirstProductPreviewProjection(store);\n    if (!projection || !hasMissingProductPreview3dArtwork(store, projection)) return;\n    if (store.previewRefreshAttempts >= 10) return;\n    var delay = Math.min(10000, 1000 * Math.pow(2, store.previewRefreshAttempts++));\n    store.previewRefreshTimer = window.setTimeout(function () {\n      store.previewRefreshTimer = null;\n      if (text(store.state.project.projectId) !== projectId || store.previewRefreshKey !== key) return;\n      void refreshProjectPreview(store, projectId).then(function () { render(store); }).catch(function () {});\n    }, delay);\n  }\n\n  function refreshProjectPreview(store, projectId, retried) {\n    var operation = captureArtworkOperation(store);\n    var previousPreviews = readProjectPreviewList(store && store.state && store.state.project);\n    var requestRefreshToken = text(store.state.project && store.state.project.refreshToken);\n    var readGeneration = store.previewRefreshReadGeneration = (store.previewRefreshReadGeneration || 0) + 1;\n    var readProjectId = text(projectId);\n    setSavedDesignReadState(store, readProjectId, 'loading');\n    var request = isPitchPrintLaunchProvider(store) ? fetchPitchPrintProjectPreview(store, projectId) : core.fetchProjectPreview(store.config, projectId);\n    var readAnswered = false;\n    return request.then(function (payload) {\n      if (!payload || store.previewRefreshReadGeneration !== readGeneration || text(store.state.project.projectId) !== text(projectId) || text(store.state.project.refreshToken) !== requestRefreshToken) return null;\n      // PHONE-GUEST-RETURN (STUDIO-0018): an answer outdated only by a page change (a Studio session adopting its size) is read once\n      // more. That read never lands during an add (in flight, or its press waiting on a confirm): its revision would outdate it.\n      if (!isArtworkOperationFresh(store, operation)) return retried ? null : refreshProjectPreview(store, projectId, true);\n      if (retried && (store.purchaseSubmissionInFlight || artworkOwners.get(store).operation)) return null;\n      var ownsEditor = store.artworkEditorOperation && isArtworkOperationFresh(store, store.artworkEditorOperation);\n      readAnswered = true;\n      var nextPreviews = readProjectPreviewList(payload);\n      if (!nextPreviews.length) nextPreviews = previousPreviews.slice();\n      store.state.project.projectId = readProjectId = text(payload.projectId || projectId);\n      store.state.project.designId = text(payload.designId || store.state.project.designId || (store.state.template && store.state.template.designId));\n      store.state.project.designNumber = text(payload.designNumber || store.state.project.designNumber || (store.state.template && store.state.template.designNumber));\n      store.state.project.title = text(payload.title || store.state.project.title);\n      store.state.project.updatedAt = text(payload.updatedAt || store.state.project.updatedAt);\n      store.state.project.documentOrientation = text(payload.documentOrientation);\n      store.state.project.boardPreviews = payload.boardPreviews;\n      store.state.project.revision = Number(payload.revision) || 0;\n      var artworkTruthChanged = typeof payload.hasArtwork === 'boolean' && store.state.project.hasArtwork !== payload.hasArtwork;\n      if (typeof payload.hasArtwork === 'boolean') store.state.project.hasArtwork = payload.hasArtwork;\n      store.state.project.previewUrl = text(nextPreviews[0]);\n      store.state.project.previews = nextPreviews;\n      writeStoredProjectPreviewCache(store.state.project.projectId, nextPreviews, store.state.project.hasArtwork);\n      store.state.project.numPages = Number(payload.numPages || payload.pages || payload.pageCount || payload.pageLength || store.state.project.numPages || nextPreviews.length || 0) || 0;\n      // Save events stamp the refresh token; a preview read must not re-stamp\n      // it, because every new token mints a fresh editor prewarm bootstrap\n      // (and server session) on the next render.\n      store.state.project.refreshToken = text(store.state.project.refreshToken) || String(Date.now());\n      // The serialized page state (cart line, commerce context) must carry\n      // the settled artwork truth, not the pre-read guess.\n      if (artworkTruthChanged) syncFormState(store);\n      if (ownsEditor) recordArtworkEditorOperation(store);\n      scheduleProductPreviewRefresh(store, projectId);\n      return payload;\n    }).finally(function () {\n      // STOREFRONT-SAVED-EMPTY: the newest read settles the readiness state,\n      // \"failed\" when it ended without an answer (no access, network). An\n      // older read superseded by a save leaves it alone.\n      if (store.previewRefreshReadGeneration !== readGeneration || text(store.state.project && store.state.project.projectId) !== readProjectId) return;\n      setSavedDesignReadState(store, readProjectId, readAnswered ? 'read' : 'failed');\n    });\n  }\n\n  function refreshPitchPrintProjectPreview(store, projectId) {\n    var cleanProjectId = text(projectId);\n    if (!store || !cleanProjectId) return Promise.resolve(null);\n    if (store.pitchPrintPreviewRefreshPromise && text(store.pitchPrintPreviewRefreshProjectId) === cleanProjectId) {\n      return store.pitchPrintPreviewRefreshPromise;\n    }\n    store.pitchPrintPreviewRefreshProjectId = cleanProjectId;\n    store.pitchPrintPreviewRefreshCounter = Number(store.pitchPrintPreviewRefreshCounter || 0) + 1;\n    var requestId = store.pitchPrintPreviewRefreshCounter;\n    var promise = refreshProjectPreview(store, cleanProjectId).then(function (payload) {\n      if (!payload) return null;\n      if (requestId !== Number(store.pitchPrintPreviewRefreshCounter || 0)) return payload;\n      if (text(store.state.project && store.state.project.projectId) !== cleanProjectId) return payload;\n      syncPitchPrintProjectInputs(\n        text(store.state.project && store.state.project.projectId),\n        text(store.state.project && store.state.project.designNumber)\n      );\n      syncPitchPrintReturnContext(store);\n      syncFormState(store);\n      render(store);\n      return payload;\n    }).catch(function () {\n      return null;\n    }).finally(function () {\n      if (store.pitchPrintPreviewRefreshPromise === promise) {\n        store.pitchPrintPreviewRefreshPromise = null;\n      }\n      if (text(store.pitchPrintPreviewRefreshProjectId) === cleanProjectId) {\n        store.pitchPrintPreviewRefreshProjectId = '';\n      }\n    });\n    store.pitchPrintPreviewRefreshPromise = promise;\n    return promise;\n  }\n\n  function ensurePitchPrintLaunchPreloader() {\n    var existing = document.querySelector('[data-bg-pitchprint-launch-preloader]');\n    if (existing) return existing;\n    var node = document.createElement('div');\n    node.className = 'bg-designer-storefront__pitchprint-preloader';\n    node.setAttribute('data-bg-pitchprint-launch-preloader', 'true');\n    node.setAttribute('aria-hidden', 'true');\n    node.hidden = true;\n    node.innerHTML = '' +\n      '<div class=\"bg-designer-storefront__pitchprint-preloader-backdrop\"></div>' +\n      '<div class=\"bg-designer-storefront__pitchprint-preloader-dialog\" role=\"status\" aria-live=\"polite\">' +\n        '<span class=\"bg-designer-storefront__pitchprint-preloader-spinner\" aria-hidden=\"true\"></span>' +\n        '<span class=\"bg-designer-storefront__pitchprint-preloader-copy\">Loading designer...</span>' +\n      '</div>';\n    document.body.appendChild(node);\n    return node;\n  }\n\n  function hidePitchPrintLaunchPreloader(store) {\n    if (store && store.pitchPrintLaunchPreloaderTimer) {\n      window.clearTimeout(store.pitchPrintLaunchPreloaderTimer);\n      store.pitchPrintLaunchPreloaderTimer = null;\n    }\n    try {\n      if (typeof window.bgHidePitchPrintLaunchSpinner === 'function') {\n        window.bgHidePitchPrintLaunchSpinner();\n      }\n    } catch (_) {}\n    var node = document.querySelector('[data-bg-pitchprint-launch-preloader]');\n    if (!node) return;\n    node.classList.remove('is-visible');\n    node.setAttribute('aria-hidden', 'true');\n    window.setTimeout(function () {\n      if (!node.classList.contains('is-visible')) node.hidden = true;\n    }, 180);\n  }\n\n  function showPitchPrintLaunchPreloader(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var node = ensurePitchPrintLaunchPreloader();\n    if (store && store.pitchPrintLaunchPreloaderTimer) {\n      window.clearTimeout(store.pitchPrintLaunchPreloaderTimer);\n    }\n    node.hidden = false;\n    node.setAttribute('aria-hidden', 'false');\n    window.requestAnimationFrame(function () {\n      node.classList.add('is-visible');\n    });\n    if (store) {\n      var autoHideMs = Number(settings.autoHideMs);\n      if (!Number.isFinite(autoHideMs) || autoHideMs < 1000) autoHideMs = 4500;\n      store.pitchPrintLaunchPreloaderTimer = window.setTimeout(function () {\n        hidePitchPrintLaunchPreloader(store);\n      }, autoHideMs);\n    }\n    try {\n      if (typeof window.bgShowPitchPrintLaunchSpinner === 'function') {\n        window.bgShowPitchPrintLaunchSpinner({ autoHideMs: Number(settings.autoHideMs) || 4500 });\n      }\n    } catch (_) {}\n  }\n\n  function isPitchPrintFrameVisible() {\n    var frames = Array.prototype.slice.call(document.querySelectorAll('iframe[src*=\"pitchprint.io\"]'));\n    return frames.some(function (frame) {\n      if (!frame || !frame.isConnected) return false;\n      var rect = frame.getBoundingClientRect();\n      var style = window.getComputedStyle(frame);\n      var opacity = parseFloat(style.opacity || '1');\n      if (!Number.isFinite(opacity)) opacity = 1;\n      return rect.width > 100 && rect.height > 100 && style.display !== 'none' && style.visibility !== 'hidden' && opacity > 0;\n    });\n  }\n\n  function schedulePitchPrintPreloaderFrameRelease(store) {\n    [450, 900, 1600, 2600, 3800].forEach(function (delay) {\n      window.setTimeout(function () {\n        if (isPitchPrintFrameVisible()) {\n          hidePitchPrintLaunchPreloader(store);\n          settlePitchPrintLaunchSuccess(store);\n        }\n      }, delay);\n    });\n  }\n\n  // BUG-03: a PitchPrint launch that never reaches a visible editor (blocked\n  // third-party storage/scripts, hung client boot) used to fail silently \u2014\n  // the preloader faded and nothing told the customer. Mirror the 12s\n  // product-config watchdog: when no editor frame is visible by the deadline\n  // (or the launch chain errors), surface an in-flow role=alert with a Try\n  // again action and keep the upload path reachable.\n  var PITCHPRINT_LAUNCH_WATCHDOG_MS = 12000;\n\n  function getPitchPrintLaunchFailureNotice(store) {\n    return store && store.root ? store.root.querySelector('[data-bg-pitchprint-launch-error]') : null;\n  }\n\n  function hidePitchPrintLaunchFailureNotice(store) {\n    var notice = getPitchPrintLaunchFailureNotice(store);\n    if (notice && notice.parentNode) notice.parentNode.removeChild(notice);\n  }\n\n  function showPitchPrintLaunchFailureNotice(store) {\n    if (!store || !store.root) return;\n    var existing = getPitchPrintLaunchFailureNotice(store);\n    if (existing) return;\n    var blocks = readBlocks(store);\n    var anchor = blocks.message || blocks.artwork;\n    if (!anchor || !anchor.parentNode) return;\n    var canUpload = !!getStoreArtworkAvailability(store).uploadfiles;\n    var notice = document.createElement('div');\n    notice.className = 'bg-designer-storefront__upload-recovery bg-designer-storefront__launch-recovery';\n    notice.setAttribute('role', 'alert');\n    notice.setAttribute('data-bg-pitchprint-launch-error', 'true');\n    notice.innerHTML = '' +\n      '<strong>We could not open the designer</strong>' +\n      '<p>' + escapeHtml(canUpload\n        ? 'Check your connection and try again, or upload your file instead.'\n        : 'Check your connection and try again.') + '</p>' +\n      '<div class=\"bg-designer-storefront__upload-recovery-actions\">' +\n        '<button type=\"button\" class=\"button button--secondary\" data-bg-pitchprint-launch-retry>Try again</button>' +\n        (canUpload ? '<button type=\"button\" class=\"bg-designer-storefront__text-action\" data-bg-pitchprint-launch-upload>Upload a file instead</button>' : '') +\n      '</div>';\n    anchor.parentNode.insertBefore(notice, anchor);\n    var uploadButton = notice.querySelector('[data-bg-pitchprint-launch-upload]');\n    if (uploadButton) {\n      // The notice lives outside the artwork block, so the artwork click\n      // delegation cannot reach it; route the action directly.\n      uploadButton.onclick = function (event) {\n        event.preventDefault();\n        store.pitchPrintLaunchFailureActive = false;\n        hidePitchPrintLaunchFailureNotice(store);\n        handleArtworkAction(store, readBlocks(store), 'upload-files', uploadButton);\n      };\n    }\n    var retryButton = notice.querySelector('[data-bg-pitchprint-launch-retry]');\n    if (retryButton) {\n      retryButton.onclick = function (event) {\n        event.preventDefault();\n        store.pitchPrintLaunchFailureActive = false;\n        hidePitchPrintLaunchFailureNotice(store);\n        var retryOptions = Object.assign({}, store.pitchPrintLaunchRetryOptions || {});\n        // The customer already answered the account question on the first\n        // attempt; retrying must relaunch, not reopen the auth modal.\n        retryOptions.skipHybridPitchPrintAuthPrompt = true;\n        void launchDesigner(store, retryOptions);\n      };\n      window.requestAnimationFrame(function () {\n        // The watchdog can fire while the shopper is already typing in\n        // another lane (an upload field, the personalization form); a\n        // role=alert announces itself, so only move focus when it will not\n        // interrupt active text entry.\n        var active = document.activeElement;\n        var typing = !!(active && (\n          /^(INPUT|TEXTAREA|SELECT)$/.test(active.tagName || '')\n          || active.isContentEditable\n        ));\n        if (typing) return;\n        if (typeof retryButton.focus === 'function') {\n          try { retryButton.focus({ preventScroll: true }); } catch (_) { retryButton.focus(); }\n        }\n      });\n    }\n  }\n\n  function disarmPitchPrintLaunchWatchdog(store) {\n    if (store && store.pitchPrintLaunchWatchdogTimer) {\n      window.clearTimeout(store.pitchPrintLaunchWatchdogTimer);\n      store.pitchPrintLaunchWatchdogTimer = null;\n    }\n  }\n\n  function settlePitchPrintLaunchSuccess(store) {\n    disarmPitchPrintLaunchWatchdog(store);\n    if (store) store.pitchPrintLaunchFailureActive = false;\n    hidePitchPrintLaunchFailureNotice(store);\n  }\n\n  function triggerPitchPrintLaunchFailure(store, reason, error) {\n    disarmPitchPrintLaunchWatchdog(store);\n    if (store) store.pitchPrintLaunchFailureActive = true;\n    hidePitchPrintLaunchPreloader(store);\n    emitStorefrontError(\n      store,\n      'pitchprint_launch_stalled',\n      'pitchprint_launch_stalled',\n      error || new Error('PitchPrint launch did not reach a visible editor within ' + PITCHPRINT_LAUNCH_WATCHDOG_MS + 'ms.'),\n      { reason: text(reason) || 'watchdog_timeout', watchdogMs: PITCHPRINT_LAUNCH_WATCHDOG_MS }\n    );\n    showPitchPrintLaunchFailureNotice(store);\n  }\n\n  function armPitchPrintLaunchWatchdog(store) {\n    if (!store) return 0;\n    disarmPitchPrintLaunchWatchdog(store);\n    store.pitchPrintLaunchFailureActive = false;\n    hidePitchPrintLaunchFailureNotice(store);\n    // Generation token: Try again while a slow first chain is still pending\n    // must not let that stale chain's late rejection disarm or alert over the\n    // newer launch. Only the newest generation may settle or fail.\n    store.pitchPrintLaunchGeneration = (store.pitchPrintLaunchGeneration || 0) + 1;\n    var generation = store.pitchPrintLaunchGeneration;\n    store.pitchPrintLaunchWatchdogTimer = window.setTimeout(function () {\n      store.pitchPrintLaunchWatchdogTimer = null;\n      if (store.pitchPrintLaunchGeneration !== generation) return;\n      if (isPitchPrintFrameVisible()) {\n        settlePitchPrintLaunchSuccess(store);\n        return;\n      }\n      triggerPitchPrintLaunchFailure(store, 'watchdog_timeout');\n    }, PITCHPRINT_LAUNCH_WATCHDOG_MS);\n    return generation;\n  }\n\n  function isHybridPitchPrintProduct(store) {\n    var config = store && store.config && typeof store.config === 'object' ? store.config : {};\n    var designer = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    return !!(\n      isPitchPrintLaunchProvider(store)\n      && (\n        designer.isHybridPitchPrint === true\n        || text(designer.isHybridPitchPrint).toLowerCase() === 'true'\n        || config.isHybridPitchPrint === true\n        || text(config.isHybridPitchPrint).toLowerCase() === 'true'\n      )\n    );\n  }\n\n  function hasHybridPitchPrintCustomerId(value) {\n    var clean = text(value);\n    return !!clean && clean.toLowerCase() !== 'guest' && clean !== '0';\n  }\n\n  function readHybridPitchPrintCustomerIdSignal() {\n    var customerData = window.customerData && typeof window.customerData === 'object'\n      ? window.customerData\n      : {};\n    var shopify = window.Shopify && typeof window.Shopify === 'object'\n      ? window.Shopify\n      : {};\n    var analyticsPage = window.ShopifyAnalytics\n      && window.ShopifyAnalytics.meta\n      && window.ShopifyAnalytics.meta.page\n      && typeof window.ShopifyAnalytics.meta.page === 'object'\n      ? window.ShopifyAnalytics.meta.page\n      : {};\n    return text(\n      customerData.id\n      || customerData.customerId\n      || customerData.customer_id\n      || shopify.customer_id\n      || shopify.customerId\n      || analyticsPage.customerId\n      || analyticsPage.customer_id\n    );\n  }\n\n  function hasHybridPitchPrintCustomerSessionSignal() {\n    if (hasHybridPitchPrintCustomerId(readHybridPitchPrintCustomerIdSignal())) return true;\n    var customerData = window.customerData && typeof window.customerData === 'object'\n      ? window.customerData\n      : {};\n    if (customerData.isLoggedIn === true || text(customerData.isLoggedIn).toLowerCase() === 'true') return true;\n    try {\n      if (document.documentElement && document.documentElement.classList.contains('customer-logged-in')) return true;\n      if (document.body && document.body.classList.contains('customer-logged-in')) return true;\n      if (document.querySelector('a[href*=\"/account/logout\"], form[action*=\"/account/logout\"]')) return true;\n    } catch (_) {}\n    return false;\n  }\n\n  function isCustomerLoggedIn(store) {\n    var customer = store && store.config && store.config.customer && typeof store.config.customer === 'object'\n      ? store.config.customer\n      : {};\n    return !!(\n      customer.isLoggedIn === true\n      || text(customer.isLoggedIn).toLowerCase() === 'true'\n      || hasHybridPitchPrintCustomerId(customer.id)\n      || hasHybridPitchPrintCustomerSessionSignal()\n    );\n  }\n\n  function shouldPromptHybridPitchPrintAuth(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (settings.skipHybridPitchPrintAuthPrompt) return false;\n    if (text(settings.authPrompt) !== 'customize-online') return false;\n    if (!store || !store.state || !store.state.template) return false;\n    if (text(store.state.project && store.state.project.projectId)) return false;\n    if (!isHybridPitchPrintProduct(store)) return false;\n    if (isCustomerLoggedIn(store)) return false;\n    return true;\n  }\n\n  function createHybridPitchPrintAuthResumeId() {\n    return String(Date.now()) + '-' + Math.random().toString(36).slice(2, 10);\n  }\n\n  function cleanHybridPitchPrintAuthReturnUrl(url) {\n    [\n      HYBRID_PITCHPRINT_AUTH_RESUME_PARAM,\n      'bg_cart_line_key',\n      'bg_project_id',\n      'bg_design_id',\n      'bg_cart_action',\n      'bg_saved_project_id',\n      'bg_saved_source',\n      'bg_saved_return',\n      'projectId',\n      'designonline',\n      'designnum',\n      'designNumber',\n      'id',\n      'backer',\n      'pp_resume',\n      'pp_resume_ticket'\n    ].forEach(function (key) {\n      url.searchParams.delete(key);\n    });\n    return url;\n  }\n\n  function buildHybridPitchPrintAuthReturnPath(store, resumeId) {\n    try {\n      var url = new URL(window.location.href);\n      if (!/^\\/products\\//i.test(text(url.pathname))) {\n        url = new URL(text(store && store.config && store.config.productUrl) || ('/products/' + text(store && store.config && store.config.handle)), window.location.origin);\n      }\n      cleanHybridPitchPrintAuthReturnUrl(url);\n      url.searchParams.set(HYBRID_PITCHPRINT_AUTH_RESUME_PARAM, text(resumeId));\n      return url.pathname + url.search + url.hash;\n    } catch (_) {\n      var basePath = text(store && store.config && store.config.productUrl) || ('/products/' + text(store && store.config && store.config.handle));\n      var separator = basePath.indexOf('?') === -1 ? '?' : '&';\n      return basePath + separator + HYBRID_PITCHPRINT_AUTH_RESUME_PARAM + '=' + encodeURIComponent(text(resumeId));\n    }\n  }\n\n  function buildHybridPitchPrintAuthCurrentPath(store) {\n    try {\n      var url = new URL(window.location.href);\n      if (!/^\\/products\\//i.test(text(url.pathname))) {\n        url = new URL(text(store && store.config && store.config.productUrl) || ('/products/' + text(store && store.config && store.config.handle)), window.location.origin);\n      }\n      cleanHybridPitchPrintAuthReturnUrl(url);\n      return url.pathname + url.search + url.hash;\n    } catch (_) {\n      return text(store && store.config && store.config.productUrl) || ('/products/' + text(store && store.config && store.config.handle));\n    }\n  }\n\n  function buildHybridPitchPrintAuthResumeSnapshot(store, intent) {\n    if (!store || !store.state || !store.state.template) return null;\n    var context = buildEditorContext(store);\n    var resumeId = createHybridPitchPrintAuthResumeId();\n    var now = Date.now();\n    var template = context.template || {};\n    var snapshot = {\n      version: 1,\n      resumeId: resumeId,\n      createdAt: now,\n      expiresAt: now + HYBRID_PITCHPRINT_AUTH_RESUME_TTL_MS,\n      intent: text(intent) || 'customize_online',\n      launchProvider: 'pitchprint',\n      artworkMode: 'designonline',\n      productHandle: text(context.productHandle || store.config.handle),\n      productId: text(context.productId || store.config.productId),\n      productPath: buildHybridPitchPrintAuthCurrentPath(store),\n      returnPath: buildHybridPitchPrintAuthReturnPath(store, resumeId),\n      projectId: text(context.projectId),\n      projectRefreshToken: text(context.projectRefreshToken),\n      designId: text(context.designId || template.designId),\n      designNumber: text(context.designNumber || template.designNumber),\n      templateLookup: text(context.templateLookup || template.templateLookup || template.templatePublicId),\n      templateTitle: text(context.templateTitle || template.title),\n      backer: text(context.backer || template.backer),\n      template: context.template || null,\n      optionSelections: Array.isArray(context.optionSelections) ? context.optionSelections : [],\n      size: context.size || {},\n      selectedOrientation: text(context.selectedOrientation),\n      storefrontBinding: context.storefrontBinding || null\n    };\n    return snapshot;\n  }\n\n  function writeHybridPitchPrintAuthResumeSnapshot(store, intent) {\n    var snapshot = buildHybridPitchPrintAuthResumeSnapshot(store, intent);\n    if (!snapshot) return null;\n    try {\n      window.sessionStorage.setItem(HYBRID_PITCHPRINT_AUTH_RESUME_STORAGE_KEY, JSON.stringify(snapshot));\n      return snapshot;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function buildHybridPitchPrintAccountUrl(accountPath, returnPath) {\n    try {\n      var url = new URL(accountPath, window.location.origin);\n      url.searchParams.set('return_url', text(returnPath));\n      return url.pathname + url.search;\n    } catch (_) {\n      return accountPath + '?return_url=' + encodeURIComponent(text(returnPath));\n    }\n  }\n\n  function getHybridPitchPrintAuthModal() {\n    return document.querySelector('[data-bg-designer-auth-modal]');\n  }\n\n  function getFocusableElements(container) {\n    if (!container) return [];\n    return Array.prototype.slice.call(container.querySelectorAll(\n      'a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n    )).filter(function (node) {\n      if (!node || node.disabled) return false;\n      if (node.getAttribute('aria-hidden') === 'true') return false;\n      return !!(node.offsetWidth || node.offsetHeight || node.getClientRects().length);\n    });\n  }\n\n  function closeHybridPitchPrintAuthModal(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var modal = getHybridPitchPrintAuthModal();\n    if (!modal) return;\n    modal.hidden = true;\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.body.classList.remove('bg-designer-auth-modal--open');\n    if (settings.restoreFocus === false || !store) return;\n    var target = store.hybridPitchPrintAuthModalPreviousFocus;\n    store.hybridPitchPrintAuthModalPreviousFocus = null;\n    if (target && typeof target.focus === 'function' && document.contains(target)) {\n      try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n    }\n  }\n\n  function bindHybridPitchPrintAuthModal(store, modal) {\n    if (!modal) return false;\n    modal.__bgHybridPitchPrintAuthStore = store;\n    Array.prototype.slice.call(modal.querySelectorAll('[data-bg-designer-auth-modal-close]')).forEach(function (button) {\n      button.onclick = function (event) {\n        event.preventDefault();\n        closeHybridPitchPrintAuthModal(store);\n      };\n    });\n\n    var createButton = modal.querySelector('[data-bg-designer-auth-create]');\n    var loginButton = modal.querySelector('[data-bg-designer-auth-login]');\n    var guestButton = modal.querySelector('[data-bg-designer-auth-guest]');\n\n    function navigateToAccount(accountPath) {\n      var snapshot = writeHybridPitchPrintAuthResumeSnapshot(store, 'customize_online');\n      if (!snapshot) {\n        setMessage(store, 'We could not prepare the account return link. Continue as guest or try again.', 'error');\n        return;\n      }\n      window.location.href = buildHybridPitchPrintAccountUrl(accountPath, snapshot.returnPath);\n    }\n\n    if (createButton) {\n      createButton.onclick = function (event) {\n        event.preventDefault();\n        navigateToAccount('/account/register');\n      };\n    }\n    if (loginButton) {\n      loginButton.onclick = function (event) {\n        event.preventDefault();\n        navigateToAccount('/account/login');\n      };\n    }\n    if (guestButton) {\n      guestButton.onclick = function (event) {\n        event.preventDefault();\n        closeHybridPitchPrintAuthModal(store, { restoreFocus: false });\n        void launchDesigner(store, { skipHybridPitchPrintAuthPrompt: true });\n      };\n    }\n\n    modal.onkeydown = function (event) {\n      if (modal.hidden) return;\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        closeHybridPitchPrintAuthModal(store);\n        return;\n      }\n      if (event.key !== 'Tab') return;\n      var focusable = getFocusableElements(modal);\n      if (!focusable.length) return;\n      var first = focusable[0];\n      var last = focusable[focusable.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    };\n    return true;\n  }\n\n  function openHybridPitchPrintAuthModal(store) {\n    var modal = getHybridPitchPrintAuthModal();\n    if (!modal) {\n      return launchDesigner(store, { skipHybridPitchPrintAuthPrompt: true });\n    }\n    bindHybridPitchPrintAuthModal(store, modal);\n    store.hybridPitchPrintAuthModalPreviousFocus = document.activeElement;\n    modal.hidden = false;\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('bg-designer-auth-modal--open');\n    window.requestAnimationFrame(function () {\n      var focusTarget = modal.querySelector('[data-bg-designer-auth-create]')\n        || modal.querySelector('[role=\"dialog\"]')\n        || modal;\n      if (focusTarget && typeof focusTarget.focus === 'function') {\n        try { focusTarget.focus({ preventScroll: true }); } catch (_) { focusTarget.focus(); }\n      }\n    });\n    return Promise.resolve(false);\n  }\n\n  function readHybridPitchPrintAuthResumeIdFromUrl() {\n    try {\n      return text(new URLSearchParams(window.location.search || '').get(HYBRID_PITCHPRINT_AUTH_RESUME_PARAM));\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function stripHybridPitchPrintAuthResumeUrlParam() {\n    try {\n      var url = new URL(window.location.href);\n      if (!url.searchParams.has(HYBRID_PITCHPRINT_AUTH_RESUME_PARAM)) return false;\n      url.searchParams.delete(HYBRID_PITCHPRINT_AUTH_RESUME_PARAM);\n      window.history.replaceState({}, document.title, url.toString());\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function readHybridPitchPrintAuthResumeSnapshot() {\n    try {\n      return parseJson(window.sessionStorage.getItem(HYBRID_PITCHPRINT_AUTH_RESUME_STORAGE_KEY), null);\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function normalizeHybridPitchPrintAuthPath(value) {\n    var clean = text(value);\n    if (!clean) return '';\n    try {\n      var url = new URL(clean, window.location.origin);\n      cleanHybridPitchPrintAuthReturnUrl(url);\n      return url.pathname.replace(/\\/+$/, '') || '/';\n    } catch (_) {\n      return clean.split('?')[0].split('#')[0].replace(/\\/+$/, '') || '/';\n    }\n  }\n\n  function doesHybridPitchPrintAuthSnapshotMatchCurrentProduct(store, snapshot) {\n    var source = snapshot && typeof snapshot === 'object' ? snapshot : {};\n    var config = store && store.config && typeof store.config === 'object' ? store.config : {};\n    var snapshotHandle = text(source.productHandle);\n    var currentHandle = text(config.handle);\n    if (snapshotHandle && currentHandle && snapshotHandle !== currentHandle) return false;\n    var snapshotProductId = text(source.productId);\n    var currentProductId = text(config.productId);\n    if (snapshotProductId && currentProductId && snapshotProductId !== currentProductId) return false;\n    var snapshotPath = normalizeHybridPitchPrintAuthPath(source.productPath || source.returnPath);\n    if (!snapshotPath) return true;\n    var currentPath = normalizeHybridPitchPrintAuthPath(window.location.href);\n    var configuredPath = normalizeHybridPitchPrintAuthPath(config.productUrl || ('/products/' + currentHandle));\n    return snapshotPath === currentPath || (!!configuredPath && snapshotPath === configuredPath);\n  }\n\n  function readHybridPitchPrintAuthResumeCandidate(store) {\n    var explicitResumeId = readHybridPitchPrintAuthResumeIdFromUrl();\n    var snapshot = readHybridPitchPrintAuthResumeSnapshot();\n    if (explicitResumeId) {\n      return {\n        explicit: true,\n        resumeId: explicitResumeId,\n        snapshot: snapshot\n      };\n    }\n    if (!snapshot || typeof snapshot !== 'object') return null;\n    var snapshotResumeId = text(snapshot.resumeId);\n    if (!snapshotResumeId) return null;\n    if (Number(snapshot.expiresAt || 0) < Date.now()) {\n      clearHybridPitchPrintAuthResumeSnapshot(snapshotResumeId);\n      return null;\n    }\n    if (text(snapshot.intent) && text(snapshot.intent) !== 'customize_online') return null;\n    if (text(snapshot.launchProvider) && text(snapshot.launchProvider).toLowerCase() !== 'pitchprint') return null;\n    if (!doesHybridPitchPrintAuthSnapshotMatchCurrentProduct(store, snapshot)) return null;\n    return {\n      explicit: false,\n      resumeId: snapshotResumeId,\n      snapshot: snapshot\n    };\n  }\n\n  function clearHybridPitchPrintAuthResumeSnapshot(resumeId) {\n    var cleanResumeId = text(resumeId);\n    try {\n      var stored = readHybridPitchPrintAuthResumeSnapshot();\n      if (!cleanResumeId || !stored || text(stored.resumeId) === cleanResumeId) {\n        window.sessionStorage.removeItem(HYBRID_PITCHPRINT_AUTH_RESUME_STORAGE_KEY);\n      }\n    } catch (_) {}\n    stripHybridPitchPrintAuthResumeUrlParam();\n  }\n\n  function applyTemplateBackerSelection(template, backer) {\n    var cleanBacker = text(backer);\n    if (!template || !cleanBacker) return template;\n    template.backer = cleanBacker;\n    var matchedBacker = Array.isArray(template.backers)\n      ? template.backers.find(function (entry) {\n        return text(entry && entry.id) === cleanBacker;\n      })\n      : null;\n    template.backerLabel = matchedBacker ? text(matchedBacker.label) : text(template.backerLabel);\n    return template;\n  }\n\n  function normalizePitchPrintLegacyBacker(value) {\n    var cleanBacker = text(value);\n    if (!cleanBacker) return '';\n    if (/^\\d+$/.test(cleanBacker)) return Number(cleanBacker);\n    return cleanBacker;\n  }\n\n  function findTemplateForHybridPitchPrintAuthResume(store, snapshot) {\n    var source = snapshot && typeof snapshot === 'object' ? snapshot : {};\n    var templatePayload = source.template && typeof source.template === 'object' ? source.template : {};\n    var template = findTemplateForSavedProject(\n      store,\n      text(source.templateLookup || templatePayload.templateLookup || templatePayload.templatePublicId),\n      text(source.designId || templatePayload.designId),\n      text(source.designNumber || templatePayload.designNumber),\n      text(source.backer || templatePayload.backer)\n    );\n    if (!template && templatePayload && Object.keys(templatePayload).length) {\n      template = enrichTemplateWithLookupMap(deepClone(templatePayload, {}), store.templateLookupMap);\n    }\n    return applyTemplateBackerSelection(template, text(source.backer || templatePayload.backer));\n  }\n\n  function applyHybridPitchPrintAuthResumeState(store, snapshot) {\n    var source = snapshot && typeof snapshot === 'object' ? snapshot : {};\n    var nextTemplate = findTemplateForHybridPitchPrintAuthResume(store, source);\n    if (!nextTemplate) return false;\n    var draft = artworkConfigurationDraft(store, { template: nextTemplate });\n    collectStoredOptionSelections(draft, source.optionSelections);\n    var committed = commitArtworkConfiguration(store, { selections: draft.state.selections, template: nextTemplate, artworkMode: 'designonline' }, { source: 'restore', preserveProject: true });\n    if (committed.status === 'refused') return false;\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n\n    store.uiState.artworkChooserExpanded = false;\n    store.state.project = {\n      projectId: text(source.projectId),\n      designId: text(source.designId || nextTemplate.designId),\n      designNumber: text(source.designNumber || nextTemplate.designNumber),\n      previewUrl: '',\n      previews: [],\n      refreshToken: text(source.projectRefreshToken) || String(Date.now())\n    };\n    clearCompletionState(store);\n    recalculate(store);\n    if (text(store.state.project.projectId)) {\n      prepareRestoredPitchPrintProjectState(store);\n    } else {\n      syncPitchPrintProjectInputs('', '');\n      syncFormState(store);\n    }\n    return true;\n  }\n\n  function isHybridPitchPrintAuthResumeLaunchReady(store) {\n    var client = window.ppclient || null;\n    if (client && (typeof client.fire === 'function' || typeof client.showApp === 'function')) return true;\n    if (typeof window.launchDesignFromProductPage === 'function') return true;\n    if (text(store && store.state && store.state.project && store.state.project.projectId)) {\n      return typeof resolvePitchPrintClientConstructor() === 'function';\n    }\n    return false;\n  }\n\n  function waitForHybridPitchPrintAuthResumeLaunch(store, resumeId, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (!store || !isHybridPitchPrintProduct(store)) return Promise.resolve(false);\n    if (isHybridPitchPrintAuthResumeLaunchReady(store)) {\n      return launchDesigner(store, {\n        showPreloader: true,\n        skipHybridPitchPrintAuthPrompt: true\n      }).then(function (launched) {\n        clearHybridPitchPrintAuthResumeSnapshot(resumeId);\n        return !!launched;\n      }).catch(function () {\n        stripHybridPitchPrintAuthResumeUrlParam();\n        return false;\n      });\n    }\n    if (remaining <= 0) {\n      hidePitchPrintLaunchPreloader(store);\n      stripHybridPitchPrintAuthResumeUrlParam();\n      setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n      return Promise.resolve(false);\n    }\n    if (remaining === 48) {\n      setMessage(store, 'Loading designer...', 'info');\n      showPitchPrintLaunchPreloader(store);\n    }\n    return new Promise(function (resolve) {\n      window.setTimeout(function () {\n        resolve(waitForHybridPitchPrintAuthResumeLaunch(store, resumeId, remaining - 1));\n      }, 250);\n    });\n  }\n\n  function waitForHybridPitchPrintAuthCustomerSession(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (isCustomerLoggedIn(store)) return Promise.resolve(true);\n    if (remaining <= 0) return Promise.resolve(false);\n    return new Promise(function (resolve) {\n      window.setTimeout(function () {\n        resolve(waitForHybridPitchPrintAuthCustomerSession(store, remaining - 1));\n      }, 250);\n    });\n  }\n\n  function restoreHybridPitchPrintAuthResume(store) {\n    if (hasFreshTemplateUrlHandoffRequest()) return Promise.resolve(false);\n    var candidate = readHybridPitchPrintAuthResumeCandidate(store);\n    if (!candidate) return Promise.resolve(false);\n    var resumeId = text(candidate.resumeId);\n    if (!store || !isHybridPitchPrintProduct(store)) {\n      stripHybridPitchPrintAuthResumeUrlParam();\n      return Promise.resolve(false);\n    }\n    if (store.hybridPitchPrintAuthResumeRestoredId === resumeId) return Promise.resolve(false);\n    var snapshot = candidate.snapshot;\n    if (!snapshot || text(snapshot.resumeId) !== resumeId) {\n      stripHybridPitchPrintAuthResumeUrlParam();\n      return Promise.resolve(false);\n    }\n    if (Number(snapshot.expiresAt || 0) < Date.now()) {\n      clearHybridPitchPrintAuthResumeSnapshot(resumeId);\n      return Promise.resolve(false);\n    }\n    if (!doesHybridPitchPrintAuthSnapshotMatchCurrentProduct(store, snapshot)) {\n      stripHybridPitchPrintAuthResumeUrlParam();\n      return Promise.resolve(false);\n    }\n    // URL-PROJECT-PARAM-ARTWORK-OFF-01: the resume would place the snapshot's\n    // design and reopen the editor over a page that shows neither.\n    if (refuseSavedDesignLanding(store, { silent: !text(snapshot.projectId) })) {\n      clearHybridPitchPrintAuthResumeSnapshot(resumeId);\n      return Promise.resolve(false);\n    }\n    var token = captureArtworkOperation(store);\n    return waitForHybridPitchPrintAuthCustomerSession(store, 16).then(function (hasCustomerSession) {\n      if (!isArtworkOperationFresh(store, token)) return false;\n      if (!hasCustomerSession) {\n        if (candidate.explicit) {\n          stripHybridPitchPrintAuthResumeUrlParam();\n          setMessage(store, 'Log in or create an account to continue customizing this design.', 'info');\n        }\n        return false;\n      }\n      if (!applyHybridPitchPrintAuthResumeState(store, snapshot)) {\n        clearHybridPitchPrintAuthResumeSnapshot(resumeId);\n        setMessage(store, 'We could not reload that selected template. Choose a template to customize online.', 'error');\n        return false;\n      }\n      store.hybridPitchPrintAuthResumeRestoredId = resumeId;\n      render(store);\n      return waitForHybridPitchPrintAuthResumeLaunch(store, resumeId, 48).then(function () {\n        return true;\n      });\n    });\n  }\n\n  // FX-16 shell lane. Switch account inside the Studio editor sends the\n  // customer through the logout/login trip and back to this product page\n  // with a one-time pass (pp_resume=1&pp_resume_ticket=...). Studio-shell\n  // pages never load bg-header-scripts, so the bridge that spends that pass\n  // on the classic product page is absent here. This is the shell's own\n  // consumer: it runs first in the boot restore chain, spends the pass\n  // exactly once, removes it from the address before any launch URL can copy\n  // it, forgets the previous account, and arms the existing template URL\n  // action so the editor reopens through the same launchDesigner tail a\n  // Customize click uses. A refused or expired pass leaves the page usable\n  // and never falls back to anything the previous account left behind.\n  var ACCOUNT_SWITCH_RESUME_FLAG_PARAM = 'pp_resume';\n  var ACCOUNT_SWITCH_RESUME_TICKET_PARAM = 'pp_resume_ticket';\n  var ACCOUNT_SWITCH_RESUME_SOURCE = 'editor-switch-account';\n  var ACCOUNT_SWITCH_RESUME_CONSUME_PATH = '/auth/resume-ticket/consume';\n  var EDITOR_BOOTSTRAP_CACHE_KEY_PREFIX = 'bg-designer-v2-bootstrap:';\n  // Same attribute, values and wording as the classic page's resume bridge\n  // (bg-header-scripts.liquid markResumeOutcome), plus 'consumed' so a live\n  // check on a shell page can tell \"reopened\" from \"never ran\".\n  var ACCOUNT_SWITCH_RESUME_OUTCOME_MESSAGES = {\n    'consumed': 'The design editor is reopening for the account that just signed in.',\n    'ticket-refused': 'The design editor did not reopen. The one-time sign-in pass was already used or it ran out of time.',\n    'no-context': 'The design editor did not reopen. The sign-in pass did not name a design or a template to open.',\n    'no-editor': 'The design editor did not reopen. This page has no design editor to open.'\n  };\n  var accountSwitchResumeConsumeAttempted = false;\n  // FX-16B: what happened to the design the switch-account pass carried.\n  // designer-api answers `transfer` on a consumed pass that named a project:\n  // 'moved' (now owned by the account that signed in), 'same-owner' (it\n  // already was), 'skipped-guest' (nobody signed in) or 'failed'; a pass that\n  // carried no project reads 'none'. Only 'moved' and 'same-owner' may pin\n  // the project here; every other answer opens the fresh template.\n  var ACCOUNT_SWITCH_RESUME_TRANSFER_OUTCOMES = ['moved', 'same-owner', 'skipped-guest', 'failed'];\n\n  function markAccountSwitchResumeTransfer(value) {\n    var key = ACCOUNT_SWITCH_RESUME_TRANSFER_OUTCOMES.indexOf(text(value)) === -1 ? 'none' : text(value);\n    try { document.documentElement.setAttribute('data-bg-resume-transfer', key); } catch (_) {}\n    return key;\n  }\n\n  function readAccountSwitchResumeTicketFromUrl() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      if (text(params.get(ACCOUNT_SWITCH_RESUME_FLAG_PARAM)) !== '1') return '';\n      return text(params.get(ACCOUNT_SWITCH_RESUME_TICKET_PARAM));\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function stripAccountSwitchResumeUrlParams() {\n    try {\n      var url = new URL(window.location.href);\n      if (\n        !url.searchParams.has(ACCOUNT_SWITCH_RESUME_FLAG_PARAM)\n        && !url.searchParams.has(ACCOUNT_SWITCH_RESUME_TICKET_PARAM)\n      ) {\n        return false;\n      }\n      url.searchParams.delete(ACCOUNT_SWITCH_RESUME_FLAG_PARAM);\n      url.searchParams.delete(ACCOUNT_SWITCH_RESUME_TICKET_PARAM);\n      window.history.replaceState(window.history.state, document.title, url.toString());\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function markAccountSwitchResumeOutcome(reason) {\n    var key = text(reason);\n    var message = ACCOUNT_SWITCH_RESUME_OUTCOME_MESSAGES[key] || '';\n    if (!message) return false;\n    try { document.documentElement.setAttribute('data-bg-resume-outcome', key); } catch (_) {}\n    try { window.__BG_RESUME_OUTCOME = { reason: key, message: message }; } catch (_) {}\n    try {\n      if (window.console && typeof window.console.info === 'function') window.console.info(message);\n    } catch (_) {}\n    return true;\n  }\n\n  function consumeAccountSwitchResumeTicket(store, ticket) {\n    var designer = store && store.config && store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    var proxyRoot = (text(designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer').replace(/\\/+$/, '');\n    var request;\n    try {\n      request = fetch(proxyRoot + ACCOUNT_SWITCH_RESUME_CONSUME_PATH, {\n        method: 'POST',\n        headers: { 'content-type': 'application/json' },\n        credentials: 'same-origin',\n        body: JSON.stringify({ ticket: text(ticket) })\n      });\n    } catch (_) {\n      return Promise.resolve(null);\n    }\n    return Promise.resolve(request).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (data) {\n        if (!response || !response.ok || !data || data.ok !== true || !data.context || typeof data.context !== 'object') return null;\n        return data.context;\n      });\n    }).catch(function () { return null; });\n  }\n\n  // The shell's editor bootstrap cache is keyed on the launch address only\n  // (no customer in the key) and it survives the same-tab logout/login trip\n  // in sessionStorage, so a launch under the next account could be served\n  // the previous account's cached bootstrap. Drop it before any launch.\n  function clearEditorBootstrapCache() {\n    try { window.__BG_STOREFRONT_BOOTSTRAP_CACHE_V2__ = {}; } catch (_) {}\n    try {\n      var storage = window.sessionStorage;\n      var stale = [];\n      for (var index = 0; index < storage.length; index += 1) {\n        var key = storage.key(index) || '';\n        if (key.indexOf(EDITOR_BOOTSTRAP_CACHE_KEY_PREFIX) === 0) stale.push(key);\n      }\n      stale.forEach(function (staleKey) { storage.removeItem(staleKey); });\n    } catch (_) {}\n  }\n\n  function forgetPreviousAccountShellContext(store) {\n    if (store && store.state) clearProjectState(store);\n    clearPitchPrintRestoreSessionKeys();\n    clearEditorBootstrapCache();\n    // The editor's per-tab configuration-session handoff (session id plus the\n    // token whose claims name it; readDesignerConfigurationSessionHandoff\n    // reads it) was written for the previous account and survives the\n    // same-tab logout/login trip.\n    try { window.sessionStorage.removeItem('bg_designer_configuration_session_v1'); } catch (_) {}\n    try { window.BG_DESIGNER_RETURN_CONTEXT = null; } catch (_) {}\n  }\n\n  function restoreFromAccountSwitchResume(store) {\n    var ticket = readAccountSwitchResumeTicketFromUrl();\n    if (!ticket) return Promise.resolve(false);\n    if (accountSwitchResumeConsumeAttempted) return Promise.resolve(false);\n    accountSwitchResumeConsumeAttempted = true;\n    var token = captureArtworkOperation(store);\n    return consumeAccountSwitchResumeTicket(store, ticket).then(function (context) {\n      if (!isArtworkOperationFresh(store, token)) return false;\n      // Spent or refused, the pass leaves the address now, before the launch\n      // copies the page URL into the editor's return address and before a\n      // reload could present it a second time.\n      stripAccountSwitchResumeUrlParams();\n      if (!context) {\n        // Already used, expired, or a guest. Nothing the previous account\n        // left behind may stand in for it.\n        clearEditorBootstrapCache();\n        markAccountSwitchResumeOutcome('ticket-refused');\n        return false;\n      }\n      if (text(context.source) !== ACCOUNT_SWITCH_RESUME_SOURCE) {\n        // A project-bound sign-in pass keeps today's shell behaviour: nothing\n        // reopens here. Only a pass naming nothing at all is marked.\n        if (!text(context.projectId) && !text(context.designId) && !text(context.templateLookup)) {\n          markAccountSwitchResumeOutcome('no-context');\n        }\n        return false;\n      }\n      if (!store || !store.state) {\n        markAccountSwitchResumeOutcome('no-editor');\n        return false;\n      }\n      forgetPreviousAccountShellContext(store);\n      // URL-PROJECT-PARAM-ARTWORK-OFF-01: this page would show neither the\n      // moved design nor what the reopened editor returns, so nothing is\n      // pinned and nothing reopens. A pass that carried a design says so.\n      if (refuseSavedDesignLanding(store, { silent: !text(context.projectId) })) {\n        markAccountSwitchResumeTransfer(context.transfer);\n        markAccountSwitchResumeOutcome('no-editor');\n        return false;\n      }\n      if (!store.state.template && text(context.templateLookup)) {\n        var template = resolveTemplateFromUrlState(store, { templateLookup: text(context.templateLookup) });\n        if (template) writeArtworkTemplate(store, template);\n      }\n      // FX-16B: the design the customer was working on, now owned by the\n      // account that signed in (designer-api moved it at consume time, or it\n      // already belonged to them). The pin is set the way a saved-design\n      // reopen pins store.state.project, and ONLY on those two answers: a\n      // project id with any other transfer answer is ignored, so this page\n      // never opens a design the signed-in account does not own.\n      var transfer = markAccountSwitchResumeTransfer(context.transfer);\n      var movedProjectId = (transfer === 'moved' || transfer === 'same-owner') ? text(context.projectId) : '';\n      if (movedProjectId) {\n        store.state.project = {\n          projectId: movedProjectId,\n          designId: text(store.state.template && store.state.template.designId),\n          designNumber: text(store.state.template && store.state.template.designNumber),\n          title: '',\n          updatedAt: '',\n          previewUrl: '',\n          previews: [],\n          numPages: 0,\n          refreshToken: String(Date.now())\n        };\n        commitArtworkChoice(store, { mode: 'designonline', source: 'restore' });\n        syncFormState(store);\n      }\n      if (!store.state.template && !movedProjectId) {\n        markAccountSwitchResumeOutcome('no-context');\n        return false;\n      }\n      // maybeRunTemplateUrlAction reads this field as its fallback and opens\n      // Studio through the same launchDesigner tail every Customize click\n      // uses; no second launch path. When the address also carries a\n      // design-collection handoff, the customer already pressed Customize\n      // before the sign-in trip: the consumed pass is that activation, so\n      // the reopen may pass the collection lane's wait for the button.\n      // With a moved project pinned, that tail takes launchDesigner's\n      // existing-project path (mode=edit, projectId on the launch URL).\n      store.urlStateTemplateAction = 'customize_online';\n      store.accountSwitchResumeReopenArmed = true;\n      markAccountSwitchResumeOutcome('consumed');\n      return false;\n    }).catch(function () {\n      if (!isArtworkOperationFresh(store, token)) return false;\n      stripAccountSwitchResumeUrlParams();\n      markAccountSwitchResumeOutcome('ticket-refused');\n      return false;\n    });\n  }\n\n  // BD-B66: the old editor opened without a design shows blank full-screen\n  // frames with no way out. A saved project or a template with a real design\n  // id may launch it; anything else stays on the product page with a message.\n  function pitchPrintLaunchHasDesign(store) {\n    var state = store && store.state ? store.state : {};\n    if (text(state.project && state.project.projectId)) return true;\n    var template = state.template;\n    return !!template && isLegacyEditorDesignId(template.designId, template.foundationTemplateId);\n  }\n\n  function refusePitchPrintLaunchWithoutDesign(store) {\n    if (pitchPrintLaunchHasDesign(store)) return false;\n    hidePitchPrintLaunchPreloader(store);\n    if (text(store.state.artworkMode) === 'designonline') {\n      commitArtworkChoice(store, { mode: '', source: 'availability', reset: true });\n      recalculate(store);\n    }\n    // Rendered once after the purchase button's own message reset.\n    store.pendingUrlStateErrorMessage = 'This template is not ready for online editing yet. Choose a different template or use our personalization service.';\n    render(store);\n    return true;\n  }\n\n  function launchDesigner(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (store) store.eddmDateMoved = null; // ALLOWED-BLOCKS-AT-MUTATION: the shopper leaves the page that shows the date\n    // Flush the deferred URL sync NOW: the launch URL snapshots the page URL\n    // into bgReturnUrl/bgNextUrl, and a launch inside the 250ms debounce (or\n    // after a quantity change, which never scheduled the sync) baked the\n    // stale query in \u2014 on close/approve the page reloaded at the OLD\n    // configuration and wrote it back into state (the fast-click race's\n    // round-trip variant).\n    if (store) scheduleDesignerUrlStateSync(store, true);\n    if (store && !ensureContextualSelectedDesignCompatibility(store)) {\n      setMessage(store, 'Resolve the selected design and product options before opening Studio.', 'error');\n      render(store);\n      return Promise.resolve(false);\n    }\n    if (store.state.template && !templateMatchesOptionSourceRules(store, store.state.template)) {\n      // Fail safe (slice 2): never launch a template the current choices\n      // exclude \u2014 the bootstrap cannot fulfill it and the editor would sit\n      // on its spinner. Detach the stuck template and open the chooser.\n      writeArtworkTemplate(store, null);\n      if (store.state.artworkMode === 'designonline' || store.state.artworkMode === 'editservice') {\n        commitArtworkChoice(store, { mode: '', source: 'launch', reset: true, preserveProject: true });\n      }\n      recalculate(store);\n      setMessage(store, 'That design is not available with your current choices. Choose a design to continue.', 'error');\n      render(store);\n      openTemplateModal(store, 'designonline');\n      return Promise.resolve(false);\n    }\n    var hasTemplateOrProject = !!(store.state.template || text(store.state.project && store.state.project.projectId));\n    if (!hasTemplateOrProject && isPitchPrintLaunchProvider(store)) {\n      openTemplateModal(store, 'designonline');\n      return Promise.resolve(false);\n    }\n    if (isPitchPrintLaunchProvider(store) && refusePitchPrintLaunchWithoutDesign(store)) {\n      return Promise.resolve(false);\n    }\n    if (shouldPromptHybridPitchPrintAuth(store, settings)) {\n      return openHybridPitchPrintAuthModal(store);\n    }\n    var requestedLaunchMode = text(settings.launchMode).toLowerCase();\n    var nextLaunchMode = requestedLaunchMode === 'upload' ? 'uploadfiles' : 'designonline';\n    var launchOffer = getArtworkMethodOffer(store, nextLaunchMode);\n    if (store.state.artworkMode !== nextLaunchMode && launchOffer.price && launchOffer.price.amount > 0) {\n      commitArtworkChoice(store, { mode: '', source: 'launch', reset: true, preserveProject: true });\n      render(store);\n      return Promise.resolve(false);\n    }\n    var launchChoice = commitArtworkChoice(store, { mode: nextLaunchMode, source: 'launch' });\n    if (launchChoice.status !== 'applied') return Promise.resolve(false);\n    recordArtworkEditorOperation(store);\n    var launchOperation = store.artworkEditorOperation;\n    setMessage(store, 'Loading designer\u2026', 'info');\n    if (isPitchPrintLaunchProvider(store)) {\n      if (store.editorShell && typeof store.editorShell.close === 'function') {\n        store.editorShell.close();\n      }\n      store.editorShell = null;\n      if (settings.showPreloader !== false) {\n        showPitchPrintLaunchPreloader(store, { autoHideMs: settings.preloaderAutoHideMs });\n        schedulePitchPrintPreloaderFrameRelease(store);\n      } else {\n        hidePitchPrintLaunchPreloader(store);\n      }\n      // BUG-03: every hybrid launch is watched; the Try again action replays\n      // this exact launch.\n      store.pitchPrintLaunchRetryOptions = Object.assign({}, settings);\n      var launchGeneration = armPitchPrintLaunchWatchdog(store);\n      render(store);\n      return ensurePitchPrintHybridRuntime(store).then(function () {\n        if (!isArtworkOperationFresh(store, launchOperation)) return false;\n        return launchPitchPrintDesigner(store);\n      }).then(function (launched) {\n        if (!isArtworkOperationFresh(store, launchOperation)) return false;\n        if (store.pitchPrintLaunchGeneration !== launchGeneration) return launched;\n        if (!launched) triggerPitchPrintLaunchFailure(store, 'launch_rejected');\n        return launched;\n      }, function (error) {\n        if (!isArtworkOperationFresh(store, launchOperation)) return false;\n        if (store.pitchPrintLaunchGeneration !== launchGeneration) return false;\n        triggerPitchPrintLaunchFailure(store, 'launch_error', error);\n        return false;\n      });\n    }\n    var hasExistingProject = !!text(store.state.project && store.state.project.projectId);\n    if (hasExistingProject) {\n      render(store);\n      if (!store.editorShell) bindEditorShell(store);\n      if (!store.editorShell || typeof store.editorShell.open !== 'function') {\n        setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n        render(store);\n        return Promise.resolve(false);\n      }\n      return store.editorShell.open(buildEditorContext(store));\n    }\n    if (!store.state.template) {\n      render(store);\n      if (!store.editorShell) bindEditorShell(store);\n      if (!store.editorShell || typeof store.editorShell.open !== 'function') {\n        setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n        render(store);\n        return Promise.resolve(false);\n      }\n      return store.editorShell.open(buildEditorContext(store));\n    }\n    return ensureTemplateHasLaunchLookup(store, store.state.template).then(function (resolvedTemplate) {\n      if (!isArtworkOperationFresh(store, launchOperation)) return false;\n      if (commitArtworkConfiguration(store, { template: resolvedTemplate }, { source: 'launch', token: launchOperation }).status !== 'applied') return false;\n      recordArtworkEditorOperation(store);\n      if (!text(store.state.template && (store.state.template.templateLookup || store.state.template.templatePublicId))) {\n        setMessage(store, 'This template is not ready for online editing yet. Choose a different template or use our personalization service.', 'error');\n        render(store);\n        return false;\n      }\n      render(store);\n      if (!store.editorShell) bindEditorShell(store);\n      if (!store.editorShell || typeof store.editorShell.open !== 'function') {\n        setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n        render(store);\n        return false;\n      }\n      return store.editorShell.open(buildEditorContext(store));\n    });\n  }\n\n  function waitForTemplateUrlActionPitchPrintClient(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    if (isPitchPrintCartEditClientReady()) {\n      void launchDesigner(store, {\n        showPreloader: true,\n        preloaderAutoHideMs: 15000,\n        skipHybridPitchPrintAuthPrompt: true\n      });\n      return true;\n    }\n    if (remaining <= 0) {\n      hidePitchPrintLaunchPreloader(store);\n      setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n      return false;\n    }\n    if (remaining === 60) {\n      setMessage(store, 'Loading designer...', 'info');\n      showPitchPrintLaunchPreloader(store, { autoHideMs: 15000 });\n    }\n    window.setTimeout(function () {\n      waitForTemplateUrlActionPitchPrintClient(store, remaining - 1);\n    }, 250);\n    return true;\n  }\n\n  function maybeRunTemplateUrlAction(store, urlState) {\n    if (!store || !store.state) return false;\n    var action = normalizeTemplateUrlAction(\n      (urlState && urlState.templateAction) ||\n      store.urlStateTemplateAction ||\n      ''\n    );\n    if (!action) return false;\n    if (store.templateUrlActionAutoHandled) return false;\n    if (!store.state.template && !text(store.state.project && store.state.project.projectId)) return false;\n    store.templateUrlActionAutoHandled = true;\n\n    // Collection handoffs first render the contextual selected-design state.\n    // Studio opens only after the customer explicitly activates its CTA, once\n    // the PDP has revalidated and applied every geometry-changing choice.\n    // A consumed switch-account pass is that activation (the customer pressed\n    // Customize before the sign-in trip), so it alone continues to the launch\n    // below; the handoff itself stays valid for the page behind the editor.\n    if (store.collectionTemplateHandoff && store.collectionTemplateHandoff.valid\n      && !store.accountSwitchResumeReopenArmed) {\n      render(store);\n      return true;\n    }\n\n    if (action === 'edit_service') {\n      if (!applyArtworkMethodOption(store, 'editservice')) return false;\n      clearProjectState(store);\n      clearUploadState(store);\n      clearCanvaState(store);\n      clearArtworkAuxiliaryState(store);\n      setArtworkChoice(store, 'need-design', 'use-template', 'editservice');\n      render(store);\n      return true;\n    }\n\n    // URL-PROJECT-PARAM-ARTWORK-OFF-01: an address action never opens the\n    // editor over a page that could not show the design it returns.\n    if (refuseSavedDesignLanding(store, { silent: true })) return false;\n    if (isPitchPrintLaunchProvider(store) && refusePitchPrintLaunchWithoutDesign(store)) return false;\n\n    clearUploadState(store);\n    clearCanvaState(store);\n    clearArtworkAuxiliaryState(store);\n    // FX-16B: a consumed switch-account pass that pinned the moved project\n    // keeps that pin, so launchDesigner below takes its existing-project\n    // path; every other template action starts the project fresh as before.\n    if (!(store.accountSwitchResumeReopenArmed && text(store.state.project && store.state.project.projectId))) {\n      resetPitchPrintProjectForTemplateLaunch(store);\n    }\n    setArtworkChoice(store, 'need-design', 'use-template', 'designonline');\n    render(store);\n    if (isPitchPrintLaunchProvider(store)) {\n      return waitForTemplateUrlActionPitchPrintClient(store, 60);\n    }\n    void launchDesigner(store, {\n      showPreloader: true,\n      skipHybridPitchPrintAuthPrompt: true\n    });\n    return true;\n  }\n\n  function maybeAutoLaunchRestoredCartDesign(store, restoredFromCartLine) {\n    if (!store || !restoredFromCartLine) return false;\n    if (store.cartEditDesignAutoLaunchAttempted) return false;\n    if (text(store.pendingCartReturnAction).toLowerCase() !== 'edit_design') return false;\n    if (getCartDesignEditor(store) === 'pitchprint-mini') {\n      store.cartEditDesignAutoLaunchAttempted = true;\n      store.pendingCartReturnAction = '';\n      var miniProject = store.state && store.state.project ? store.state.project : {};\n      schedulePitchPrintProjectInputSync(\n        text(miniProject.projectId),\n        text(miniProject.designNumber),\n        12\n      );\n      waitForPitchPrintMiniCartEdit(store, 80);\n      return true;\n    }\n    if (!isPitchPrintLaunchProvider(store)) return false;\n    if (!store.state || !store.state.template) return false;\n    if (!text(store.state && store.state.project && store.state.project.projectId)) return false;\n    store.cartEditDesignAutoLaunchAttempted = true;\n    store.pendingCartReturnAction = '';\n    waitForPitchPrintCartEditClient(store, 48);\n    return true;\n  }\n\n  function waitForPitchPrintMiniCartEdit(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (!store || getCartDesignEditor(store) !== 'pitchprint-mini') return false;\n    var editButton = document.getElementById('pp_edit_btn');\n    if (editButton && !editButton.disabled && typeof editButton.click === 'function') {\n      editButton.click();\n      return true;\n    }\n    if (remaining <= 0) {\n      setMessage(store, 'The design editor is still loading. Select Edit Design on this page.', 'error');\n      return false;\n    }\n    window.setTimeout(function () {\n      waitForPitchPrintMiniCartEdit(store, remaining - 1);\n    }, 250);\n    return true;\n  }\n\n  function isPitchPrintCartEditClientReady() {\n    var client = window.ppclient || null;\n    if (client && (typeof client.fire === 'function' || typeof client.showApp === 'function')) return true;\n    return typeof resolvePitchPrintClientConstructor() === 'function';\n  }\n\n  function waitForPitchPrintCartEditClient(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    if (isPitchPrintCartEditClientReady()) {\n      void launchDesigner(store, { showPreloader: true });\n      return true;\n    }\n    if (remaining <= 0) {\n      hidePitchPrintLaunchPreloader(store);\n      setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n      return false;\n    }\n    if (remaining === 48) {\n      setMessage(store, 'Loading designer...', 'info');\n    }\n    window.setTimeout(function () {\n      waitForPitchPrintCartEditClient(store, remaining - 1);\n    }, 250);\n    return true;\n  }\n\n  function bindPitchPrintClientLifecycle(store) {\n    var client = window.ppclient;\n    if (!client || typeof client.on !== 'function') return false;\n    // The storefront runtime can re-initialize on live navigation\n    // (bg-designer-storefront-live-bootstrap re-runs initStorefront -> createStore),\n    // which builds a fresh store and re-points installPitchPrintStorefrontBridge at it,\n    // while the persistent PitchPrint client keeps the handlers bound below. Always track\n    // the latest store so the handlers act on the store that actually renders. Without this,\n    // a save on a re-initialized product (e.g. door hangers, whose backer step triggers a\n    // re-init) updated a stale store: the projectId never reached the visible state, so the\n    // design preview + approval step never appeared.\n    client.__bgActivePitchPrintStore = store;\n    if (client.__bgDesignerStorefrontPitchPrintBoundV1 === '1') return true;\n    client.__bgDesignerStorefrontPitchPrintBoundV1 = '1';\n    function activeStore() {\n      return client.__bgActivePitchPrintStore || store;\n    }\n    client.on('editor-shown', function () {\n      hidePitchPrintLaunchPreloader(activeStore());\n      settlePitchPrintLaunchSuccess(activeStore());\n      setMessage(activeStore(), '', '');\n    });\n    client.on('design-loaded', function () {\n      hidePitchPrintLaunchPreloader(activeStore());\n      settlePitchPrintLaunchSuccess(activeStore());\n      setMessage(activeStore(), '', '');\n    });\n    client.on('project-saved', function (payload) {\n      hidePitchPrintLaunchPreloader(activeStore());\n      settlePitchPrintLaunchSuccess(activeStore());\n      applyPitchPrintProjectState(activeStore(), payload);\n    });\n    client.on('session-saved', function (payload) {\n      hidePitchPrintLaunchPreloader(activeStore());\n      settlePitchPrintLaunchSuccess(activeStore());\n      applyPitchPrintProjectState(activeStore(), payload);\n    });\n    client.on('after-close-app', function (payload) {\n      var currentStore = activeStore();\n      hidePitchPrintLaunchPreloader(currentStore);\n      // Reaching the editor and closing it is a successful launch \u2014 the\n      // stall watchdog must not fire after the fact.\n      settlePitchPrintLaunchSuccess(currentStore);\n      if (hasExplicitPitchPrintProjectPayload(payload) || text(currentStore.state && currentStore.state.project && currentStore.state.project.projectId)) {\n        applyPitchPrintProjectState(currentStore, payload);\n        return;\n      }\n      resetUnsavedPitchPrintCustomizationChoice(currentStore);\n    });\n    return true;\n  }\n\n  function schedulePitchPrintClientLifecycleBinding(store, attempts) {\n    var remaining = Number(attempts || 0);\n    if (bindPitchPrintClientLifecycle(store) || remaining <= 0) return;\n    window.setTimeout(function () {\n      schedulePitchPrintClientLifecycleBinding(store, remaining - 1);\n    }, 160);\n  }\n\n  function syncPitchPrintLaunchGlobals(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var reopenSavedProject = !!settings.reopenSavedProject;\n    var template = store && store.state && store.state.template ? store.state.template : null;\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var designId = text(project.designId || template && template.designId);\n    var designNumber = text(project.designNumber || template && template.designNumber);\n    var projectId = text(project.projectId);\n    var clientMode = projectId ? 'edit' : 'new';\n    var backer = text(template && template.backer);\n    if (!projectId && !designId && !designNumber) return false;\n    window.BG_DESIGNER_LAUNCH_PROVIDER = 'pitchprint';\n    window.BG_DESIGNER_DEFAULT_PROVIDER = 'pitchprint';\n    window.designIDFromTemplatePage = designId;\n    window.designNumberFromTemplatePage = designNumber;\n    window.ppDesignID = designId;\n    window.ppDesignNumber = designNumber;\n    window.selectedTemplateBackerFromPicker = backer;\n    window.designSelectedBacker = normalizePitchPrintLegacyBacker(backer);\n    window.triggerDesignIDFlag = !reopenSavedProject;\n    window.designLoadedByIDNotSaved = !reopenSavedProject;\n    window.loadDesignByIDFlag = !reopenSavedProject;\n    window.templateModalCustomizeClicked = !reopenSavedProject;\n    window.pitchProjectSaved = reopenSavedProject;\n    window.isEditService = false;\n    if (window.ppclient && window.ppclient._vars) {\n      window.ppclient._vars.mode = clientMode;\n      window.ppclient._vars.projectId = projectId || '';\n      window.ppclient._vars.designId = designId || '';\n      window.ppclient._vars.type = text(window.ppclient._vars.type || 'p');\n      window.ppclient._vars.displayMode = text(window.ppclient._vars.displayMode || 'modal');\n      if (!Number(window.ppclient._vars.numPages)) window.ppclient._vars.numPages = 1;\n      window.ppclient._vars.product = buildPitchPrintClientProductPayload(store, window.ppclient._vars.product);\n    }\n    if (window.ppclient && window.ppclient.vars) {\n      window.ppclient.vars.mode = clientMode;\n      window.ppclient.vars.projectId = projectId || '';\n      window.ppclient.vars.designId = designId || '';\n      window.ppclient.vars.type = text(window.ppclient.vars.type || 'p');\n      window.ppclient.vars.displayMode = text(window.ppclient.vars.displayMode || 'modal');\n      if (!Number(window.ppclient.vars.numPages)) window.ppclient.vars.numPages = 1;\n      window.ppclient.vars.product = buildPitchPrintClientProductPayload(store, window.ppclient.vars.product);\n    }\n    syncPitchPrintProjectInputs(projectId, designNumber);\n    syncPitchPrintReturnContext(store);\n    schedulePitchPrintClientProjectStateSync(store, 24);\n    return true;\n  }\n\n  function replayPitchPrintDesignSelection(designId) {\n    var expectedDesignId = text(designId);\n    if (!expectedDesignId) return false;\n    var client = window.ppclient;\n    if (!client || typeof client.fire !== 'function') return false;\n    if (client._vars) client._vars.designId = expectedDesignId;\n    if (client.vars) client.vars.designId = expectedDesignId;\n    try {\n      client.fire('load-design-by-id', expectedDesignId);\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function reinforcePitchPrintDesignSelection(store) {\n    var designId = text(window.ppDesignID || window.designIDFromTemplatePage || (store.state.template && store.state.template.designId));\n    if (!designId) return;\n    [240, 900, 2200, 4200].forEach(function (delay) {\n      window.setTimeout(function () {\n        replayPitchPrintDesignSelection(designId);\n      }, delay);\n    });\n  }\n\n  function getPitchPrintPreviewUrls(projectId, previewUrl, previews) {\n    var list = Array.isArray(previews) ? previews.map(text).filter(Boolean) : [];\n    var firstPreview = text(previewUrl);\n    if (firstPreview) list.unshift(firstPreview);\n    if (!list.length && projectId) {\n      list.push(buildPitchPrintPreviewFallbackUrl(projectId, 1));\n    }\n    return core.uniqueStrings(list);\n  }\n\n  function prepareRestoredPitchPrintProjectState(store) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    var project = store.state && store.state.project ? store.state.project : {};\n    var designId = text(project.designId || store.state.template && store.state.template.designId);\n    var projectId = text(project.projectId);\n    if (projectId) setPitchPrintRestoreSuppressed(store, false);\n    setPitchPrintReuseState(store, projectId ? 'restored' : '', projectId, designId);\n    syncPitchPrintLaunchGlobals(store, { reopenSavedProject: !!projectId });\n    syncPitchPrintSessionPointer(store);\n    syncFormState(store);\n    return true;\n  }\n\n  function resolvePitchPrintClientConstructor() {\n    if (typeof window.PitchPrintClient === 'function') return window.PitchPrintClient;\n    try {\n      if (typeof PitchPrintClient === 'function') return PitchPrintClient;\n    } catch (_) {}\n    return null;\n  }\n\n  function normalizePitchPrintProductUrl(rawUrl, handle) {\n    var candidate = text(rawUrl || (handle ? '/products/' + handle : window.location.pathname || ''));\n    if (!candidate) return '';\n    if (/^[a-z0-9.-]+\\.[a-z]{2,}(?:\\/|$)/i.test(candidate) && candidate.indexOf('://') === -1 && candidate.charAt(0) !== '/') {\n      candidate = 'https://' + candidate;\n    }\n    try {\n      var url = new URL(candidate, window.location.origin);\n      ['bg_cart_line_key', 'bg_project_id', 'bg_design_id', 'bg_cart_action', 'preview_theme_id', 'cb', '_cb'].forEach(function (key) {\n        url.searchParams.delete(key);\n      });\n      return url.pathname + url.search;\n    } catch (_) {\n      return candidate;\n    }\n  }\n\n  function buildPitchPrintClientProductPayload(store, sourceProduct) {\n    var source = sourceProduct && typeof sourceProduct === 'object' ? Object.assign({}, sourceProduct) : {};\n    var title = text(source.title || source.name || store && store.productData && (store.productData.productName || store.productData.title));\n    var handle = text(source.handle || store && store.config && store.config.handle);\n    var url = normalizePitchPrintProductUrl(source.url, handle);\n    var productId = text(source.id || store && store.config && store.config.productId);\n    if (productId) source.id = productId;\n    if (title) {\n      if (!text(source.title)) source.title = title;\n      if (!text(source.name)) source.name = title;\n    }\n    if (handle && !text(source.handle)) source.handle = handle;\n    if (url) source.url = url;\n    return source;\n  }\n\n  function buildPitchPrintSavedProjectInit(store, baseVars) {\n    var source = baseVars && typeof baseVars === 'object' ? Object.assign({}, baseVars) : {};\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var template = store && store.state && store.state.template ? store.state.template : null;\n    var projectId = text(project.projectId);\n    var designId = text(project.designId || template && template.designId || source.designId || window.ppDesignID);\n    var userId = text(source.userId || window.customerData && window.customerData.id);\n    var numPages = Number(source.numPages || project.numPages || 1);\n    if (!Number.isFinite(numPages) || numPages < 1) numPages = 1;\n    var payload = Object.assign({}, source, {\n      apiKey: text(source.apiKey || window.Shopify && window.Shopify.shop || window.PITCH_APIKEY || ''),\n      projectId: projectId || '',\n      designId: designId || '',\n      mode: projectId ? 'edit' : 'new',\n      type: text(source.type || 'p'),\n      displayMode: text(source.displayMode || 'modal'),\n      pdfDownload: typeof source.pdfDownload === 'boolean' ? source.pdfDownload : false,\n      numPages: numPages,\n      meta: source.meta && typeof source.meta === 'object' ? source.meta : {},\n      product: buildPitchPrintClientProductPayload(store, source.product)\n    });\n    if (userId) payload.userId = userId;\n    return payload;\n  }\n\n  function persistPitchPrintSessionPointer(payload) {\n    var session = payload && typeof payload === 'object' ? Object.assign({}, payload) : {};\n    var product = session.product && typeof session.product === 'object' ? session.product : {};\n    var productId = text(product.id);\n    var projectId = text(session.projectId);\n    if (!productId || !projectId) return false;\n    var storeMap = {};\n    try {\n      storeMap = JSON.parse(window.localStorage.getItem('pprint-sp') || '{}');\n      if (!storeMap || typeof storeMap !== 'object') storeMap = {};\n    } catch (_) {\n      storeMap = {};\n    }\n    storeMap[productId] = session;\n    try {\n      window.localStorage.setItem('pprint-sp', JSON.stringify(storeMap));\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function readPitchPrintSessionPointerMap() {\n    try {\n      var storeMap = JSON.parse(window.localStorage.getItem('pprint-sp') || '{}');\n      return storeMap && typeof storeMap === 'object' ? storeMap : {};\n    } catch (_) {\n      return {};\n    }\n  }\n\n  function normalizePitchPrintPointerPath(value) {\n    var candidate = text(value);\n    if (!candidate) return '';\n    if (/^[a-z0-9.-]+\\.[a-z]{2,}(?:\\/|$)/i.test(candidate) && candidate.indexOf('://') === -1 && candidate.charAt(0) !== '/') {\n      candidate = 'https://' + candidate;\n    }\n    try {\n      var url = new URL(candidate, window.location.origin);\n      return text(url.pathname).replace(/\\/+$/, '');\n    } catch (_) {\n      return candidate.split('?')[0].replace(/\\/+$/, '');\n    }\n  }\n\n  function collectPitchPrintSessionPointerProductIds(store) {\n    var reviewSource = store && store.config && store.config.reviewSource && typeof store.config.reviewSource === 'object'\n      ? store.config.reviewSource\n      : {};\n    var analyticsProduct = window.ShopifyAnalytics\n      && window.ShopifyAnalytics.meta\n      && window.ShopifyAnalytics.meta.product\n      && typeof window.ShopifyAnalytics.meta.product === 'object'\n      ? window.ShopifyAnalytics.meta.product\n      : {};\n    return core.uniqueStrings([\n      text(store && store.config && store.config.productId),\n      text(reviewSource.productId),\n      text(window.__st && window.__st.rid),\n      text(analyticsProduct.id)\n    ]);\n  }\n\n  function pitchPrintPointerMatchesCurrentProduct(store, pointer) {\n    var source = pointer && typeof pointer === 'object' ? pointer : {};\n    var product = source.product && typeof source.product === 'object' ? source.product : {};\n    var productIds = collectPitchPrintSessionPointerProductIds(store);\n    var productId = text(product.id);\n    if (productId && productIds.indexOf(productId) !== -1) return true;\n    var handle = text(product.handle);\n    if (handle && handle === text(store && store.config && store.config.handle)) return true;\n    var pointerPath = normalizePitchPrintPointerPath(product.url);\n    if (!pointerPath) return false;\n    var currentPath = normalizePitchPrintPointerPath(window.location.href);\n    var configPath = normalizePitchPrintPointerPath(store && store.config && store.config.productUrl);\n    return pointerPath === currentPath || pointerPath === configPath;\n  }\n\n  function findPitchPrintSessionPointer(store) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return null;\n    var storeMap = readPitchPrintSessionPointerMap();\n    var productIds = collectPitchPrintSessionPointerProductIds(store);\n    for (var index = 0; index < productIds.length; index += 1) {\n      var direct = storeMap[productIds[index]];\n      if (direct && typeof direct === 'object' && text(direct.projectId || direct.id)) return direct;\n    }\n    var keys = Object.keys(storeMap);\n    for (var keyIndex = 0; keyIndex < keys.length; keyIndex += 1) {\n      var entry = storeMap[keys[keyIndex]];\n      if (!entry || typeof entry !== 'object') continue;\n      if (!text(entry.projectId || entry.id)) continue;\n      if (pitchPrintPointerMatchesCurrentProduct(store, entry)) return entry;\n    }\n    return null;\n  }\n\n  function normalizePitchPrintSessionPointerPayload(pointer) {\n    var source = pointer && typeof pointer === 'object' ? pointer : {};\n    var projectId = text(source.projectId || source.projectID || source.project_id || source.publicId || source.id);\n    if (!projectId) return null;\n    var pages = Number(source.numPages || source.pages || source.pageLength || 0);\n    var previews = Array.isArray(source.previews) ? source.previews.map(text).filter(Boolean) : [];\n    if (!previews.length && Number.isFinite(pages) && pages > 1) {\n      for (var page = 1; page <= Math.min(pages, 8); page += 1) {\n        previews.push(buildPitchPrintPreviewFallbackUrl(projectId, page));\n      }\n    }\n    return {\n      projectId: projectId,\n      designId: text(source.designId || source.designID || source.pitchPrintDesignId),\n      designNumber: text(source.designNumber || source.designnum || source.designNum),\n      previewUrl: text(source.previewUrl || source.preview),\n      previews: previews,\n      product: source.product && typeof source.product === 'object' ? source.product : {},\n      numPages: Number.isFinite(pages) && pages > 0 ? pages : 1\n    };\n  }\n\n  function restoreFromPitchPrintSessionPointer(store) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return Promise.resolve(false);\n    if (hasFreshTemplateUrlHandoffRequest()) return Promise.resolve(false);\n    if (text(store.state && store.state.project && store.state.project.projectId)) return Promise.resolve(false);\n    var pointer = findPitchPrintSessionPointer(store);\n    var payload = normalizePitchPrintSessionPointerPayload(pointer);\n    if (!payload || !payload.projectId) return Promise.resolve(false);\n    // URL-PROJECT-PARAM-ARTWORK-OFF-01: a plain visit that the browser's kept\n    // pointer would turn into a loaded design. The customer asked for\n    // nothing, so nothing is said; the pointer itself is left as it is.\n    if (refuseSavedDesignLanding(store, { silent: true })) return Promise.resolve(false);\n    var restored = applyPitchPrintProjectState(store, payload, { reuseMode: 'session-pointer' });\n    return Promise.resolve(!!restored);\n  }\n\n  function clearPitchPrintSessionPointer(store, projectId) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    var productKeys = core.uniqueStrings([\n      text(store.config && store.config.productId),\n      text(window.ppclient && window.ppclient._vars && window.ppclient._vars.product && window.ppclient._vars.product.id),\n      text(window.ppclient && window.ppclient.vars && window.ppclient.vars.product && window.ppclient.vars.product.id)\n    ]);\n    var targetProjectId = text(projectId);\n    var storeMap = {};\n    var changed = false;\n    try {\n      storeMap = JSON.parse(window.localStorage.getItem('pprint-sp') || '{}');\n      if (!storeMap || typeof storeMap !== 'object') storeMap = {};\n    } catch (_) {\n      storeMap = {};\n    }\n\n    productKeys.forEach(function (key) {\n      if (!key) return;\n      if (!Object.prototype.hasOwnProperty.call(storeMap, key)) return;\n      delete storeMap[key];\n      changed = true;\n    });\n\n    if (targetProjectId) {\n      Object.keys(storeMap).forEach(function (key) {\n        var entry = storeMap[key] && typeof storeMap[key] === 'object' ? storeMap[key] : null;\n        if (text(entry && entry.projectId) !== targetProjectId) return;\n        delete storeMap[key];\n        changed = true;\n      });\n    }\n\n    if (!changed) return false;\n    try {\n      window.localStorage.setItem('pprint-sp', JSON.stringify(storeMap));\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function syncPitchPrintSessionPointer(store, baseVars) {\n    if (!store || !isPitchPrintLaunchProvider(store)) return false;\n    if (!text(store.state && store.state.project && store.state.project.projectId)) return false;\n    var source = baseVars && typeof baseVars === 'object'\n      ? baseVars\n      : (window.ppclient && window.ppclient._vars && typeof window.ppclient._vars === 'object'\n        ? window.ppclient._vars\n        : (window.ppclient && window.ppclient.vars && typeof window.ppclient.vars === 'object'\n          ? window.ppclient.vars\n          : {}));\n    return persistPitchPrintSessionPointer(buildPitchPrintSavedProjectInit(store, source));\n  }\n\n  function reopenPitchPrintSavedProject(store) {\n    if (!store) return false;\n    var project = store.state && store.state.project ? store.state.project : {};\n    var projectId = text(project.projectId);\n    var designId = text(project.designId || store.state.template && store.state.template.designId || window.ppDesignID);\n    var clientMode = projectId ? 'edit' : 'new';\n    var client = window.ppclient || null;\n    var ClientCtor = resolvePitchPrintClientConstructor();\n    var baseVars = client && client._vars && typeof client._vars === 'object'\n      ? Object.assign({}, client._vars)\n      : (client && client.vars && typeof client.vars === 'object'\n        ? Object.assign({}, client.vars)\n        : {});\n    var savedProjectInit = buildPitchPrintSavedProjectInit(store, baseVars);\n\n    persistPitchPrintSessionPointer(savedProjectInit);\n\n    if (typeof ClientCtor === 'function') {\n      try {\n        replacePitchPrintClient(function () {\n          var nextClient = new ClientCtor(savedProjectInit);\n          if (nextClient) {\n            window.ppclient = nextClient;\n            client = nextClient;\n          }\n        });\n      } catch (_) {}\n    }\n\n    if (!client) return false;\n    if (client._vars) {\n      client._vars.mode = clientMode;\n      client._vars.projectId = projectId || '';\n      client._vars.designId = designId || text(client._vars.designId);\n      client._vars.type = text(client._vars.type || 'p');\n      client._vars.displayMode = text(client._vars.displayMode || 'modal');\n      if (!Number(client._vars.numPages)) client._vars.numPages = 1;\n      client._vars.pdfDownload = typeof client._vars.pdfDownload === 'boolean' ? client._vars.pdfDownload : false;\n      client._vars.meta = client._vars.meta && typeof client._vars.meta === 'object' ? client._vars.meta : {};\n      client._vars.product = buildPitchPrintClientProductPayload(store, client._vars.product);\n    }\n    if (client.vars) {\n      client.vars.mode = clientMode;\n      client.vars.projectId = projectId || '';\n      client.vars.designId = designId || text(client.vars.designId);\n      client.vars.type = text(client.vars.type || 'p');\n      client.vars.displayMode = text(client.vars.displayMode || 'modal');\n      if (!Number(client.vars.numPages)) client.vars.numPages = 1;\n      client.vars.pdfDownload = typeof client.vars.pdfDownload === 'boolean' ? client.vars.pdfDownload : false;\n      client.vars.meta = client.vars.meta && typeof client.vars.meta === 'object' ? client.vars.meta : {};\n      client.vars.product = buildPitchPrintClientProductPayload(store, client.vars.product);\n    }\n    schedulePitchPrintClientLifecycleBinding(store, 36);\n    try {\n      if (typeof client.fire === 'function') {\n        window.setTimeout(function () {\n          try {\n            client.fire('show-app');\n          } catch (_) {}\n        }, 3000);\n        return true;\n      }\n      if (typeof client.showApp === 'function') {\n        window.setTimeout(function () {\n          try {\n            client.showApp();\n          } catch (_) {}\n        }, 3000);\n        return true;\n      }\n    } catch (_) {}\n    return false;\n  }\n\n  function applyPitchPrintProjectState(store, payload, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var detail = payload && typeof payload === 'object'\n      ? (payload.data && typeof payload.data === 'object' ? payload.data : payload)\n      : {};\n    var existingProject = store.state && store.state.project ? store.state.project : {};\n    var projectId = text(detail.projectId || detail.projectID || detail.project_id || detail.publicId || detail.selfHostedProjectId || detail.id || existingProject.projectId);\n    var designId = text(detail.designId || detail.designID || detail.pitchPrintDesignId || existingProject.designId || (store.state.template && store.state.template.designId));\n    var designNumber = text(detail.designNumber || detail.designnum || detail.designNum || existingProject.designNumber || (store.state.template && store.state.template.designNumber));\n    if (!projectId) return false;\n    var currentPreviews = readProjectPreviewList(store.state && store.state.project);\n    var hasPayloadPreview = !!text(detail.previewUrl || detail.preview)\n      || (Array.isArray(detail.previews) && detail.previews.map(text).filter(Boolean).length > 0);\n    var previews = hasPayloadPreview\n      ? getPitchPrintPreviewUrls(projectId, detail.previewUrl || detail.preview, detail.previews)\n      : currentPreviews.slice();\n    if (!previews.length && projectId) {\n      previews = getPitchPrintPreviewUrls(projectId, '', []);\n    }\n    var restoredTemplate = findTemplateSelection(\n      store,\n      designId,\n      designNumber,\n      text(detail.backer || detail.backerId || (store.state.template && store.state.template.backer))\n    );\n    setArtworkIntent(store, 'need-design', 'use-template');\n    store.state.approvals.designReviewApproved = false;\n    store.state.project.projectId = projectId;\n    store.state.project.designId = designId;\n    store.state.project.designNumber = designNumber;\n    store.state.project.previewUrl = text(previews[0]);\n    store.state.project.previews = previews;\n    store.state.project.numPages = Number(detail.numPages || detail.pages || detail.pageLength || 0) || store.state.project.numPages || 1;\n    store.state.project.refreshToken = String(Date.now());\n    // The saved design is on the page before its method is committed, so\n    // design online is judged for the saved design, not for the template.\n    commitArtworkChoice(store, { mode: 'designonline', template: restoredTemplate || store.state.template, source: 'restore', preserveProject: true });\n    if (projectId) setPitchPrintRestoreSuppressed(store, false);\n    clearCompletionState(store);\n    setPitchPrintReuseState(store, text(settings.reuseMode) || 'live', projectId, designId);\n    syncPitchPrintProjectInputs(projectId, designNumber);\n    syncPitchPrintReturnContext(store);\n    syncPitchPrintSessionPointer(store);\n    syncFormState(store);\n    setMessage(store, 'Design loaded. Review the item and add it to cart when ready.', 'success');\n    render(store);\n    if (!settings.reuseMode && !store.mobileExperience) scheduleMobileArtworkCardsDetailScroll(store, '.bg-guided-artwork__selected-template, .bg-artwork-vx__detail, .bg-guided-artwork__cards-detail, .bg-guided-workbench__method-expansion, .bg-intent-first__selected-body', 400); // In-page save and close only (a page load restore passes reuseMode); never in a mounted phone layout (App mode, Quick Build), which scrolls its own panel.\n    if (settings.refreshPreview !== false && projectId) {\n      void refreshPitchPrintProjectPreview(store, projectId);\n    }\n    return true;\n  }\n\n  function hasExplicitPitchPrintProjectPayload(payload) {\n    var detail = payload && typeof payload === 'object'\n      ? (payload.data && typeof payload.data === 'object' ? payload.data : payload)\n      : {};\n    return !!text(detail.projectId || detail.projectID || detail.project_id || detail.publicId || detail.selfHostedProjectId);\n  }\n\n  function resetUnsavedPitchPrintCustomizationChoice(store) {\n    if (!store || !store.state) return false;\n    if (text(store.state.project && store.state.project.projectId)) return false;\n    if (text(store.state.artworkMode).toLowerCase() !== 'designonline') return false;\n    var selectedTemplate = store.state.template;\n    clearProjectState(store);\n    writeArtworkTemplate(store, selectedTemplate);\n    setArtworkIntent(store, selectedTemplate ? 'need-design' : '', selectedTemplate ? 'use-template' : '');\n    commitArtworkChoice(store, { mode: '', source: 'clear' });\n    store.state.approvals.designReviewApproved = false;\n    setMessage(store, '', '');\n    syncFormState(store);\n    render(store);\n    return true;\n  }\n\n  function installPitchPrintStorefrontBridge(store) {\n    window.BGDesignerStorefrontPitchPrintBridge = {\n      applySavedProject: function (payload) {\n        return applyPitchPrintProjectState(store, payload);\n      }\n    };\n    installPitchPrintRawSaveCapture();\n  }\n\n  // Binding-independent save capture. The theme's client.on('project-saved') handler is not\n  // reliably bound to the active PitchPrint client instance \u2014 the client gets replaced across\n  // re-inits/relaunches, so the handler can land on an unbound client and a save would then\n  // capture no projectId (no design preview / approval step). Listen for the raw pitchprint.io\n  // project-saved postMessage and route it through the bridge, which always targets the current\n  // store. applyPitchPrintProjectState is idempotent, so this is safe alongside the bound handler.\n  function installPitchPrintRawSaveCapture() {\n    if (window.__bgPitchPrintRawSaveCaptureInstalled) return;\n    window.__bgPitchPrintRawSaveCaptureInstalled = true;\n    window.addEventListener('message', function (event) {\n      try {\n        if (event.origin !== 'https://pitchprint.io') return;\n        var data = event.data;\n        if (typeof data === 'string') {\n          try { data = JSON.parse(data); } catch (_) { return; }\n        }\n        if (!data || data.event !== 'project-saved') return;\n        var value = data.value && typeof data.value === 'object' ? data.value : null;\n        if (!value || !text(value.projectId)) return;\n        var bridge = window.BGDesignerStorefrontPitchPrintBridge;\n        if (!bridge || typeof bridge.applySavedProject !== 'function') return;\n        bridge.applySavedProject({\n          projectId: value.projectId,\n          designId: (window.ppclient && window.ppclient._vars && window.ppclient._vars.designId) || window.ppDesignID || window.designIDFromTemplatePage,\n          designNumber: window.ppDesignNumber || window.designNumberFromTemplatePage,\n          backer: window.selectedTemplateBackerFromPicker,\n          numPages: value.numPages,\n          previews: value.previews,\n          previewUrl: value.previewUrl\n        });\n      } catch (_) {}\n    }, true);\n  }\n\n  function getPitchPrintShopDomain(store) {\n    var configured = text(window.PITCH_APIKEY);\n    if (configured) return configured;\n    try {\n      var host = text(window.location && window.location.hostname).toLowerCase().replace(/^www\\./, '');\n      var pitchprintConfig = window.__siteCfg && window.__siteCfg.pitchprint && typeof window.__siteCfg.pitchprint === 'object'\n        ? window.__siteCfg.pitchprint\n        : {};\n      var hostConfig = pitchprintConfig[host] && typeof pitchprintConfig[host] === 'object'\n        ? pitchprintConfig[host]\n        : null;\n      configured = text(hostConfig && (hostConfig.api_key || hostConfig.apiKey || hostConfig.shop));\n      if (configured) return configured;\n    } catch (_) {}\n    return '';\n  }\n\n  function hasMappedPitchPrintHybridConfig(store) {\n    var mapping = store && store.config && store.config.editorMapping && typeof store.config.editorMapping === 'object'\n      ? store.config.editorMapping\n      : null;\n    return text(mapping && mapping.editorType).toLowerCase().replace(/-/g, '_') === 'pitchprint_hybrid';\n  }\n\n  function getMappedPitchPrintUserId() {\n    try {\n      var stId = text(window.__st && window.__st.cid);\n      if (stId) return stId;\n    } catch (_) {}\n    try {\n      var customerId = text(window.customerData && window.customerData.id);\n      if (customerId) return customerId;\n    } catch (_) {}\n    return 'guest';\n  }\n\n  function createMappedPitchPrintClient(store) {\n    var ClientCtor = resolvePitchPrintClientConstructor();\n    if (typeof ClientCtor !== 'function') return null;\n    var project = store && store.state && store.state.project ? store.state.project : {};\n    var template = store && store.state && store.state.template ? store.state.template : null;\n    var projectId = text(project.projectId);\n    var designId = text(project.designId || template && template.designId || window.ppDesignID);\n    if (!projectId && !designId) return null;\n    var shopDomain = getPitchPrintShopDomain(store);\n    var langCode = 'en';\n    try {\n      langCode = text(document.documentElement && document.documentElement.getAttribute('lang')) || 'en';\n    } catch (_) {}\n    var client = new ClientCtor(buildPitchPrintSavedProjectInit(store, {\n      apiKey: shopDomain,\n      userId: getMappedPitchPrintUserId(),\n      langCode: langCode,\n      designId: designId,\n      projectId: projectId,\n      mode: projectId ? 'edit' : 'new',\n      client: 'sp',\n      displayMode: 'modal',\n      createButtons: false,\n      product: buildPitchPrintClientProductPayload(store, {})\n    }));\n    client.__bgDesignerStorefrontMappedPitchPrintClientV1 = '1';\n    window.ppclient = client;\n    bindPitchPrintClientLifecycle(store);\n    schedulePitchPrintClientProjectStateSync(store, 24);\n    return client;\n  }\n\n  function ensurePitchPrintHybridCompatNodes(store) {\n    try {\n      var form = store && store.form\n        ? store.form\n        : (document.querySelector('form[action*=\"/cart/add\"]') || document.querySelector('product-form form') || document.querySelector('form'));\n      var root = document.querySelector('[data-bg-designer-storefront-root]') || form || document.body;\n      if (!root) return false;\n      if (form && !document.getElementById('_pitchprint')) {\n        var projectInput = document.createElement('input');\n        projectInput.type = 'hidden';\n        projectInput.id = '_pitchprint';\n        projectInput.name = 'properties[_pitchprint]';\n        projectInput.value = '';\n        form.appendChild(projectInput);\n      }\n      if (!document.querySelector('._pitchprintdesignnumber input')) {\n        var designWrap = document.createElement('div');\n        designWrap.className = '_pitchprintdesignnumber logStats debug';\n        designWrap.id = 'ppDesignNumber';\n        designWrap.style.display = 'none';\n        designWrap.innerHTML = '' +\n          '<div class=\"\">' +\n            '<label class=\"option-label\">Design #</label>' +\n          '</div>' +\n          '<div class=\"option-type-text\">' +\n            '<input type=\"text\" class=\"text-input option-number-input\" minlength=\"0\" maxlength=\"100\">' +\n          '</div>';\n        root.appendChild(designWrap);\n      }\n      if (!document.getElementById('pitchEditArtworkButtons')) {\n        var previewWrap = document.createElement('div');\n        previewWrap.className = 'optionHolder calculatorButtonsEditArtwork _editArtworkButtons largeLabel hidden';\n        previewWrap.id = 'pitchEditArtworkButtons';\n        previewWrap.style.display = 'none';\n        previewWrap.setAttribute('data-hide-priority', '100');\n        previewWrap.innerHTML = '' +\n          '<label class=\"option-label\">Your Artwork</label>' +\n          '<div class=\"pitchArtworkDesignPreview\"></div>';\n        root.appendChild(previewWrap);\n      }\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function isPitchPrintRuntimeReady(store) {\n    var client = window.ppclient || null;\n    if (client && (typeof client.fire === 'function' || typeof client.showApp === 'function')) return true;\n    if (typeof window.launchDesignFromProductPage === 'function') return true;\n    if (text(store && store.state && store.state.project && store.state.project.projectId)) {\n      return typeof resolvePitchPrintClientConstructor() === 'function';\n    }\n    return typeof resolvePitchPrintClientConstructor() === 'function';\n  }\n\n  function waitForPitchPrintRuntimeReady(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (isPitchPrintRuntimeReady(store)) return Promise.resolve(true);\n    if (remaining <= 0) return Promise.resolve(false);\n    return new Promise(function (resolve) {\n      window.setTimeout(function () {\n        resolve(waitForPitchPrintRuntimeReady(store, remaining - 1));\n      }, 250);\n    });\n  }\n\n  function findPitchPrintRuntimeScript(pattern) {\n    var normalizedPattern = text(pattern);\n    if (!normalizedPattern) return null;\n    return Array.prototype.slice.call(document.querySelectorAll('script[src]')).find(function (script) {\n      return text(script.getAttribute('src') || script.src).indexOf(normalizedPattern) !== -1;\n    }) || null;\n  }\n\n  // BD-B66: the old editor's launch function and a saved-project reopen each\n  // build a new PitchPrint client from the page client's settings. Its\n  // constructor adds the helper scripts the page already ran (a second\n  // file-uploader.js throws \"Identifier 'PitchPrintFileUploader' has already\n  // been declared\"), and the replaced client's hidden editor frame stays in\n  // the page. Build it with those scripts skipped, then drop that frame.\n  function isLoadedPitchPrintHelperScript(node) {\n    if (!node || node.nodeType !== 1 || text(node.tagName).toLowerCase() !== 'script') return false;\n    var src = text(node.getAttribute('src') || node.src);\n    if (src.indexOf('pitchprint.io/rsc/js/file-uploader.js') !== -1) {\n      try {\n        return typeof PitchPrintFileUploader === 'function';\n      } catch (_) {\n        return false;\n      }\n    }\n    if (src.indexOf('pitchprint.io/rsc/js/uploader.js') !== -1) {\n      var jq = window.jQuery;\n      return !!(jq && jq.fn && typeof jq.fn.fileupload === 'function');\n    }\n    return false;\n  }\n\n  function replacePitchPrintClient(build) {\n    var previous = window.ppclient || null;\n    var head = document.head;\n    var hadOwnAppend = !!head && Object.prototype.hasOwnProperty.call(head, 'appendChild');\n    var ownAppend = hadOwnAppend ? head.appendChild : null;\n    if (head) {\n      var append = head.appendChild;\n      head.appendChild = function (node) {\n        if (isLoadedPitchPrintHelperScript(node)) return node;\n        return append.apply(this, arguments);\n      };\n    }\n    try {\n      return build();\n    } finally {\n      if (head) {\n        if (hadOwnAppend) head.appendChild = ownAppend;\n        else delete head.appendChild;\n      }\n      var staleFrame = previous && previous !== window.ppclient && previous._ui && previous._ui.frame;\n      if (staleFrame && staleFrame.parentNode === document.body) document.body.removeChild(staleFrame);\n    }\n  }\n\n  function hasExistingPitchPrintShopifyRuntime() {\n    return !!findPitchPrintRuntimeScript('pitchprint.io/rsc/js/shopify.js');\n  }\n\n  function hasExistingPitchPrintClientRuntime() {\n    return !!findPitchPrintRuntimeScript('pitchprint.io/rsc/js/client.js');\n  }\n\n  function waitForPagePitchPrintRuntime(store, attemptsRemaining) {\n    var remaining = Number(attemptsRemaining || 0);\n    if (isPitchPrintRuntimeReady(store)) return Promise.resolve(true);\n    if (hasExistingPitchPrintShopifyRuntime() || hasExistingPitchPrintClientRuntime()) {\n      return waitForPitchPrintRuntimeReady(store, 32);\n    }\n    if (remaining <= 0 || document.readyState === 'complete') return Promise.resolve(false);\n    return new Promise(function (resolve) {\n      window.setTimeout(function () {\n        resolve(waitForPagePitchPrintRuntime(store, remaining - 1));\n      }, 100);\n    });\n  }\n\n  function loadPitchPrintHybridClient(store) {\n    if (isPitchPrintRuntimeReady(store)) return Promise.resolve(true);\n    if (window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE) return window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE;\n    var useDirectClient = hasMappedPitchPrintHybridConfig(store);\n    var shopDomain = getPitchPrintShopDomain(store);\n    if (!useDirectClient && !shopDomain) return Promise.resolve(false);\n    if (useDirectClient && (document.readyState !== 'complete' || hasExistingPitchPrintShopifyRuntime() || hasExistingPitchPrintClientRuntime())) {\n      window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE = waitForPagePitchPrintRuntime(store, 40).then(function (loaded) {\n        var pageRuntimeExists = hasExistingPitchPrintShopifyRuntime() || hasExistingPitchPrintClientRuntime();\n        window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE = null;\n        if (loaded || pageRuntimeExists) return loaded;\n        return loadPitchPrintHybridClient(store);\n      });\n      return window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE;\n    }\n    var scriptUrl = useDirectClient\n      ? 'https://pitchprint.io/rsc/js/client.js'\n      : 'https://pitchprint.io/rsc/js/shopify.js?shop=' + encodeURIComponent(shopDomain);\n    var scriptPattern = useDirectClient\n      ? 'pitchprint.io/rsc/js/client.js'\n      : 'pitchprint.io/rsc/js/shopify.js';\n    var existing = findPitchPrintRuntimeScript(scriptPattern);\n    window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE = new Promise(function (resolve) {\n      var settled = false;\n      function finish(value) {\n        if (settled) return;\n        settled = true;\n        resolve(!!value);\n      }\n      var script = existing || document.createElement('script');\n      script.async = true;\n      script.setAttribute('data-bg-designer-pitchprint-runtime', '1');\n      script.addEventListener('load', function () {\n        finish(true);\n      }, { once: true });\n      script.addEventListener('error', function () {\n        finish(false);\n      }, { once: true });\n      window.setTimeout(function () {\n        finish(isPitchPrintRuntimeReady(store));\n      }, 7000);\n      if (!existing) {\n        script.src = scriptUrl;\n        (document.head || document.body || document.documentElement).appendChild(script);\n      } else if (isPitchPrintRuntimeReady(store)) {\n        finish(true);\n      }\n    }).then(function (loaded) {\n      if (!loaded) window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE = null;\n      return loaded;\n    });\n    return window.__BG_DESIGNER_PITCHPRINT_CLIENT_PROMISE;\n  }\n\n  function ensurePitchPrintHybridRuntime(store) {\n    ensurePitchPrintHybridCompatNodes(store);\n    window.BG_DESIGNER_LAUNCH_PROVIDER = 'pitchprint';\n    window.BG_DESIGNER_DEFAULT_PROVIDER = 'pitchprint';\n    window.BG_DESIGNER_SELF_HOSTED_PILOT = false;\n    return loadPitchPrintHybridClient(store).then(function () {\n      return waitForPitchPrintRuntimeReady(store, 24);\n    });\n  }\n\n  function launchPitchPrintDesigner(store) {\n    var hasSavedProject = !!text(store && store.state && store.state.project && store.state.project.projectId);\n    if (!syncPitchPrintLaunchGlobals(store, { reopenSavedProject: hasSavedProject })) {\n      setMessage(store, 'This template is not ready for online editing yet. Choose a different template or use our personalization service.', 'error');\n      return Promise.resolve(false);\n    }\n    return new Promise(function (resolve) {\n      var launched = false;\n      try {\n        var launchFn = typeof window.launchDesignFromProductPage === 'function'\n          ? window.launchDesignFromProductPage\n          : null;\n        var baseClient = window.ppclient || null;\n        if (hasSavedProject && canReuseLivePitchPrintClient(store)) {\n          schedulePitchPrintClientLifecycleBinding(store, 36);\n          baseClient.fire('show-app');\n          launched = true;\n        } else if (hasSavedProject && reopenPitchPrintSavedProject(store)) {\n          launched = true;\n        } else\n        if (launchFn && String(launchFn).indexOf('launchFromSelection') === -1) {\n          schedulePitchPrintClientLifecycleBinding(store, 36);\n          replacePitchPrintClient(launchFn);\n          if (!hasSavedProject) {\n            reinforcePitchPrintDesignSelection(store);\n          }\n          launched = true;\n        } else {\n          baseClient = window.ppclient || createMappedPitchPrintClient(store);\n          schedulePitchPrintClientLifecycleBinding(store, 36);\n          if (baseClient && typeof baseClient.fire === 'function') {\n            if (!hasSavedProject && window.ppDesignID) baseClient.fire('load-design-by-id', window.ppDesignID);\n            baseClient.fire('show-app');\n            if (!hasSavedProject) {\n              reinforcePitchPrintDesignSelection(store);\n            }\n            launched = true;\n          }\n        }\n      } catch (_) {\n        launched = false;\n      }\n      if (!launched) {\n        hidePitchPrintLaunchPreloader(store);\n        setMessage(store, 'Customize Online is not ready yet. Please refresh the page and try again.', 'error');\n        resolve(false);\n        return;\n      }\n      resolve(true);\n    });\n  }\n\n  function bindEditorShell(store) {\n    if (getLaunchProvider(store) !== 'self-hosted') return;\n    store.editorShell = core.createEditorShell({\n      config: store.config,\n      source: 'product',\n      overlayId: 'bg-designer-editor-shell-' + core.slugify(store.config.handle),\n      loadingCopy: 'Loading designer\u2026',\n      navigate: function (url) { window.location.assign(prepareMobileArtworkNavigation(store, url)); },\n      // Phone-class top-level launch (MOBILE-DTC-PARITY-01): the PDP unloads,\n      // so stash the form-owned commerce state (quantity/options/apparel/\n      // EDDM) for the marker return's auto-add. No-op unless the product's\n      // resolved directToCart flag is on.\n      onBeforeTopLevelLaunchNavigate: function () {\n        writeDirectToCartLaunchStash(store);\n      },\n      onProjectSaved: function (detail) {\n        if (!acceptArtworkEditorCompletion(store, detail)) return;\n        // A save (including the copy-and-convert copy) settles the project\n        // pointer; the conversion request never re-launches.\n        store.pendingStyleConversion = null;\n        store.state.project.projectId = text(detail.projectId || store.state.project.projectId);\n        if (store.state.project.projectId) {\n          // The saved document may have changed: forget the artwork truth\n          // until the record read below re-derives it (EDITOR-LANES-EMPTY-SAVE-01).\n          store.state.project.hasArtwork = undefined;\n          dropStoredProjectArtworkTruth(store.state.project.projectId);\n          store.previewHydrateAttemptKey = store.state.project.projectId;\n          // An editor save takes ownership of the design \u2014 guided refills\n          // rebuild from the template and would clobber the editor work.\n          disarmGuidedFill(store);\n          store.state.guidedFillProjectId = '';\n          store.state.project.designId = text(detail.designId || store.state.project.designId || (store.state.template && store.state.template.designId));\n          store.state.project.designNumber = text(detail.designNumber || store.state.project.designNumber || (store.state.template && store.state.template.designNumber));\n          store.state.project.numPages = Number(detail.numPages || detail.pages || detail.pageCount || detail.pageLength || store.state.project.numPages || 0) || 0;\n          store.state.project.refreshToken = String(Date.now());\n          clearCompletionState(store);\n          syncFormState(store);\n          recordArtworkEditorOperation(store);\n          void refreshProjectPreview(store, store.state.project.projectId).finally(function () {\n            render(store);\n          });\n        }\n      },\n      onLifecycleEvent: function (event, detail) {\n        // Editor Templates rail: keep the product page's size selection and\n        // price in step with the template the customer switched to.\n        if (event === 'template-switched' && acceptArtworkEditorCompletion(store, detail)) {\n          applyEditorTemplateSwitch(store, detail);\n          recordArtworkEditorOperation(store);\n        }\n      },\n      // Stage 2 S6 (ECO-SIGNS-04): the editor executed a cross-product move.\n      // Navigate to the moved product's page carrying the saved design and\n      // the configuration session; that page restores the design, reads the\n      // session state, and auto-reopens the editor.\n      onRelaunchProduct: function (detail) {\n        var movedHandle = text(detail && detail.productHandle);\n        if (!movedHandle) return;\n        try {\n          var movedUrl = new URL('/products/' + encodeURIComponent(movedHandle.replace(/^\\/+/, '')), window.location.origin);\n          var movedProjectId = text(detail.projectId);\n          if (movedProjectId) {\n            movedUrl.searchParams.set('bg_saved_project_id', movedProjectId);\n            movedUrl.searchParams.set('bg_saved_source', 'product-move');\n            movedUrl.searchParams.set('bg_template_action', 'customize_online');\n          }\n          var movedSessionId = text(detail.configurationSessionId);\n          if (movedSessionId) movedUrl.searchParams.set('bgConfigurationSession', movedSessionId);\n          window.location.assign(movedUrl.toString());\n        } catch (_) { /* the safety-net close lane still routes correctly */ }\n      },\n      onClose: function (detail) {\n        if (!acceptArtworkEditorCompletion(store, detail)) return;\n        if (store.mobileArtworkLaunch) {\n          var artworkApproved = detail.action === 'next' || text(detail.completionDestination) === 'add-to-cart';\n          settleMobileArtworkLaunch(store, artworkApproved);\n          if (!artworkApproved) return;\n        }\n        store.pendingStyleConversion = null;\n        // S4 flow-back (ADR-021): the close hands back the Configuration\n        // Session; a planner-mutated session re-renders this page's options,\n        // price, and add state from the server truth.\n        var closeConfigurationSessionId = text(detail.configurationSessionId);\n        if (closeConfigurationSessionId) {\n          rememberDesignerConfigurationSession(store, closeConfigurationSessionId);\n        }\n        var projectId = text(detail.projectId || (store.state.project && store.state.project.projectId));\n        if (!projectId) {\n          if (closeConfigurationSessionId) {\n            void syncProductStateFromConfigurationSession(store, closeConfigurationSessionId);\n          }\n          render(store);\n          return;\n        }\n        disarmGuidedFill(store);\n        store.state.guidedFillProjectId = '';\n        store.state.project.projectId = projectId;\n        // A save inside the editor may not have reached this page (export-only\n        // saves stay silent): forget the artwork truth until the record read\n        // below re-derives it (EDITOR-LANES-EMPTY-SAVE-01).\n        store.state.project.hasArtwork = undefined;\n        dropStoredProjectArtworkTruth(projectId);\n        store.previewHydrateAttemptKey = projectId;\n        store.state.project.designId = text(detail.designId || store.state.project.designId || (store.state.template && store.state.template.designId));\n        store.state.project.designNumber = text(detail.designNumber || store.state.project.designNumber || (store.state.template && store.state.template.designNumber));\n        store.state.project.numPages = Number(detail.numPages || detail.pages || detail.pageCount || detail.pageLength || store.state.project.numPages || 0) || 0;\n        clearCompletionState(store);\n        recordArtworkEditorOperation(store);\n        var closeOperation = store.artworkEditorOperation;\n        // The session the editor hands back is the customer's own choice\n        // there: once applied, it is the configuration this close continues.\n        function adoptCloseSession(applied) {\n          if (!applied) return;\n          recordArtworkEditorOperation(store);\n          closeOperation = store.artworkEditorOperation;\n        }\n        // Pass-through direct cart (Decision A): an approved design whose\n        // launch carried completionDestination=add-to-cart runs the existing\n        // signed add corridor and lands on the cart page \u2014 no product-page\n        // stop. Claiming the close ({ deferShellClose: true }) keeps the\n        // editor overlay open over the product page while the corridor runs;\n        // failures are posted back into the editor overlay. Cart-line edit\n        // sessions and non-designonline artwork lanes keep the classic close.\n        if (\n          text(detail.completionDestination) === 'add-to-cart'\n          && text(store.state.artworkMode).toLowerCase() === 'designonline'\n          && !text(store.editingLineKey)\n        ) {\n          // Duplicate storefront:close messages (postMessage + same-origin\n          // fallback both fire) must not double-run the add corridor.\n          if (!store.activeDirectToCartAdd) {\n            if (closeConfigurationSessionId) {\n              // Apply the transitioned session before the corridor submits so\n              // the cart line carries the new options/quantity; a failed\n              // readback degrades to today's state and never blocks the add.\n              void syncProductStateFromConfigurationSession(store, closeConfigurationSessionId)\n                .then(adoptCloseSession, function () {})\n                .then(function () {\n                  if (stopHeldDirectAdd(store, true)) return;\n                  if (isArtworkOperationFresh(store, closeOperation)) return void completeDirectToCartClose(store, projectId);\n                  // The page changed while the session was read: the editor\n                  // stays open, so it is told why nothing was added.\n                  var sentence = store.artworkChoiceNotice || artworkStaleMessage;\n                  setMessage(store, sentence, 'error');\n                  notifyDirectToCartResult(store, { ok: false, message: sentence });\n                });\n            } else {\n              void completeDirectToCartClose(store, projectId);\n            }\n          }\n          return { deferShellClose: true };\n        }\n        var closeSync = closeConfigurationSessionId\n          ? syncProductStateFromConfigurationSession(store, closeConfigurationSessionId).then(adoptCloseSession, function () {})\n          : Promise.resolve(false);\n        void closeSync.finally(function () {\n          if (!isArtworkOperationFresh(store, closeOperation)) return;\n          void refreshProjectPreview(store, projectId).finally(function () {\n            render(store);\n          });\n        });\n      }\n    });\n  }\n\n  function readCartLineRestorePayload(line) {\n    var properties = line && line.properties && typeof line.properties === 'object' ? line.properties : {};\n    var legacyPayload = parseJson(properties._bg_designer_state_v1, null);\n    if (legacyPayload && typeof legacyPayload === 'object') return Promise.resolve(legacyPayload);\n    var contextId = text(properties._bg_context_id || properties['_Context ID'] || properties['Context ID'] || properties['QPS Context ID']);\n    if (contextId && core && typeof core.fetchCommerceContext === 'function' && typeof core.readCommerceContextFullState === 'function') {\n      return core.fetchCommerceContext(contextId).then(function (context) {\n        return core.readCommerceContextFullState(context);\n      });\n    }\n    if (core && typeof core.readDesignerStateFromProperties === 'function') {\n      return Promise.resolve(core.readDesignerStateFromProperties(properties));\n    }\n    return Promise.resolve(null);\n  }\n\n  // The saved design a cart-line restore would place in page state (the same\n  // fields, in the same order, as the restore below reads them).\n  function readCartLineSavedDesignId(payload, line) {\n    var properties = line && line.properties && typeof line.properties === 'object' ? line.properties : {};\n    var project = payload && payload.project && typeof payload.project === 'object' ? payload.project : {};\n    return text(project.projectId || properties['Project ID'] || properties._pitchprint);\n  }\n\n  function clearCartLineRestoreParams() {\n    try {\n      var cleanUrl = new URL(window.location.href);\n      cleanUrl.searchParams.delete('bg_cart_line_key');\n      cleanUrl.searchParams.delete('bg_project_id');\n      cleanUrl.searchParams.delete('bg_design_id');\n      cleanUrl.searchParams.delete('bg_cart_action');\n      window.history.replaceState({}, document.title, cleanUrl.toString());\n    } catch (_) {}\n  }\n\n  var CART_LINE_DESIGN_NOT_SHOWN_MESSAGE = 'We could not open that cart item here because this page no longer shows its design. It is still in your cart, unchanged.';\n\n  // CARTLINE-RESTORE-ARTWORK-OFF-01: \"Update cart item\" replaces the whole\n  // property set of the line it edits, so a design restored where the page\n  // cannot show it would ride that update unseen, and a restore without it\n  // would drop it from the customer's line. The line is therefore not\n  // restored at all: no edit mode, no state moved, the page is a fresh visit\n  // (its Add to cart adds a separate line) and the cart line stays as it is.\n  // The sentence rides the boot render the way a refused saved design does.\n  function rejectCartLineRestore(store, message) {\n    var refusal = text(message) || CART_LINE_DESIGN_NOT_SHOWN_MESSAGE;\n    store.pendingUrlStateErrorMessage = refusal;\n    setMessage(store, refusal, 'error');\n    clearCartLineRestoreParams();\n    return false;\n  }\n\n  // CARTLINE-RESTORE-UPLOADS-01: \"Update cart item\" replaces the whole\n  // property set of the line, so the files the customer uploaded for that\n  // line must be in page state again before the page can update it. The line\n  // already names them (_bg_uploaded_file_N_url / _name, in N order), and its\n  // serialized state holds each file's full record (upload reference, type,\n  // size) under the upload field it was added through. Nothing is uploaded or\n  // fetched again. Slot-fill files are never line properties, so they are\n  // never read here.\n  var CART_LINE_UPLOAD_URL_PROPERTY = /^_bg_uploaded_file_(\\d+)_url$/;\n  var CART_LINE_UPLOAD_ORIGIN_READ_TIMEOUT_MS = 8000;\n  var CART_LINE_UPLOADS_NOT_CHECKED_MESSAGE = 'We could not open that cart item here because we could not check its uploaded files. It is still in your cart, unchanged.';\n\n  function readCartLineUploadedFiles(store, payload, line) {\n    var properties = line && line.properties && typeof line.properties === 'object' ? line.properties : {};\n    var recordsByUrl = Object.create(null);\n    (Array.isArray(payload && payload.uploads) ? payload.uploads : []).forEach(function (entry) {\n      var fieldId = text(entry && entry.id);\n      (Array.isArray(entry && entry.files) ? entry.files : []).forEach(function (file) {\n        var recordUrl = text(file && (file.publicUrl || file.url));\n        if (fieldId && recordUrl && !recordsByUrl[recordUrl]) recordsByUrl[recordUrl] = { fieldId: fieldId, file: file };\n      });\n    });\n    // A file shows where this page draws that upload field today; a field the\n    // product no longer has falls back to the page's own artwork upload field.\n    // A detail field (a QR code file, a mailing list) keeps its own id, so the\n    // file never turns into an artwork file on an update.\n    var pageFieldIds = normalizeUploadFields(store.binding).map(function (field) { return field.id; });\n    var knownFieldIds = pageFieldIds.concat([ARTWORK_OPTION_SUPPORTING_UPLOAD_FIELD_ID]);\n    return Object.keys(properties).map(function (key) {\n      var match = CART_LINE_UPLOAD_URL_PROPERTY.exec(key);\n      var url = match ? text(properties[key]) : '';\n      if (!url) return null;\n      var record = recordsByUrl[url] || {};\n      var source = record.file && typeof record.file === 'object' ? record.file : {};\n      var lineName = text(properties['_bg_uploaded_file_' + match[1] + '_name']);\n      return {\n        order: Number(match[1]),\n        url: url,\n        fieldId: knownFieldIds.indexOf(record.fieldId) === -1 && !findDetailUploadField(store, record.fieldId) ? pageFieldIds[0] : record.fieldId,\n        name: text(source.name || source.fileName) || lineName || 'Uploaded file',\n        fileName: text(source.fileName || source.name) || lineName || 'Uploaded file',\n        uploadRef: text(source.uploadRef),\n        contentType: text(source.contentType),\n        byteSize: Math.max(0, Number(source.byteSize || 0) || 0),\n        storageTarget: text(source.storageTarget)\n      };\n    }).filter(Boolean).sort(function (a, b) {\n      return a.order - b.order;\n    });\n  }\n\n  // The add path takes an upload's link from one place only: the answer of\n  // the store's own designer service (bootstrap apiBaseUrl), which signs the\n  // link on its own origin. A cart line is customer-editable, so a restored\n  // link is held to that same origin; anything else is not this store's file.\n  function readStoreUploadOrigin(bootstrap) {\n    try {\n      var parsed = new URL(getDesignerApiBaseUrlFromBootstrap(bootstrap));\n      return parsed.protocol === 'https:' ? parsed.origin : '';\n    } catch (_) {\n      return '';\n    }\n  }\n\n  var STORE_UPLOAD_CONTENT_PATH = '/api/storefront/uploads/content/';\n\n  function isStoreUploadUrl(url, uploadOrigin) {\n    if (!uploadOrigin) return false;\n    try {\n      var parsed = new URL(text(url));\n      return parsed.protocol === 'https:' && !parsed.username && !parsed.password && parsed.origin === uploadOrigin\n        && parsed.pathname.indexOf(STORE_UPLOAD_CONTENT_PATH) === 0 && parsed.pathname.length > STORE_UPLOAD_CONTENT_PATH.length\n        && !!text(parsed.searchParams.get('cap'));\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function restoreCartLineUploadedFiles(store, lineUploads) {\n    clearEveryUploadState(store);\n    // A restored detail file follows its field only once this page draws the\n    // field after the restore (isCarriedCartLineUpload).\n    store.detailUploadFieldsDrawn = {};\n    lineUploads.forEach(function (entry) {\n      uploadFileClientSequence += 1;\n      var files = store.state.uploads[entry.fieldId] || [];\n      files.push({\n        clientId: 'bg-upload-file-' + String(uploadFileClientSequence),\n        name: entry.name,\n        fileName: entry.fileName,\n        uploadRef: entry.uploadRef,\n        url: entry.url,\n        publicUrl: entry.url,\n        contentType: entry.contentType,\n        byteSize: entry.byteSize,\n        storageTarget: entry.storageTarget,\n        uploadFailed: false,\n        uploading: false,\n        cartLineUpload: true\n      });\n      store.state.uploads[entry.fieldId] = files;\n    });\n  }\n\n  function restoreFromCartLine(store) {\n    var params = new URLSearchParams(window.location.search || '');\n    var lineKey = text(params.get('bg_cart_line_key'));\n    var projectId = text(params.get('bg_project_id'));\n    var designId = text(params.get('bg_design_id'));\n    var cartAction = text(params.get('bg_cart_action')).toLowerCase();\n    if (!lineKey && !projectId && !designId) return Promise.resolve(false);\n    var operation = captureArtworkOperation(store);\n    return core.fetchCartState().then(function (cart) {\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      var line = core.findLineByKey(cart, lineKey);\n      if (!line) {\n        var items = cart && Array.isArray(cart.items) ? cart.items : [];\n        line = items.find(function (item) {\n          var props = item && item.properties && typeof item.properties === 'object' ? item.properties : {};\n          if (text(props._bg_designer_handle) && text(props._bg_designer_handle) !== text(store.config.handle)) return false;\n          if (projectId && text(props['Project ID']) === projectId) return true;\n          if (!projectId && designId && text(props['_Design ID'] || props['Design ID']) === designId) return true;\n          return false;\n        }) || null;\n      }\n      if (!line) return false;\n      line.properties = line.properties && typeof line.properties === 'object' ? line.properties : {};\n      return readCartLineRestorePayload(line).then(async function (payload) {\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      if (!payload && core.isNativeChannelOfferLine && core.isNativeChannelOfferLine(line)) {\n        var nativeOffer = core.findChannelOfferByVariant(store.channelCatalog, text(line.variant_id || line.id));\n        if (text(line.product_id) !== text(store.config.productId) || !nativeOffer) {\n          store.channelOfferVerificationFailed = true;\n          store.pendingChannelOfferNotice = 'This package cannot be edited here. Return to your cart to review the original item.';\n          return false;\n        }\n        payload = { handle: store.config.handle,\n          channelOffer: Object.assign({}, nativeOffer, { mode: 'native' }),\n          printQuantity: nativeOffer.packageQuantity,\n          optionSelections: Object.keys(nativeOffer.selections).map(function (holderId) {\n            return { holderId: holderId, valueId: nativeOffer.selections[holderId] };\n          }),\n          artworkMode: nativeOffer.designIncluded ? 'customdesign' : 'youhaveart',\n          quantityMode: nativeOffer.collectSizesAfterOrder ? 'apparelMatrix' : '', apparelSizes: {},\n        };\n      }\n      if (!payload || text(payload.handle) !== text(store.config.handle)) return false;\n      if (isPageWithoutSavedDesignSurface(store) && readCartLineSavedDesignId(payload, line)) {\n        return rejectCartLineRestore(store);\n      }\n      // CARTLINE-RESTORE-UPLOADS-01: a line whose files cannot all be held to\n      // the store's upload origin is not opened at all (the refusal shape of\n      // CARTLINE-RESTORE-ARTWORK-OFF-01): the page never writes a link it\n      // cannot vouch for, and it never updates the line without one of its\n      // files. The session bootstrap is the page's own stored answer; it is\n      // read over the network only when this page view has none yet.\n      var lineUploads = readCartLineUploadedFiles(store, payload, line);\n      if (lineUploads.length) {\n        var originReadTimer = 0;\n        var originReadLimitMs = Number(window.__bgCartLineUploadOriginReadTimeoutMs) > 0\n          ? Number(window.__bgCartLineUploadOriginReadTimeoutMs)\n          : CART_LINE_UPLOAD_ORIGIN_READ_TIMEOUT_MS;\n        var uploadOrigin = readStoreUploadOrigin(await Promise.race([\n          ensureDesignerBootstrapLoaded(store),\n          new Promise(function (resolve) {\n            originReadTimer = window.setTimeout(function () { resolve(null); }, originReadLimitMs);\n          })\n        ]));\n        window.clearTimeout(originReadTimer);\n        var everyUploadIsTheStoresOwn = lineUploads.every(function (entry) {\n          return isStoreUploadUrl(entry.url, uploadOrigin);\n        });\n        if (!isArtworkOperationFresh(store, operation)) return false;\n        if (!everyUploadIsTheStoresOwn) return rejectCartLineRestore(store, CART_LINE_UPLOADS_NOT_CHECKED_MESSAGE);\n      }\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      var offerDraft = artworkConfigurationDraft(store, {});\n      await resolveChannelOfferOrigin(offerDraft, payload.channelOffer);\n      if (!isArtworkOperationFresh(store, operation)) return false;\n      store.state.channelOffer = offerDraft.state.channelOffer;\n      store.resolvedChannelOfferOrigin = offerDraft.resolvedChannelOfferOrigin;\n      store.channelOfferVerificationFailed = offerDraft.channelOfferVerificationFailed;\n      var restoredProvider = readLaunchProviderCandidate(\n        text(payload.launchProvider || payload.project && payload.project.provider || line.properties._bg_designer_provider)\n      );\n      if (restoredProvider) {\n        store.config.launchProvider = restoredProvider;\n        window.BG_DESIGNER_LAUNCH_PROVIDER = restoredProvider;\n        window.BG_DESIGNER_DEFAULT_PROVIDER = restoredProvider;\n      }\n      store.editingLineVariantId = text(line.variant_id || line.id);\n      store.editingLineQuantity = Math.max(1, Number(line.quantity) || 1);\n      store.editingLineSku = text(line.sku);\n      store.editingLineKey = text(line.key || lineKey);\n      store.editingLineFingerprint = artworkCartLineFingerprint(line);\n      store.pendingCartReturnAction = cartAction === 'edit_design' ? cartAction : '';\n      var selections = Array.isArray(payload.optionSelections) ? payload.optionSelections : [];\n      var proposedSelections = Object.assign({}, store.state.selections);\n      store.holders.forEach(function (holder) {\n        var selection = selections.find(function (entry) {\n          return text(entry && entry.holderId) === getHolderId(holder)\n            || text(entry && entry.holderHtmlId) === text(holder.htmlID);\n        });\n        if (!selection) return;\n        var matched = findValueByMatchers(holder, selection);\n        if (matched) {\n          proposedSelections[getHolderId(holder)] = text(matched.hvId);\n        }\n      });\n      store.state.quantity = Number(numberValue(payload.printQuantity, store.state.quantity || 0));\n      store.state.quantityMode = text(payload.quantityMode);\n      store.state.typedQuantity = Number(numberValue(payload.typedQuantity || payload.typedQty, store.state.quantity || 0));\n      store.state.paidPrintQuantity = Number(numberValue(payload.paidPrintQty || payload.paidPrintQuantity, store.state.quantity || 0));\n      store.state.apparelSizesInitialized = text(payload.quantityMode) === 'apparelMatrix';\n      store.state.apparelSizes = core.normalizeApparelSizes ? core.normalizeApparelSizes(payload.apparelSizes) : {};\n      store.state.sizeSurchargeTotal = Number(numberValue(payload.sizeSurchargeTotal, 0) || 0);\n      store.state.eddm = payload.eddm && typeof payload.eddm === 'object'\n        ? Object.assign(buildDefaultEddmState(), {\n          provider: text(payload.eddm.provider),\n          dataVersion: text(payload.eddm.dataVersion),\n          routeGroupUuid: text(payload.eddm.routeGroupUuid),\n          targetInMailboxDate: text(payload.eddm.targetInMailboxDate),\n          routesSelected: !!payload.eddm.routesSelected,\n          selectedRouteCount: Number(payload.eddm.selectedRouteCount || 0) || 0,\n          residentialAddresses: Number(payload.eddm.residentialAddresses || 0) || 0,\n          businessAddresses: Number(payload.eddm.businessAddresses || 0) || 0,\n          totalAddresses: Number(payload.eddm.totalAddresses || 0) || 0,\n          residentialOnly: !!payload.eddm.residentialOnly,\n          politicalMailer: !!payload.eddm.politicalMailer,\n          routeDetails: text(payload.eddm.routeDetails),\n          selectedRoutes: Array.isArray(payload.eddm.selectedRoutes) ? payload.eddm.selectedRoutes : []\n        })\n        : buildDefaultEddmState();\n      var restoredMode = core.normalizeArtworkMode(payload.artworkMode || (line.properties && line.properties.Artwork));\n      store.state.canvaUrl = text(payload.canvaUrl || (line.properties && line.properties['Canva Link']));\n      if (lineUploads.length) restoreCartLineUploadedFiles(store, lineUploads);\n      store.state.extraInputs.qrCodeLink = text(line.properties['QR Code Link']);\n      store.state.extraInputs.imprintInformation = text(line.properties['Imprint Information']);\n      var restoredCustomerInputs = Array.isArray(payload.customerInputs) ? payload.customerInputs : [];\n      getCustomerInputConfig(store).fields.forEach(function (field) {\n        var restoredEntry = restoredCustomerInputs.find(function (entry) {\n          return text(entry && entry.id) === field.id;\n        });\n        var fallbackValue = line.properties && line.properties[field.label];\n        store.state.customerInputs[field.id] = field.type === 'checkbox'\n          ? Boolean(restoredEntry ? restoredEntry.value === true : text(fallbackValue).toLowerCase() === 'yes')\n          : String(restoredEntry ? restoredEntry.value : (fallbackValue == null ? '' : fallbackValue)).slice(0, 1000);\n      });\n      var restoredApprovals = payload.approvals && typeof payload.approvals === 'object' && !Array.isArray(payload.approvals) ? payload.approvals : {};\n      store.state.approvals.designReviewApproved = restoredApprovals.designReviewApproved === true;\n      store.state.approvals.customDesignApproved = restoredApprovals.customDesignApproved === true;\n      var restoredTemplate = store.state.template;\n      if (payload.template) {\n        restoredTemplate = findTemplateSelection(\n          store,\n          text(payload.template.designId),\n          text(payload.template.designNumber),\n          text(payload.template.backer)\n        );\n      }\n      var artworkHolder = getConfiguredArtworkMethodHolder(store);\n      var restored = commitArtworkConfiguration(store, { selections: proposedSelections, template: restoredTemplate, artworkMode: restoredMode },\n        { source: 'restore', preserveProject: true, quoted: artworkHolder ? { option: proposedSelections[getHolderId(artworkHolder)] } : null });\n      if (restored.status === 'refused') return false;\n      store.state.project = payload.project ? {\n        projectId: text(payload.project.projectId || line.properties['Project ID'] || line.properties._pitchprint),\n        designId: text(payload.project.designId || line.properties['_Design ID'] || line.properties['Design ID']),\n        designNumber: text(payload.project.designNumber || line.properties['Design #']),\n        title: text(payload.project.title || payload.project.name || payload.project.designTitle),\n        updatedAt: text(payload.project.updatedAt || payload.project.lastEditedAt || payload.project.modifiedAt),\n        documentOrientation: text(payload.project.documentOrientation),\n        previewUrl: text(payload.project.previewUrl),\n        previews: Array.isArray(payload.project.previews) ? payload.project.previews.map(text).filter(Boolean) : [],\n        numPages: Number(payload.project.numPages || 0) || 0,\n        // EDITOR-LANES-EMPTY-SAVE-01: a cart line's saved design keeps its\n        // settled artwork truth so the line can be updated after a cache\n        // eviction (boolean only).\n        hasArtwork: typeof payload.project.hasArtwork === 'boolean' ? payload.project.hasArtwork : undefined,\n        refreshToken: text(payload.project.refreshToken)\n      } : {\n        projectId: text(line.properties['Project ID'] || line.properties._pitchprint),\n        designId: text(line.properties['_Design ID'] || line.properties['Design ID']),\n        designNumber: text(line.properties['Design #']),\n        title: '',\n        updatedAt: '',\n        previewUrl: '',\n        previews: [],\n        numPages: 0,\n        refreshToken: ''\n      };\n      if (isPitchPrintLaunchProvider(store)) {\n        var restoredPreviews = getPitchPrintPreviewUrls(\n          text(store.state.project.projectId),\n          text(store.state.project.previewUrl),\n          store.state.project.previews\n        );\n        store.state.project.previewUrl = text(restoredPreviews[0]);\n        store.state.project.previews = restoredPreviews;\n        if (!text(store.state.project.refreshToken)) {\n          store.state.project.refreshToken = String(Date.now());\n        }\n      }\n      store.state.completion = core.normalizeCompletionState(payload.completion) || store.state.completion;\n      if (payload.guidedFill && typeof payload.guidedFill === 'object') {\n        // Guest page loads mint a fresh sessionId, so the server can never\n        // re-authorize a prior guest session's project for a refill \u2014 only\n        // logged-in customers re-arm the guided panel on cart edit; guests\n        // keep the restored project and replace photos through the editor.\n        if (payload.guidedFill.armed === true && isCustomerLoggedIn(store)) {\n          store.state.guidedFillArmed = true;\n          store.state.guidedFillProjectId = text(payload.guidedFill.projectId);\n        } else {\n          store.state.guidedFillArmed = false;\n          store.state.guidedFillProjectId = '';\n        }\n        store.guidedSlotFillRequestKey = '';\n      }\n      if (isPitchPrintLaunchProvider(store)) {\n        prepareRestoredPitchPrintProjectState(store);\n      }\n      syncFormState(store);\n      clearCartLineRestoreParams();\n      return true;\n      });\n    }).catch(function () {\n      return false;\n    });\n  }\n\n  function readProjectStorefrontBinding(project) {\n    var source = project && typeof project === 'object' ? project : {};\n    var metadata = source.metadata && typeof source.metadata === 'object' ? source.metadata : {};\n    var documentValue = source.document && typeof source.document === 'object' ? source.document : {};\n    var documentMetadata = documentValue.metadata && typeof documentValue.metadata === 'object'\n      ? documentValue.metadata\n      : {};\n    var directBinding = source.storefrontBinding && typeof source.storefrontBinding === 'object'\n      ? source.storefrontBinding\n      : {};\n    var summarySelection = source.selection && typeof source.selection === 'object'\n      ? source.selection\n      : {};\n    var summaryBinding = {\n      productId: text(source.productId),\n      productHandle: text(source.productHandle),\n      templateLookup: text(source.templateLookup),\n      templateTitle: text(source.templateTitle),\n      selection: summarySelection\n    };\n    var binding = metadata.storefrontBinding && typeof metadata.storefrontBinding === 'object'\n      ? metadata.storefrontBinding\n      : (documentMetadata.storefrontBinding && typeof documentMetadata.storefrontBinding === 'object'\n        ? documentMetadata.storefrontBinding\n        : (Object.keys(directBinding).length ? directBinding : summaryBinding));\n    return binding && typeof binding === 'object' ? binding : {};\n  }\n\n  function readLegacyProjectPayload(project) {\n    var source = project && typeof project === 'object' ? project : {};\n    var legacy = source.document && source.document.legacy && typeof source.document.legacy === 'object'\n      ? source.document.legacy\n      : {};\n    return legacy && typeof legacy === 'object' ? legacy : {};\n  }\n\n  function normalizeStorefrontProductIdentity(value) {\n    var clean = text(value).trim().toLowerCase();\n    if (!clean) return '';\n    var gidMatch = clean.match(/\\/product\\/([^/?#]+)$/i);\n    return gidMatch ? gidMatch[1] : clean;\n  }\n\n  function savedProjectBindingMatchesStorePage(store, binding) {\n    var savedHandle = text(binding && binding.productHandle).trim().toLowerCase();\n    var currentHandle = text(store && store.config && store.config.handle).trim().toLowerCase();\n    var savedProductId = normalizeStorefrontProductIdentity(binding && binding.productId);\n    var currentProductId = normalizeStorefrontProductIdentity(store && store.config && store.config.productId);\n    if (!savedHandle && !savedProductId) return false;\n    if (savedHandle && (!currentHandle || savedHandle !== currentHandle)) return false;\n    if (savedProductId && (!currentProductId || savedProductId !== currentProductId)) return false;\n    return true;\n  }\n\n  var SAVED_PROJECT_RESUME_UNAVAILABLE_MESSAGE = 'We could not reopen that saved design. Open it again from My Designs.';\n\n  function rejectSavedProjectResume(store, message) {\n    var refusal = text(message) || 'We could not reopen that saved design for this product. Open it again from My Designs.';\n    // PDP-BOUND-SIZE-RESUME-01: the refusal arrives during boot, before the\n    // first full render clears the message row; carry it the way a refused\n    // URL arrival does so the customer reads it instead of a silent default.\n    // PDP-RESUME-MESSAGES-01: the missing-record and failed-resume refusals\n    // ride the same carrier with their own sentence, so every refused\n    // arrival reads its reason. The reorder chooser's RE2 catch clears the\n    // carrier and stays silent.\n    store.pendingUrlStateErrorMessage = refusal;\n    setMessage(store, refusal, 'error');\n    clearSavedProjectResumeParams();\n    return false;\n  }\n\n  // ARCHIVED-BRIDGE-LOOKUP: a saved design's stored lookup is offered only\n  // when a card this page lists (the strict matcher's own candidate set)\n  // carries it. A lookup no page card carries names a retired template: the\n  // template list stopped naming archived Studio templates on its cards.\n  function isTemplateLookupOfferedOnPage(store, lookup) {\n    var cleanLookup = text(lookup);\n    if (!cleanLookup) return false;\n    return (Array.isArray(store.templates) ? store.templates : []).some(function (template) {\n      return templateMatchesStorePage(store, template)\n        && (text(template.templateLookup || template.templatePublicId) === cleanLookup\n          || getTemplateSelectionKey(template) === cleanLookup);\n    });\n  }\n\n  function findTemplateForSavedProject(store, templateLookup, designId, designNumber, backer) {\n    return resolveStrictTemplateCollectionSelection(store, {\n      templateLookup: text(templateLookup),\n      designId: text(designId),\n      designNumber: text(designNumber),\n      backer: text(backer)\n    });\n  }\n\n  function readSavedProjectResumeIdFromParams(params) {\n    var explicitId = text(params && params.get && params.get('bg_saved_project_id'));\n    if (explicitId) return explicitId;\n    var hasTemplateIdentity = !!text(\n      (params && params.get && params.get('templateLookup'))\n      || (params && params.get && params.get('templatePublicId'))\n      || (params && params.get && params.get('templateId'))\n      || (params && params.get && params.get('designnum'))\n      || (params && params.get && params.get('designNumber'))\n      || (params && params.get && params.get('designId'))\n      || (params && params.get && params.get('id'))\n    );\n    if (hasTemplateIdentity) return '';\n    return '';\n  }\n\n  function readSavedProjectPrintQuantity(selection) {\n    var source = selection && typeof selection === 'object' ? selection : {};\n    var numeric = Number(source.printQuantity || source.quantity);\n    if (!Number.isSafeInteger(numeric) || numeric < 1 || numeric > 1000000) return 0;\n    return numeric;\n  }\n\n  function clearSavedProjectResumeParams() {\n    try {\n      var cleanUrl = new URL(window.location.href);\n      var projectId = readSavedProjectResumeIdFromParams(cleanUrl.searchParams);\n      cleanUrl.searchParams.delete('bg_saved_project_id');\n      cleanUrl.searchParams.delete('bg_saved_source');\n      cleanUrl.searchParams.delete('bg_saved_return');\n      cleanUrl.searchParams.delete('bg_reorder_origin');\n      if (isSelfHostedProjectId(projectId)) {\n        cleanUrl.searchParams.delete('projectId');\n        cleanUrl.searchParams.delete('projectID');\n        cleanUrl.searchParams.delete('project_id');\n        cleanUrl.searchParams.delete('bg_project_id');\n      }\n      window.history.replaceState({}, document.title, cleanUrl.toString());\n    } catch (_) {}\n  }\n\n  function readHiddenPropertyValue(store, propertyName) {\n    if (!store || !store.form || !text(propertyName)) return '';\n    var input = store.form.querySelector('input[name=\"properties[' + propertyName.replace(/\"/g, '\\\\\"') + ']\"]');\n    return text(input && input.value);\n  }\n\n  function readSerializedFormState(store) {\n    if (!store || !store.form) return null;\n    var input = store.form.querySelector('input[name=\"properties[_bg_designer_state_v1]\"]');\n    if (!input || !text(input.value)) return null;\n    return parseJson(input.value, null);\n  }\n\n  function restoreProjectStateFromForm(store) {\n    var owner = artworkOwners.get(store);\n    if (owner && (owner.explicit || owner.notice)) return;\n    if (store && store.suppressProjectRestoreOnce) {\n      store.suppressProjectRestoreOnce = false;\n      return false;\n    }\n    if (!store || !store.state || text(store.state.project && store.state.project.projectId)) return false;\n    var serialized = readSerializedFormState(store) || {};\n    var serializedProject = serialized.project && typeof serialized.project === 'object'\n      ? serialized.project\n      : {};\n    var restoredProvider = readLaunchProviderCandidate(\n      serialized.launchProvider\n      || serialized.provider\n      || serializedProject.provider\n      || readHiddenPropertyValue(store, '_bg_designer_provider')\n    );\n    if (restoredProvider) {\n      store.config.launchProvider = restoredProvider;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = restoredProvider;\n      window.BG_DESIGNER_DEFAULT_PROVIDER = restoredProvider;\n    }\n    var projectId = text(serializedProject.projectId || readHiddenPropertyValue(store, 'Project ID') || readHiddenPropertyValue(store, '_pitchprint'));\n    if (!projectId) return false;\n    // URL-PROJECT-PARAM-ARTWORK-OFF-01: every render reads the form back, so\n    // a design an outside script wrote into it is never adopted here.\n    if (refuseSavedDesignLanding(store, { silent: true })) return false;\n    var designId = text(serializedProject.designId || readHiddenPropertyValue(store, '_Design ID') || readHiddenPropertyValue(store, 'Design ID'));\n    var designNumber = text(serializedProject.designNumber || readHiddenPropertyValue(store, 'Design #'));\n    var previewUrl = text(serializedProject.previewUrl);\n    var previews = Array.isArray(serializedProject.previews)\n      ? serializedProject.previews.map(text).filter(Boolean)\n      : [];\n    var artworkMode = core.normalizeArtworkMode(serialized.artworkMode || readHiddenPropertyValue(store, 'Artwork'));\n\n    if (artworkMode === 'designonline') {\n      if (!text(store.state.artworkPrimaryChoice)) setArtworkIntent(store, 'need-design', store.state.artworkSecondaryChoice);\n      if (!text(store.state.artworkSecondaryChoice)) setArtworkIntent(store, store.state.artworkPrimaryChoice, 'use-template');\n    }\n    var serializedTemplate = serialized.template && typeof serialized.template === 'object'\n      ? serialized.template\n      : null;\n    var restoredTemplate = serializedTemplate\n      ? findTemplateSelection(\n          store,\n          text(serializedTemplate.designId),\n          text(serializedTemplate.designNumber),\n          text(serializedTemplate.backer)\n        )\n      : null;\n    if (!restoredTemplate) {\n      restoredTemplate = findTemplateSelection(store, designId, designNumber, '');\n    }\n    var restored = commitArtworkConfiguration(store, { template: restoredTemplate || store.state.template, artworkMode: artworkMode }, { source: 'restore', preserveProject: true });\n    if (restored.status === 'refused') return false;\n    var restoredPreviewUrls = isPitchPrintLaunchProvider(store)\n      ? getPitchPrintPreviewUrls(projectId, previewUrl, previews)\n      : core.uniqueStrings([previewUrl].concat(previews || []).map(text).filter(Boolean));\n    store.state.project = {\n      projectId: projectId,\n      designId: designId,\n      designNumber: designNumber,\n      title: text(serializedProject.title || serializedProject.name || serializedProject.designTitle),\n      updatedAt: text(serializedProject.updatedAt || serializedProject.lastEditedAt || serializedProject.modifiedAt),\n      documentOrientation: text(serializedProject.documentOrientation),\n      previewUrl: text(restoredPreviewUrls[0]),\n      previews: restoredPreviewUrls,\n      numPages: Number(serializedProject.numPages || 0) || 0,\n      // EDITOR-LANES-EMPTY-SAVE-01: the serialized state carries the last\n      // settled artwork truth; read it back (boolean only).\n      hasArtwork: typeof serializedProject.hasArtwork === 'boolean' ? serializedProject.hasArtwork : undefined,\n      refreshToken: text(serializedProject.refreshToken) || String(Date.now())\n    };\n    if (isPitchPrintLaunchProvider(store)) {\n      prepareRestoredPitchPrintProjectState(store);\n    }\n    syncFormState(store);\n    return true;\n  }\n\n  // PDP-BOUND-SIZE-RESUME-01: the page places a saved design a quarter turn\n  // onto a size only where the product allows it: an Orientation choice of\n  // its own (the turn is then a separate choice) or the configured rotation\n  // policy switched on, the reading the attach and copy lanes use.\n  function savedProjectSizeRotationAllowed(store) {\n    if (findSyncedOptionHolder(store, '', 'orientation', 'orientation')) return true;\n    return getTemplateBinding(store).allowRotate === true;\n  }\n\n  function savedProjectSelectionNamesHolder(optionSelections, holder) {\n    var holderId = getHolderId(holder);\n    var holderHtmlId = text(holder && holder.htmlID);\n    return (Array.isArray(optionSelections) ? optionSelections : []).some(function (entry) {\n      return text(entry && entry.holderId) === holderId\n        || (!!holderHtmlId && text(entry && entry.holderHtmlId) === holderHtmlId);\n    });\n  }\n\n  function normalizeSavedProjectSizeUnit(value) {\n    var unit = text(value).toLowerCase().replace(/\\.$/, '');\n    if (!unit || unit === 'inches' || unit === 'inch' || unit === 'in' || unit === '\"') return 'inches';\n    if (unit === 'feet' || unit === 'foot' || unit === 'ft' || unit === \"'\") return 'feet';\n    return unit;\n  }\n\n  // Dimensions from one unit into another, only where the page already\n  // converts (feet into inches, as parseSizeInInches does). Any other pair\n  // of differing units is no match: a refusal, never a wrong size.\n  function convertSavedProjectSizeDimensions(width, height, fromUnit, toUnit) {\n    if (fromUnit === toUnit) return { width: width, height: height };\n    if (fromUnit === 'feet' && toUnit === 'inches') return { width: width * 12, height: height * 12 };\n    if (fromUnit === 'inches' && toUnit === 'feet') return { width: width / 12, height: height / 12 };\n    return null;\n  }\n\n  // The one visible Size option whose configured dimensions equal the saved\n  // ones (as drawn, or a quarter turn where the product allows it), in the\n  // saved unit. No match, or two or more sizes sharing those dimensions\n  // (twins that differ only by material or name), yields null: an ambiguous\n  // match must refuse the resume rather than land on the first twin.\n  function findSavedProjectSizeOptionByDimensions(store, holder, wantedWidth, wantedHeight, wantedUnit, rotationAllowed) {\n    var options = getVisibleOptions(store, holder);\n    var savedUnit = normalizeSavedProjectSizeUnit(wantedUnit);\n    var matches = [];\n    options.forEach(function (option) {\n      if (!option) return;\n      var syncedValue = findProductCommerceSizeValue(store, holder, option);\n      var width = numberValue(syncedValue && syncedValue.width, NaN);\n      var height = numberValue(syncedValue && syncedValue.height, NaN);\n      var optionUnit = normalizeSavedProjectSizeUnit(syncedValue && syncedValue.unit);\n      if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n        var parsed = parseOptionSizeToken(option, syncedValue && syncedValue.label);\n        width = numberValue(parsed && parsed.width, NaN);\n        height = numberValue(parsed && parsed.height, NaN);\n        optionUnit = 'inches';\n      }\n      if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return;\n      var converted = convertSavedProjectSizeDimensions(wantedWidth, wantedHeight, savedUnit, optionUnit);\n      if (!converted) return;\n      var same = Math.abs(width - converted.width) < 0.01 && Math.abs(height - converted.height) < 0.01;\n      var rotated = Math.abs(width - converted.height) < 0.01 && Math.abs(height - converted.width) < 0.01;\n      if (same || (rotated && rotationAllowed)) matches.push(option);\n    });\n    return matches.length === 1 ? matches[0] : null;\n  }\n\n  // A design attached to a product (Choose Product, same-size copy) carries\n  // its size as the product's configured size id, label and dimensions, plus\n  // the direction it sits in (selectedOrientation), not as page option\n  // tokens. When the stored tokens left the synced Size choice untouched,\n  // place that size through the product's own Size list (id, then label, then\n  // dimensions in the saved unit; a quarter turn only where the product allows\n  // it; two sizes sharing the dimensions are ambiguous), and place\n  // the saved direction on the page's Orientation choice where it has one,\n  // matched the way the template picker maps an orientation. A named size or\n  // direction the page cannot place refuses the resume; a design with no\n  // saved size, or a page with no such choice, keeps the page as it is.\n  function applySavedProjectSizeSelection(store, selection, optionSelections) {\n    var result = { applied: false, rejected: false };\n    var source = plainObject(selection);\n    var wantedWidth = numberValue(source.selectedWidth, NaN);\n    var wantedHeight = numberValue(source.selectedHeight, NaN);\n    var hasDimensions = Number.isFinite(wantedWidth) && wantedWidth > 0\n      && Number.isFinite(wantedHeight) && wantedHeight > 0;\n    var wanted = {\n      selectedSizeId: text(source.selectedSizeId),\n      selectedSizeLabel: text(source.selectedSizeLabel),\n      selectedWidth: hasDimensions ? wantedWidth : '',\n      selectedHeight: hasDimensions ? wantedHeight : ''\n    };\n    var hasSize = !!(wanted.selectedSizeId || wanted.selectedSizeLabel || hasDimensions);\n    var wantedOrientation = normalizeTemplateOrientation(source.selectedOrientation);\n    if (!hasSize && !wantedOrientation) return result;\n    var sync = getProductCommerceEditorSync(store);\n    var sizeHolder = hasSize ? findSyncedOptionHolder(store, sync.sizeHolderId, 'size', 'size') : null;\n    if (sizeHolder && !savedProjectSelectionNamesHolder(optionSelections, sizeHolder)) {\n      var sizeOption = null;\n      if (wanted.selectedSizeId || wanted.selectedSizeLabel) {\n        sizeOption = findSizeOptionForTemplateSwitch(store, sizeHolder, {\n          selectedSizeId: wanted.selectedSizeId,\n          selectedSizeLabel: wanted.selectedSizeLabel\n        });\n      }\n      if (!sizeOption && hasDimensions) {\n        sizeOption = findSavedProjectSizeOptionByDimensions(\n          store,\n          sizeHolder,\n          wantedWidth,\n          wantedHeight,\n          source.selectedUnit,\n          savedProjectSizeRotationAllowed(store)\n        );\n      }\n      if (!sizeOption) {\n        result.rejected = true;\n        return result;\n      }\n      var sizeHolderId = getHolderId(sizeHolder);\n      if (text(store.state.selections[sizeHolderId]) !== text(sizeOption.hvId)) {\n        writeArtworkSelection(store, sizeHolderId, text(sizeOption.hvId), 'reconcile');\n        result.applied = true;\n      }\n    }\n    var orientationHolder = wantedOrientation ? findSyncedOptionHolder(store, '', 'orientation', 'orientation') : null;\n    if (orientationHolder && !savedProjectSelectionNamesHolder(optionSelections, orientationHolder)) {\n      var orientationOptions = Array.isArray(orientationHolder.values) ? orientationHolder.values : [];\n      var orientationOption = orientationOptions.find(function (option) {\n        return normalizeTemplateOrientation(buildDisplayLabel(option)) === wantedOrientation\n          || normalizeTemplateOrientation(option && (option.targetingID || option.targetingId)) === wantedOrientation;\n      }) || null;\n      if (!orientationOption) {\n        // A square design has no direction to choose (the picker treats it\n        // as neutral); a named direction the page cannot place refuses.\n        if (wantedOrientation !== 'square') {\n          result.rejected = true;\n          return result;\n        }\n      } else {\n        var orientationHolderId = getHolderId(orientationHolder);\n        if (text(store.state.selections[orientationHolderId]) !== text(orientationOption.hvId)) {\n          writeArtworkSelection(store, orientationHolderId, text(orientationOption.hvId), 'reconcile');\n          result.applied = true;\n        }\n      }\n    }\n    return result;\n  }\n\n  // RESUME-CATCH-STATE-01: everything the resume chain writes before it can\n  // still throw (selections, size, template, channel offer, quantity, mode,\n  // project, reorder mark, the validated flag), taken once the record is\n  // read and put back whole when a refusal lands late.\n  // RESUME-COMPAT-NOTICE-RESTORE-01: the adjustment notice is part of it. The\n  // chain's recalculate names a change the design's stored choices forced;\n  // a refusal undoes that change, so the notice goes back to what the\n  // arrival had earned before the design was tried (a Style rule or a\n  // carried choice still shows; the undone change never does).\n  function snapshotSavedProjectResumeState(store) {\n    return {\n      pendingCompatibilityNotice: text(store.pendingCompatibilityNotice),\n      selections: Object.assign({}, store.state.selections),\n      template: store.state.template,\n      quantity: store.state.quantity,\n      artworkMode: store.state.artworkMode,\n      project: store.state.project,\n      channelOffer: store.state.channelOffer,\n      reorderContext: store.state.reorderContext,\n      reorderFallback: store.state.reorderFallback,\n      resolvedChannelOfferOrigin: store.resolvedChannelOfferOrigin,\n      channelOfferVerificationFailed: store.channelOfferVerificationFailed,\n      authoritativelyValidated: store.savedProjectResumeAuthoritativelyValidated\n    };\n  }\n\n  // The explicit refusals have applied choices only: those and the notice go\n  // back, then the page recalculates.\n  function restoreSavedProjectResumeSelections(store, snapshot) {\n    replaceArtworkSelections(store, snapshot.selections, 'restore');\n    store.pendingCompatibilityNotice = snapshot.pendingCompatibilityNotice;\n    recalculate(store);\n  }\n\n  function restoreSavedProjectResumeState(store, snapshot) {\n    store.pendingCompatibilityNotice = snapshot.pendingCompatibilityNotice;\n    restoreArtworkSnapshot(store, { selections: snapshot.selections, template: snapshot.template, quantity: snapshot.quantity, artworkMode: snapshot.artworkMode });\n    store.state.project = snapshot.project;\n    store.state.channelOffer = snapshot.channelOffer;\n    store.state.reorderContext = snapshot.reorderContext;\n    store.state.reorderFallback = snapshot.reorderFallback;\n    store.resolvedChannelOfferOrigin = snapshot.resolvedChannelOfferOrigin;\n    store.channelOfferVerificationFailed = snapshot.channelOfferVerificationFailed;\n    store.savedProjectResumeAuthoritativelyValidated = snapshot.authoritativelyValidated;\n  }\n\n  function restoreFromSavedProjectResume(store, operation) {\n    var token = operation || captureArtworkOperation(store);\n    var params = new URLSearchParams(window.location.search || '');\n    var savedProjectId = readSavedProjectResumeIdFromParams(params);\n    if (!savedProjectId) return Promise.resolve(false);\n    // RESUME-ARTWORK-OFF-01: with the artwork section disabled by Admin the\n    // page has no design flow (no hero, no card, no artwork block) and its\n    // Add to cart is a direct cart action, so a loaded design would ride the\n    // cart line unseen. Refuse before the record is read or any state moves.\n    if (isArtworkSectionAdminDisabled(store)) return Promise.resolve(rejectSavedProjectResume(store));\n    var liveStore = store;\n    var resumeSnapshot = null;\n    return core.fetchProjectRecord(store.config, savedProjectId).then(async function (project) {\n      if (!isArtworkOperationFresh(liveStore, token)) return false;\n      var store = artworkConfigurationDraft(liveStore, {});\n      if (!project) return rejectSavedProjectResume(liveStore, SAVED_PROJECT_RESUME_UNAVAILABLE_MESSAGE);\n      var binding = readProjectStorefrontBinding(project);\n      var selection = binding.selection && typeof binding.selection === 'object' ? binding.selection : {};\n      var artworkHolder = getConfiguredArtworkMethodHolder(store);\n      var optionSelections = (Array.isArray(selection.optionSelections) ? selection.optionSelections : []).filter(function (entry) {\n        return !artworkHolder || (text(entry.holderId) !== getHolderId(artworkHolder) && text(entry.holderHtmlId) !== text(artworkHolder.htmlID));\n      });\n      var savedQuantity = readSavedProjectPrintQuantity(selection);\n      var legacy = readLegacyProjectPayload(project);\n      if (!savedProjectBindingMatchesStorePage(store, binding)) return rejectSavedProjectResume(liveStore);\n      var savedDesignId = text(project.designId || legacy.pitchPrintDesignId);\n      var savedDesignNumber = text(project.designNumber || legacy.designNumber);\n      var savedTemplateLookup = text(binding.templateLookup);\n      var savedBacker = text(selection.backer);\n      var hasSavedTemplateIdentity = !!text(savedTemplateLookup || savedDesignId || savedDesignNumber);\n      resumeSnapshot = snapshotSavedProjectResumeState(liveStore);\n      var strictSelectionResult = applyStoredOptionSelections(store, optionSelections, { strictIdentity: true });\n      if (strictSelectionResult.invalidSelections.length) return rejectSavedProjectResume(liveStore);\n      if (strictSelectionResult.appliedCount) recalculate(store);\n      // PDP-BOUND-SIZE-RESUME-01: a design attached to a product names its\n      // size and direction by the product's configured size, not by page\n      // option tokens.\n      var savedSizeResult = applySavedProjectSizeSelection(store, selection, optionSelections);\n      if (savedSizeResult.rejected) {\n        return rejectSavedProjectResume(liveStore);\n      }\n      if (savedSizeResult.applied) recalculate(store);\n      // ARCHIVED-BRIDGE-LOOKUP: a stored lookup no card on this page carries\n      // (a retired template) drops out of the match. The design id and number\n      // still pick today's card when exactly one page card matches and its\n      // configuration fits; any other outcome preselects nothing. This path\n      // never refuses the design over its template; the design opens from its\n      // own record.\n      var savedLookupRetired = !!savedTemplateLookup && !isTemplateLookupOfferedOnPage(store, savedTemplateLookup);\n      // BD-STUDIO-SAVE-IDENTITY: a Studio save keeps the card's design id and\n      // number in its binding. Only a retired lookup falls back to that pair,\n      // and only when the record has no identity of its own (a PitchPrint\n      // import's legacy pair wins as a whole). An offered lookup keeps\n      // today's matcher input.\n      var useBindingCardIdentity = savedLookupRetired && !savedDesignId && !savedDesignNumber;\n      var nextTemplate = findTemplateForSavedProject(\n        store,\n        savedLookupRetired ? '' : savedTemplateLookup,\n        useBindingCardIdentity ? text(binding.designId) : savedDesignId,\n        useBindingCardIdentity ? text(binding.designNumber) : savedDesignNumber,\n        savedBacker\n      );\n      if (savedLookupRetired) {\n        if (nextTemplate) {\n          var retiredLookupConfiguration = getTemplateModalConfiguration(store, nextTemplate);\n          if (!retiredLookupConfiguration || !retiredLookupConfiguration.mappable || !retiredLookupConfiguration.matchesCurrent) {\n            nextTemplate = null;\n          }\n        }\n      } else {\n        if (hasSavedTemplateIdentity && !nextTemplate) {\n          return rejectSavedProjectResume(liveStore);\n        }\n        if (nextTemplate) {\n          var savedConfiguration = getTemplateModalConfiguration(store, nextTemplate);\n          if (!savedConfiguration || !savedConfiguration.mappable || !savedConfiguration.matchesCurrent) {\n              return rejectSavedProjectResume(liveStore);\n          }\n        }\n      }\n      if (nextTemplate) {\n        writeArtworkTemplate(store, nextTemplate);\n      }\n      await resolveChannelOfferOrigin(store, selection.channelOffer);\n      if (!isArtworkOperationFresh(liveStore, token)) return false;\n      store.savedProjectResumeAuthoritativelyValidated = true;\n      if (savedQuantity > 0) {\n        store.state.quantity = savedQuantity;\n      }\n      var requiresNewChoice = !!text(params.get('bg_reorder_origin')) && !!artworkHolder;\n      commitArtworkChoice(store, { mode: requiresNewChoice ? '' : 'designonline', source: 'restore', reset: requiresNewChoice, preserveProject: true });\n      var savedProjectPreviewUrls = isPitchPrintLaunchProvider(store)\n        ? getPitchPrintPreviewUrls(\n            text(project.publicId || project.id || savedProjectId),\n            text((core.collectProjectPreviewUrls(project)[0]) || ''),\n            core.collectProjectPreviewUrls(project)\n          )\n        : core.collectProjectPreviewUrls(project);\n      var resumedArtworkTruth = typeof core.readProjectArtworkPresence === 'function'\n        ? core.readProjectArtworkPresence(project)\n        : null;\n      store.state.project = {\n        // EDITOR-LANES-EMPTY-SAVE-01: the record read carries the document,\n        // so the artwork truth lands with the resume (boolean only).\n        hasArtwork: typeof resumedArtworkTruth === 'boolean' ? resumedArtworkTruth : undefined,\n        // Self-hosted commerce lanes key credentials and cart access by the\n        // canonical shp_ id; the publicId alias stays for PitchPrint lanes.\n        projectId: isPitchPrintLaunchProvider(store)\n          ? text(project.publicId || project.id || savedProjectId)\n          : text(project.id || project.publicId || savedProjectId),\n        designId: text(project.designId || legacy.pitchPrintDesignId),\n        designNumber: text(project.designNumber || legacy.designNumber),\n        title: text(project.title || project.name || project.designTitle || (project.document && project.document.title)),\n        updatedAt: text(project.updatedAt || project.lastEditedAt || project.modifiedAt),\n        documentOrientation: core.readProjectDocumentOrientation(project),\n        revision: Number(project.revision) || 0,\n        boardPreviews: core.collectProjectBoardPreviews(project),\n        previewUrl: text(savedProjectPreviewUrls[0]),\n        previews: savedProjectPreviewUrls,\n        numPages: Number(project.numPages || project.pages || project.pageCount || project.pageLength || 0) || savedProjectPreviewUrls.length || 0,\n        printQuantity: savedQuantity,\n        refreshToken: String(Date.now())\n      };\n      if (!isArtworkOperationFresh(liveStore, token)) return false;\n      var published = commitArtworkConfiguration(liveStore, store.state, { source: 'restore', token: token,\n        reset: requiresNewChoice, preserveProject: true });\n      if (published.status === 'refused') return false;\n      liveStore.pendingCompatibilityNotice = store.pendingCompatibilityNotice || liveStore.pendingCompatibilityNotice;\n      liveStore.resolvedChannelOfferOrigin = store.resolvedChannelOfferOrigin;\n      liveStore.channelOfferVerificationFailed = store.channelOfferVerificationFailed;\n      liveStore.savedProjectResumeAuthoritativelyValidated = true;\n      store = liveStore;\n      if (requiresNewChoice) store.artworkResumedProjectId = text(store.state.project.projectId);\n      // STOREFRONT-SAVED-EMPTY: this record read answered for the design.\n      setSavedDesignReadState(store, store.state.project.projectId, 'read');\n      scheduleProductPreviewRefresh(store, store.state.project.projectId);\n      clearCompletionState(store);\n      // A chooser-pick arrival marks the restored line as a reorder; the\n      // param survives an interrupted pick (reload) so the mark is not lost.\n      var reorderOrigin = text(params.get('bg_reorder_origin'));\n      if (reorderOrigin === 'saved' || reorderOrigin === 'ordered') {\n        setReorderContextFromResumedProject(store, reorderOrigin, null);\n      }\n      if (isPitchPrintLaunchProvider(store)) {\n        prepareRestoredPitchPrintProjectState(store);\n      }\n      syncFormState(store);\n      // PDP-RESUME-MESSAGES-01: the layout states the loaded design itself\n      // (the Intent First hero \"Welcome back \u2014 \u2026 is saved\", the classic\n      // saved-design card \"Saved and attached to this item\"), so no message\n      // row repeats it; the row carries refusals only. The former\n      // \"choose a product\" sentence was unreachable: a binding with no\n      // product identity is refused by savedProjectBindingMatchesStorePage.\n      clearSavedProjectResumeParams();\n      return true;\n    }).catch(function () {\n      if (!isArtworkOperationFresh(store, token)) return false;\n      // RESUME-CATCH-STATE-01: a throw after the design's choices were\n      // applied refuses with the sentence AND leaves the page as a fresh\n      // visit, exactly as the explicit refusals above do.\n      if (resumeSnapshot) {\n        restoreSavedProjectResumeState(store, resumeSnapshot);\n        recalculate(store);\n      }\n      return rejectSavedProjectResume(liveStore, SAVED_PROJECT_RESUME_UNAVAILABLE_MESSAGE);\n    });\n  }\n\n  function applyRuleSurfaceAttributes(store) {\n    var surfaceAttributes = store && store.uiState && store.uiState.surfaceAttributes;\n    var scopeRoot = store && store.root ? (store.root.closest('[id^=\"ProductInfo-\"]') || store.root) : null;\n    if (!surfaceAttributes || !scopeRoot) return false;\n    if (!store.appliedRuleSurfaceAttributes || typeof store.appliedRuleSurfaceAttributes !== 'object') {\n      store.appliedRuleSurfaceAttributes = Object.create(null);\n    }\n    var changedSelection = false;\n    var selections = Object.assign({}, store.state.selections);\n    Object.keys(surfaceAttributes).forEach(function (key) {\n      var entry = surfaceAttributes[key];\n      if (!entry || !text(entry.selector) || !text(entry.name)) return;\n      if (entry.onlyOnce && store.appliedRuleSurfaceAttributes[key]) return;\n      var targets = Array.prototype.slice.call(scopeRoot.querySelectorAll(entry.selector));\n      if (!targets.length) return;\n      targets.forEach(function (target) {\n        if (!target || typeof target.setAttribute !== 'function') return;\n        var attributeName = text(entry.name);\n        var attributeValue = entry.value != null ? String(entry.value) : '';\n        var isCheckedAttribute = attributeName.toLowerCase() === 'checked' && target.matches && target.matches('input[type=\"radio\"], input[type=\"checkbox\"]');\n        if (isCheckedAttribute) {\n          var holderId = text(target.getAttribute('data-bg-holder-input'));\n          var hvid = text(target.getAttribute('data-bg-hvid'));\n          if (holderId && hvid && text(store.state.selections[holderId]) !== hvid) {\n            selections[holderId] = hvid;\n            changedSelection = true;\n          }\n          target.checked = true;\n        }\n        target.setAttribute(attributeName, attributeValue);\n      });\n      if (entry.onlyOnce) {\n        store.appliedRuleSurfaceAttributes[key] = true;\n      }\n    });\n    if (changedSelection) return replaceArtworkSelections(store, selections, 'reconcile').status !== 'refused';\n    return false;\n  }\n\n  // SF-15 (2026-09-13): presentation.productHighlights.collapsible (Admin\n  // switch added by the settings lane; absent = off) reshapes the theme's\n  // rendered .product-highlights block into a native <details> accordion,\n  // collapsed by default. The protected product template JSON is untouched:\n  // the runtime rewraps the block in place after every render and unwraps it\n  // again when the switch is off, so an unset product renders byte for byte.\n  function syncProductHighlightsPresentation(store) {\n    var productInfo = store && store.root && store.root.closest ? store.root.closest('product-info') : null;\n    if (!productInfo) return;\n    var highlightsConfig = plainObject(readProductPresentationConfig(store).productHighlights) || {};\n    // Payload truth after the config fetch; the page-shell mirror\n    // (highlightsCollapsible) seeds first paint so the block does not open\n    // and then snap shut.\n    var collapsible = highlightsConfig.collapsible === true\n      || (!(store && store.productEditorConfigProductData) && readServerPageShellSeed(store).highlightsCollapsible === true);\n    Array.prototype.slice.call(productInfo.querySelectorAll('.product-highlights')).forEach(function (block) {\n      var wrapped = block.tagName === 'DETAILS' && block.getAttribute('data-bg-product-highlights-collapsible') === 'true';\n      if (collapsible && block.tagName !== 'DETAILS') {\n        var heading = block.querySelector(':scope > h1, :scope > h2, :scope > h3, :scope > h4');\n        if (!heading) return;\n        var details = document.createElement('details');\n        Array.prototype.slice.call(block.attributes).forEach(function (attribute) {\n          details.setAttribute(attribute.name, attribute.value);\n        });\n        details.classList.add('product-highlights--collapsible');\n        details.setAttribute('data-bg-product-highlights-collapsible', 'true');\n        var summary = document.createElement('summary');\n        summary.className = 'product-highlights__summary';\n        summary.appendChild(heading);\n        var chevron = document.createElement('span');\n        chevron.className = 'product-highlights__chevron';\n        chevron.setAttribute('aria-hidden', 'true');\n        summary.appendChild(chevron);\n        details.appendChild(summary);\n        while (block.firstChild) details.appendChild(block.firstChild);\n        block.parentNode.replaceChild(details, block);\n        return;\n      }\n      if (!collapsible && wrapped) {\n        var plain = document.createElement('div');\n        Array.prototype.slice.call(block.attributes).forEach(function (attribute) {\n          if (attribute.name === 'data-bg-product-highlights-collapsible' || attribute.name === 'open') return;\n          plain.setAttribute(attribute.name, attribute.value);\n        });\n        plain.classList.remove('product-highlights--collapsible');\n        var summaryNode = block.querySelector(':scope > summary');\n        var headingNode = summaryNode ? summaryNode.querySelector('h1, h2, h3, h4') : null;\n        if (headingNode) plain.appendChild(headingNode);\n        if (summaryNode) block.removeChild(summaryNode);\n        while (block.firstChild) plain.appendChild(block.firstChild);\n        block.parentNode.replaceChild(plain, block);\n      }\n    });\n  }\n\n  function render(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    restoreProjectStateFromForm(store);\n    prepareArtworkChoiceForRender(store);\n    recalculate(store);\n    if (store.setupDataLoadFailed && !isSetupDataUnavailable(store)) restoreSetupDataBlocks(store);\n    syncRootUiState(store);\n    syncNoPriceRowRootClass(store);\n    syncProductHighlightsPresentation(store);\n    renderDiscountBadge(store);\n    renderAccolades(store);\n    renderOptions(store);\n    renderQuantity(store);\n    renderCustomerInputs(store);\n    renderSummary(store);\n    renderArtwork(store);\n    renderUploads(store);\n    if (applyRuleSurfaceAttributes(store) && !settings.fromRuleSurfaceAttributes) {\n      render(store, { fromRuleSurfaceAttributes: true });\n      return;\n    }\n    renderCtaMeta(store);\n    syncFormState(store);\n    syncSubmitButton(store);\n    reportNoPriceRow(store);\n    syncProductMedia(store);\n    syncMobileGalleryV2(store);\n    renderGuidedProductFormPresentation(store);\n    renderVersion2ProductFormPresentation(store);\n    renderExperimentalProductFormPresentations(store);\n    renderProductPageNotices(store);\n    if (isPrototypeProductFormPresentation(getProductFormPresentation(store))) {\n      // The sticky owner is bound before the asynchronous product/pricing\n      // payloads settle. Refresh it from the same canonical presentation data\n      // as soon as a prototype finishes a render so it never retains the\n      // initial $0.00/empty-button placeholder until the next scroll event.\n      syncStickyPurchaseBar(store);\n    }\n    syncProductPageMobileExperience(store);\n    scheduleDesignerUrlStateSync(store);\n    if (store.bootRenderDone && !store.setupDataLoadFailed) scheduleRegionHoldRecord(store);\n    if (canPrewarmEditorSession(store)) {\n      void store.editorShell.prewarm(buildEditorContext(store));\n    }\n    if (text(store.pendingChannelOfferNotice)) setMessage(store, store.pendingChannelOfferNotice, 'notice');\n    if (store.channelOfferVerificationFailed) setMessage(store, 'We could not verify the included-design offer. Refresh this page to try again.', 'error');\n    renderDesignerConfigurationHold(store);\n    if (isSetupDataUnavailable(store)) renderSetupDataUnavailable(store);\n    if (text(store.pendingUrlStateErrorMessage)) {\n      var pendingUrlStateErrorMessage = text(store.pendingUrlStateErrorMessage);\n      store.pendingUrlStateErrorMessage = '';\n      setMessage(store, pendingUrlStateErrorMessage, 'error');\n    }\n    // BUG-03: the launch-failure alert anchors inside re-render territory; a\n    // render queued behind a fast launch rejection would silently wipe it, so\n    // an active failure re-inserts after every render until retried/settled.\n    if (store.pitchPrintLaunchFailureActive) showPitchPrintLaunchFailureNotice(store);\n    store.pendingCompatibilityNotice = '';\n  }\n\n  // The editor session prewarm runs for a Studio design online with a\n  // template or a saved design on the page (render and the saved-design read).\n  function canPrewarmEditorSession(store) {\n    return !!store.editorShell\n      && !isPitchPrintLaunchProvider(store)\n      && text(store.state.artworkMode) === 'designonline'\n      && !!(store.state.template || text(store.state.project && store.state.project.projectId));\n  }\n\n  function scheduleIdleEditorPrewarm(store) {\n    if (!store || !store.editorShell || store.idleEditorPrewarmScheduled) return;\n    if (isPitchPrintLaunchProvider(store)) return;\n    var availability = getStoreArtworkAvailability(store);\n    if (!availability.designonline) return;\n    store.idleEditorPrewarmScheduled = true;\n\n    function runPrewarm() {\n      if (!store || !store.editorShell || store.idleEditorPrewarmComplete) return;\n      if (document.visibilityState === 'hidden') {\n        store.idleEditorPrewarmScheduled = false;\n        window.setTimeout(function () {\n          scheduleIdleEditorPrewarm(store);\n        }, 1200);\n        return;\n      }\n      store.idleEditorPrewarmComplete = true;\n      // BD-B20: warm the editor with the page's current launch context. A\n      // selection-free warm got HTTP 400 LAUNCH_SELECTION_INVALID (twice) on\n      // every product with fulfillment layouts; with no size chosen yet the\n      // server refuses too, so that page view skips the warm.\n      var warmContext = buildEditorContext(store);\n      var sizeHolder = findSyncedOptionHolder(store, getProductCommerceEditorSync(store).sizeHolderId, 'size', 'size');\n      if (sizeHolder && !text(warmContext.size && warmContext.size.selectedSizeId)) return;\n      void store.editorShell.prewarmDocument(warmContext).catch(function () {\n        store.idleEditorPrewarmComplete = false;\n      });\n    }\n\n    if (typeof window.requestIdleCallback === 'function') {\n      window.requestIdleCallback(runPrewarm, { timeout: 2200 });\n      return;\n    }\n    window.setTimeout(runPrewarm, 900);\n  }\n\n  function consumeContext(store, reason) {\n    if (text(reason) !== 'add-to-cart') return;\n    if (store.editingLineKey) return;\n    clearProjectState(store);\n  }\n\n  function buildProductEditorConfigUrl(store) {\n    var config = store && store.config ? store.config : {};\n    var designer = config.designer && typeof config.designer === 'object' ? config.designer : {};\n    var explicit = text(designer.productEditorConfigUrl || config.productEditorConfigUrl);\n    if (explicit) return explicit;\n    var proxyRoot = text(designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer';\n    var storeKey = text(config.storeKey || config.storefront || window.__siteCfg && window.__siteCfg.brand_slug);\n    var productHandle = text(config.handle);\n    var productId = text(config.productId);\n    var url = proxyRoot.replace(/\\/+$/, '') + '/product-editor-config?storeKey=' + encodeURIComponent(storeKey);\n    if (productHandle) url += '&productHandle=' + encodeURIComponent(productHandle);\n    if (productId) url += '&productId=' + encodeURIComponent(productId);\n    return url;\n  }\n\n  function addStorefrontCacheBust(url, key) {\n    var cleanUrl = text(url);\n    if (!cleanUrl) return '';\n    var separator = cleanUrl.indexOf('?') === -1 ? '?' : '&';\n    return cleanUrl + separator + encodeURIComponent(key || '_bg_refresh') + '=' + encodeURIComponent(String(Date.now()));\n  }\n\n  function readProductEditorConfigRoot(payload) {\n    return payload && payload.result && typeof payload.result === 'object'\n      ? payload.result\n      : (payload && typeof payload === 'object' ? payload : {});\n  }\n\n  function mergeProductDataRecords(base, override) {\n    var baseRecord = plainObject(base) || {};\n    var overrideRecord = plainObject(override);\n    if (!overrideRecord) return baseRecord;\n    var next = Object.assign({}, baseRecord, overrideRecord);\n    if (!text(next.handle) && text(baseRecord.handle)) next.handle = text(baseRecord.handle);\n    if ((next.id == null || next.id === '') && baseRecord.id != null && baseRecord.id !== '') next.id = baseRecord.id;\n    if (!text(next.productName) && text(baseRecord.productName || baseRecord.title)) {\n      next.productName = text(baseRecord.productName || baseRecord.title);\n    }\n    return next;\n  }\n\n  function readProductEditorConfigProductData(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    if (root.ok === false) return null;\n    var productDetails = plainObject(root.productDetails || root.productData);\n    if (!productDetails) return null;\n    var next = Object.assign({}, productDetails);\n    if (!text(next.handle) && text(root.productHandle)) next.handle = text(root.productHandle);\n    if ((next.id == null || next.id === '') && text(root.productId)) next.id = text(root.productId);\n    if (typeof root.selectedDesignLiveMockupSupported === 'boolean') {\n      next.selectedDesignLiveMockupSupported = root.selectedDesignLiveMockupSupported;\n    }\n    // Boguna 3D preview Slice 5: the compiled live Product Preview Profile\n    // projection is an additive top-level payload field (absent for every\n    // profile-less product). Carry it beside the product data so the PDP\n    // eligibility/viewer lane reads THIS payload \u2014 never a second fetch.\n    var productPreviewProjection = plainObject(root.productPreview);\n    if (productPreviewProjection) {\n      next.productPreview = productPreviewProjection;\n    }\n    return next;\n  }\n\n  function applyProductEditorConfigProductData(store, productData) {\n    if (!store || !productData || typeof productData !== 'object') return null;\n    store.productEditorConfigProductData = mergeProductDataRecords(store.productEditorConfigProductData, productData);\n    if (store.productData && typeof store.productData === 'object') {\n      store.productData = mergeProductDataRecords(store.productData, store.productEditorConfigProductData);\n    }\n    if (store.config && typeof store.config === 'object') {\n      store.config.productConfigSource = 'foundation-product-editor-config';\n      store.config.productConfigSourceHandle = text(store.productEditorConfigProductData.handle || store.config.handle);\n      var productPageConfig = plainObject(store.productEditorConfigProductData.productPageConfig);\n      store.config.productPresentationConfig = plainObject(productPageConfig && productPageConfig.presentation) || {};\n    }\n    applyProductFormPresentationMode(store);\n    try { window.BG_DESIGNER_PRODUCT_CONFIG_SOURCE = 'foundation-product-editor-config'; } catch (_) {}\n    try { window.BG_DESIGNER_PRODUCT_CONFIG_HANDLE = text(store.productEditorConfigProductData.handle || (store.config && store.config.handle)); } catch (_) {}\n    return store.productEditorConfigProductData;\n  }\n\n  // Store-settable ProductPage theme tokens (GUIDED-PDP-TOKENIZE-01 T2).\n  // The API serves brandTheme.tokens filtered to the registry's\n  // ProductPage-surface names; this injects them at :root AFTER the theme\n  // sheets so they override the `initial` markers in\n  // bg-designer-storefront.css. The name/value guards mirror the contracts\n  // validators as defense in depth \u2014 the API is the enforcing filter.\n  function applyProductPageThemeTokens(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    var tokens = root.ok === false ? null : root.productPageThemeTokens;\n    var styleId = 'bg-designer-product-page-theme-tokens';\n    var style = document.getElementById(styleId);\n    var lines = [];\n    if (tokens && typeof tokens === 'object' && !Array.isArray(tokens)) {\n      Object.keys(tokens).forEach(function (name) {\n        var value = text(tokens[name]);\n        if (!/^--[a-z][a-z0-9-]*$/.test(name)) return;\n        if (!value || value.length > 180) return;\n        if (/[;{}<>]/.test(value) || /\\burl\\s*\\(/i.test(value) || /\\bexpression\\s*\\(/i.test(value) || /@import/i.test(value) || /javascript:/i.test(value)) return;\n        lines.push('  ' + name + ': ' + value + ';');\n      });\n    }\n    if (!lines.length) {\n      if (style && style.parentNode) style.parentNode.removeChild(style);\n      return;\n    }\n    if (!style) {\n      style = document.createElement('style');\n      style.id = styleId;\n      style.setAttribute('data-bg-designer-product-page-theme-tokens', '');\n      (document.head || document.documentElement).appendChild(style);\n    }\n    // WO-05 carrier adoption: when the server-rendered carrier node is on\n    // the page (host shell, AFTER the section stylesheets in document\n    // order), a plain :root rule wins the tie against the single-:root\n    // `initial` markers by position, so the fresh payload rewrites that\n    // node in place and the escalation below never runs. Without a carrier\n    // (head-created node), :root:root stays REQUIRED: the section\n    // stylesheets render in the body, AFTER a head-appended style, so an\n    // equal-specificity head rule would lose the tie (2026-08-31 fix \u2014 do\n    // not regress).\n    if (style.hasAttribute('data-bg-server-carrier')) {\n      style.textContent = ':root {\\n' + lines.join('\\n') + '\\n}';\n      return;\n    }\n    style.textContent = ':root:root {\\n' + lines.join('\\n') + '\\n}';\n  }\n\n  function applyProductPageCustomCss(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    var css = root.ok === false ? '' : text(root.productPageCustomCss);\n    var styleId = 'bg-designer-product-page-custom-css';\n    var style = document.getElementById(styleId);\n    if (!css) {\n      if (style && style.parentNode) style.parentNode.removeChild(style);\n      return;\n    }\n    if (!style) {\n      style = document.createElement('style');\n      style.id = styleId;\n      style.setAttribute('data-bg-designer-product-page-custom-css', '');\n      (document.head || document.documentElement).appendChild(style);\n    }\n    style.textContent = css;\n  }\n\n  function readProductEditorConfigProductCommerceBundle(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    if (root.ok === false) return null;\n    return plainObject(root.productCommerceBundle || root.compiledProductCommerceBundle || root.productCommerceRuntime);\n  }\n\n  function normalizeProductCommerceFieldType(fieldType) {\n    var normalized = text(fieldType).toLowerCase().replace(/[\\s_-]+/g, '');\n    if (normalized === 'select' || normalized === 'dropdown') return 'dropdown';\n    if (normalized === 'buttons' || normalized === 'button' || normalized === 'radio') return 'buttons';\n    if (normalized === 'productlinkswatch') return 'productLinkSwatch';\n    if (normalized === 'hidden') return 'hidden';\n    // Admin 'color_swatch' (hex-preferred) rides the legacy colorSwatch\n    // pipeline; plain 'swatch' stays image-preferred.\n    if (normalized === 'colorswatch') return 'colorSwatch';\n    return 'swatch';\n  }\n\n  function normalizeProductCommerceSkuSegment(value) {\n    var raw = text(value);\n    if (!raw) return '';\n    var parsed = Number(raw);\n    return Number.isFinite(parsed) && parsed > 0 ? String(parsed) : raw;\n  }\n\n  function normalizeProductCommerceRuntimeOptionHolder(holder, index) {\n    var source = holder && typeof holder === 'object' ? holder : {};\n    var holderId = text(source.id);\n    if (!holderId) return null;\n    var role = text(source.role).toLowerCase();\n    var skuBehavior = text(source.skuBehavior).toLowerCase();\n    var fieldType = normalizeProductCommerceFieldType(source.fieldType);\n    var ui = source.ui && typeof source.ui === 'object' ? source.ui : {};\n    var values = Array.isArray(source.variations) ? source.variations.map(function (variation) {\n      var value = variation && typeof variation === 'object' ? variation : {};\n      var variationId = text(value.id);\n      if (!variationId) return null;\n      var swatch = value.swatch && typeof value.swatch === 'object' ? value.swatch : {};\n      var presentation = value.presentation && typeof value.presentation === 'object' ? value.presentation : {};\n      var addonConfig = value.addon && typeof value.addon === 'object' ? value.addon : {};\n      var pricingSkuSegment = normalizeProductCommerceSkuSegment(value.pricingSkuSegment);\n      var numericSku = pricingSkuSegment || normalizeProductCommerceSkuSegment(value.numericSku);\n      var addonPrice = numberValue(value.addonPrice, NaN);\n      var semantics = value.semantics && typeof value.semantics === 'object' ? value.semantics : {};\n      return {\n        hvId: variationId,\n        label: text(value.label),\n        // Typed print-process reference (Decision B): template printing-mode\n        // mapping reads THIS, never the choice's words.\n        printProcess: text(semantics.process).toLowerCase(),\n        printColorCount: numberValue(semantics.colorCount, 0) || null,\n        targetingID: text(value.targetingId || value.targetingID),\n        linkedProductHandle: text(value.linkedProductHandle || value.linked_product_handle),\n        numericSku: numericSku,\n        productCommerceNumericSku: normalizeProductCommerceSkuSegment(value.numericSku),\n        pricingSkuSegment: pricingSkuSegment,\n        friendlySku: text(value.friendlySku),\n        defaultValue: value.defaultValue === true,\n        outOfStock: value.outOfStock === true,\n        dontUseInSKU: skuBehavior === 'ignored' || role === 'addon' || !numericSku,\n        addonPrice: Number.isFinite(addonPrice) ? addonPrice : null,\n        hexColor: text(swatch.hexColor),\n        swatchColor: text(swatch.hexColor),\n        imageUrl: text(swatch.imageUrl),\n        image: text(swatch.imageUrl),\n        badges: Array.isArray(swatch.badges) ? swatch.badges.map(text).filter(Boolean) : [],\n        swatchBadges: Array.isArray(swatch.badges) ? swatch.badges.map(text).filter(Boolean) : [],\n        contextImages: Array.isArray(value.contextImages) ? value.contextImages.map(function (entry) {\n          var record = entry && typeof entry === 'object' ? entry : {};\n          return {\n            optionValues: Array.isArray(record.optionValues) ? record.optionValues.map(text).filter(Boolean) : [],\n            imageUrl: text(record.imageUrl)\n          };\n        }).filter(function (entry) {\n          return entry.imageUrl && entry.optionValues.length;\n        }) : [],\n        flavorText: text(presentation.flavorText),\n        htmlDescription: text(presentation.htmlDescription),\n        tooltip: text(presentation.tooltip),\n        brandLogoURL: text(presentation.brandLogoUrl),\n        displayLogo: presentation.displayLogo === true,\n        labelInsideDescription: text(presentation.labelInsideDescription),\n        groupLabel: text(presentation.groupLabel),\n        overrideProductImage: text(presentation.overrideProductImage),\n        showAddonPrice: presentation.showAddonPrice === true,\n        addonConfig: {\n          addonLabel: text(addonConfig.addonLabel),\n          addonName: text(addonConfig.addonName),\n          addonType: text(addonConfig.addonType),\n          addonSKU: numberValue(addonConfig.addonSku, NaN),\n          discountEligible: addonConfig.discountEligible === true,\n          excludeFromCart: addonConfig.excludeFromCart === true,\n          useTypedQuantity: addonConfig.useTypedQuantity === true,\n          isPostage: addonConfig.isPostage === true,\n          dontSayFree: addonConfig.dontSayFree === true,\n          displayPriceInLabel: addonConfig.displayPriceInLabel === true || presentation.showAddonPrice === true\n        }\n      };\n    }).filter(Boolean) : [];\n    if (!values.length || fieldType === 'hidden') return null;\n    var label = text(source.customLabel || source.label);\n    return {\n      id: holderId,\n      holderId: holderId,\n      displayName: label,\n      htmlID: text(source.label || holderId),\n      targetingID: holderId,\n      optionType: fieldType,\n      sortOrder: index + 1,\n      isRequired: source.required === true,\n      dontUseInSKU: skuBehavior === 'ignored' || role === 'addon',\n      productCommerceRole: role, fixedChoice: plainObject(source.metadata).fixedChoice === true,\n      values: values,\n      helpText: text(ui.helpText),\n      labelPosition: text(ui.labelPosition),\n      hidePrice: ui.hideOptionPrice === true,\n      displayAsAccordion: ui.displayAsAccordion === true,\n      ui: {\n        mobile: ui.mobile ? plainObject(ui.mobile) : undefined,\n        behavior: {\n          isAddon: role === 'addon',\n          required: source.required === true,\n          designerDisabled: ui.designerDisabled === true\n        },\n        layout: {\n          accordion: ui.displayAsAccordion === true,\n          descriptionPane: ui.descriptionPane === true,\n          helpText: text(ui.helpText),\n          labelPosition: text(ui.labelPosition),\n          labelStyle: text(ui.labelStyle),\n          // PDP-TOKENIZE-02 Stage B/C: per-holder layout overrides and the\n          // guided presentation pin. null/'' = inherit (no emission).\n          optionPaddingPx: positiveIntegerOrNull(ui.optionPaddingPx),\n          labelMarginPx: nonNegativeIntegerOrNull(ui.labelMarginPx),\n          buttonMinWidthPx: positiveIntegerOrNull(ui.buttonMinWidthPx),\n          titleFontFamily: text(ui.titleFontFamily),\n          titleFontWeight: positiveIntegerOrNull(ui.titleFontWeight),\n          presentation: text(ui.presentation).toLowerCase()\n        },\n        pricing: {\n          hideOptionPrice: ui.hideOptionPrice === true\n        },\n        swatch: {\n          desktopSizePx: numberValue(ui.desktopSwatchSizePx, 0),\n          mobileSizePx: numberValue(ui.mobileSwatchSizePx, 0),\n          hoverPreview: {\n            enabled: ui.hoverPreview === true,\n            sizePx: numberValue(ui.hoverPreviewSizePx, 0)\n          }\n        }\n      }\n    };\n  }\n\n  function inferProductCodeFromCommerceBundle(bundle) {\n    var pricing = bundle && bundle.pricing && typeof bundle.pricing === 'object' ? bundle.pricing : {};\n    var metadata = pricing.metadata && typeof pricing.metadata === 'object' ? pricing.metadata : {};\n    var fromMetadata = text(metadata.sourceProductCode);\n    if (fromMetadata) return fromMetadata;\n    var skuPrefix = text(pricing.skuPrefix);\n    var prefixMatch = skuPrefix.match(/^([^-]+)-?/);\n    if (prefixMatch && prefixMatch[1]) return prefixMatch[1];\n    var rows = Array.isArray(pricing.rows) ? pricing.rows : [];\n    for (var index = 0; index < rows.length; index += 1) {\n      var match = text(rows[index] && rows[index].sku).match(/^([^-]+)-/);\n      if (match && match[1]) return match[1];\n    }\n    return '';\n  }\n\n  function inferQuantityOnlySkuPrefixFromCommerceBundle(bundle, holders) {\n    var pricing = bundle && bundle.pricing && typeof bundle.pricing === 'object' ? bundle.pricing : {};\n    if (Array.isArray(holders) && holders.length) return '';\n    var authoredPrefix = text(pricing.skuPrefix);\n    if (authoredPrefix) return authoredPrefix;\n    var rows = Array.isArray(pricing.rows) ? pricing.rows : [];\n    var prefixes = {};\n    for (var index = 0; index < rows.length; index += 1) {\n      var row = rows[index] && typeof rows[index] === 'object' ? rows[index] : {};\n      var sku = text(row.sku);\n      var quantity = normalizePositiveInteger(row.quantity, 0);\n      var quantityText = quantity > 0 ? String(quantity) : '';\n      if (!sku || !quantityText || sku.slice(-quantityText.length) !== quantityText) return '';\n      var prefix = sku.slice(0, -quantityText.length);\n      if (!prefix) return '';\n      prefixes[prefix] = true;\n    }\n    var inferredPrefixes = Object.keys(prefixes);\n    return inferredPrefixes.length === 1 ? inferredPrefixes[0] : '';\n  }\n\n  function buildProductCommerceSelectionKey(map) {\n    var source = map && typeof map === 'object' && !Array.isArray(map) ? map : null;\n    if (!source) return '';\n    var keys = Object.keys(source).sort();\n    var parts = [];\n    for (var index = 0; index < keys.length; index += 1) {\n      var holderId = text(keys[index]);\n      var valueId = text(source[keys[index]]);\n      if (!holderId || !valueId) return '';\n      parts.push(holderId + '=' + valueId);\n    }\n    return parts.length ? parts.join('|') : '';\n  }\n\n  // Admin-authored pricing rows carry the exact option-value ids they were\n  // priced for. Index each row's authored SKU prefix under that selection so\n  // the runtime can price fresh Product Commerce products whose SKU segments\n  // are not numeric and which have no legacy product code. The admin rows are\n  // the pricing truth; SKU-string reconstruction stays only as the legacy\n  // Airtable-era lane.\n  function buildProductCommerceSelectionPrefixIndex(rows) {\n    var prefixes = {};\n    var holderIdSeen = {};\n    (Array.isArray(rows) ? rows : []).forEach(function (row) {\n      var sku = text(row && row.sku);\n      var quantity = normalizePositiveInteger(row && row.quantity, 0);\n      var ids = row && row.holderValueIds && typeof row.holderValueIds === 'object' && !Array.isArray(row.holderValueIds)\n        ? row.holderValueIds\n        : null;\n      if (!sku || !(quantity > 0) || !ids) return;\n      var quantityText = String(quantity);\n      if (sku.slice(-quantityText.length) !== quantityText) return;\n      var prefix = sku.slice(0, -quantityText.length);\n      if (!prefix) return;\n      var selectionKey = buildProductCommerceSelectionKey(ids);\n      if (!selectionKey) return;\n      Object.keys(ids).forEach(function (holderId) { holderIdSeen[text(holderId)] = true; });\n      if (!(selectionKey in prefixes)) {\n        prefixes[selectionKey] = prefix;\n      } else if (prefixes[selectionKey] !== prefix) {\n        // Two different row families claim the same selection \u2014 never guess.\n        prefixes[selectionKey] = '';\n      }\n    });\n    return {\n      prefixes: prefixes,\n      holderIds: Object.keys(holderIdSeen).filter(Boolean).sort()\n    };\n  }\n\n  function resolveProductCommerceSelectionPrefix(store) {\n    var prefixes = store && store.productCommerceSelectionPrefixes && typeof store.productCommerceSelectionPrefixes === 'object'\n      ? store.productCommerceSelectionPrefixes\n      : null;\n    var holderIds = store && Array.isArray(store.productCommerceSelectionHolderIds)\n      ? store.productCommerceSelectionHolderIds\n      : [];\n    if (!prefixes || !holderIds.length) return '';\n    var holdersById = {};\n    (Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      holdersById[getHolderId(holder)] = holder;\n    });\n    var selections = store && store.state && store.state.selections && typeof store.state.selections === 'object'\n      ? store.state.selections\n      : {};\n    var map = {};\n    for (var index = 0; index < holderIds.length; index += 1) {\n      var holderId = holderIds[index];\n      var valueId = '';\n      var holder = holdersById[holderId];\n      if (holder) {\n        // BD-PC-ALL-HIDDEN-FALLBACK: a hidden option is left out of the\n        // selection, as the price code leaves it out; its stored choice never\n        // picks a row (no row: no price, never the stored choice's row).\n        if (isHolderUnavailableByRules(store, holder)) continue;\n        var option = getSelectedOption(store, holder);\n        valueId = text(option && option.hvId);\n      }\n      if (!valueId) valueId = text(selections[holderId]);\n      if (!valueId) return '';\n      map[holderId] = valueId;\n    }\n    return text(prefixes[buildProductCommerceSelectionKey(map)]);\n  }\n\n  function normalizeProductCommerceApparelConfig(value, quantityDefaults) {\n    var source = value && typeof value === 'object' && !Array.isArray(value) ? value : null;\n    if (!source || source.enableSizingMatrix !== true) return null;\n    var availableSizes = Array.isArray(source.availableSizes)\n      ? source.availableSizes.map(text).filter(Boolean).filter(function (size, index, values) {\n        return values.indexOf(size) === index;\n      })\n      : [];\n    if (!availableSizes.length) return null;\n    var sizeSet = {};\n    availableSizes.forEach(function (size) {\n      sizeSet[size] = true;\n    });\n    var sourceSurcharges = source.sizeSurcharges && typeof source.sizeSurcharges === 'object' && !Array.isArray(source.sizeSurcharges)\n      ? source.sizeSurcharges\n      : {};\n    var sizeSurcharges = {};\n    Object.keys(sourceSurcharges).forEach(function (size) {\n      var label = text(size);\n      var amount = numberValue(sourceSurcharges[size], 0);\n      if (!label || !sizeSet[label] || amount <= 0) return;\n      sizeSurcharges[label] = amount;\n    });\n    var defaultSize = text(source.defaultSize);\n    var minQty = normalizePositiveInteger(source.minQty, quantityDefaults && quantityDefaults.minQty);\n    var defaultQty = normalizePositiveInteger(source.defaultQty, quantityDefaults && quantityDefaults.defaultQty);\n    return {\n      enableSizingMatrix: true,\n      availableSizes: availableSizes,\n      minQty: minQty,\n      defaultQty: defaultQty,\n      defaultSize: sizeSet[defaultSize] ? defaultSize : availableSizes[0],\n      sizeSurcharges: sizeSurcharges\n    };\n  }\n\n  function normalizeProductCommerceQuantityProductData(bundle) {\n    var quantity = bundle && bundle.quantity && typeof bundle.quantity === 'object' ? bundle.quantity : {};\n    var metadata = quantity.metadata && typeof quantity.metadata === 'object' && !Array.isArray(quantity.metadata)\n      ? quantity.metadata\n      : {};\n    var priceQuantities = Array.isArray(quantity.priceQuantities)\n      ? quantity.priceQuantities.map(function (value) { return normalizePositiveInteger(value, 0); }).filter(function (value, index, source) {\n        return value > 0 && source.indexOf(value) === index;\n      }).sort(function (a, b) { return a - b; })\n      : [];\n    var fieldType = text(quantity.fieldType).toLowerCase();\n    var minQty = normalizePositiveInteger(quantity.min, priceQuantities[0] || 1);\n    var maxQty = normalizePositiveInteger(quantity.max, priceQuantities[priceQuantities.length - 1] || minQty);\n    var defaultQty = normalizePositiveInteger(quantity.defaultQuantity, priceQuantities[0] || minQty);\n    var stepQty = normalizePositiveInteger(quantity.step, 1);\n    var data = {\n      minQty: minQty,\n      maxQty: maxQty,\n      defaultQty: defaultQty,\n      quantityFieldType: fieldType,\n      showQtyAsDropdown: fieldType === 'dropdown' || fieldType === 'generated_table' || fieldType === 'pricing_table' || fieldType === 'range_table' || fieldType === 'buttons',\n      hideQty: fieldType === 'hidden',\n      quantityUnitLabel: text(metadata.unitLabel),\n      quantityPresentation: plainObject(metadata.presentation) || {},\n      // Buttons tile row settings; per-unit line defaults ON.\n      quantityShowPerUnitPrice: metadata.showPerUnitPrice !== false,\n      quantityMaxVisibleRows: (function () {\n        var maxRows = Number(metadata.maxVisibleRows);\n        return Number.isInteger(maxRows) && maxRows > 0 ? maxRows : 0;\n      })(),\n      isApparelItem: fieldType === 'size_quantity_inputs',\n      isPromoItem: fieldType === 'slider',\n      rangeBased: fieldType === 'range_table' || fieldType === 'numeric_input',\n      calculateOnTypedQty: fieldType === 'range_table' || fieldType === 'numeric_input',\n      quantityLockedToPricingTable: quantity.lockedToPricingTable === true,\n      // EDDM-ROUTE-MIN-ALIGN: the minimum as authored (minQty above falls back\n      // to the first price quantity when none is set).\n      quantityConfiguredMinimum: readConfiguredQuantityMinimum(quantity.min),\n      // BD-APPAREL-OVER-MAX: the maximum as authored (maxQty above falls back\n      // to the last price quantity when none is set).\n      quantityConfiguredMaximum: readConfiguredQuantityMaximum(quantity.max),\n      quantityPriceQuantities: priceQuantities,\n      sliderConfig: {\n        min: minQty,\n        max: maxQty,\n        step: stepQty\n      }\n    };\n    var apparelConfig = fieldType === 'size_quantity_inputs'\n      ? normalizeProductCommerceApparelConfig(metadata.apparelConfig, {\n        minQty: minQty,\n        defaultQty: defaultQty\n      })\n      : null;\n    if (apparelConfig) {\n      data.apparelConfig = apparelConfig;\n      data.defaultSize = apparelConfig.defaultSize;\n    }\n    return data;\n  }\n\n  function applyProductCommerceRuntimeBundle(store) {\n    var bundle = store && store.productCommerceRuntimeBundle && typeof store.productCommerceRuntimeBundle === 'object'\n      ? store.productCommerceRuntimeBundle\n      : null;\n    if (!bundle) return false;\n    var target = bundle.target && typeof bundle.target === 'object' ? bundle.target : {};\n    var targetHandle = text(target.targetHandle || (store.config && store.config.handle));\n    if (!targetHandle) return false;\n    var sourceHandle = text(target.sourceHandle);\n    // Foundation-complete targets own their entire runtime config; never seed\n    // them from (or mirror them onto) the source product's baked theme JSON.\n    var selfContained = target.selfContained === true;\n    var productCode = inferProductCodeFromCommerceBundle(bundle);\n    var holders = Array.isArray(bundle.optionHolders)\n      ? bundle.optionHolders.map(normalizeProductCommerceRuntimeOptionHolder).filter(Boolean)\n      : [];\n    var holderIds = holders.map(function (holder) { return getHolderId(holder); }).filter(Boolean);\n    var pricing = bundle.pricing && typeof bundle.pricing === 'object' ? bundle.pricing : {};\n    var rows = Array.isArray(pricing.rows) ? pricing.rows : [];\n    var runtimeSkuPrefix = inferQuantityOnlySkuPrefixFromCommerceBundle(bundle, holders);\n    var pricingMap = {};\n    rows.forEach(function (row) {\n      var sku = text(row && row.sku);\n      if (!sku) return;\n      var quantity = normalizePositiveInteger(row && row.quantity, 1);\n      var price = roundAuthoredRowMoney(numberValue(row && row.price, 0));\n      pricingMap[sku] = {\n        price: price,\n        unitPrice: numberValue(row && row.unitPrice, quantity > 0 ? price / quantity : price),\n        displayMode: text(row && row.displayMode) || text(pricing.displayMode),\n        currency: text(row && row.currency) || 'USD',\n        estTurnaround: text(row && row.estTurnaround),\n        qtyNote: text(row && row.qtyNote),\n        displayPerPieceOnly: !!(row && row.displayPerPieceOnly === true),\n        data: {\n          productCommerceRowId: text(row && row.id),\n          quantity: quantity\n        },\n        // The row as authored (for example 404.316): every line scales it\n        // (EXACT-CENTS-CATALOG); `price` is its half-up cents.\n        authored: { price: numberValue(row && row.price, 0) }\n      };\n      // Staff-assigned price columns, when the row carries a positive cell (a\n      // cell at or below zero is no tier price: BD-ZERO-TIER-CELL).\n      [PARTNER_TIER_PRICE_KEY, 'priceBrokerBasic', 'priceBrokerPremium', 'priceFriendsFamily'].forEach(function (column) {\n        var cell = readTierPrice(row, column);\n        var amount = cell !== null && cell !== '' ? Number(cell) : NaN;\n        if (amount > 0) {\n          pricingMap[sku][column] = roundAuthoredRowMoney(amount);\n          pricingMap[sku].authored[column] = amount;\n        }\n      });\n    });\n    var selectionIndex = buildProductCommerceSelectionPrefixIndex(rows);\n    var hasSelectionPrefixes = Object.keys(selectionIndex.prefixes).some(function (key) {\n      return !!selectionIndex.prefixes[key];\n    });\n    // Quantity-and-pricing-only products intentionally have no option holders.\n    // Their row SKUs can supply the pricing prefix when no separate product\n    // code or SKU prefix was authored (for example q25, q50, q100). Rows that\n    // carry holderValueIds price through the selection index instead, so a\n    // missing legacy product code no longer blocks the bundle.\n    if (!Object.keys(pricingMap).length || (!productCode && !runtimeSkuPrefix && !hasSelectionPrefixes)) return false;\n    store.optionLayout = store.optionLayout && typeof store.optionLayout === 'object' ? store.optionLayout : {};\n    store.optionLayout.optionHolders = store.optionLayout.optionHolders && typeof store.optionLayout.optionHolders === 'object'\n      ? Object.assign({}, store.optionLayout.optionHolders)\n      : {};\n    holders.forEach(function (holder) {\n      store.optionLayout.optionHolders[getHolderId(holder)] = holder;\n    });\n    store.optionLayout.products = store.optionLayout.products && typeof store.optionLayout.products === 'object'\n      ? Object.assign({}, store.optionLayout.products)\n      : {};\n    var sourceProductLayout = !selfContained && sourceHandle && store.optionLayout.products[sourceHandle] && typeof store.optionLayout.products[sourceHandle] === 'object'\n      ? store.optionLayout.products[sourceHandle]\n      : {};\n    var existingProductLayout = store.optionLayout.products[targetHandle] && typeof store.optionLayout.products[targetHandle] === 'object'\n      ? store.optionLayout.products[targetHandle]\n      : {};\n    store.optionLayout.products[targetHandle] = Object.assign({}, sourceProductLayout, existingProductLayout, {\n      optionHolders: holderIds,\n      productCommerceRuntime: true\n    });\n    if (sourceHandle && !selfContained) {\n      store.optionLayout.products[sourceHandle] = Object.assign({}, store.optionLayout.products[sourceHandle] || {}, store.optionLayout.products[targetHandle]);\n    }\n    store.pricingData = store.pricingData && typeof store.pricingData === 'object' ? store.pricingData : {};\n    store.pricingData.pricing = Object.assign({}, store.pricingData.pricing || {}, pricingMap);\n    store.productCommercePricingSkuPrefix = runtimeSkuPrefix;\n    store.productCommerceSelectionPrefixes = selectionIndex.prefixes;\n    store.productCommerceSelectionHolderIds = selectionIndex.holderIds;\n    store.productCatalog = store.productCatalog && typeof store.productCatalog === 'object' ? store.productCatalog : {};\n    var quantityProductData = normalizeProductCommerceQuantityProductData(bundle);\n    var sourceProductData = !selfContained && sourceHandle && store.productCatalog[sourceHandle] && typeof store.productCatalog[sourceHandle] === 'object'\n      ? store.productCatalog[sourceHandle]\n      : {};\n    var existingProductData = store.productCatalog[targetHandle] && typeof store.productCatalog[targetHandle] === 'object'\n      ? store.productCatalog[targetHandle]\n      : {};\n    var commerceProductData = Object.assign({}, sourceProductData, existingProductData, quantityProductData, {\n      productCode: productCode,\n      productCommerceRuntime: true,\n      productCommerceBundleId: text(bundle.bundleId),\n      productCommerceSourceHandle: sourceHandle\n    });\n    if (selfContained && text(target.shopifyProductId)) {\n      commerceProductData.id = text(target.shopifyProductId);\n      commerceProductData.handle = targetHandle;\n    }\n    store.productCatalog[targetHandle] = commerceProductData;\n    if (sourceHandle && !selfContained) {\n      store.productCatalog[sourceHandle] = Object.assign({}, store.productCatalog[sourceHandle] || {}, commerceProductData);\n    }\n    var skuOrder = pricing.metadata && typeof pricing.metadata === 'object' && Array.isArray(pricing.metadata.skuHolderOrder)\n      ? pricing.metadata.skuHolderOrder.map(text).filter(Boolean)\n      : [];\n    store.productCommerceSkuHolderOrder = skuOrder;\n    store.config.productCommerceRuntime = true;\n    store.config.productCommerceBundleId = text(bundle.bundleId);\n    store.config.resolvedProductDataSourceHandle = targetHandle;\n    store.config.resolvedOptionLayoutSourceHandle = targetHandle;\n    try { window.BG_DESIGNER_PRODUCT_COMMERCE_SOURCE = 'foundation-product-commerce-bundle'; } catch (_) {}\n    return true;\n  }\n\n  function readProductEditorConfigMapping(payload) {\n    var root = readProductEditorConfigRoot(payload);\n    if (root.ok === false) return null;\n    var mapping = root.mapping && typeof root.mapping === 'object' ? root.mapping : {};\n    var editorType = normalizeBogunaEditorType(mapping.editorType || root.editorType);\n    if (!editorType && text(root.mappingStatus) === 'not_found') editorType = 'none';\n    if (!editorType) return null;\n    var next = Object.assign({}, mapping, {\n      editorType: editorType,\n      aliasSourceHandle: text(mapping.aliasSourceHandle || root.aliasSourceHandle),\n      templateSourceHandle: text(mapping.templateSourceHandle || root.templateSourceHandle),\n      templateCollectionPath: text(mapping.templateCollectionPath || root.templateCollectionPath),\n      returnProductHandle: text(mapping.returnProductHandle || root.returnProductHandle)\n    });\n    if (typeof root.editorReady === 'boolean') next.editorReady = root.editorReady;\n    if (text(root.editorReadinessSource)) next.editorReadinessSource = text(root.editorReadinessSource);\n    if (text(root.editorReadinessReason)) next.editorReadinessReason = text(root.editorReadinessReason);\n    return next;\n  }\n\n  function publishProductEditorMappingState(store, mapping, editorType) {\n    var normalizedEditorType = normalizeBogunaEditorType(editorType);\n    try { window.BG_DESIGNER_EDITOR_TYPE = normalizedEditorType; } catch (_) {}\n    try { window.BG_DESIGNER_EDITOR_MAPPING = mapping || null; } catch (_) {}\n    try {\n      window.dispatchEvent(new CustomEvent('bg:product-editor-mapping-resolved', {\n        detail: {\n          editorType: normalizedEditorType,\n          productHandle: text(store && store.config && store.config.handle),\n          productId: text(store && store.config && store.config.productId),\n          mapping: mapping || null\n        }\n      }));\n    } catch (_) {\n      try { window.dispatchEvent(new Event('bg:product-editor-mapping-resolved')); } catch (__) {}\n    }\n  }\n\n  function buildTemplateCollectionDesignsUrl(store) {\n    var config = store && store.config ? store.config : {};\n    var assets = config.assets && typeof config.assets === 'object' ? config.assets : {};\n    var explicit = text(assets.templateCollectionDesignsUrl || config.templateCollectionDesignsUrl);\n    if (explicit) return explicit;\n    var designer = config.designer && typeof config.designer === 'object' ? config.designer : {};\n    var proxyRoot = text(designer.proxyRoot) || '/apps/qps-commerce-control-plane/designer';\n    var storeKey = text(config.storeKey || config.storefront || window.__siteCfg && window.__siteCfg.brand_slug);\n    var productHandle = text(config.handle);\n    if (!productHandle) return '';\n    return proxyRoot.replace(/\\/+$/, '') + '/template-collection-designs?storeKey=' + encodeURIComponent(storeKey) + '&productHandle=' + encodeURIComponent(productHandle);\n  }\n\n  function readTemplateCollectionDesignsResult(payload) {\n    if (Array.isArray(payload)) {\n      return {\n        items: payload,\n        result: {\n          items: payload\n        }\n      };\n    }\n    var root = payload && payload.result && typeof payload.result === 'object'\n      ? payload.result\n      : (payload && typeof payload === 'object' ? payload : {});\n    return {\n      items: Array.isArray(root.items) ? root.items : [],\n      result: root\n    };\n  }\n\n  // settings.readJson / settings.isCancelled: a background heal passes its\n  // cancellable reader and predicate (THEME-SETUP-READ-RECOVER), so a\n  // cancelled heal's template read is aborted and a late answer changes nothing.\n  function loadTemplateCollectionDesignRows(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var url = buildTemplateCollectionDesignsUrl(store);\n    if (!url) return Promise.reject(new Error('Template collection designs URL is not configured.'));\n    if (settings.fresh === true) url = addStorefrontCacheBust(url, '_bg_templates_refresh');\n    var read = typeof settings.readJson === 'function' ? settings.readJson : core.loadJson;\n    var isCancelled = typeof settings.isCancelled === 'function' ? settings.isCancelled : function () { return false; };\n    return read(url).then(function (payload) {\n      if (isCancelled()) return [];\n      if (payload && payload.ok === false) {\n        throw new Error(text(payload.error || payload.message) || 'Template collection designs request failed.');\n      }\n      var parsed = readTemplateCollectionDesignsResult(payload);\n      var result = parsed.result && typeof parsed.result === 'object' ? parsed.result : {};\n      store.templateCollectionDesignsPayload = result;\n      store.templateCollectionMapping = result.mapping && typeof result.mapping === 'object' ? result.mapping : null;\n      store.productTemplateCollectionMapping = result.productMapping && typeof result.productMapping === 'object' ? result.productMapping : null;\n      if (store.config && result.mapping && typeof result.mapping === 'object' && text(result.mapping.templateSourceHandle)) {\n        store.config.templateSourceHandle = text(result.mapping.templateSourceHandle);\n      }\n      return parsed.items;\n    });\n  }\n\n  // Editorless products with Use a template explicitly on still load their\n  // edit-service template catalog; editorFlowDisabled keeps blocking editor\n  // LAUNCH (getLaunchProvider) either way.\n  function allowEditorlessTemplates(store) {\n    if (!store || !store.config) return false;\n    var mapping = store.config.editorMapping;\n    if (normalizeBogunaEditorType(mapping && mapping.editorType) !== 'none') return false;\n    var settings = getArtworkSectionConfig(store);\n    var configured = settings._methodAvailabilityConfigured || {};\n    return !!(configured.useTemplate && settings.showUseTemplate);\n  }\n\n  function templateRowsBlocked(store) {\n    return !!(store && store.config && store.config.editorFlowDisabled === true && !allowEditorlessTemplates(store));\n  }\n\n  function loadTemplateRowsForStore(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    if (!store || !store.config || templateRowsBlocked(store)) return Promise.resolve([]);\n    return loadTemplateCollectionDesignRows(store, settings).catch(function (error) {\n      if (typeof settings.isCancelled === 'function' && settings.isCancelled()) return [];\n      if (window.console && window.console.warn) {\n        window.console.warn('BG Designer Storefront: Foundation template mapping was unavailable.', error);\n      }\n      return [];\n    });\n  }\n\n  function applyProductEditorMapping(store, mapping) {\n    if (!store || !store.config || !mapping || typeof mapping !== 'object') return null;\n    var editorType = normalizeBogunaEditorType(mapping.editorType);\n    if (!editorType) return null;\n    var designer = store.config.designer && typeof store.config.designer === 'object'\n      ? store.config.designer\n      : {};\n    store.config.designer = designer;\n    store.config.editorMapping = mapping;\n    store.config.aliasSourceHandle = text(mapping.aliasSourceHandle);\n    if (text(mapping.templateSourceHandle)) {\n      store.config.templateSourceHandle = text(mapping.templateSourceHandle);\n      store.config.assets = store.config.assets && typeof store.config.assets === 'object' ? store.config.assets : {};\n      store.config.assets.templateCollectionDesignsUrl = buildTemplateCollectionDesignsUrl(store);\n    }\n    if (text(mapping.returnProductHandle)) {\n      store.config.returnProductHandle = text(mapping.returnProductHandle);\n    }\n    publishProductEditorMappingState(store, mapping, editorType);\n    if (editorType === 'boguna_studio' && mapping.editorReady === false) {\n      store.config.editorFlowDisabled = true;\n      store.config.editorMappingBlocked = true;\n      store.config.editorMappingWarning = text(mapping.editorReadinessReason) || 'Boguna is not ready for this product yet.';\n      store.config.templateSourceHandle = '';\n      store.config.returnProductHandle = '';\n      store.config.launchProvider = '';\n      designer.launchProvider = '';\n      designer.isHybridPitchPrint = false;\n      store.config.isHybridPitchPrint = false;\n      if (store.editorShell && typeof store.editorShell.close === 'function') {\n        store.editorShell.close();\n      }\n      store.editorShell = null;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = '';\n      window.BG_DESIGNER_DEFAULT_PROVIDER = '';\n      if (window.console && window.console.warn) {\n        window.console.warn('BG Designer Storefront: Boguna mapping is not launch-ready for this product.', store.config.editorMappingWarning);\n      }\n      return mapping;\n    }\n    if (editorType === 'pitchprint_hybrid') {\n      store.config.editorFlowDisabled = false;\n      store.config.editorMappingBlocked = false;\n      store.config.editorMappingWarning = '';\n      store.config.launchProvider = 'pitchprint';\n      designer.launchProvider = 'pitchprint';\n      designer.isHybridPitchPrint = true;\n      store.config.isHybridPitchPrint = true;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = 'pitchprint';\n      window.BG_DESIGNER_DEFAULT_PROVIDER = 'pitchprint';\n      window.BG_DESIGNER_SELF_HOSTED_PILOT = false;\n      if (store.editorShell && typeof store.editorShell.close === 'function') {\n        store.editorShell.close();\n      }\n      store.editorShell = null;\n      store.idleEditorPrewarmScheduled = false;\n      store.idleEditorPrewarmComplete = false;\n      void ensurePitchPrintHybridRuntime(store);\n      return mapping;\n    }\n    if (editorType === 'none') {\n      store.config.editorFlowDisabled = true;\n      // Keep any mapping-provided template source: editorless products can\n      // still serve an edit-service template catalog.\n      store.config.returnProductHandle = '';\n      store.config.launchProvider = '';\n      designer.launchProvider = '';\n      designer.isHybridPitchPrint = false;\n      store.config.isHybridPitchPrint = false;\n      if (store.editorShell && typeof store.editorShell.close === 'function') {\n        store.editorShell.close();\n      }\n      store.editorShell = null;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = '';\n      window.BG_DESIGNER_DEFAULT_PROVIDER = '';\n      return mapping;\n    }\n    if (editorType === 'boguna_studio') {\n      store.config.editorFlowDisabled = false;\n      store.config.editorMappingBlocked = false;\n      store.config.editorMappingWarning = '';\n      store.config.launchProvider = 'self-hosted';\n      designer.launchProvider = 'self-hosted';\n      designer.isHybridPitchPrint = false;\n      store.config.isHybridPitchPrint = false;\n      window.BG_DESIGNER_LAUNCH_PROVIDER = 'self-hosted';\n      window.BG_DESIGNER_DEFAULT_PROVIDER = 'self-hosted';\n      if (!store.editorShell) bindEditorShell(store);\n      return mapping;\n    }\n    return mapping;\n  }\n\n  var PRODUCT_CONFIG_LOAD_WATCHDOG_MS = 12000;\n\n  // Setup data that is still unavailable after core.loadJson's retries leaves\n  // a page that cannot price. It shows one plain message with the reference\n  // code instead of a $0.00 form, and Add to cart stays blocked. A page that\n  // still prices from its other data keeps working.\n  var SETUP_DATA_UNAVAILABLE_MESSAGE = 'This product\\'s options could not load. Please reload the page or try again later.';\n\n  function isSetupDataUnavailable(store) {\n    return !!(store && store.setupDataLoadFailed && store.state\n      && !(text(store.state.finalSku) && Number(store.state.price) > 0));\n  }\n\n  // The terminal state hides only what was visible and remembers it, so a page\n  // that prices after all (other data, or a later successful setup read) gets\n  // exactly those controls back.\n  function renderSetupDataUnavailable(store) {\n    var blocks = readBlocks(store);\n    clearInitialOptionsLoader(blocks);\n    var hidden = store.setupDataHiddenNodes || (store.setupDataHiddenNodes = []);\n    function hide(node) {\n      if (!node || node.hidden) return;\n      node.hidden = true;\n      hidden.push(node);\n    }\n    ['options', 'quantity', 'customerInputs', 'summary', 'artwork', 'uploads'].forEach(function (key) {\n      hide(blocks[key]);\n    });\n    // The guided price overview would otherwise keep its loading placeholder.\n    var host = store.root.closest('product-info') || store.root.closest('[id^=\"ProductInfo-\"]');\n    Array.prototype.slice.call(host ? host.querySelectorAll('[data-bg-guided-mobile-overview]') : []).forEach(hide);\n    setMessage(store, withCartFailureReferenceCode(SETUP_DATA_UNAVAILABLE_MESSAGE), 'error');\n    holdSetupRegionHeight(store, readBlocks(store));\n    scheduleSetupDataRereads(store);\n  }\n\n  // THEME-SETUP-READ-RECOVER feel: the purchase region keeps its loading\n  // height through the terminal state, so nothing below it moves when the\n  // message replaces the loader. The height is read once, while the first-\n  // paint loader is still up; the message panel then grows by the shortfall\n  // (its text centred). The heal releases it, and the healed form takes the\n  // space a normal first load gives it.\n  function captureSetupRegionHeight(store) {\n    if (!store || !store.root || store.setupRegionHeight) return;\n    var blocks = readBlocks(store);\n    if (!blocks.options || !blocks.options.querySelector('[data-bg-designer-initial-loader]')) return;\n    var region = store.root.closest('product-info') || store.root;\n    store.setupRegionHeight = region.getBoundingClientRect().height;\n  }\n\n  function holdSetupRegionHeight(store, blocks) {\n    var message = blocks && blocks.message;\n    if (!message || message.hidden || message.hasAttribute('data-bg-designer-setup-hold')) return;\n    var regionHold = store.root.__bgRegionHold;\n    var shortfall = 0;\n    var messageHeight = 0;\n    if (regionHold) {\n      // The purchase region already holds its stored height: the panel fills\n      // it, so the held space is the message, never a blank band. Both are\n      // measured without the reservation (a grid root stretches its rows).\n      store.root.removeAttribute('data-bg-designer-region-hold');\n      shortfall = regionHold.root - store.root.getBoundingClientRect().height;\n      messageHeight = message.getBoundingClientRect().height;\n      store.root.setAttribute('data-bg-designer-region-hold', '');\n    } else {\n      if (!store.setupRegionHeight) return;\n      var region = store.root.closest('product-info') || store.root;\n      shortfall = store.setupRegionHeight - region.getBoundingClientRect().height;\n      messageHeight = message.getBoundingClientRect().height;\n    }\n    if (!(shortfall > 0)) return;\n    message.style.setProperty('--bg-designer-setup-hold-min-height', Math.round(messageHeight + shortfall) + 'px');\n    message.setAttribute('data-bg-designer-setup-hold', '');\n  }\n\n  function releaseSetupRegionHeight(blocks) {\n    var message = blocks && blocks.message;\n    if (!message || !message.hasAttribute('data-bg-designer-setup-hold')) return;\n    message.removeAttribute('data-bg-designer-setup-hold');\n    message.style.removeProperty('--bg-designer-setup-hold-min-height');\n  }\n\n  // THEME-SETUP-READ-RECOVER (Director ruling, fix round 2): the purchase\n  // region (the storefront root, the WO-01 region) reserves the last rendered\n  // form height known for this product in this tab, kept in sessionStorage\n  // after every rendered form. While the page loads, the reservation also\n  // covers the purchase form and the blocks the stylesheet hides until the\n  // boot (they show in the same task that ends loading, and the reservation\n  // drops by their height then). It lasts through the setup message and the\n  // re-reads, and leaves in the first frame of the rendered form, so a repeat\n  // visit's first load and a heal land without moving the content below. A\n  // first visit has nothing stored; its heal still grows by the form's height\n  // (the open FIRST-LOAD-RESERVATION case).\n  var REGION_HOLD_STORAGE_PREFIX = 'bgDesignerPurchaseRegion:';\n  var REGION_HOLD_RECORDS_ENABLED = false; // Off: FIRST-LOAD-RESERVATION (#738) owns turning the stored height record on; until then the bucket code below is unused.\n  var REGION_HOLD_MOVE_LIMIT_PX = 4;\n\n  // The stored height is per viewport bucket (a rotated phone or a desktop\n  // window never replays a phone height); the host shell's inline script uses\n  // the same code (a parity test keeps the two identical).\n  // The bucket is the layout the stylesheet applies, read from its media\n  // queries (the phone layout is max-width 749px), plus the orientation, so\n  // each orientation keeps its own record: a sideways iPhone that Safari\n  // letterboxes to a phone-width layout (about 734 px) and an iPad turning\n  // between 820 and 1180 never share one. Never screen.width: iOS Safari\n  // keeps it at the upright width when the phone turns sideways. Media\n  // queries follow the layout viewport, which horizontal overflow does not\n  // widen. Without a working query API the layout is unknown (''): no record\n  // is read, deleted or written, and the stylesheet's default reserves.\n  function regionHoldViewportBucket() {\n    var media = function (query) { var list = typeof window.matchMedia === 'function' ? window.matchMedia(query) : null; return list ? !!list.matches : null; };\n    var narrow = media('(max-width: 389px)');\n    var phone = media('(max-width: 749px)');\n    var landscape = media('(orientation: landscape)');\n    var bucket = narrow === null || phone === null || landscape === null ? '' : (narrow ? 'w375' : phone ? 'w402' : 'desktop') + (landscape ? '-landscape' : '-portrait');\n    return bucket;\n  }\n\n  // The bottom of the visible page in layout-viewport coordinates (the ones\n  // getBoundingClientRect reads). Under pinch zoom on iOS Safari innerHeight\n  // follows the visual viewport, so the larger of the two keeps an unseen\n  // check conservative.\n  function regionHoldVisibleBottom() {\n    var viewport = window.visualViewport;\n    var visual = viewport ? (Number(viewport.offsetTop) || 0) + (Number(viewport.height) || 0) : 0;\n    return Math.max(Number(window.innerHeight) || 0, visual);\n  }\n\n  // '' when the layout is unknown: callers then read, delete and write nothing.\n  function regionHoldStorageKey(store) {\n    if (!REGION_HOLD_RECORDS_ENABLED) return '';\n    var bucket = regionHoldViewportBucket();\n    if (!bucket) return '';\n    return REGION_HOLD_STORAGE_PREFIX + text(store.config && store.config.storeKey) + ':' + text(store.config && store.config.handle)\n      + ':' + bucket;\n  }\n\n  // The product's configuration revision (Product Commerce authoring\n  // revision). A stored height recorded under another revision is dropped as\n  // soon as the configuration arrives, so the next load takes the default.\n  function currentRegionHoldRevision(store) {\n    var bundle = store && store.productCommerceRuntimeBundle;\n    return text(bundle && (bundle.authoringRevisionId || bundle.bundleId));\n  }\n\n  function dropStaleRegionHold(store) {\n    var revision = currentRegionHoldRevision(store);\n    if (!revision) return;\n    var active = store.root && store.root.__bgRegionHold;\n    if (active && active.kind === 'stored' && text(active.revision) !== revision) active.stale = true;\n    try {\n      var key = regionHoldStorageKey(store);\n      var stored = key ? parseJson(window.sessionStorage.getItem(key), null) : null;\n      if (stored && text(stored.revision) !== revision) window.sessionStorage.removeItem(key);\n    } catch (_) { /* storage unavailable */ }\n  }\n\n  function readStoredRegionHold(store) {\n    try {\n      var key = regionHoldStorageKey(store);\n      var stored = key ? parseJson(window.sessionStorage.getItem(key), null) : null;\n      var root = Number(stored && stored.root);\n      var gated = Number(stored && stored.gated);\n      if (!(root > 0)) return null;\n      return { root: root, gated: gated > 0 ? gated : 0, revision: text(stored && stored.revision) };\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function hydrationGatedNodes(store) {\n    var host = store.root.closest('product-info');\n    return host ? Array.prototype.slice.call(host.querySelectorAll('.product-form, [data-bg-designer-post-buy-block], .product-highlights')) : [];\n  }\n\n  function layoutHeight(node) {\n    if (!node || node.hidden) return 0;\n    var rect = node.getBoundingClientRect();\n    if (!(rect.height > 0)) return 0;\n    var style = window.getComputedStyle ? window.getComputedStyle(node) : null;\n    return rect.height + (style ? (parseFloat(style.marginTop) || 0) + (parseFloat(style.marginBottom) || 0) : 0);\n  }\n\n  function setRegionHold(root, px) {\n    if (!(px > 0)) return;\n    root.style.setProperty('--bg-designer-region-hold-min-height', Math.round(px) + 'px');\n    root.setAttribute('data-bg-designer-region-hold', '');\n  }\n\n  function releaseRegionHold(root) {\n    if (!root) return;\n    root.__bgRegionHold = null;\n    root.removeAttribute('data-bg-designer-region-default');\n    if (!root.hasAttribute('data-bg-designer-region-hold')) return;\n    root.removeAttribute('data-bg-designer-region-hold');\n    root.style.removeProperty('--bg-designer-region-hold-min-height');\n  }\n\n  // At boot and at a heal: reserve the stored height (never less than the\n  // region already takes, so the loader's own reservation still counts).\n  function applyStoredRegionHold(store) {\n    if (!store || !store.root || store.root.__bgRegionHold) return;\n    var host = store.root.closest('product-info');\n    var loading = !!(host && host.getAttribute('data-bg-ds-hydration') === 'loading');\n    var stored = readStoredRegionHold(store);\n    if (!stored) {\n      // A first visit: the default reservation (CSS token, min-height, set\n      // before the first paint by the host shell) holds the region instead.\n      if (!loading) return;\n      store.root.setAttribute('data-bg-designer-region-default', '');\n      store.root.__bgRegionHold = { kind: 'default', root: 0, gated: 0 };\n      return;\n    }\n    store.root.__bgRegionHold = { kind: 'stored', root: stored.root, gated: stored.gated, revision: stored.revision };\n    setRegionHold(store.root, Math.max(store.root.getBoundingClientRect().height, stored.root + (loading ? stored.gated : 0)));\n  }\n\n  // Before the boot: each designer root on the page reserves its stored\n  // height from its own config script (the store is not built yet).\n  function reserveStoredRegionHoldsEarly() {\n    Array.prototype.slice.call(document.querySelectorAll('[data-bg-designer-storefront-root]')).forEach(function (root) {\n      try {\n        var config = core.readConfig(root);\n        if (!config || !text(config.handle)) return;\n        applyStoredRegionHold({ root: root, config: config });\n      } catch (_) { /* the boot reserves it instead */ }\n    });\n  }\n\n  // Loading just ended and the gated blocks showed: the root keeps the height\n  // the region had, less theirs, so the content below stays put. A stored\n  // hold keeps its recorded form height; the default hold keeps what it\n  // reserved (measured just before, in the same task).\n  function settleRegionHoldAfterHydration(root, heldBeforeHydration) {\n    var hold = root && root.__bgRegionHold;\n    if (!hold) return;\n    if (hold.kind === 'stored') {\n      setRegionHold(root, hold.root);\n      return;\n    }\n    var host = root.closest('product-info');\n    var gated = (host ? Array.prototype.slice.call(host.querySelectorAll('.product-form, [data-bg-designer-post-buy-block], .product-highlights')) : [])\n      .reduce(function (sum, node) { return sum + layoutHeight(node); }, 0);\n    hold.root = Math.max(0, Math.round(heldBeforeHydration - gated));\n    root.removeAttribute('data-bg-designer-region-default');\n    if (hold.root > 0) setRegionHold(root, hold.root);\n    else releaseRegionHold(root);\n  }\n\n  // THEME-SETUP-READ-RECOVER round 5: a stale hold (recorded under another\n  // configuration revision) gives back its extra space only while everything\n  // after the region stays below the visible page, so no visible content\n  // moves. Until then it waits for a scroll that makes the change unseen; if\n  // that never comes, the space stays (the next load uses the new record).\n  function replaceStaleRegionHold(store, excessPx) {\n    var root = store && store.root;\n    if (!root || !root.__bgRegionHold || !root.__bgRegionHold.stale) return;\n    var unseen = root.getBoundingClientRect().bottom - excessPx >= regionHoldVisibleBottom();\n    if (unseen) {\n      if (root.__bgRegionHoldScroll) window.removeEventListener('scroll', root.__bgRegionHoldScroll);\n      root.__bgRegionHoldScroll = null;\n      releaseRegionHold(root);\n      return;\n    }\n    if (root.__bgRegionHoldScroll) return;\n    var pending = false;\n    root.__bgRegionHoldScroll = function () {\n      if (pending) return;\n      pending = true;\n      var frame = typeof window.requestAnimationFrame === 'function'\n        ? window.requestAnimationFrame.bind(window)\n        : function (callback) { return window.setTimeout(callback, 16); };\n      frame(function () {\n        pending = false;\n        var hold = root.__bgRegionHold;\n        if (!hold || !hold.stale || !root.hasAttribute('data-bg-designer-region-hold')) {\n          window.removeEventListener('scroll', root.__bgRegionHoldScroll);\n          root.__bgRegionHoldScroll = null;\n          return;\n        }\n        root.removeAttribute('data-bg-designer-region-hold');\n        var natural = root.getBoundingClientRect().height;\n        root.setAttribute('data-bg-designer-region-hold', '');\n        var held = Math.max(root.getBoundingClientRect().height, Number(hold.root) || 0);\n        replaceStaleRegionHold(store, held - natural);\n      });\n    };\n    window.addEventListener('scroll', root.__bgRegionHoldScroll, { passive: true });\n  }\n\n  // After a rendered form: release the reservation and keep the form's\n  // height for the next load (one layout read per frame).\n  function scheduleRegionHoldRecord(store) {\n    if (!store || !store.root || store.regionHoldRecordScheduled) return;\n    store.regionHoldRecordScheduled = true;\n    var frame = typeof window.requestAnimationFrame === 'function'\n      ? window.requestAnimationFrame.bind(window)\n      : function (callback) { return window.setTimeout(callback, 16); };\n    frame(function () {\n      store.regionHoldRecordScheduled = false;\n      if (!store.root || store.sectionUnloaded || store.setupDataLoadFailed || !store.bootRenderDone) return;\n      var held = store.root.__bgRegionHold;\n      var heldPx = held && store.root.hasAttribute('data-bg-designer-region-hold')\n        ? Math.max(store.root.getBoundingClientRect().height, Number(held.root) || 0) : 0;\n      if (held) store.root.removeAttribute('data-bg-designer-region-hold');\n      var root = Math.round(store.root.getBoundingClientRect().height);\n      if (held) {\n        if (held.stale && heldPx - root > REGION_HOLD_MOVE_LIMIT_PX) {\n          // A hold from an older configuration: replaced by the measured form\n          // only when the change is off screen (see replaceStaleRegionHold).\n          store.root.setAttribute('data-bg-designer-region-hold', '');\n          replaceStaleRegionHold(store, heldPx - root);\n        } else if (heldPx - root > REGION_HOLD_MOVE_LIMIT_PX) {\n          // The form is shorter than what was held: the space stays for the\n          // page's life, after the last block (align-content: start), so\n          // nothing ever moves up and no tap or scroll changes it. A taller\n          // later render grows past it and releases it then.\n          store.root.setAttribute('data-bg-designer-region-hold', '');\n        } else {\n          releaseRegionHold(store.root);\n        }\n      }\n      if (!(root > 0)) return;\n      // An unknown layout keeps no record (regionHoldStorageKey).\n      var key = regionHoldStorageKey(store);\n      if (!key) return;\n      var gated = Math.round(hydrationGatedNodes(store).reduce(function (sum, node) {\n        return sum + layoutHeight(node);\n      }, 0));\n      var revision = currentRegionHoldRevision(store);\n      // The same height under another bucket (after a rotation) is still written.\n      if (store.recordedRegionHold && store.recordedRegionHoldKey === key && store.recordedRegionHold.root === root\n        && store.recordedRegionHold.gated === gated && store.recordedRegionHold.revision === revision) return;\n      store.recordedRegionHold = { root: root, gated: gated, revision: revision };\n      store.recordedRegionHoldKey = key;\n      try {\n        window.sessionStorage.setItem(key, JSON.stringify(store.recordedRegionHold));\n      } catch (_) { /* storage unavailable: the next load reserves the loader height only */ }\n    });\n  }\n\n  // THEME-SETUP-READ-RECOVER: a page left in the terminal state reads its\n  // setup data again in the background, at most twice: about 15 s and about\n  // 40 s after the message. A brief upstream stall or a slow phone then heals\n  // with no reload. Each re-read is a new cache-busted config read; its\n  // success runs recoverFromSetupDataFailure. Add to cart stays blocked by the\n  // terminal state until the page prices again. A failed re-read keeps the\n  // message, and nothing reads again after the second one.\n  var SETUP_DATA_REREAD_AFTER_MS = [15000, 40000];\n\n  // Background re-reads use this runtime-local reader, not core.loadJson,\n  // whose timeout and backoff chain cannot be stopped from outside. One\n  // attempt per read, cut off at SETUP_DATA_REREAD_TIMEOUT_MS (the boot\n  // chain's whole budget); the next scheduled re-read is the retry. cancel()\n  // aborts every request in flight and clears its timer, so nothing fetches\n  // after the page leaves.\n  var SETUP_DATA_REREAD_TIMEOUT_MS = 10000;\n\n  function createCancellableSetupReader() {\n    var active = [];\n    var cancelled = false;\n    function cancelledError() {\n      var error = new Error('setup_reread_cancelled');\n      error.status = 0;\n      return error;\n    }\n    function read(url) {\n      var cleanUrl = text(url);\n      if (!cleanUrl) return Promise.resolve(null);\n      if (cancelled) return Promise.reject(cancelledError());\n      return new Promise(function (resolve, reject) {\n        var Controller = typeof AbortController === 'function' ? AbortController : window.AbortController;\n        var controller = typeof Controller === 'function' ? new Controller() : null;\n        var entry = { done: false, timer: 0 };\n        function abort() {\n          if (!controller) return;\n          try { controller.abort(); } catch (_) { /* already settled */ }\n        }\n        function finish(callback, value) {\n          if (entry.done) return;\n          entry.done = true;\n          window.clearTimeout(entry.timer);\n          var index = active.indexOf(entry);\n          if (index !== -1) active.splice(index, 1);\n          callback(value);\n        }\n        entry.cancel = function () {\n          abort();\n          finish(reject, cancelledError());\n        };\n        entry.timer = window.setTimeout(function () {\n          abort();\n          var timeout = new Error('Storefront data did not arrive in time from ' + cleanUrl);\n          timeout.status = 0;\n          timeout.timedOut = true;\n          finish(reject, timeout);\n        }, SETUP_DATA_REREAD_TIMEOUT_MS);\n        active.push(entry);\n        var init = { credentials: 'same-origin', headers: { accept: 'application/json' } };\n        if (controller) init.signal = controller.signal;\n        fetch(cleanUrl, init).then(function (response) {\n          if (entry.done) return null;\n          if (!response.ok) {\n            var failure = new Error('Unable to load storefront data from ' + cleanUrl);\n            failure.status = Number(response.status) || 0;\n            try {\n              if (response.body && typeof response.body.cancel === 'function') response.body.cancel().catch(function () {});\n            } catch (_) { /* nothing to release */ }\n            finish(reject, failure);\n            return null;\n          }\n          return response.json().then(function (payload) {\n            finish(resolve, payload);\n          });\n        }).catch(function (error) {\n          finish(reject, error instanceof Error ? error : new Error('Unable to reach storefront data at ' + cleanUrl));\n        });\n      });\n    }\n    function cancel() {\n      cancelled = true;\n      active.slice().forEach(function (entry) {\n        entry.cancel();\n      });\n    }\n    return { read: read, cancel: cancel };\n  }\n\n  // Leaving the page (pagehide, a bfcache entry included) or unloading the\n  // section cancels the schedule: the pending timer is cleared, the read in\n  // flight is aborted with its timer, and nothing applies or reads again.\n  function scheduleSetupDataRereads(store) {\n    if (!store || store.setupDataRereads) return;\n    var rereads = store.setupDataRereads = {\n      since: Date.now(), attempt: 0, timer: 0, cancelled: false, onPageHide: null,\n      reader: createCancellableSetupReader()\n    };\n    rereads.onPageHide = function () {\n      cancelSetupDataRereads(store);\n    };\n    window.addEventListener('pagehide', rereads.onPageHide);\n    function isCancelled() {\n      return rereads.cancelled || !!store.sectionUnloaded;\n    }\n    function next() {\n      var afterMs = SETUP_DATA_REREAD_AFTER_MS[rereads.attempt];\n      if (afterMs === undefined || isCancelled()) {\n        cancelSetupDataRereads(store);\n        return;\n      }\n      rereads.timer = window.setTimeout(run, Math.max(0, afterMs - (Date.now() - rereads.since)));\n    }\n    function run() {\n      rereads.timer = 0;\n      if (isCancelled() || !isSetupDataUnavailable(store)) {\n        cancelSetupDataRereads(store);\n        return;\n      }\n      rereads.attempt += 1;\n      var attempt = rereads.attempt;\n      loadProductEditorConfig(store, {\n        fresh: true,\n        recoveryAttempt: attempt,\n        isCancelled: isCancelled,\n        readJson: rereads.reader.read\n      }).then(function () {\n        if (isCancelled()) return;\n        if (isSetupDataUnavailable(store)) {\n          next();\n          return;\n        }\n        cancelSetupDataRereads(store);\n        emitStorefrontEvent(store, 'setup_data_recovered', 'config', { attempt: attempt }, 'normal');\n      });\n    }\n    next();\n  }\n\n  function cancelSetupDataRereads(store) {\n    var rereads = store && store.setupDataRereads;\n    if (!rereads || rereads.cancelled) return;\n    rereads.cancelled = true;\n    if (rereads.timer) window.clearTimeout(rereads.timer);\n    rereads.timer = 0;\n    if (rereads.reader) rereads.reader.cancel();\n    if (rereads.onPageHide) window.removeEventListener('pagehide', rereads.onPageHide);\n  }\n\n  // THEME-SETUP-READ-RECOVER: a first load still reading its setup data after\n  // STILL_LOADING_OPTIONS_AFTER_MS says so in the same loader. The label shows\n  // under the dots, out of flow, so the dots never move.\n  var STILL_LOADING_OPTIONS_AFTER_MS = 3000;\n  var STILL_LOADING_OPTIONS_LABEL = 'Still loading options';\n\n  function scheduleStillLoadingOptionsLabel(store) {\n    window.setTimeout(function () {\n      if (!store.root || store.sectionUnloaded) return;\n      var options = readBlocks(store).options;\n      var loader = options && options.querySelector('[data-bg-designer-initial-loader]');\n      if (!loader) return;\n      var label = loader.querySelector('.bg-designer-storefront__initial-loader-label');\n      if (label) label.textContent = STILL_LOADING_OPTIONS_LABEL;\n      loader.setAttribute('aria-label', STILL_LOADING_OPTIONS_LABEL);\n      loader.setAttribute('data-bg-designer-loader-slow', 'true');\n    }, STILL_LOADING_OPTIONS_AFTER_MS);\n  }\n\n  function restoreSetupDataBlocks(store) {\n    store.setupDataLoadFailed = false;\n    (store.setupDataHiddenNodes || []).forEach(function (node) {\n      node.hidden = false;\n    });\n    store.setupDataHiddenNodes = [];\n    // The setup error is resolved: clear its message on its own. Any other\n    // requirement (a required field, say) keeps its own gate and message.\n    var blocks = readBlocks(store);\n    releaseSetupRegionHeight(blocks);\n    if (blocks.message && text(blocks.message.textContent).indexOf(SETUP_DATA_UNAVAILABLE_MESSAGE) === 0) {\n      setMessage(store, '', '');\n    }\n  }\n\n  // A later successful setup read on a page in the terminal state rebuilds the\n  // page from the same reads as the boot (GET only; nothing is written). A\n  // boot that ended in the terminal state never ran its restorations; the\n  // heal runs them now, once, on the healed data (completeStorefrontBoot).\n  function recoverFromSetupDataFailure(store, isCancelled, readJson) {\n    return loadStorefrontBootPayloads(store, readJson, isCancelled).then(function (payloads) {\n      if ((typeof isCancelled === 'function' && isCancelled()) || !store.root || store.sectionUnloaded) return;\n      applyStorefrontBootPayloads(store, payloads);\n      if (!store.storefrontBootCompleted && !isSetupDataUnavailable(store)) {\n        applyStoredRegionHold(store);\n        completeStorefrontBoot(store, { healing: true });\n        return;\n      }\n      render(store);\n    });\n  }\n\n  function emitSetupDataFailure(store, errorName, errorCode, error, payload) {\n    emitStorefrontError(store, errorName, errorCode, error, Object.assign({}, payload || {}, {\n      status: error && typeof error.status === 'number' ? error.status : undefined,\n      referenceCode: readCartFailureReferenceCode(),\n      reason: text(error && error.message).slice(0, 120)\n    }));\n    // The report leaves at once on the telemetry transport (sendBeacon, else a\n    // keepalive fetch) instead of on the next batch, so a shopper who reloads\n    // or leaves the broken page does not drop it.\n    var telemetry = storefrontTelemetry();\n    if (telemetry && typeof telemetry.flush === 'function') {\n      try { telemetry.flush(); } catch (_) { /* telemetry never breaks the page */ }\n    }\n  }\n\n  function loadProductEditorConfigJsonWithWatchdog(store, url, attempt) {\n    return new Promise(function (resolve, reject) {\n      var settled = false;\n      // A request that never settles (poisoned connection, hung proxy) must\n      // not leave the product form on its preloader forever; time it out so\n      // the caller can retry on a fresh request and fall back visibly.\n      var timer = window.setTimeout(function () {\n        if (settled) return;\n        settled = true;\n        emitStorefrontError(\n          store,\n          'product_config_load_stalled',\n          'config_load_stalled',\n          new Error('Product config request did not settle within ' + PRODUCT_CONFIG_LOAD_WATCHDOG_MS + 'ms.'),\n          { attempt: attempt }\n        );\n        reject(new Error('product_config_load_stalled'));\n      }, PRODUCT_CONFIG_LOAD_WATCHDOG_MS);\n      core.loadJson(url).then(function (payload) {\n        if (settled) return;\n        settled = true;\n        window.clearTimeout(timer);\n        resolve(payload);\n      }, function (error) {\n        if (settled) return;\n        settled = true;\n        window.clearTimeout(timer);\n        reject(error);\n      });\n    });\n  }\n\n  // After a refused signing whose amount the page's own prices cannot\n  // explain: re-read the store's current component prices for this product\n  // (price rows, option and artwork value prices, the custom design price)\n  // and apply only those, so every offer and total is priced again by the\n  // normal rules (sale, credits, customer tier). Resolves true when a price\n  // changed.\n  function refreshArtworkComponentPrices(store) {\n    if (store.artworkPriceRefresh) return store.artworkPriceRefresh;\n    var url = buildProductEditorConfigUrl(store);\n    if (!url) return Promise.resolve(false);\n    store.artworkPriceRefresh = loadProductEditorConfigJsonWithWatchdog(store, addStorefrontCacheBust(url, '_bg_price_refresh'), 1).then(function (payload) {\n      return applyFreshComponentPrices(store, readProductEditorConfigProductCommerceBundle(payload), readProductEditorConfigProductData(payload));\n    }).catch(function () {\n      return false;\n    }).then(function (changed) {\n      store.artworkPriceRefresh = null;\n      return changed;\n    });\n    return store.artworkPriceRefresh;\n  }\n\n  function applyFreshComponentPrices(store, bundle, productDetails) {\n    var changed = false;\n    function assign(target, key, value) {\n      if (!Number.isFinite(value) || target[key] === value) return;\n      target[key] = value;\n      changed = true;\n    }\n    var pricing = store.pricingData && store.pricingData.pricing && typeof store.pricingData.pricing === 'object' ? store.pricingData.pricing : {};\n    var rows = bundle && bundle.pricing && Array.isArray(bundle.pricing.rows) ? bundle.pricing.rows : [];\n    rows.forEach(function (row) {\n      var entry = pricing[text(row && row.sku)];\n      if (!entry) return;\n      ['price', PARTNER_TIER_PRICE_KEY, 'priceBrokerBasic', 'priceBrokerPremium', 'priceFriendsFamily'].forEach(function (column) {\n        var cell = readTierPrice(row, column);\n        var amount = cell !== null && cell !== '' && cell !== undefined ? Number(cell) : NaN;\n        // EXACT-CENTS-CATALOG: the line scales the row as authored, so the\n        // authored value moves with the compact cents (never a stale row).\n        var authored = entry.authored && typeof entry.authored === 'object' ? entry.authored : null;\n        // BD-ZERO-TIER-CELL: a staff cell at or below zero is no tier price.\n        if (column === 'price' ? Number.isFinite(amount) : amount > 0) {\n          assign(entry, column, roundAuthoredRowMoney(amount));\n          if (authored && authored[column] !== amount) {\n            authored[column] = amount;\n            changed = true;\n          }\n        } else if (column !== 'price' && Object.prototype.hasOwnProperty.call(entry, column)) {\n          // The store no longer prices this tier on this row.\n          delete entry[column];\n          if (authored) delete authored[column];\n          changed = true;\n        }\n        // An entry read before the rename may still hold the tier's former key:\n        // the fresh row's answer (above) replaces it.\n        if (column === PARTNER_TIER_PRICE_KEY && core.LEGACY_PARTNER_TIER_PRICE_KEY) {\n          if (Object.prototype.hasOwnProperty.call(entry, core.LEGACY_PARTNER_TIER_PRICE_KEY)) {\n            delete entry[core.LEGACY_PARTNER_TIER_PRICE_KEY];\n            changed = true;\n          }\n          if (authored && Object.prototype.hasOwnProperty.call(authored, core.LEGACY_PARTNER_TIER_PRICE_KEY)) {\n            delete authored[core.LEGACY_PARTNER_TIER_PRICE_KEY];\n            changed = true;\n          }\n        }\n      });\n      if (row.unitPrice !== null && row.unitPrice !== undefined && row.unitPrice !== '') assign(entry, 'unitPrice', Number(row.unitPrice));\n    });\n    var freshHolders = {};\n    (bundle && Array.isArray(bundle.optionHolders) ? bundle.optionHolders : []).forEach(function (holder, index) {\n      var normalized = normalizeProductCommerceRuntimeOptionHolder(holder, index);\n      if (normalized) freshHolders[getHolderId(normalized)] = normalized;\n    });\n    (Array.isArray(store.holders) ? store.holders : []).forEach(function (holder) {\n      var fresh = freshHolders[getHolderId(holder)];\n      if (!fresh) return;\n      (Array.isArray(holder.values) ? holder.values : []).forEach(function (value) {\n        var freshValue = fresh.values.find(function (candidate) { return text(candidate.hvId) === text(value.hvId); });\n        if (!freshValue) return;\n        if (freshValue.addonPrice !== null && value.addonPrice !== freshValue.addonPrice) {\n          value.addonPrice = freshValue.addonPrice;\n          changed = true;\n        }\n        if (freshValue.addonConfig && JSON.stringify(value.addonConfig) !== JSON.stringify(freshValue.addonConfig)) {\n          value.addonConfig = freshValue.addonConfig;\n          changed = true;\n        }\n      });\n    });\n    var customDesignCost = productDetails && productDetails.customDesignCost !== undefined && productDetails.customDesignCost !== null\n      ? Number(productDetails.customDesignCost) : NaN;\n    if (store.productData && typeof store.productData === 'object') assign(store.productData, 'customDesignCost', customDesignCost);\n    return changed;\n  }\n\n  function loadProductEditorConfig(store, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var url = buildProductEditorConfigUrl(store);\n    if (!url) return Promise.resolve(null);\n    if (settings.fresh === true) url = addStorefrontCacheBust(url, '_bg_mapping_refresh');\n    var recoveryAttempt = Number(settings.recoveryAttempt) || undefined;\n    function isCancelled() {\n      return typeof settings.isCancelled === 'function' && settings.isCancelled() === true;\n    }\n    emitStorefrontEvent(store, 'product_config_load_started', 'config', {\n      fresh: settings.fresh === true,\n      recoveryAttempt: recoveryAttempt\n    }, 'normal');\n    var readJson = typeof settings.readJson === 'function' ? settings.readJson : null;\n    var request = readJson ? readJson(url) : loadProductEditorConfigJsonWithWatchdog(store, url, 1).catch(function (error) {\n      if (!error || error.message !== 'product_config_load_stalled') throw error;\n      // The stalled first request stays cached as a pending promise; a\n      // cache-busted URL issues a genuinely new request instead of reusing it.\n      return loadProductEditorConfigJsonWithWatchdog(store, addStorefrontCacheBust(url, '_bg_stall_retry'), 2);\n    });\n    return request.then(function (payload) {\n      // A background re-read cancelled while in flight applies nothing.\n      if (isCancelled()) return null;\n      // Tokens land before custom CSS so per-store custom CSS stays the\n      // last word over token-driven styling.\n      applyProductPageThemeTokens(payload);\n      applyProductPageCustomCss(payload);\n      applyProductEditorConfigProductData(store, readProductEditorConfigProductData(payload));\n      // A refused or empty answer is not the truth: the server block stays.\n      if (payload && readProductEditorConfigRoot(payload).ok !== false) {\n        store.productPageNotices = readProductPageNoticesPayload(payload);\n        store.productPageNoticesLoaded = true;\n      }\n      // The binding upload capability rides the config's TOP-LEVEL flag (the\n      // page's designerProductBinding bag has no upload key) \u2014 guided slot\n      // fill gates on it so it never offers a dead-end upload.\n      store.bindingUploadEnabled = !!(payload && payload.upload === true);\n      store.productCommerceRuntimeBundle = readProductEditorConfigProductCommerceBundle(payload);\n      dropStaleRegionHold(store);\n      store.channelCatalog = core.normalizeChannelCatalog(readProductEditorConfigRoot(payload).channelOffers, store.config.productId);\n      // Selected merchandise is an arrival, never the calculator's base identity.\n      var commerceBase = text(store.productCommerceRuntimeBundle && store.productCommerceRuntimeBundle.target\n        && store.productCommerceRuntimeBundle.target.shopifyBaseVariantId);\n      if (store.channelCatalog) store.config.baseVariantId = store.channelCatalog.calculatorVariantId;\n      else if (/^\\d+$/.test(commerceBase)) store.config.baseVariantId = commerceBase;\n      var mapping = readProductEditorConfigMapping(payload);\n      emitStorefrontEvent(store, 'product_config_load_succeeded', 'config', {\n        hasMapping: !!mapping,\n        editorType: text(mapping && mapping.editorType)\n      }, 'normal');\n      var appliedMapping = applyProductEditorMapping(store, mapping);\n      if (settings.boot !== true && isSetupDataUnavailable(store)) {\n        return recoverFromSetupDataFailure(store, isCancelled, readJson).then(function () {\n          return appliedMapping;\n        });\n      }\n      return appliedMapping;\n    }).catch(function (error) {\n      if (isCancelled()) return null;\n      emitSetupDataFailure(store, 'product_config_load_failed', 'config_load_failed', error, {\n        fresh: settings.fresh === true,\n        recoveryAttempt: recoveryAttempt\n      });\n      if (settings.boot === true) store.setupDataLoadFailed = true;\n      if (window.console && window.console.warn) {\n        window.console.warn('BG Designer Storefront: product editor config was unavailable.', error);\n      }\n      // A reserved first-paint preview frame must not hold its spinner over\n      // the product photo forever: the failure releases it on the next render.\n      store.productEditorConfigLoadFailed = true;\n      if (settings.boot === true) captureSetupRegionHeight(store);\n      if (store.root && !store.sectionUnloaded) {\n        try { render(store); } catch (_) { /* the page keeps its native state */ }\n      }\n      return null;\n    });\n  }\n\n  function refreshTemplateModalDataIfNeeded(store) {\n    if (!store || !store.config) return null;\n    if (Array.isArray(store.templates) && store.templates.length && !templateRowsBlocked(store)) return null;\n    if (store.templateModalRefreshPromise) return store.templateModalRefreshPromise;\n    store.templateModalRefreshPromise = loadProductEditorConfig(store, { fresh: true }).then(function () {\n      if (templateRowsBlocked(store)) return [];\n      return loadTemplateRowsForStore(store, { fresh: true }).then(function (templates) {\n        store.templates = Array.isArray(templates)\n          ? enrichTemplatesWithLookupMap(templates.map(normalizeTemplate), store.templateLookupMap)\n          : [];\n        return store.templates;\n      });\n    }).catch(function (error) {\n      if (window.console && window.console.warn) {\n        window.console.warn('BG Designer Storefront: template modal data refresh was unavailable.', error);\n      }\n      return store.templates || [];\n    }).finally(function () {\n      store.templateModalRefreshPromise = null;\n    });\n    return store.templateModalRefreshPromise;\n  }\n\n  // The product data every boot reads after the setup data (GET only). A\n  // recovery after a failed setup read reads the same set again.\n  // readJson: a cancellable reader for a background heal; the boot uses\n  // core.loadJson (cached, retried).\n  function loadStorefrontBootPayloads(store, readJson, isCancelled) {\n    var read = typeof readJson === 'function' ? readJson : core.loadJson;\n    return Promise.all([\n      read(store.config.assets && store.config.assets.optionLayoutUrl),\n      read(store.config.assets && store.config.assets.masterPricingUrl),\n      read(store.config.assets && store.config.assets.productDataUrl),\n      loadTemplateRowsForStore(store, { readJson: readJson, isCancelled: isCancelled }),\n      read(store.config.assets && store.config.assets.rulesUrl).catch(function () {\n        return [];\n      })\n    ]);\n  }\n\n  // BD-CATALOG-CONTRACT (0011): the theme data files are keyed by product\n  // handle and staff cannot see them. The page never takes product behavior\n  // from them: these keys come only from the server payload (the product's\n  // Admin settings), and absent means the defaults. Options, prices and every\n  // other catalog field stay (Product Commerce and trusted pricing own them).\n  var THEME_PRODUCT_BEHAVIOR_KEYS = ['designerProductBinding', 'artworkSection', 'artworkSectionConfig', 'customDesignCost'];\n\n  function withoutThemeProductBehaviorRecords(records) {\n    var next = {};\n    Object.keys(records || {}).forEach(function (key) {\n      var record = records[key];\n      if (!record || typeof record !== 'object' || Array.isArray(record)) {\n        next[key] = record;\n        return;\n      }\n      var copy = Object.assign({}, record);\n      THEME_PRODUCT_BEHAVIOR_KEYS.forEach(function (name) { delete copy[name]; });\n      next[key] = copy;\n    });\n    return next;\n  }\n\n  function withoutThemeProductBehavior(layout) {\n    var source = layout && typeof layout === 'object' ? layout : {};\n    if (!source.products || typeof source.products !== 'object') return source;\n    return Object.assign({}, source, { products: withoutThemeProductBehaviorRecords(source.products) });\n  }\n\n  function applyStorefrontBootPayloads(store, payloads) {\n    store.optionLayout = withoutThemeProductBehavior(payloads[0] || {});\n    // Release A: the pricing data's tier under its former name is read as the\n    // Partner tier (PRICING-TIER-RENAME-A).\n    store.pricingData = typeof core.withPartnerTierPricingData === 'function'\n      ? core.withPartnerTierPricingData(payloads[1] || {})\n      : payloads[1] || {};\n    store.productCatalog = withoutThemeProductBehaviorRecords(payloads[2] && payloads[2].products && typeof payloads[2].products === 'object'\n      ? payloads[2].products\n      : {});\n    applyProductCommerceRuntimeBundle(store);\n    var productDataSourceHandle = resolveProductDataSourceHandle(store);\n    var optionLayoutSourceHandle = resolveOptionLayoutSourceHandle(store);\n    var configSourceHandle = optionLayoutSourceHandle || productDataSourceHandle || getConfigSourceHandle(store);\n    store.config.resolvedProductDataSourceHandle = productDataSourceHandle;\n    store.config.resolvedOptionLayoutSourceHandle = optionLayoutSourceHandle;\n    store.productData = getProductCatalogEntry(store, productDataSourceHandle) || getProductCatalogEntry(store, store.config.handle) || {};\n    store.productData = mergeProductDataRecords(store.productData, store.productEditorConfigProductData);\n    store.templateLookupMap = normalizeTemplateLookupMap(null);\n    store.rules = normalizeStorefrontRules(payloads[4]);\n    store.templates = Array.isArray(payloads[3])\n      ? enrichTemplatesWithLookupMap(payloads[3].map(normalizeTemplate), store.templateLookupMap)\n      : [];\n\n    var productLayout = getOptionLayoutProductEntry(store, optionLayoutSourceHandle)\n      || getOptionLayoutProductEntry(store, configSourceHandle)\n      || getOptionLayoutProductEntry(store, store.config.handle)\n      || {};\n    var holderIds = Array.isArray(productLayout.optionHolders) ? productLayout.optionHolders : [];\n    store.holders = holderIds.map(function (holderId) {\n      var holder = store.optionLayout.optionHolders && store.optionLayout.optionHolders[holderId];\n      if (!holder || !Array.isArray(holder.values) || !holder.values.length) return null;\n      return Object.assign({}, holder, { id: holderId });\n    }).filter(Boolean).sort(function (a, b) {\n      return (Number(a.sortOrder) || 0) - (Number(b.sortOrder) || 0);\n    });\n    var productEditorConfigBinding = store.productEditorConfigProductData && typeof store.productEditorConfigProductData.designerProductBinding === 'object'\n      ? store.productEditorConfigProductData.designerProductBinding\n      : null;\n    store.binding = productEditorConfigBinding\n      || (productLayout && typeof productLayout.designerProductBinding === 'object'\n      ? productLayout.designerProductBinding\n      : ((store.productData && typeof store.productData.designerProductBinding === 'object')\n        ? store.productData.designerProductBinding\n        : {}));\n    bindDesignerUrlStateRuntime(store);\n    window.BG_DESIGNER_LAUNCH_PROVIDER = getLaunchProvider(store);\n    window.BG_DESIGNER_DEFAULT_PROVIDER = getLaunchProvider(store);\n    enforcePitchPrintRestoreSuppression(store);\n\n    applyDefaultSelections(store);\n    recalculate(store);\n  }\n\n  // HOST-SHELL-FAIL-OPEN-ADD / BD-NO-IMAGE-HOST-SHELL: the designer section\n  // renders the theme purchase form closed (hidden while product-info is\n  // \"loading\", Add to cart disabled), and only a booted runtime opens it. A\n  // page that cannot boot (an unreadable page config, a boot that throws)\n  // must never reveal that form, which would add the bare base variant with\n  // no options or price. The gate stays closed (\"unavailable\" keeps the\n  // stylesheet hiding the form), Add to cart stays disabled, and the page\n  // says one plain sentence instead of loading forever.\n  var PAGE_CONFIG_UNAVAILABLE_MESSAGE = 'This product is being updated. Try again in a few minutes.';\n\n  function closePurchaseGate(root) {\n    var optionsBlock = root.querySelector('[data-bg-designer-block=\"options\"]');\n    clearInitialOptionsLoader({ options: optionsBlock });\n    var host = root.closest('product-info');\n    if (host) {\n      host.setAttribute('data-bg-ds-hydration', 'unavailable');\n      Array.prototype.slice.call(host.querySelectorAll('[data-bg-guided-mobile-overview]')).forEach(function (node) {\n        node.hidden = true;\n      });\n    }\n    var sectionId = text(root.getAttribute('data-section-id'));\n    var form = sectionId ? document.getElementById('product-form-' + sectionId) : null;\n    Array.prototype.slice.call(form ? form.querySelectorAll('[type=\"submit\"]') : []).forEach(function (button) {\n      button.disabled = true;\n      button.setAttribute('aria-disabled', 'true');\n    });\n    var message = root.querySelector('[data-bg-designer-block=\"message\"]');\n    if (message) {\n      message.className = 'bg-designer-storefront__message is-error';\n      message.textContent = PAGE_CONFIG_UNAVAILABLE_MESSAGE;\n      message.setAttribute('role', 'status');\n      message.hidden = false;\n    }\n  }\n\n  // The boot's restorations and hand-offs (incoming channel offer, managed\n  // templates, address state, account-switch and saved-project resumes, the\n  // cart-line edit, PitchPrint resumes, the direct-to-cart return, template\n  // address actions, editor prewarm). They run exactly once, when the page\n  // first hydrates with data it can price: at boot, or at the heal of a boot\n  // that ended on the setup-data message (THEME-SETUP-READ-RECOVER), never on\n  // defaults the page could not price.\n  function completeStorefrontBoot(store, options) {\n    if (!store || store.storefrontBootCompleted) return;\n    store.storefrontBootCompleted = true;\n    if (options && options.healing) store.directToCartReturnStandDown = true;\n    void Promise.resolve(applyIncomingChannelOffer(store)).then(function () {\n      return hydrateTemplatesFromManagedCatalog(store);\n    }).finally(function () {\n      var restoredFromCartLine = false;\n      var restoredFromHybridAuthResume = false;\n      var urlState = readDesignerUrlState(store);\n      store.bootUrlStateRead = true;\n      if (hasDesignerUrlStateToApply(urlState)) {\n        applyDesignerUrlState(store, urlState);\n      }\n      void restoreFromAccountSwitchResume(store).then(function () {\n        return restoreFromSavedProjectResume(store);\n      }).then(function (restoredFromSavedProject) {\n        if (restoredFromSavedProject) return false;\n        return restoreFromCartLine(store).then(function (restored) {\n          restoredFromCartLine = !!restored;\n          if (restoredFromCartLine) return true;\n          return restoreHybridPitchPrintAuthResume(store).then(function (restoredAuth) {\n            restoredFromHybridAuthResume = !!restoredAuth;\n            if (restoredAuth) return true;\n            return restoreFromPitchPrintSessionPointer(store);\n          });\n        });\n      }).finally(function () {\n        if (urlState.hasAny && urlState.force) {\n          applyDesignerUrlState(store, urlState);\n        }\n        if (store.mobileArtworkReturnSnapshot) {\n          restoreArtworkSnapshot(store, store.mobileArtworkReturnSnapshot);\n          store.mobileArtworkReturnSnapshot = null;\n          store.mobileArtworkReturnedWithoutApproval = true;\n          syncFormState(store);\n        }\n        store.bootRenderDone = true;\n        render(store);\n        ensureRestoredProjectPreviewHydrated(store);\n        window.addEventListener('pageshow', function (event) {\n          if (event && event.persisted) ensureRestoredProjectPreviewHydrated(store);\n        });\n        // MOBILE-DTC-PARITY-01: a claimed marker return owns this load \u2014\n        // the page is adding to the cart behind the scrim, so no editor\n        // auto-launch may run over it. An unclaimed marker (guards failed)\n        // keeps every classic boot behavior.\n        var directAddReturnClaimed = runDirectToCartReturnLane(store);\n        if (!directAddReturnClaimed) {\n          // S4 flow-back: a classic top-level editor return carries the\n          // Configuration Session id \u2014 read the planner-mutated state back\n          // so this page renders the transitioned options and price.\n          var returnConfigurationSessionId = readConfigurationSessionReturnParam();\n          if (returnConfigurationSessionId) {\n            void syncProductStateFromConfigurationSession(store, returnConfigurationSessionId);\n          }\n        }\n        if (!restoredFromHybridAuthResume && !directAddReturnClaimed && !store.mobileArtworkReturnedWithoutApproval) {\n          maybeAutoLaunchRestoredCartDesign(store, restoredFromCartLine);\n        }\n        if (!restoredFromCartLine && !restoredFromHybridAuthResume && !directAddReturnClaimed && !store.mobileArtworkReturnedWithoutApproval) {\n          maybeRunTemplateUrlAction(store, urlState);\n        }\n        scheduleIdleEditorPrewarm(store);\n        scheduleStampedReviewBridge(store);\n      });\n    });\n  }\n\n  function initStorefront(root) {\n    var store = createStore(root);\n    if (!store || !store.form) {\n      if (!store && root && root.querySelector) {\n        closePurchaseGate(root);\n      } else {\n        clearInitialOptionsLoader({\n          options: root && root.querySelector ? root.querySelector('[data-bg-designer-block=\"options\"]') : null\n        });\n      }\n      // No runnable storefront on this root: never strand a marker return\n      // behind the early scrim.\n      hideDirectToCartReturnScrim();\n      return;\n    }\n    initializeArtworkOwner(store);\n    bindGuidedArtworkIntentDocumentDelegate(store);\n    store.mobileArtworkReturnSnapshot = consumeMobileArtworkReturn(store);\n    bindExperimentalPresentationLifecycle();\n    // MOBILE-DTC-PARITY-01: capture the marker before any restore machinery\n    // touches the URL; the lane itself runs after the boot restore chain.\n    store.directToCartReturnMarker = readDirectToCartReturnMarker();\n    emitStorefrontEvent(store, 'storefront_runtime_initialized', 'lifecycle', {\n      configSourceHandle: text(store.config && store.config.configSourceHandle),\n      launchProvider: text(store.config && store.config.launchProvider)\n    }, 'normal');\n    applyProductFormPresentationMode(store);\n    hoistGlobalUiLayers();\n    markNativeOrderFormShell(store);\n    bindNativeSubmitVisibilityGuard(store);\n    bindStickyPurchaseBar(store);\n    installPitchPrintStorefrontBridge(store);\n    bindPitchPrintMiniConfirmationGate(store);\n    bindPreviewBarSafeArea(store);\n    bindProductForm(store);\n    window.bgConsumeDesignerStorefrontContext = function (reason) {\n      // The product form's add or update reached the cart.\n      var owner = artworkOwners.get(store);\n      if (owner && owner.operation) owner.landed = owner.operation;\n      consumeContext(store, reason);\n    };\n    bindEditorShell(store);\n    bindGenericModelLane(store);\n    document.addEventListener('click', function (event) {\n      if (!store.state.quantityDropdownOpen) return;\n      var blocks = readBlocks(store);\n      if (blocks.quantity && blocks.quantity.contains(event.target)) return;\n      store.state.quantityDropdownOpen = false;\n      renderQuantity(store);\n    });\n\n    applyStoredRegionHold(store);\n    scheduleStillLoadingOptionsLabel(store);\n    loadProductEditorConfig(store, { fresh: true, boot: true }).then(function () {\n      return loadStorefrontBootPayloads(store);\n    }).then(function (payloads) {\n      applyStorefrontBootPayloads(store, payloads);\n      if (isSetupDataUnavailable(store)) {\n        // The page cannot price: it shows the setup message now, and the\n        // restorations wait for the heal that makes it price.\n        hideDirectToCartReturnScrim();\n        render(store);\n        return;\n      }\n      completeStorefrontBoot(store);\n    }).catch(function (error) {\n      captureSetupRegionHeight(store);\n      clearInitialOptionsLoader(readBlocks(store));\n      // A failed boot must never strand a marker return behind the scrim.\n      hideDirectToCartReturnScrim();\n      // Any other setup read that failed after its retries: the same plain\n      // terminal state (the technical text goes to telemetry only).\n      emitSetupDataFailure(store, 'storefront_boot_failed', 'setup_data_failed', error, {});\n      store.setupDataLoadFailed = true;\n      if (isSetupDataUnavailable(store)) {\n        renderSetupDataUnavailable(store);\n        var bootSubmitButton = getSubmitButton(store);\n        if (bootSubmitButton) {\n          bootSubmitButton.disabled = true;\n          bootSubmitButton.setAttribute('aria-disabled', 'true');\n        }\n      } else {\n        // The page still prices: keep it usable and show only the message.\n        store.setupDataLoadFailed = false;\n        setMessage(store, withCartFailureReferenceCode(SETUP_DATA_UNAVAILABLE_MESSAGE), 'error');\n      }\n    });\n  }\n\n  // A boot that throws before the page is hydrated keeps the purchase gate\n  // closed and says so (the technical text goes to telemetry only).\n  function initStorefrontSafely(root) {\n    try {\n      initStorefront(root);\n    } catch (error) {\n      if (root && root.querySelector) closePurchaseGate(root);\n      hideDirectToCartReturnScrim();\n      try {\n        emitStorefrontError(null, 'storefront_boot_failed', 'boot_threw', error, {});\n      } catch (_) {}\n    }\n  }\n\n  function initAll() {\n    var roots = Array.prototype.slice.call(document.querySelectorAll('[data-bg-designer-storefront-root]'));\n    Promise.all(roots.map(function (root) {\n      return refreshProductSectionRoot(root);\n    })).then(function (resolvedRoots) {\n      resolvedRoots.forEach(function (root) {\n        initStorefrontSafely(root);\n      });\n    }).catch(function () {\n      roots.forEach(function (root) {\n        initStorefrontSafely(root);\n      });\n    });\n  }\n\n  // MOBILE-DTC-PARITY-01: the marker-return scrim goes up before initAll's\n  // async boot so the restored product page never paints mid-add.\n  maybeShowEarlyDirectToCartReturnScrim();\n  // THEME-SETUP-READ-RECOVER: the stored purchase-region height is reserved\n  // at script evaluation, before the async boot, so a return visit's loader\n  // never paints at a smaller height first.\n  reserveStoredRegionHoldsEarly();\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initAll, { once: true });\n  } else {\n    initAll();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["script", "option", "delay", "card", "field", "options", "entry", "selected", "tier", "currentIndex", "state", "node", "core", "document", "raw", "store", "holder"]
}
