{
  "version": 3,
  "sources": ["/cdn/shop/t/27/assets/bg-template-collection.js?bg_tc_rev=20261012-admin-reference-prices"],
  "sourcesContent": ["(function (window, document) {\n  'use strict';\n\n  // OP-09: tag_based is a first-class 4th page experience \u2014 the mapping\n  // defines a cross-product concept via normalized metadata (tags), product\n  // scope stays visible because cross-product is the point.\n  var VALID_PRESETS = new Set(['product_specific', 'industry', 'all_templates', 'tag_based']);\n  var PAGE_LIMIT = 250;\n  var PAGE_CONCURRENCY = 4;\n  var DISPLAY_STEP = 20;\n  // TC-PERF-01: catalogs at or under this size keep the historical fully\n  // client-computed pipeline (fetch everything once, filter locally) \u2014 small\n  // product pages stay snappy with zero extra round trips. Larger catalogs\n  // switch to server mode: the server filters/sorts/counts per query and the\n  // client fetches only the pages it shows, caching fetched pages per\n  // normalized query state.\n  var CATALOG_MODE_MAX_TOTAL = 600;\n  // Client-side cache of server-mode queries (pages + counts) \u2014 bounded so a\n  // long browse session cannot grow without limit.\n  var QUERY_CACHE_MAX_ENTRIES = 12;\n  var RETURN_STATE_VERSION = 1;\n  var RETURN_STATE_PREFIX = 'bg_tc_state:';\n  var RETURN_STATE_MAX_RESULTS = 5000;\n  // TC-FILTER-01: metadata-driven facet vocabulary. Facets with fewer than\n  // two live values never render (availableFacets), so a page whose designs\n  // lack a field \u2014 or agree on one value \u2014 keeps today's chrome exactly.\n  // The `style` facet filters design THEMES (Bold & Colorful, Minimal\u2026); its\n  // customer-facing label is Theme so it cannot collide with the TC2 \"Style:\"\n  // product-subtype scope row. The stored key stays `style` for admin\n  // override and URL compatibility. print_method derives from the same tag\n  // grammar the PDP handoff reads (designPrinting).\n  var FILTER_DEFINITIONS = {\n    size: { label: 'Size', fields: ['size', 'sizes_available'] },\n    style: { label: 'Theme', fields: ['style', 'styles_themes'] },\n    industry: { label: 'Industry', fields: ['industry'] },\n    color: { label: 'Color', fields: ['color'] },\n    material: { label: 'Material', fields: ['material'] },\n    shape: { label: 'Shape', fields: ['shape'] },\n    orientation: { label: 'Orientation', fields: ['orientation'] },\n    perforation: { label: 'Perforation', fields: ['perforation'] },\n    print_method: { label: 'Print method', fields: [] }\n  };\n  // TC-RESCUE-01 preset defaults: product-specific browsing is never\n  // interrupted mid-results (bottom + empty state only); broad pages offer\n  // the rescue after meaningful browsing plus the bottom; an empty result\n  // set offers it immediately on every visible placement.\n  var PRESET_DEFAULTS = {\n    product_specific: {\n      intro: true,\n      productScope: false,\n      search: true,\n      sort: true,\n      visibleFilters: ['size', 'style', 'industry', 'shape', 'orientation', 'print_method'],\n      cardFields: ['name', 'size_or_format', 'front_and_back'],\n      rescuePlacement: 'bottom'\n    },\n    industry: {\n      intro: true,\n      productScope: true,\n      search: true,\n      sort: true,\n      visibleFilters: ['style', 'color', 'size', 'material', 'shape', 'orientation', 'print_method'],\n      cardFields: ['name', 'product', 'size_or_format', 'front_and_back'],\n      rescuePlacement: 'after_meaningful_browsing'\n    },\n    all_templates: {\n      intro: true,\n      productScope: true,\n      search: true,\n      sort: true,\n      visibleFilters: ['size', 'style', 'material', 'shape', 'orientation', 'print_method'],\n      cardFields: ['name', 'product', 'size_or_format', 'front_and_back'],\n      rescuePlacement: 'after_meaningful_browsing'\n    },\n    tag_based: {\n      intro: true,\n      productScope: true,\n      search: true,\n      sort: true,\n      visibleFilters: ['size', 'style', 'industry', 'material', 'shape', 'orientation', 'print_method'],\n      cardFields: ['name', 'product', 'size_or_format', 'front_and_back'],\n      rescuePlacement: 'after_meaningful_browsing'\n    }\n  };\n  // TC-YARD-01: style subtype scopes DERIVE from the page's target product \u2014\n  // its option-holder values (customer-facing labels) joined to the same\n  // templatePickerUi.optionSourceRules that gate the PDP template strip. Both\n  // config surfaces are the existing public endpoints; nothing new is authored.\n  var STYLE_SCOPE_PICKER_CONFIG_PATH = '/apps/qps-commerce-control-plane/designer/template-picker-config';\n  var STYLE_SCOPE_PRODUCT_CONFIG_PATH = '/apps/qps-commerce-control-plane/designer/product-editor-config';\n  var EXCLUDED_PRODUCT_HANDLES = new Set(['social-media-ad-designer', 'wcr-ad-setups']);\n  var TESTING_PRODUCT_PATTERN = /(^|[-_])(test|testing|debug)([-_]|$)/;\n  var INVALID_TEMPLATE_NAMES = new Set(['', '+', '-', 'untitled', 'untitled template']);\n  var FOCUSABLE_SELECTOR = [\n    'a[href]',\n    'button:not([disabled])',\n    'input:not([disabled])',\n    'select:not([disabled])',\n    'textarea:not([disabled])',\n    '[tabindex]:not([tabindex=\"-1\"])'\n  ].join(',');\n  // -------------------------------------------------------------------------\n  // Boguna 3D preview Slice 6 \u2014 detail-sheet \"2D | 3D\" toggle (P-12; design\n  // handoff \u00A73). Grid cards NEVER mount a viewer. The\n  // switch renders only after compatible product resolution: the listing's\n  // additive per-product flag (productPreviewInteractive) gates ONE cached\n  // product-editor-config fetch per handle, and the strict projection from\n  // that payload is the only 3D truth. Unflagged products (every real page\n  // today) keep byte-identical behavior and zero new requests. Zero viewer\n  // bytes load before the customer selects 3D; every failure\n  // returns to the designed 2D state and never touches Customize/Personalize.\n  // Model + texture bytes load straight from the canonical public asset domain\n  // (OD-059 closed 2026-09-02: the bucket answers CORS on every request that\n  // carries an Origin header).\n  // -------------------------------------------------------------------------\n  var PRODUCT_PREVIEW_SHEET_DISCLAIMER = '3D preview is illustrative. Print files come from your actual design.';\n  var PRODUCT_PREVIEW_SHEET_DISCLAIMER_CLEAR = '3D preview is illustrative. Transparency and white ink are simulated; print files come from your actual design.';\n  var PRODUCT_PREVIEW_SHEET_LOADING_COPY = 'Loading 3D preview\u2026';\n  var PRODUCT_PREVIEW_SHEET_ERROR_COPY = '3D preview is not available right now.';\n  var PRODUCT_PREVIEW_SHEET_INCOMPATIBLE_COPY = 'No 3D preview for this combination yet.';\n  // The stage's reset glyph (a counter-clockwise arrow); the button's\n  // aria-label carries the name so the cluster stays compact over the canvas.\n  var PRODUCT_PREVIEW_SHEET_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  // STANDING TRAP (verifier-proven 2026-09-02): the public domain sends\n  // access-control-allow-origin ONLY when the request carries an Origin header\n  // (vary: Origin). Grid cards and the sheet's 2D still load the SAME template\n  // preview URL as plain <img> (no Origin), and the browser then hands that\n  // cached no-ACAO response to the WebGL texture load, which fails. The\n  // texture lane therefore carries a fixed query param the bucket ignores, so\n  // it owns its own cache entry.\n  var PRODUCT_PREVIEW_SHEET_TEXTURE_CACHE_KEY = 'texture=webgl';\n\n  function productPreviewSheetTextureUrl(sourceUrl) {\n    var raw = asText(sourceUrl);\n    if (!raw || /^(?:data|blob):/i.test(raw)) return raw;\n    return raw + (raw.indexOf('?') === -1 ? '?' : '&') + PRODUCT_PREVIEW_SHEET_TEXTURE_CACHE_KEY;\n  }\n\n  // Strict interactive-projection gate \u2014 mirrors the PDP lane's checks\n  // (capabilities.interactive, a desktop model URL, at least one surface).\n  function readSheetPreviewProjection(payloadRoot) {\n    var projection = payloadRoot && payloadRoot.productPreview && typeof payloadRoot.productPreview === 'object' && !Array.isArray(payloadRoot.productPreview)\n      ? payloadRoot.productPreview\n      : null;\n    if (!projection) return null;\n    var capabilities = projection.capabilities && typeof projection.capabilities === 'object' ? projection.capabilities : {};\n    var model = projection.model && typeof projection.model === 'object' ? projection.model : {};\n    var desktopModel = model.desktop && typeof model.desktop === 'object' ? model.desktop : {};\n    if (capabilities.interactive !== true) return null;\n    if (!asText(desktopModel.url)) return null;\n    if (!Array.isArray(projection.surfaces) || !projection.surfaces.length) return null;\n    return projection;\n  }\n\n  function sheetPreviewSurfaceSides(projection) {\n    var sides = [];\n    (Array.isArray(projection && projection.surfaces) ? projection.surfaces : []).forEach(function (mapping) {\n      var side = asText(mapping && mapping.board && mapping.board.side);\n      if (side && sides.indexOf(side) === -1) sides.push(side);\n    });\n    if (!sides.length) sides = ['front'];\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  // A selected option pair whose holder participates in preview bindings must\n  // point at a BOUND value; an unbound selected value would make the 3D claim\n  // untruthful (same rule the PDP lane ships).\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 sheetPreviewUnboundSelection(projection, pairs) {\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 = binding && binding.match && typeof binding.match === 'object' ? binding.match : {};\n      var optionId = asText(match.optionId);\n      var valueId = asText(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  // EXACT-CENTS-CATALOG (2026-10-03): a price row as authored, shown in the cents the\n  // product page and the cart charge (the quote engine's half-up cent: toFixed showed a\n  // 135.795 row as 135.79). A positive price row only.\n  function exactRowAmount(value) {\n    var micros = Math.round(Number(value) * 1000000);\n    return Number.isFinite(micros) ? Math.round(micros / 10000) / 100 : value;\n  }\n\n  function asText(value) {\n    return String(value == null ? '' : value).trim();\n  }\n\n  function normalizedText(value) {\n    return asText(value).toLowerCase().replace(/[_-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n  }\n\n  function unique(values) {\n    return Array.from(new Set(values.filter(Boolean)));\n  }\n\n  function list(value) {\n    if (Array.isArray(value)) {\n      return unique(value.flatMap(list));\n    }\n    if (value == null || value === '') return [];\n    return unique(String(value).split(/[,|\\n]/g).map(function (entry) { return entry.trim(); }));\n  }\n\n  // Style-rule matching grammar. Byte-for-byte the storefront runtime's\n  // normalizeSearchValue so a page scope, the PDP strip filter, and the PDP\n  // arrival preselect can never disagree about which values a rule names.\n  function normalizeStyleMatchKey(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  // The same per-design family fields the runtime's option-source-rule gate\n  // reads (getTemplateSourceRuleHandles). A design with none of them has no\n  // family metadata: it belongs to All Styles only and never gates out.\n  function designFamilyHandles(item) {\n    return unique([]\n      .concat(list(item && item.__foundationTemplateSourceHandle))\n      .concat(list(item && item.template_source_handle))\n      .concat(list(item && item.template_source_handles))\n      .concat(list(item && item.handle))\n      .map(function (value) { return asText(value).toLowerCase(); })\n      .filter(Boolean));\n  }\n\n  function bool(value) {\n    if (value === true || value === false) return value;\n    var next = normalizedText(value);\n    if (next === 'true' || next === 'yes' || next === '1') return true;\n    if (next === 'false' || next === 'no' || next === '0') return false;\n    return null;\n  }\n\n  function number(value, fallback) {\n    var parsed = Number(value);\n    return Number.isFinite(parsed) ? parsed : fallback;\n  }\n\n  function normalizePayload(payload) {\n    if (!payload || typeof payload !== 'object') return null;\n    var result = payload.result && typeof payload.result === 'object' ? payload.result : payload;\n    return Array.isArray(result.items) ? result : null;\n  }\n\n  function designKey(design) {\n    return asText(design && (\n      design.designnum\n      || design.templateLookup\n      || design.templatePublicId\n      || design.publicId\n      || design.id\n    ));\n  }\n\n  function productHandle(design) {\n    var candidates = [\n      design && design.__foundationTargetProductHandle,\n      design && design.__foundationReturnProductHandle,\n      design && design.__foundationTargetTemplateSourceHandle,\n      design && design.__foundationTemplateSourceHandle,\n      design && design.product_handle,\n      design && design.productHandle,\n      design && design.handle\n    ];\n    for (var index = 0; index < candidates.length; index += 1) {\n      var handle = asText(candidates[index]).toLowerCase();\n      if (handle) return handle;\n    }\n    return '';\n  }\n\n  function productName(product) {\n    return asText(product && (product.productName || product.title || product.handle));\n  }\n\n  function productUrl(product) {\n    var direct = asText(product && (product.__foundationProductUrl || product.productUrl || product.path));\n    if (direct) return direct;\n    var mapping = product && product.editorMapping && typeof product.editorMapping === 'object'\n      ? product.editorMapping\n      : {};\n    var handle = asText(\n      mapping.returnProductHandle\n      || mapping.return_product_handle\n      || product && (product.returnProductHandle || product.return_product_handle || product.handle)\n    );\n    return handle ? '/products/' + encodeURIComponent(handle) : '';\n  }\n\n  function designProductUrl(design, productsByHandle) {\n    var direct = asText(design && design.__foundationProductUrl);\n    if (direct) return direct;\n    var product = productsByHandle.get(productHandle(design));\n    return productUrl(product);\n  }\n\n  function designPreviews(design) {\n    var previews = Array.isArray(design && design.previews) ? design.previews.map(asText).filter(Boolean) : [];\n    if (!previews.length) {\n      var first = asText(design && (design.design_preview_url || design.preview_url || design.image_url || design.image));\n      if (first) previews.push(first);\n    }\n    return unique(previews);\n  }\n\n  function designName(design, fallbackIndex) {\n    var raw = asText(design && (design.template_name || design.title || design.name));\n    if (!INVALID_TEMPLATE_NAMES.has(normalizedText(raw))) return raw;\n    var family = asText(design && (design.product || design.product_name || design.category)) || 'Template';\n    // Never a public id or row id: customers see the design number, else the position.\n    var suffix = asText(design && design.designnum) || String(fallbackIndex + 1);\n    return family + ' ' + suffix;\n  }\n\n  function dimensionLabel(dimension) {\n    if (!dimension || typeof dimension !== 'object') return '';\n    var authored = asText(dimension.label);\n    if (authored) return authored;\n    var width = number(dimension.width, NaN);\n    var height = number(dimension.height, NaN);\n    if (!Number.isFinite(width) || !Number.isFinite(height)) return '';\n    var unit = asText(dimension.unit);\n    return width + ' \u00D7 ' + height + (unit ? ' ' + unit : '');\n  }\n\n  function actualDesignSizeValues(item) {\n    var values = list(item && item.size);\n    if (Array.isArray(item && item.dimensions)) {\n      values = values.concat(item.dimensions.map(dimensionLabel));\n    }\n    return unique(values.map(asText));\n  }\n\n  function designSizeValues(item) {\n    return unique(actualDesignSizeValues(item).concat(list(item && item.sizes_available)).map(asText));\n  }\n\n  // TC-FILTER-01: print method is metadata carried on design tags. The\n  // grammar matches designPrinting (the PDP handoff) exactly, so a facet\n  // value and the printing mode the PDP resolves can never disagree.\n  function designPrintMethodValues(item) {\n    var tags = list(item && item.tags);\n    var values = [];\n    for (var index = 0; index < tags.length; index += 1) {\n      var value = normalizedText(tags[index]);\n      if (/^(?:print )?(?:1|one) colou?r/.test(value)) values.push('1 Color');\n      else if (/^(?:print )?full colou?r/.test(value)) values.push('Full Color');\n    }\n    return unique(values);\n  }\n\n  function itemValues(item, field) {\n    var definition = FILTER_DEFINITIONS[field];\n    if (!definition) return [];\n    if (field === 'size') return designSizeValues(item);\n    if (field === 'print_method') return designPrintMethodValues(item);\n    var values = [];\n    definition.fields.forEach(function (key) {\n      values = values.concat(list(item && item[key]));\n    });\n    return unique(values.map(function (value) { return asText(value); }));\n  }\n\n  function escapeSelector(value) {\n    if (window.CSS && typeof window.CSS.escape === 'function') return window.CSS.escape(value);\n    return String(value).replace(/[\"\\\\]/g, '\\\\$&');\n  }\n\n  function appendParams(baseUrl, params) {\n    var raw = asText(baseUrl);\n    if (!raw) return '';\n    try {\n      var url = new URL(raw, window.location.origin);\n      Object.keys(params || {}).forEach(function (key) {\n        var value = params[key];\n        if (value === undefined || value === null || value === '') return;\n        url.searchParams.set(key, String(value));\n      });\n      return url.origin === window.location.origin ? url.pathname + url.search + url.hash : url.toString();\n    } catch (_) {\n      var entries = Object.keys(params || {}).filter(function (key) {\n        return params[key] !== undefined && params[key] !== null && params[key] !== '';\n      });\n      if (!entries.length) return raw;\n      var query = entries.map(function (key) {\n        return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\n      }).join('&');\n      return raw + (raw.indexOf('?') === -1 ? '?' : '&') + query;\n    }\n  }\n\n  function boundedText(value, maxLength) {\n    return asText(value).replace(/[\\u0000-\\u001f\\u007f]/g, '').slice(0, Math.max(0, Number(maxLength) || 0));\n  }\n\n  function normalizeSameOriginPath(value, fallback) {\n    var raw = boundedText(value, 500);\n    if (!raw) raw = boundedText(fallback, 500);\n    if (!raw || raw.indexOf('\\\\') !== -1) return '';\n    try {\n      var url = new URL(raw, window.location.origin);\n      if (url.origin !== window.location.origin || !url.pathname || url.pathname.charAt(0) !== '/') return '';\n      return url.pathname.replace(/\\/{2,}/g, '/');\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function normalizeSameOriginUrl(value) {\n    var raw = boundedText(value, 1200);\n    if (!raw || raw.indexOf('\\\\') !== -1) return '';\n    try {\n      var url = new URL(raw, window.location.origin);\n      if (url.origin !== window.location.origin || !url.pathname || url.pathname.charAt(0) !== '/') return '';\n      return url.pathname.replace(/\\/{2,}/g, '/') + url.search + url.hash;\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function normalizeExperience(mapping) {\n    var preset = normalizedText(mapping && mapping.pageExperience).replace(/\\s+/g, '_');\n    if (!VALID_PRESETS.has(preset)) return null;\n    var defaults = PRESET_DEFAULTS[preset];\n    var overrides = mapping && mapping.pageExperienceOverrides && typeof mapping.pageExperienceOverrides === 'object'\n      ? mapping.pageExperienceOverrides\n      : {};\n    var next = Object.assign({}, defaults);\n    ['intro', 'productScope', 'search', 'sort'].forEach(function (key) {\n      if (typeof overrides[key] === 'boolean') next[key] = overrides[key];\n    });\n    if (Array.isArray(overrides.visibleFilters)) {\n      next.visibleFilters = unique(overrides.visibleFilters.map(function (field) {\n        return normalizedText(field).replace(/\\s+/g, '_');\n      }).filter(function (field) {\n        return Object.prototype.hasOwnProperty.call(FILTER_DEFINITIONS, field);\n      })).slice(0, 9);\n    }\n    if (Array.isArray(overrides.cardFields)) {\n      var cardFields = overrides.cardFields.map(normalizedText).map(function (field) {\n        return field.replace(/\\s+/g, '_');\n      });\n      next.cardFields = unique(['name'].concat(cardFields)).filter(function (field) {\n        return ['name', 'product', 'size_or_format', 'front_and_back'].indexOf(field) !== -1;\n      }).slice(0, 4);\n    }\n    var placement = normalizedText(overrides.rescuePlacement).replace(/\\s+/g, '_');\n    if (['both', 'after_first_results', 'after_meaningful_browsing', 'bottom', 'hidden'].indexOf(placement) !== -1) {\n      next.rescuePlacement = placement;\n    }\n    next.introCopy = asText(overrides.introCopy);\n    next.preset = preset;\n    return next;\n  }\n\n  function currentStateWithoutOverlay() {\n    var state = window.history.state && typeof window.history.state === 'object'\n      ? Object.assign({}, window.history.state)\n      : {};\n    delete state.bgTcOverlay;\n    return state;\n  }\n\n  function visibleFocusable(element) {\n    if (!element || element.hidden || element.getAttribute('aria-hidden') === 'true') return false;\n    if (element.closest('[hidden], [aria-hidden=\"true\"], [inert]')) return false;\n    if (typeof window.getComputedStyle !== 'function') return true;\n    var style = window.getComputedStyle(element);\n    return style.display !== 'none' && style.visibility !== 'hidden';\n  }\n\n  function getConfig(root) {\n    var configId = root && root.getAttribute('data-config-id');\n    var script = configId ? document.getElementById(configId) : null;\n    if (!script) return {};\n    try {\n      return JSON.parse(script.textContent || '{}');\n    } catch (_) {\n      return {};\n    }\n  }\n\n  function TemplateCollectionController(root, options) {\n    this.root = root;\n    this.host = root.closest('[data-bg-tc-host]') || root.parentElement;\n    this.config = Object.assign({}, getConfig(root), options && options.config || {});\n    this.fetch = options && options.fetch || window.fetch.bind(window);\n    this.navigate = options && options.navigate || function (url) { window.location.href = url; };\n    this.replaceNavigate = options && options.replaceNavigate || function (url) { window.location.replace(url); };\n    this.instanceId = 'bg-tc-' + Math.random().toString(36).slice(2);\n    this.generation = 0;\n    this.items = [];\n    this.total = 0;\n    this.complete = false;\n    this.loadingRemainder = false;\n    this.loadingProductStatuses = false;\n    this.failedOffsets = [];\n    this.targetProducts = [];\n    this.productsByHandle = new Map();\n    this.hiddenProductHandles = new Set();\n    this.mapping = null;\n    this.experience = null;\n    this.query = '';\n    this.scopeProduct = '';\n    this.scopeIndustry = '';\n    this.scopeStyle = '';\n    this.styleScopes = [];\n    this.loadingStyleScopes = false;\n    this.styleScopesResolved = false;\n    this.styleScopesRequested = false;\n    this.sort = 'popular';\n    this.filters = new Map();\n    this.pendingFilters = new Map();\n    this.openFacetField = '';\n    // TC-RESCUE-01 \"after meaningful browsing\" latch. Threshold definition:\n    // the customer scrolled past the first screenful of results (scrollY >=\n    // 90% of the viewport height, min 200px) OR interacted with search,\n    // scope, a filter, sort, or Load more. Latches for the page view.\n    this.meaningfulBrowsing = false;\n    this.openProductPicker = false;\n    this.productPickerQuery = '';\n    this.visibleLimit = DISPLAY_STEP;\n    this.pricing = {};\n    this.referencePriceReads = new Set();\n    this.openOverlay = null;\n    this.overlayReturn = null;\n    this.backgroundStates = [];\n    this.bodyHadOverlayClass = false;\n    this.historyFallback = null;\n    this.pendingCloseUrl = '';\n    this.detail = null;\n    this.searchTimer = null;\n    this.returnSnapshot = null;\n    this.returnViewedDesignKey = '';\n    this.returnRestored = false;\n    this.returnRestoreScheduled = false;\n    this.hasExplicitUrlState = false;\n    // TC-PERF-01 server mode state. serverMode flips on when the catalog is\n    // too large to hold client-side; items then contain only the loaded pages\n    // of the CURRENT query and serverMeta carries the server-computed totals,\n    // facets, and scope counts the UI renders.\n    this.serverMode = false;\n    this.serverMeta = null;\n    this.queryCache = new Map();\n    this.loadedQueryKey = '';\n    this.queryLoading = false;\n    this.queryError = false;\n    this.failedQueryKey = '';\n    this.queryGeneration = 0;\n    this.queryAbort = null;\n    this.loadingMorePage = false;\n    this.failedQueryOffset = -1;\n    this.pendingSheetMeta = null;\n    this.pendingSheetTimer = null;\n    this.pendingSheetRequestedKey = '';\n    // Slice 6 sheet 3D lane. preview3d is created lazily on the FIRST sheet\n    // whose resolved product carries the listing flag; productPreviewConfigs\n    // caches one product-editor-config resolution per flagged handle\n    // ('pending' | {projection, holders} | null-projection 'none').\n    this.preview3d = null;\n    this.productPreviewConfigs = new Map();\n    this.bound = false;\n    this.els = this.collectElements();\n  }\n\n  TemplateCollectionController.prototype.collectElements = function () {\n    var query = function (root, selector) { return root ? root.querySelector(selector) : null; };\n    return {\n      breadcrumb: query(this.root, '[data-bg-tc-breadcrumb]'),\n      meta: query(this.root, '[data-bg-tc-meta]'),\n      intro: query(this.root, '[data-bg-tc-intro]'),\n      scope: query(this.root, '[data-bg-tc-scope]'),\n      toolbar: query(this.root, '[data-bg-tc-toolbar]'),\n      searchForm: query(this.root, '[data-bg-tc-search-form]'),\n      search: query(this.root, '[data-bg-tc-search]'),\n      searchButton: query(this.root, '[data-bg-tc-search-form] button[type=\"submit\"]'),\n      facets: query(this.root, '[data-bg-tc-facets]'),\n      filtersOpen: query(this.root, '[data-bg-tc-filters-open]'),\n      filtersCount: query(this.root, '[data-bg-tc-filters-count]'),\n      sort: query(this.root, '[data-bg-tc-sort]'),\n      chips: query(this.root, '[data-bg-tc-chips]'),\n      count: query(this.root, '[data-bg-tc-count]'),\n      grid: query(this.root, '[data-bg-tc-grid]'),\n      state: query(this.root, '[data-bg-tc-state]'),\n      loadMore: query(this.root, '[data-bg-tc-load-more]'),\n      loadMoreMeta: query(this.root, '[data-bg-tc-load-more-meta]'),\n      laterError: query(this.root, '[data-bg-tc-later-error]'),\n      laterRetry: query(this.root, '[data-bg-tc-later-retry]'),\n      rescues: Array.from(this.root.querySelectorAll('[data-bg-tc-rescue]')),\n      detailOverlay: query(this.host, '[data-bg-tc-detail-overlay]'),\n      detailScrim: query(this.host, '[data-bg-tc-detail-scrim]'),\n      detailDialog: query(this.host, '[data-bg-tc-detail]'),\n      detailTitle: query(this.host, '[data-bg-tc-detail-title]'),\n      detailBody: query(this.host, '[data-bg-tc-detail-body]'),\n      detailBack: query(this.host, '[data-bg-tc-detail-back]'),\n      detailClose: query(this.host, '[data-bg-tc-detail-close]'),\n      detailPrimary: query(this.host, '[data-bg-tc-detail-primary]'),\n      detailSecondary: query(this.host, '[data-bg-tc-detail-secondary]'),\n      filterOverlay: query(this.host, '[data-bg-tc-filter-overlay]'),\n      filterScrim: query(this.host, '[data-bg-tc-filter-scrim]'),\n      filterDialog: query(this.host, '[data-bg-tc-filter-sheet]'),\n      filterBody: query(this.host, '[data-bg-tc-filter-body]'),\n      filterClose: query(this.host, '[data-bg-tc-filter-close]'),\n      filterReset: query(this.host, '[data-bg-tc-filter-reset]'),\n      filterApply: query(this.host, '[data-bg-tc-filter-apply]')\n    };\n  };\n\n  TemplateCollectionController.prototype.emit = function (name, payload) {\n    var telemetry = window.BGDesignerTelemetry;\n    if (!telemetry || typeof telemetry.emitEvent !== 'function') return;\n    telemetry.emitEvent(name, 'template_collection', Object.assign({\n      pagePath: asText(this.config.pagePath),\n      preset: this.experience && this.experience.preset || ''\n    }, payload || {}), 'normal', { config: this.config });\n  };\n\n  TemplateCollectionController.prototype.emitError = function (name, code, error) {\n    var telemetry = window.BGDesignerTelemetry;\n    if (!telemetry || typeof telemetry.emitError !== 'function') return;\n    telemetry.emitError(name, code, error, {\n      pagePath: asText(this.config.pagePath),\n      preset: this.experience && this.experience.preset || ''\n    }, { config: this.config });\n  };\n\n  TemplateCollectionController.prototype.init = function () {\n    if (this.bound) return this;\n    this.bound = true;\n    this.readUrlState();\n    this.readReturnState();\n    this.bindEvents();\n    this.showLoading();\n    this.loadPricing();\n    this.load();\n    return this;\n  };\n\n  TemplateCollectionController.prototype.bindEvents = function () {\n    var self = this;\n    this.els.searchForm.addEventListener('submit', function (event) {\n      event.preventDefault();\n      self.applySearch(self.els.search.value);\n    });\n    this.els.search.addEventListener('input', function () {\n      window.clearTimeout(self.searchTimer);\n      self.searchTimer = window.setTimeout(function () {\n        self.applySearch(self.els.search.value);\n      }, 250);\n    });\n    this.els.sort.addEventListener('change', function () {\n      self.sort = self.els.sort.value === 'newest' ? 'newest' : 'popular';\n      self.visibleLimit = DISPLAY_STEP;\n      self.markMeaningfulBrowsing();\n      self.syncUrl();\n      self.render();\n    });\n    this.els.filtersOpen.addEventListener('click', function () { self.openFilters(); });\n    this.els.loadMore.addEventListener('click', function () {\n      self.visibleLimit += DISPLAY_STEP;\n      self.markMeaningfulBrowsing();\n      self.render();\n    });\n    this.els.laterRetry.addEventListener('click', function () { self.retryRemainder(); });\n    this.els.detailScrim.addEventListener('click', function () { self.requestOverlayClose(); });\n    this.els.detailClose.addEventListener('click', function () { self.requestOverlayClose(); });\n    this.els.detailBack.addEventListener('click', function () { self.requestOverlayClose(); });\n    this.els.filterScrim.addEventListener('click', function () { self.requestOverlayClose(); });\n    this.els.filterClose.addEventListener('click', function () { self.requestOverlayClose(); });\n    this.els.filterReset.addEventListener('click', function () {\n      self.pendingFilters = new Map();\n      self.renderFilterSheet();\n    });\n    this.els.filterApply.addEventListener('click', function () {\n      self.filters = self.cloneFilters(self.pendingFilters);\n      self.visibleLimit = DISPLAY_STEP;\n      self.markMeaningfulBrowsing();\n      self.emit('tc_filter_changed', { field: 'mobile_sheet', added: self.activeFilterCount() > 0 });\n      var committedUrl = self.urlForState();\n      self.render();\n      self.requestOverlayClose(committedUrl);\n    });\n    this.els.detailPrimary.addEventListener('click', function () { self.runDetailPrimary(); });\n    this.els.detailSecondary.addEventListener('click', function () { self.runDetailSecondary(); });\n    this.root.addEventListener('click', function (event) {\n      var rescue = event.target.closest('[data-bg-tc-rescue-action]');\n      if (rescue && self.root.contains(rescue)) self.handleRescue(rescue.getAttribute('data-bg-tc-rescue-action'), rescue);\n    });\n    document.addEventListener('keydown', function (event) {\n      self.handleOverlayKeydown(event);\n      if (!self.openOverlay) self.handleFacetKeydown(event);\n    }, true);\n    document.addEventListener('click', function (event) {\n      if (self.openFacetField && !self.els.facets.contains(event.target)) self.closeFacetMenu(false);\n      if (self.openProductPicker && self.els.scope && !self.els.scope.contains(event.target)) {\n        self.closeProductPicker(false);\n      }\n    });\n    // TC-RESCUE-01: scrolling past the first screenful of results counts as\n    // meaningful browsing.\n    window.addEventListener('scroll', function () {\n      if (self.meaningfulBrowsing) return;\n      var threshold = Math.max(200, (window.innerHeight || 800) * 0.9);\n      if ((window.scrollY || window.pageYOffset || 0) >= threshold) self.markMeaningfulBrowsing();\n    }, { passive: true });\n    // TC-SCOPE-01/02: the mobile scope row scrolls horizontally with an\n    // explicit continuation cue; keep the cue truthful while scrolling.\n    this.els.scope.addEventListener('scroll', function () { self.updateScopeOverflowCue(); }, { passive: true });\n    window.addEventListener('resize', function () { self.updateScopeOverflowCue(); });\n    function restoreAfterHistoryNavigation(event) {\n      var marker = window.history.state && window.history.state.bgTcOverlay;\n      if (self.openOverlay && (!marker || marker.owner !== self.instanceId || event && event.persisted)) {\n        if (marker && marker.owner === self.instanceId) {\n          window.history.replaceState(currentStateWithoutOverlay(), '', window.location.href);\n        }\n        self.closeOverlayDirect(true);\n      }\n      if (self.openOverlay) return;\n      if (!self.returnSnapshot) self.readReturnState();\n      if (!self.returnSnapshot || !self.experience) return;\n      self.applyReturnState();\n      self.render();\n    }\n    window.addEventListener('popstate', restoreAfterHistoryNavigation);\n    window.addEventListener('pageshow', restoreAfterHistoryNavigation);\n  };\n\n  TemplateCollectionController.prototype.readUrlState = function () {\n    var params = new URLSearchParams(window.location.search);\n    this.hasExplicitUrlState = ['q', 'product', 'industry', 'style', 'sort'].some(function (key) {\n      return params.has(key);\n    }) || Array.from(params.keys()).some(function (key) { return key.indexOf('filter_') === 0; });\n    this.query = asText(params.get('q'));\n    this.scopeProduct = asText(params.get('product')).toLowerCase();\n    this.scopeIndustry = asText(params.get('industry'));\n    this.scopeStyle = boundedText(params.get('style'), 160);\n    this.sort = params.get('sort') === 'newest' ? 'newest' : 'popular';\n    var self = this;\n    Object.keys(FILTER_DEFINITIONS).forEach(function (field) {\n      var raw = params.get('filter_' + field);\n      if (!raw) return;\n      self.filters.set(field, new Set(list(raw)));\n    });\n  };\n\n  TemplateCollectionController.prototype.pagePath = function () {\n    return normalizeSameOriginPath(this.config.pagePath, window.location.pathname);\n  };\n\n  TemplateCollectionController.prototype.returnStateKey = function () {\n    var path = this.pagePath();\n    return path ? RETURN_STATE_PREFIX + path : '';\n  };\n\n  TemplateCollectionController.prototype.readReturnState = function () {\n    var key = this.returnStateKey();\n    if (!key) return null;\n    var parsed = null;\n    try {\n      parsed = JSON.parse(window.sessionStorage.getItem(key) || 'null');\n    } catch (_) {\n      parsed = null;\n    }\n    if (!parsed || typeof parsed !== 'object' || Number(parsed.version) !== RETURN_STATE_VERSION\n      || normalizeSameOriginPath(parsed.pagePath) !== this.pagePath()) {\n      try { window.sessionStorage.removeItem(key); } catch (_) {}\n      return null;\n    }\n    var filters = new Map();\n    var sourceFilters = parsed.filters && typeof parsed.filters === 'object' ? parsed.filters : {};\n    Object.keys(FILTER_DEFINITIONS).forEach(function (field) {\n      var values = Array.isArray(sourceFilters[field]) ? sourceFilters[field] : [];\n      var safeValues = unique(values.map(function (value) { return boundedText(value, 120); }).filter(Boolean)).slice(0, 12);\n      if (safeValues.length) filters.set(field, new Set(safeValues));\n    });\n    this.returnSnapshot = {\n      version: RETURN_STATE_VERSION,\n      pagePath: this.pagePath(),\n      query: boundedText(parsed.query, 200),\n      scopeProduct: boundedText(parsed.scopeProduct, 160).toLowerCase(),\n      scopeIndustry: boundedText(parsed.scopeIndustry, 160),\n      scopeStyle: boundedText(parsed.scopeStyle, 160),\n      sort: parsed.sort === 'newest' ? 'newest' : 'popular',\n      filters: filters,\n      visibleLimit: Math.max(DISPLAY_STEP, Math.min(RETURN_STATE_MAX_RESULTS, Math.round(number(parsed.visibleLimit || parsed.loadedCount, DISPLAY_STEP)))),\n      loadedCount: Math.max(0, Math.min(RETURN_STATE_MAX_RESULTS, Math.round(number(parsed.loadedCount, 0)))),\n      designKey: boundedText(parsed.designKey, 200),\n      focusKey: boundedText(parsed.focusKey, 240),\n      scrollY: Math.max(0, Math.round(number(parsed.scrollY, 0)))\n    };\n    if (this.returnSnapshot.designKey && this.returnSnapshot.loadedCount < 1) {\n      this.returnSnapshot = null;\n      try { window.sessionStorage.removeItem(key); } catch (_) {}\n      return null;\n    }\n    this.applyReturnState();\n    return this.returnSnapshot;\n  };\n\n  TemplateCollectionController.prototype.applyReturnState = function () {\n    var snapshot = this.returnSnapshot;\n    if (!snapshot) return false;\n    if (this.hasExplicitUrlState) {\n      var currentFilters = JSON.stringify(Array.from(this.filters.entries()).map(function (entry) {\n        return [entry[0], Array.from(entry[1]).sort()];\n      }).sort());\n      var returnFilters = JSON.stringify(Array.from(snapshot.filters.entries()).map(function (entry) {\n        return [entry[0], Array.from(entry[1]).sort()];\n      }).sort());\n      if (this.query !== snapshot.query\n        || this.scopeProduct !== snapshot.scopeProduct\n        || this.scopeIndustry !== snapshot.scopeIndustry\n        || this.scopeStyle !== snapshot.scopeStyle\n        || this.sort !== snapshot.sort\n        || currentFilters !== returnFilters) {\n        this.returnSnapshot = null;\n        this.returnViewedDesignKey = '';\n        var staleKey = this.returnStateKey();\n        if (staleKey) {\n          try { window.sessionStorage.removeItem(staleKey); } catch (_) {}\n        }\n        return false;\n      }\n    } else {\n      this.query = snapshot.query;\n      this.scopeProduct = snapshot.scopeProduct;\n      this.scopeIndustry = snapshot.scopeIndustry;\n      this.scopeStyle = snapshot.scopeStyle;\n      this.sort = snapshot.sort;\n      this.filters = this.cloneFilters(snapshot.filters);\n      this.syncUrl();\n    }\n    this.visibleLimit = snapshot.loadedCount;\n    this.returnViewedDesignKey = snapshot.designKey;\n    if (this.els.search) this.els.search.value = this.query;\n    if (this.els.sort) this.els.sort.value = this.sort;\n    return true;\n  };\n\n  TemplateCollectionController.prototype.persistReturnState = function (design) {\n    var key = this.returnStateKey();\n    if (!key) return false;\n    var self = this;\n    var filtered = this.filteredItems();\n    var selectedKey = boundedText(this.detail && this.detail.originalKey\n      || this.overlayReturn && this.overlayReturn.stableKey\n      || designKey(design), 200);\n    var active = document.activeElement;\n    var focusKey = this.overlayReturn && this.overlayReturn.element\n      ? boundedText(this.overlayReturn.element.getAttribute('data-bg-tc-focus-key'), 240)\n      : active && this.root.contains(active)\n        ? boundedText(active.getAttribute('data-bg-tc-focus-key'), 240)\n        : '';\n    var storedFilters = {};\n    this.filters.forEach(function (values, field) {\n      if (!Object.prototype.hasOwnProperty.call(FILTER_DEFINITIONS, field)) return;\n      storedFilters[field] = unique(Array.from(values).map(function (value) {\n        return boundedText(value, 120);\n      }).filter(Boolean)).slice(0, 12);\n    });\n    var payload = {\n      version: RETURN_STATE_VERSION,\n      pagePath: this.pagePath(),\n      query: boundedText(this.query, 200),\n      scopeProduct: boundedText(this.scopeProduct, 160).toLowerCase(),\n      scopeIndustry: boundedText(this.scopeIndustry, 160),\n      scopeStyle: boundedText(this.scopeStyle, 160),\n      filters: storedFilters,\n      sort: this.sort === 'newest' ? 'newest' : 'popular',\n      visibleLimit: Math.max(DISPLAY_STEP, Math.min(RETURN_STATE_MAX_RESULTS, Math.round(number(this.visibleLimit, DISPLAY_STEP)))),\n      loadedCount: Math.min(filtered.length, Math.max(0, Math.min(RETURN_STATE_MAX_RESULTS, Math.round(number(this.visibleLimit, DISPLAY_STEP))))),\n      designKey: selectedKey,\n      focusKey: focusKey || (selectedKey ? 'card:' + selectedKey : ''),\n      scrollY: Math.max(0, Math.round(number(window.scrollY || window.pageYOffset, 0)))\n    };\n    try {\n      window.sessionStorage.setItem(key, JSON.stringify(payload));\n      this.returnSnapshot = null;\n      this.returnRestored = false;\n      this.returnViewedDesignKey = '';\n      return true;\n    } catch (_) {\n      self.returnSnapshot = null;\n      return false;\n    }\n  };\n\n  TemplateCollectionController.prototype.navigationContextParams = function () {\n    var path = this.pagePath();\n    return path ? {\n      bg_tc_return: path,\n      bg_tc_preset: this.experience && VALID_PRESETS.has(this.experience.preset) ? this.experience.preset : '',\n      bg_tc_source: boundedText(this.config.pageTitle, 160)\n    } : {};\n  };\n\n  // PERF-06 (server mode): restoration readiness needs only the stored depth\n  // of the restored query \u2014 never the full catalog. Pages are fetched up to\n  // the snapshot's loadedCount, then the anchor restores exactly as before.\n  TemplateCollectionController.prototype.returnRestoreBlocked = function () {\n    if (this.loadingProductStatuses || this.loadingStyleScopes) return true;\n    if (this.serverMode) {\n      if (this.queryLoading || this.loadingMorePage) return true;\n      if (this.queryError || !this.serverMeta) return false;\n      var snapshot = this.returnSnapshot;\n      var neededDepth = snapshot ? Math.min(snapshot.loadedCount, this.serverMeta.total) : 0;\n      if (this.items.length < neededDepth) {\n        this.maybeFetchRestoreDepth(neededDepth);\n        return true;\n      }\n      return false;\n    }\n    return this.loadingRemainder || (!this.complete && this.total > this.items.length);\n  };\n\n  TemplateCollectionController.prototype.maybeFetchRestoreDepth = function (neededDepth) {\n    if (!this.serverMode || this.queryLoading || this.loadingMorePage || this.queryError) return;\n    var entry = this.queryCache.get(this.loadedQueryKey);\n    if (!entry || entry.exhausted === true) return;\n    if (this.items.length >= neededDepth) return;\n    this.requestQueryPage(this.loadedQueryKey, number(entry.nextOffset, this.items.length));\n  };\n\n  TemplateCollectionController.prototype.scheduleReturnRestore = function () {\n    var self = this;\n    if (!this.returnSnapshot || this.returnRestored || this.returnRestoreScheduled) return;\n    if (this.returnRestoreBlocked()) return;\n    this.returnRestoreScheduled = true;\n    window.requestAnimationFrame(function () {\n      window.requestAnimationFrame(function () {\n        self.returnRestoreScheduled = false;\n        if (!self.returnSnapshot || self.returnRestored) return;\n        if (self.returnRestoreBlocked()) {\n          self.scheduleReturnRestore();\n          return;\n        }\n        var snapshot = self.returnSnapshot;\n        var target = snapshot.focusKey\n          ? self.root.querySelector('[data-bg-tc-focus-key=\"' + escapeSelector(snapshot.focusKey) + '\"]')\n          : null;\n        if (!target && snapshot.designKey) {\n          target = self.root.querySelector('[data-design-key=\"' + escapeSelector(snapshot.designKey) + '\"]');\n        }\n        try { window.scrollTo(0, snapshot.scrollY); } catch (_) {}\n        if (target && typeof target.focus === 'function') {\n          try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); }\n        }\n        self.returnRestored = true;\n        self.emit('tc_returned_restored', {\n          anchorRestored: !!target,\n          loadedCount: Math.min(self.visibleLimit, self.filteredItems().length)\n        });\n        var key = self.returnStateKey();\n        if (key) {\n          try { window.sessionStorage.removeItem(key); } catch (_) {}\n        }\n        self.returnSnapshot = null;\n        self.returnViewedDesignKey = '';\n      });\n    });\n  };\n\n  TemplateCollectionController.prototype.showLoading = function () {\n    this.root.setAttribute('data-bg-tc-hydration', 'loading');\n    this.els.grid.hidden = false;\n    this.els.grid.setAttribute('aria-busy', 'true');\n    this.els.grid.setAttribute('aria-label', 'Loading designs');\n    this.els.count.textContent = 'Loading designs\u2026';\n    this.els.state.innerHTML = '';\n    this.els.state.hidden = true;\n    this.els.loadMore.hidden = true;\n    this.els.laterError.hidden = true;\n    this.els.toolbar.setAttribute('aria-busy', 'true');\n    this.emit('tc_state', { state: 'loading' });\n  };\n\n  TemplateCollectionController.prototype.loadPricing = function () {\n    var self = this;\n    var url = asText(this.config.masterPricingUrl);\n    if (!url) return;\n    this.fetch(url).then(function (response) {\n      return response && response.ok === false ? null : response.json();\n    }).then(function (payload) {\n      self.pricing = payload && payload.pricing && typeof payload.pricing === 'object' ? payload.pricing : {};\n      if (self.openOverlay === 'detail' && self.detail) self.renderDetailBody();\n    }).catch(function () {});\n  };\n\n  // ---- Style subtype scope (TC-YARD-01/02) -------------------------------\n  // Scopes derive from the target product's own configuration: the option\n  // holder values name the customer-facing styles and optionSourceRules map\n  // each style to its template families. A page whose product has no such\n  // rules (or whose designs all share one family) renders exactly as before \u2014\n  // both config fetches are skipped.\n\n  TemplateCollectionController.prototype.distinctFamilyCount = function () {\n    // Server mode holds only the loaded pages; the server reports the\n    // catalog-wide distinct family count for the style-scope config gate.\n    if (this.serverMode && this.serverMeta) return this.serverMeta.familyCount;\n    var families = new Set();\n    this.items.forEach(function (item) {\n      designFamilyHandles(item).forEach(function (handle) { families.add(handle); });\n    });\n    return families.size;\n  };\n\n  TemplateCollectionController.prototype.maybeLoadStyleScopes = function (generation) {\n    if (this.styleScopesRequested) return;\n    if (!this.experience || this.experience.preset !== 'product_specific') return;\n    var productHandle = asText(this.mapping && this.mapping.productHandle).toLowerCase();\n    if (!productHandle) return;\n    if (this.distinctFamilyCount() < 2) return;\n    this.styleScopesRequested = true;\n    this.loadStyleScopes(productHandle, generation);\n  };\n\n  TemplateCollectionController.prototype.styleConfigUrl = function (path, productHandle) {\n    var params = new URLSearchParams();\n    params.set('storeKey', asText(this.config.storeKey) || 'wcrmarketing');\n    params.set('productHandle', productHandle);\n    return path + '?' + params.toString();\n  };\n\n  // Pricing, style scopes and the product preview share the same public\n  // bundle request. The page cache retains in-flight and failed reads.\n  TemplateCollectionController.prototype.readReferenceProductConfig = function (handle) {\n    var reader = window.BGReferencePricing;\n    if (reader) {\n      return reader.load({ storeKey: this.config.storeKey, productHandle: handle, fetch: this.fetch }).then(function (entry) {\n        return entry.root;\n      });\n    }\n    // Style scopes and previews never depend on the pricing reader loading.\n    return this.fetch(this.styleConfigUrl(STYLE_SCOPE_PRODUCT_CONFIG_PATH, handle)).then(function (response) {\n      if (!response || response.ok === false) return null;\n      return response.json();\n    });\n  };\n\n  TemplateCollectionController.prototype.loadStyleScopes = function (productHandle, generation) {\n    var self = this;\n    this.loadingStyleScopes = true;\n    function done(scopes) {\n      if (generation !== self.generation) {\n        // A newer load owns the page now; let it request scopes again.\n        self.loadingStyleScopes = false;\n        self.styleScopesRequested = false;\n        self.maybeLoadStyleScopes(self.generation);\n        return;\n      }\n      self.styleScopes = Array.isArray(scopes) ? scopes : [];\n      self.loadingStyleScopes = false;\n      self.styleScopesResolved = true;\n      self.normalizeScopeForPreset();\n      if (self.serverMode && self.styleScopes.length) {\n        // Style scopes arrived after the first query: refresh the current\n        // query once so the server returns per-scope counts (and applies the\n        // family narrowing when a style arrived in the URL).\n        self.queryCache.delete(self.queryStateKey());\n        self.loadedQueryKey = '';\n      }\n      self.render();\n    }\n    this.fetch(this.styleConfigUrl(STYLE_SCOPE_PICKER_CONFIG_PATH, productHandle)).then(function (response) {\n      if (!response || response.ok === false) return null;\n      return response.json();\n    }).then(function (pickerPayload) {\n      var pickerUi = pickerPayload && pickerPayload.templatePickerUi && typeof pickerPayload.templatePickerUi === 'object'\n        ? pickerPayload.templatePickerUi\n        : null;\n      var rules = pickerUi && Array.isArray(pickerUi.optionSourceRules)\n        ? pickerUi.optionSourceRules.filter(function (rule) {\n          return rule && typeof rule === 'object'\n            && Array.isArray(rule.optionValues) && rule.optionValues.length\n            && Array.isArray(rule.sourceHandles) && rule.sourceHandles.length;\n        })\n        : [];\n      if (!rules.length) {\n        done([]);\n        return null;\n      }\n      return self.readReferenceProductConfig(productHandle).then(function (productConfig) {\n        done(self.deriveStyleScopes(rules, productConfig));\n      });\n    }).catch(function () {\n      done([]);\n    });\n  };\n\n  // One scope per option-holder value that an option-source rule names. The\n  // holder value supplies the customer-facing label (never a raw handle); the\n  // matched rules supply the template families. Values no rule names (e.g. a\n  // style with no template family yet) yield no scope \u2014 never a dead chip.\n  TemplateCollectionController.prototype.deriveStyleScopes = function (rules, productConfig) {\n    var bundle = productConfig && productConfig.productCommerceBundle && typeof productConfig.productCommerceBundle === 'object'\n      ? productConfig.productCommerceBundle\n      : {};\n    var holders = Array.isArray(bundle.optionHolders) ? bundle.optionHolders : [];\n    var normalizedRules = rules.map(function (rule) {\n      return {\n        keys: rule.optionValues.map(normalizeStyleMatchKey).filter(Boolean),\n        families: unique(rule.sourceHandles.map(function (handle) { return asText(handle).toLowerCase(); }).filter(Boolean))\n      };\n    }).filter(function (rule) { return rule.keys.length && rule.families.length; });\n    if (!normalizedRules.length) return [];\n    var scopes = [];\n    var seen = new Set();\n    holders.forEach(function (holder) {\n      var variations = holder && Array.isArray(holder.variations) ? holder.variations : [];\n      variations.forEach(function (variation) {\n        if (!variation || typeof variation !== 'object') return;\n        var label = asText(variation.label);\n        if (!label) return;\n        var matchKeys = unique([variation.label, variation.targetingId, variation.id]\n          .map(normalizeStyleMatchKey)\n          .filter(Boolean));\n        var families = [];\n        normalizedRules.forEach(function (rule) {\n          var matches = rule.keys.some(function (key) { return matchKeys.indexOf(key) !== -1; });\n          if (!matches) return;\n          rule.families.forEach(function (family) {\n            if (families.indexOf(family) === -1) families.push(family);\n          });\n        });\n        if (!families.length) return;\n        var id = boundedText(asText(variation.targetingId) || asText(variation.id) || label, 160);\n        var dedupeKey = normalizeStyleMatchKey(id);\n        if (!dedupeKey || seen.has(dedupeKey)) return;\n        seen.add(dedupeKey);\n        scopes.push({ id: id, label: label, matchKeys: matchKeys, families: families });\n      });\n    });\n    return scopes;\n  };\n\n  TemplateCollectionController.prototype.findStyleScope = function (value) {\n    var key = normalizeStyleMatchKey(value);\n    if (!key) return null;\n    return this.styleScopes.find(function (scope) {\n      return normalizeStyleMatchKey(scope.id) === key || scope.matchKeys.indexOf(key) !== -1;\n    }) || null;\n  };\n\n  TemplateCollectionController.prototype.styleScopesForItem = function (item) {\n    var families = designFamilyHandles(item);\n    if (!families.length) return [];\n    return this.styleScopes.filter(function (scope) {\n      return scope.families.some(function (family) { return families.indexOf(family) !== -1; });\n    });\n  };\n\n  // Catalog-level presence: the style bar renders only while at least two\n  // styles actually hold designs on this page, so a single-style catalog (or\n  // a page with no style concept) keeps today's chrome exactly.\n  TemplateCollectionController.prototype.presentStyleScopes = function () {\n    var self = this;\n    return this.styleScopes.filter(function (scope) {\n      return self.items.some(function (item) {\n        var families = designFamilyHandles(item);\n        return scope.families.some(function (family) { return families.indexOf(family) !== -1; });\n      });\n    });\n  };\n\n  TemplateCollectionController.prototype.styleScopeActive = function () {\n    return this.experience\n      && this.experience.preset === 'product_specific'\n      && this.presentStyleScopes().length >= 2;\n  };\n\n  TemplateCollectionController.prototype.endpoint = function (offset, unpaged) {\n    var params = new URLSearchParams();\n    params.set('storeKey', asText(this.config.storeKey) || 'wcrmarketing');\n    params.set('pagePath', asText(this.config.pagePath) || window.location.pathname);\n    if (!unpaged) {\n      params.set('limit', String(PAGE_LIMIT));\n      params.set('offset', String(offset || 0));\n    }\n    return '/apps/qps-commerce-control-plane/designer/template-collection-designs?' + params.toString();\n  };\n\n  // TC-PERF-01: the active style scope narrows by family handles the server\n  // already owns, so server mode passes the RESOLVED families, never the raw\n  // style value (an unresolved style narrows nothing \u2014 same as matchesScope).\n  TemplateCollectionController.prototype.activeStyleFamilies = function () {\n    var scope = this.findStyleScope(this.scopeStyle);\n    return scope ? scope.families.slice() : [];\n  };\n\n  // Canonical query identity for the client page cache: everything that\n  // changes the server-side result set or order.\n  TemplateCollectionController.prototype.queryStateKey = function (filterSource) {\n    var filters = [];\n    (filterSource || this.filters).forEach(function (values, field) {\n      if (!values.size) return;\n      filters.push([field, Array.from(values).map(function (value) { return normalizedText(value); }).sort()]);\n    });\n    filters.sort(function (a, b) { return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0; });\n    return JSON.stringify([\n      normalizedText(this.query),\n      this.scopeProduct,\n      normalizedText(this.scopeIndustry),\n      this.activeStyleFamilies().slice().sort(),\n      this.sort,\n      filters\n    ]);\n  };\n\n  // Query-lane parameter snapshot (everything except limit/offset). A\n  // snapshot string is captured when a query becomes active and every page of\n  // that query reuses it verbatim, so a state change mid-pagination can never\n  // mix two different server-side sequences into one result set.\n  TemplateCollectionController.prototype.buildQuerySnapshot = function (options) {\n    var opts = options || {};\n    var params = new URLSearchParams();\n    params.set('storeKey', asText(this.config.storeKey) || 'wcrmarketing');\n    params.set('pagePath', asText(this.config.pagePath) || window.location.pathname);\n    params.set('serve', 'query');\n    if (!opts.pinEmptyState) {\n      if (this.query) params.set('q', this.query);\n      if (this.scopeProduct) params.set('product', this.scopeProduct);\n      if (this.scopeIndustry) params.set('industry', this.scopeIndustry);\n      var families = this.activeStyleFamilies();\n      if (families.length) params.set('families', families.join(','));\n      var filterSource = opts.filters || this.filters;\n      filterSource.forEach(function (values, field) {\n        if (values.size) params.set('filter_' + field, Array.from(values).join(','));\n      });\n    }\n    if (this.styleScopes.length) {\n      params.set('familyGroups', this.styleScopes.map(function (scope) {\n        return scope.id + ':' + scope.families.join('|');\n      }).join(','));\n    }\n    if (this.sort === 'newest') params.set('sort', 'newest');\n    return params.toString();\n  };\n\n  TemplateCollectionController.prototype.queryEndpointFromSnapshot = function (snapshot, offset, countsOnly) {\n    return '/apps/qps-commerce-control-plane/designer/template-collection-designs?' + snapshot\n      + '&limit=' + String(countsOnly ? 0 : PAGE_LIMIT)\n      + '&offset=' + String(offset || 0);\n  };\n\n  TemplateCollectionController.prototype.fetchPayload = function (offset, unpaged, options) {\n    var opts = options || {};\n    var url = opts.snapshot\n      ? this.queryEndpointFromSnapshot(opts.snapshot, offset, opts.countsOnly)\n      : opts.query\n        ? this.queryEndpointFromSnapshot(this.buildQuerySnapshot(opts), offset, opts.countsOnly)\n        : this.endpoint(offset, unpaged);\n    var fetchOptions = opts.signal ? { signal: opts.signal } : undefined;\n    return this.fetch(url, fetchOptions).then(function (response) {\n      if (!response || response.ok === false) throw new Error('Template collection request failed');\n      return response.json();\n    }).then(function (payload) {\n      var result = normalizePayload(payload);\n      if (!result) throw new Error('Template collection response was invalid');\n      return result;\n    });\n  };\n\n  TemplateCollectionController.prototype.hasActiveNarrowing = function () {\n    var activeFilters = false;\n    this.filters.forEach(function (values) { if (values.size) activeFilters = true; });\n    return Boolean(this.query || this.scopeProduct || this.scopeIndustry\n      || this.activeStyleFamilies().length || activeFilters);\n  };\n\n  TemplateCollectionController.prototype.load = function () {\n    var self = this;\n    var generation = ++this.generation;\n    this.complete = false;\n    this.loadingRemainder = false;\n    this.loadingProductStatuses = false;\n    this.failedOffsets = [];\n    this.serverMode = false;\n    this.serverMeta = null;\n    this.queryCache = new Map();\n    this.loadedQueryKey = '';\n    this.queryLoading = false;\n    this.queryError = false;\n    this.failedQueryKey = '';\n    this.loadingMorePage = false;\n    this.failedQueryOffset = -1;\n    // TC-PERF-01: the first request is always a query-mode page-0 request for\n    // the CURRENT state (URL/restored search, scope, filters, sort) plus the\n    // catalog counts that decide the data mode. An old API that ignores the\n    // query params returns the legacy first page, and the legacy pipeline\n    // takes over untouched.\n    return this.fetchPayload(0, false, { query: true }).then(function (firstPage) {\n      if (generation !== self.generation) return;\n      self.mapping = firstPage.mapping && typeof firstPage.mapping === 'object' ? firstPage.mapping : null;\n      self.experience = normalizeExperience(self.mapping);\n      if (!self.experience) {\n        self.fallbackToLegacy();\n        return;\n      }\n      self.targetProducts = Array.isArray(firstPage.targetProducts) ? firstPage.targetProducts.slice() : [];\n      self.rebuildProductCatalog();\n      var queryMode = firstPage.queryMode === true;\n      var catalogTotal = queryMode ? Math.max(0, number(firstPage.catalogTotal, 0)) : 0;\n      if (queryMode && catalogTotal > CATALOG_MODE_MAX_TOTAL) {\n        return self.startServerMode(firstPage, generation);\n      }\n      if (queryMode && self.hasActiveNarrowing()) {\n        // Small catalog arriving with a narrowed URL state: the query-mode\n        // first page is a filtered subset, so paint it immediately and swap\n        // in the complete catalog with one unpaged fetch.\n        return self.startCatalogModeFromNarrowedFirstPage(firstPage, generation);\n      }\n      self.total = queryMode\n        ? Math.max(catalogTotal, firstPage.items.length)\n        : Math.max(number(firstPage.total, firstPage.items.length), firstPage.items.length);\n      self.items = self.normalizeItems(firstPage.items);\n      self.finishFirstPaint(generation);\n\n      if (firstPage.hasMore !== true || self.total <= firstPage.items.length) {\n        self.complete = true;\n        self.total = self.items.length;\n        self.normalizeScopeForPreset();\n        self.render();\n        return;\n      }\n      // Query-mode offsets index the server's excluded+sorted sequence, so\n      // the remainder must page the SAME sequence via a pinned snapshot (a\n      // state change mid-remainder must not fork the sequence); legacy\n      // responses keep the historical raw offsets.\n      var pageStart = queryMode\n        ? number(firstPage.offset, 0) + firstPage.items.length\n        : firstPage.items.length;\n      return self.loadRemainder(pageStart, self.total, generation, queryMode\n        ? { snapshot: self.buildQuerySnapshot({ pinEmptyState: true }) }\n        : {});\n    }).catch(function (error) {\n      if (generation !== self.generation) return;\n      self.showFirstPageError(error);\n    });\n  };\n\n  // Shared first-paint tail: preset chrome, style-scope config, statuses.\n  TemplateCollectionController.prototype.finishFirstPaint = function (generation) {\n    var self = this;\n    this.normalizeScopeForPreset();\n    this.configurePreset();\n    this.maybeLoadStyleScopes(generation);\n    this.root.setAttribute('data-bg-tc-hydration', 'ready');\n    this.els.toolbar.setAttribute('aria-busy', 'false');\n    this.els.grid.setAttribute('aria-busy', 'false');\n    this.enableControls();\n    this.emit('tc_preset_rendered', { preset: this.experience.preset });\n    this.loadingProductStatuses = true;\n    this.render();\n    this.applyProductStatuses().then(function () {\n      if (generation !== self.generation) return;\n      self.normalizeScopeForPreset();\n      self.refreshOpenDetail();\n    }).finally(function () {\n      if (generation !== self.generation) return;\n      self.loadingProductStatuses = false;\n      self.render();\n    });\n  };\n\n  // ------------------------------------------------------------------\n  // TC-PERF-01 server mode: the server filters/sorts/counts per query; the\n  // client holds only the loaded pages of the current query plus a bounded\n  // cache of recently used queries.\n  // ------------------------------------------------------------------\n\n  TemplateCollectionController.prototype.startServerMode = function (firstPage, generation) {\n    this.serverMode = true;\n    var key = this.queryStateKey();\n    var entry = this.storeQueryPage(key, this.buildQuerySnapshot(), firstPage);\n    this.adoptQueryEntry(key, entry);\n    this.finishFirstPaint(generation);\n  };\n\n  TemplateCollectionController.prototype.storeQueryPage = function (key, snapshot, payload) {\n    var entry = this.queryCache.get(key);\n    if (!entry) {\n      entry = { snapshot: snapshot, pages: new Map(), meta: null };\n      this.queryCache.set(key, entry);\n      while (this.queryCache.size > QUERY_CACHE_MAX_ENTRIES) {\n        var oldest = this.queryCache.keys().next().value;\n        if (oldest === undefined || oldest === key) break;\n        this.queryCache.delete(oldest);\n      }\n    }\n    var pageOffset = number(payload.offset, 0);\n    var pageItems = Array.isArray(payload.items) ? payload.items : [];\n    entry.pages.set(pageOffset, pageItems);\n    // Server offsets, not client item counts, drive the next page request:\n    // client-side status pruning may hide a few loaded cards without moving\n    // the server-side cursor.\n    entry.nextOffset = Math.max(number(entry.nextOffset, 0), pageOffset + pageItems.length);\n    if (payload.hasMore === false) entry.exhausted = true;\n    if (payload.facets || payload.scopeCounts || !entry.meta) {\n      entry.meta = {\n        total: Math.max(0, number(payload.total, 0)),\n        catalogTotal: Math.max(0, number(payload.catalogTotal, 0)),\n        scopedTotal: Math.max(0, number(payload.scopedTotal, 0)),\n        familyCount: Math.max(0, number(payload.familyCount, 0)),\n        facets: payload.facets && typeof payload.facets === 'object' ? payload.facets : (entry.meta ? entry.meta.facets : null),\n        scopeCounts: payload.scopeCounts && typeof payload.scopeCounts === 'object' ? payload.scopeCounts : (entry.meta ? entry.meta.scopeCounts : null)\n      };\n    } else {\n      entry.meta.total = Math.max(0, number(payload.total, entry.meta.total));\n    }\n    return entry;\n  };\n\n  TemplateCollectionController.prototype.queryEntryItems = function (entry) {\n    var offsets = Array.from(entry.pages.keys()).sort(function (a, b) { return a - b; });\n    var merged = [];\n    var seen = new Set();\n    offsets.forEach(function (offset) {\n      entry.pages.get(offset).forEach(function (item) {\n        var key = designKey(item);\n        if (!key || seen.has(key)) return;\n        seen.add(key);\n        merged.push(item);\n      });\n    });\n    return merged;\n  };\n\n  TemplateCollectionController.prototype.adoptQueryEntry = function (key, entry) {\n    this.loadedQueryKey = key;\n    this.serverMeta = entry.meta;\n    this.items = this.normalizeItems(this.queryEntryItems(entry));\n    this.total = entry.meta ? entry.meta.total : this.items.length;\n    this.complete = entry.exhausted === true || this.items.length >= this.total;\n    this.queryLoading = false;\n    this.queryError = false;\n    this.failedQueryOffset = -1;\n  };\n\n  // Ensures the loaded items/counts match the CURRENT query state. Returns\n  // true when current data is ready; false while a fetch is pending (render\n  // shows the busy state).\n  TemplateCollectionController.prototype.ensureQueryData = function () {\n    if (!this.serverMode) return true;\n    var key = this.queryStateKey();\n    if (key === this.loadedQueryKey) return true;\n    // A failed query holds its error state until the customer retries or\n    // changes the query \u2014 re-requesting from render would loop forever.\n    if (this.queryError && this.failedQueryKey === key) return true;\n    if (this.queryError) {\n      this.queryError = false;\n      this.failedQueryKey = '';\n    }\n    var cached = this.queryCache.get(key);\n    if (cached && cached.meta && cached.pages.has(0)) {\n      this.adoptQueryEntry(key, cached);\n      return true;\n    }\n    this.requestQueryPage(key, 0);\n    return false;\n  };\n\n  TemplateCollectionController.prototype.requestQueryPage = function (key, offset) {\n    var self = this;\n    var entry = this.queryCache.get(key);\n    var snapshot = entry ? entry.snapshot : this.buildQuerySnapshot();\n    if (!entry) {\n      entry = { snapshot: snapshot, pages: new Map(), meta: null };\n      this.queryCache.set(key, entry);\n    }\n    if (entry.loadingOffset === offset) return;\n    entry.loadingOffset = offset;\n    // PERF-02: a newer request supersedes the in-flight one \u2014 abort it where\n    // the browser allows, and ignore its response regardless.\n    if (offset === 0) {\n      if (this.queryAbort && typeof this.queryAbort.abort === 'function') {\n        try { this.queryAbort.abort(); } catch (_) {}\n      }\n      this.queryAbort = typeof window.AbortController === 'function' ? new window.AbortController() : null;\n      this.queryLoading = true;\n      this.queryError = false;\n    } else {\n      this.loadingMorePage = true;\n    }\n    var generation = ++this.queryGeneration;\n    var signal = offset === 0 && this.queryAbort ? this.queryAbort.signal : undefined;\n    this.fetchPayload(offset, false, { snapshot: snapshot, signal: signal }).then(function (payload) {\n      entry.loadingOffset = -1;\n      // Stale-response guard: only the newest page-0 request may adopt state.\n      if (offset === 0 && generation !== self.queryGeneration) return;\n      if (payload.queryMode !== true) {\n        // The API stopped serving query mode (rollback): fall back to the\n        // legacy full pipeline once.\n        self.serverMode = false;\n        self.retryRemainder();\n        return;\n      }\n      self.storeQueryPage(key, snapshot, payload);\n      if (offset === 0) self.queryLoading = false;\n      else self.loadingMorePage = false;\n      if (self.queryStateKey() === key) {\n        self.adoptQueryEntry(key, self.queryCache.get(key));\n        self.render();\n      }\n    }).catch(function (error) {\n      entry.loadingOffset = -1;\n      if (offset === 0 && generation !== self.queryGeneration) return;\n      if (error && error.name === 'AbortError') return;\n      if (offset === 0) {\n        self.queryLoading = false;\n        // PERF-08: a failed request is an error state, never an empty state.\n        if (self.queryStateKey() === key) {\n          self.queryError = true;\n          self.failedQueryKey = key;\n          self.render();\n        }\n      } else {\n        self.loadingMorePage = false;\n        self.failedQueryOffset = offset;\n        self.emit('tc_state', { state: 'error', phase: 'later_page' });\n        self.render();\n      }\n    });\n  };\n\n  TemplateCollectionController.prototype.maybeFetchMoreForVisibleLimit = function () {\n    if (!this.serverMode || this.queryLoading || this.queryError || this.complete) return;\n    if (this.loadingMorePage || this.failedQueryOffset !== -1) return;\n    var entry = this.queryCache.get(this.loadedQueryKey);\n    if (!entry || entry.exhausted === true) return;\n    if (this.visibleLimit <= this.items.length) return;\n    this.requestQueryPage(this.loadedQueryKey, number(entry.nextOffset, this.items.length));\n  };\n\n  TemplateCollectionController.prototype.startCatalogModeFromNarrowedFirstPage = function (firstPage, generation) {\n    var self = this;\n    this.total = Math.max(0, number(firstPage.catalogTotal, firstPage.items.length));\n    this.items = this.normalizeItems(firstPage.items);\n    this.loadingRemainder = true;\n    this.finishFirstPaint(generation);\n    return this.fetchPayload(0, true).then(function (payload) {\n      if (generation !== self.generation) return;\n      self.targetProducts = Array.isArray(payload.targetProducts) ? payload.targetProducts.slice() : self.targetProducts;\n      self.rebuildProductCatalog();\n      self.items = self.normalizeItems(payload.items);\n      self.total = self.items.length;\n      self.complete = true;\n      self.loadingRemainder = false;\n      self.normalizeScopeForPreset();\n      self.maybeLoadStyleScopes(generation);\n      self.refreshOpenDetail();\n      self.render();\n    }).catch(function () {\n      if (generation !== self.generation) return;\n      self.loadingRemainder = false;\n      self.failedOffsets = [firstPage.items.length];\n      self.els.laterError.hidden = false;\n      self.render();\n    });\n  };\n\n  TemplateCollectionController.prototype.fallbackToLegacy = function () {\n    var url = new URL(window.location.href);\n    if (url.searchParams.get('view') === 'bg-designs-collection') {\n      throw new Error('Legacy template collection fallback could not be loaded');\n    }\n    url.searchParams.set('view', 'bg-designs-collection');\n    this.root.setAttribute('data-bg-tc-hydration', 'legacy');\n    this.replaceNavigate(url.pathname + url.search + url.hash);\n  };\n\n  TemplateCollectionController.prototype.normalizeItems = function (items) {\n    var self = this;\n    var pageAllowsTesting = normalizedText(this.config.pagePath || window.location.pathname).indexOf('testing') !== -1;\n    var seen = new Set();\n    return (Array.isArray(items) ? items : []).filter(function (item) {\n      if (!item || typeof item !== 'object') return false;\n      var name = normalizedText(item.template_name);\n      if (name === 'start from scratch' || name === 'upload completed design') return false;\n      var handle = productHandle(item);\n      if (EXCLUDED_PRODUCT_HANDLES.has(handle)) return false;\n      if (!pageAllowsTesting && TESTING_PRODUCT_PATTERN.test(handle)) return false;\n      if (self.hiddenProductHandles.has(handle)) return false;\n      var key = designKey(item);\n      if (!key || seen.has(key)) return false;\n      seen.add(key);\n      return true;\n    });\n  };\n\n  TemplateCollectionController.prototype.mergeItems = function (pages) {\n    var merged = this.items.slice();\n    var seen = new Set(merged.map(designKey).filter(Boolean));\n    pages.forEach(function (page) {\n      (page || []).forEach(function (item) {\n        var key = designKey(item);\n        if (!key || seen.has(key)) return;\n        seen.add(key);\n        merged.push(item);\n      });\n    });\n    this.items = this.normalizeItems(merged);\n  };\n\n  TemplateCollectionController.prototype.loadRemainder = function (firstOffset, total, generation, options) {\n    var self = this;\n    var opts = options || {};\n    var offsets = [];\n    for (var offset = firstOffset; offset < total; offset += PAGE_LIMIT) offsets.push(offset);\n    var pages = new Map();\n    var failed = [];\n    var cursor = 0;\n    this.loadingRemainder = true;\n    this.render();\n\n    function fetchNext() {\n      if (cursor >= offsets.length) return Promise.resolve();\n      var pageOffset = offsets[cursor++];\n      return self.fetchPayload(pageOffset, false, opts.snapshot ? { snapshot: opts.snapshot } : undefined).then(function (payload) {\n        if (generation !== self.generation) return;\n        pages.set(pageOffset, payload.items);\n      }).catch(function () {\n        failed.push(pageOffset);\n      }).then(fetchNext);\n    }\n\n    var lanes = [];\n    for (var lane = 0; lane < Math.min(PAGE_CONCURRENCY, offsets.length); lane += 1) lanes.push(fetchNext());\n    return Promise.all(lanes).then(function () {\n      if (generation !== self.generation) return;\n      self.mergeItems(Array.from(pages.keys()).sort(function (a, b) { return a - b; }).map(function (key) {\n        return pages.get(key);\n      }));\n      self.loadingRemainder = false;\n      self.failedOffsets = failed.sort(function (a, b) { return a - b; });\n      self.complete = failed.length === 0;\n      if (self.complete) self.total = self.items.length;\n      self.normalizeScopeForPreset();\n      self.maybeLoadStyleScopes(generation);\n      self.refreshOpenDetail();\n      self.render();\n      if (failed.length) self.emit('tc_state', { state: 'error', phase: 'later_page' });\n    });\n  };\n\n  // PERF-08: a blocked/failed query request paints a retryable failure state,\n  // visually and semantically distinct from the zero-results empty state.\n  TemplateCollectionController.prototype.renderQueryErrorState = function () {\n    var self = this;\n    this.els.state.innerHTML = '';\n    this.els.state.hidden = false;\n    var state = document.createElement('div');\n    state.className = 'bg-tc__state bg-tc__state--error';\n    state.setAttribute('role', 'alert');\n    var title = document.createElement('strong');\n    title.textContent = \"We couldn't load these designs\";\n    var copy = document.createElement('span');\n    copy.textContent = 'Your search and filters are saved. Check your connection and try again.';\n    var actions = document.createElement('div');\n    actions.className = 'bg-tc__state-actions';\n    var retry = document.createElement('button');\n    retry.type = 'button';\n    retry.className = 'primary';\n    retry.textContent = 'Try again';\n    retry.addEventListener('click', function () {\n      self.queryError = false;\n      self.failedQueryKey = '';\n      self.queryCache.delete(self.queryStateKey());\n      self.loadedQueryKey = '';\n      self.emit('tc_state', { state: 'retry', phase: 'query' });\n      self.render();\n    });\n    actions.appendChild(retry);\n    state.append(title, copy, actions);\n    this.els.state.appendChild(state);\n  };\n\n  TemplateCollectionController.prototype.retryRemainder = function () {\n    var self = this;\n    if (this.serverMode) {\n      // PERF-07: retry fetches ONLY the missing page of the current query;\n      // every already-loaded design stays on the page.\n      var missingOffset = this.failedQueryOffset;\n      this.failedQueryOffset = -1;\n      this.els.laterError.hidden = true;\n      this.emit('tc_state', { state: 'retry', phase: 'later_page' });\n      if (missingOffset >= 0) this.requestQueryPage(this.loadedQueryKey, missingOffset);\n      this.render();\n      return;\n    }\n    var generation = ++this.generation;\n    this.loadingRemainder = true;\n    this.failedOffsets = [];\n    this.els.laterError.hidden = true;\n    this.emit('tc_state', { state: 'retry', phase: 'later_page' });\n    this.render();\n    this.fetchPayload(0, true).then(function (payload) {\n      if (generation !== self.generation) return;\n      self.targetProducts = Array.isArray(payload.targetProducts) ? payload.targetProducts.slice() : self.targetProducts;\n      self.rebuildProductCatalog();\n      self.items = self.normalizeItems(payload.items);\n      self.total = self.items.length;\n      self.complete = true;\n      self.loadingRemainder = false;\n      self.normalizeScopeForPreset();\n      self.maybeLoadStyleScopes(generation);\n      self.refreshOpenDetail();\n      self.render();\n    }).catch(function (error) {\n      if (generation !== self.generation) return;\n      self.loadingRemainder = false;\n      self.failedOffsets = [0];\n      self.els.laterError.hidden = false;\n      self.emitError('template_collection_later_page_error', 'retry_failed', error);\n      self.render();\n    });\n  };\n\n  TemplateCollectionController.prototype.rebuildProductCatalog = function () {\n    var self = this;\n    this.productsByHandle = new Map();\n    this.targetProducts.forEach(function (product) {\n      var handle = asText(product && product.handle).toLowerCase();\n      if (!handle || EXCLUDED_PRODUCT_HANDLES.has(handle)) return;\n      self.productsByHandle.set(handle, product);\n    });\n  };\n\n  TemplateCollectionController.prototype.applyProductStatuses = function () {\n    var self = this;\n    var handles = Array.from(this.productsByHandle.keys()).sort();\n    if (!handles.length) return Promise.resolve();\n    var params = new URLSearchParams();\n    params.set('storeKey', asText(this.config.storeKey) || 'wcrmarketing');\n    params.set('handles', handles.join(','));\n    var statusCheck = this.fetch('/apps/qps-commerce-control-plane/designer/template-collection-product-status?' + params.toString())\n      .then(function (response) { return response && response.ok === false ? null : response.json(); })\n      .then(function (payload) {\n        var statuses = payload && payload.ok === true && payload.statusByHandle && typeof payload.statusByHandle === 'object'\n          ? payload.statusByHandle\n          : null;\n        if (!statuses) return;\n        var pageAllowsTesting = normalizedText(self.config.pagePath || window.location.pathname).indexOf('testing') !== -1;\n        Object.keys(statuses).forEach(function (rawHandle) {\n          var handle = asText(rawHandle).toLowerCase();\n          if (normalizedText(statuses[rawHandle]) !== 'unlisted') return;\n          if (pageAllowsTesting && TESTING_PRODUCT_PATTERN.test(handle)) return;\n          self.hiddenProductHandles.add(handle);\n          self.productsByHandle.delete(handle);\n        });\n      }).catch(function () {});\n    var reachabilityChecks = handles.map(function (handle) {\n      return self.fetch('/products/' + encodeURIComponent(handle) + '.js').then(function (response) {\n        if (!response || response.status !== 404) return;\n        self.hiddenProductHandles.add(handle);\n        self.productsByHandle.delete(handle);\n      }).catch(function () {});\n    });\n    return Promise.all([statusCheck].concat(reachabilityChecks)).then(function () {\n      if (self.hiddenProductHandles.size) self.items = self.normalizeItems(self.items);\n    });\n  };\n\n  TemplateCollectionController.prototype.configurePreset = function () {\n    var experience = this.experience;\n    this.root.setAttribute('data-bg-tc-preset', experience.preset);\n    this.els.breadcrumb.hidden = experience.preset !== 'product_specific';\n    this.els.searchForm.hidden = experience.search === false;\n    this.els.sort.hidden = experience.sort === false;\n    this.els.intro.hidden = experience.intro === false || !(experience.introCopy || asText(this.config.pageIntro));\n    if (!this.els.intro.hidden) this.els.intro.textContent = experience.introCopy || asText(this.config.pageIntro);\n    this.els.search.value = this.query;\n    this.els.sort.value = this.sort;\n    this.renderScope();\n    this.renderRescuePlacement();\n  };\n\n  TemplateCollectionController.prototype.normalizeScopeForPreset = function () {\n    if (!this.experience) return false;\n    var changed = false;\n    var preset = this.experience.preset;\n    if (this.experience.productScope === false && this.scopeProduct) {\n      this.scopeProduct = '';\n      changed = true;\n    }\n    if ((this.experience.productScope === false || preset !== 'all_templates') && this.scopeIndustry) {\n      this.scopeIndustry = '';\n      changed = true;\n    }\n    if (preset !== 'product_specific' && this.scopeProduct && !this.productsByHandle.has(this.scopeProduct)) {\n      this.scopeProduct = '';\n      changed = true;\n    }\n    if (this.scopeStyle && (preset !== 'product_specific'\n      || (this.styleScopesResolved && !this.findStyleScope(this.scopeStyle)))) {\n      this.scopeStyle = '';\n      changed = true;\n    }\n    if (preset === 'all_templates' && this.scopeIndustry) {\n      var selectedIndustry = normalizedText(this.scopeIndustry);\n      var hasIndustry;\n      if (this.serverMode) {\n        // Server mode never loads the full catalog: the server's skip-scope\n        // industry counts are the same truth the full-load check used. They\n        // carry the query's other narrowing, so only an OTHERWISE UNNARROWED\n        // view may clear a stale industry (fail-open elsewhere, like the\n        // pre-complete state today).\n        var otherwiseNarrowed = Boolean(this.query || this.scopeProduct || this.activeStyleFamilies().length)\n          || this.filters.size > 0;\n        hasIndustry = otherwiseNarrowed || !this.serverMeta || this.serverScopeIndustryEntries().some(function (entry) {\n          return entry.count > 0 && normalizedText(entry.value) === selectedIndustry;\n        });\n      } else if (this.complete) {\n        hasIndustry = this.items.some(function (item) {\n          return itemValues(item, 'industry').some(function (value) {\n            return normalizedText(value) === selectedIndustry;\n          });\n        });\n      } else {\n        hasIndustry = true;\n      }\n      if (!hasIndustry) {\n        this.scopeIndustry = '';\n        changed = true;\n      }\n    }\n    if (this.experience.search === false && this.query) {\n      this.query = '';\n      this.els.search.value = '';\n      changed = true;\n    }\n    if (this.experience.sort === false && this.sort !== 'popular') {\n      this.sort = 'popular';\n      this.els.sort.value = 'popular';\n      changed = true;\n    }\n    var visibleFilters = new Set(this.experience.visibleFilters || []);\n    Array.from(this.filters.keys()).forEach(function (field) {\n      if (visibleFilters.has(field)) return;\n      this.filters.delete(field);\n      changed = true;\n    }, this);\n    if (changed) this.syncUrl();\n    return changed;\n  };\n\n  TemplateCollectionController.prototype.enableControls = function () {\n    this.els.search.disabled = false;\n    this.els.searchButton.disabled = false;\n    this.els.sort.disabled = false;\n  };\n\n  TemplateCollectionController.prototype.showFirstPageError = function (error) {\n    this.root.setAttribute('data-bg-tc-hydration', 'error');\n    this.els.grid.hidden = true;\n    this.els.grid.setAttribute('aria-busy', 'false');\n    this.els.count.textContent = 'Designs unavailable';\n    this.els.state.hidden = false;\n    this.els.state.innerHTML = '';\n    var state = document.createElement('div');\n    state.className = 'bg-tc__state bg-tc__state--error';\n    state.setAttribute('role', 'alert');\n    var title = document.createElement('strong');\n    title.textContent = \"We couldn't load these designs\";\n    var copy = document.createElement('span');\n    copy.textContent = 'Your search and filters are saved. Check your connection and try again.';\n    var actions = document.createElement('div');\n    actions.className = 'bg-tc__state-actions';\n    var retry = document.createElement('button');\n    retry.type = 'button';\n    retry.className = 'primary';\n    retry.textContent = 'Try again';\n    var self = this;\n    retry.addEventListener('click', function () {\n      self.showLoading();\n      self.emit('tc_state', { state: 'retry', phase: 'first_page' });\n      self.load();\n    });\n    actions.appendChild(retry);\n    state.append(title, copy, actions);\n    this.els.state.appendChild(state);\n    this.emit('tc_state', { state: 'error', phase: 'first_page' });\n    this.emitError('template_collection_load_error', 'first_page_failed', error);\n  };\n\n  TemplateCollectionController.prototype.renderScope = function () {\n    var self = this;\n    var scope = this.els.scope;\n    var restoreKey = this.focusKey(scope);\n    scope.innerHTML = '';\n    if (this.experience && this.experience.preset === 'product_specific') {\n      // TC-YARD-01: the product-specific preset never shows the broad Product\n      // selector; when the target product's styles differentiate the catalog\n      // it shows the style subtype scope instead.\n      if (!this.styleScopeActive()) {\n        scope.hidden = true;\n        return;\n      }\n      scope.hidden = false;\n      var styleLabel = document.createElement('span');\n      styleLabel.className = 'bg-tc__scope-label';\n      styleLabel.textContent = 'Style:';\n      scope.appendChild(styleLabel);\n      var selectedScope = this.findStyleScope(this.scopeStyle);\n      if (this.serverMode) {\n        var serverStyleCounts = this.serverMeta && this.serverMeta.scopeCounts ? this.serverMeta.scopeCounts : null;\n        var styleGroups = serverStyleCounts && serverStyleCounts.styleGroups && typeof serverStyleCounts.styleGroups === 'object'\n          ? serverStyleCounts.styleGroups\n          : {};\n        scope.appendChild(this.styleScopeChip('', 'All Styles', serverStyleCounts ? Math.max(0, number(serverStyleCounts.styleAll, 0)) : 0));\n        this.styleScopes.forEach(function (entry) {\n          var count = Math.max(0, number(styleGroups[entry.id], 0));\n          if (!count && (!selectedScope || selectedScope.id !== entry.id)) return;\n          scope.appendChild(self.styleScopeChip(entry.id, entry.label, count));\n        });\n        this.restoreFocusKey(scope, restoreKey);\n        this.syncScopeOverflow();\n        return;\n      }\n      var styleScopeItems = this.filteredItems({ skipScope: 'style' });\n      var allStyles = this.styleScopeChip('', 'All Styles', styleScopeItems.length);\n      scope.appendChild(allStyles);\n      this.presentStyleScopes().forEach(function (entry) {\n        var count = styleScopeItems.filter(function (item) {\n          var families = designFamilyHandles(item);\n          return entry.families.some(function (family) { return families.indexOf(family) !== -1; });\n        }).length;\n        if (!count && (!selectedScope || selectedScope.id !== entry.id)) return;\n        scope.appendChild(self.styleScopeChip(entry.id, entry.label, count));\n      });\n      this.restoreFocusKey(scope, restoreKey);\n      this.syncScopeOverflow();\n      return;\n    }\n    if (!this.experience || this.experience.productScope === false) {\n      scope.hidden = true;\n      return;\n    }\n    scope.hidden = false;\n    // OP-09: a tag-based concept page keeps its cross-product scope visible\n    // through the same chip lane the industry preset uses.\n    if (this.experience.preset === 'industry' || this.experience.preset === 'tag_based') {\n      var label = document.createElement('span');\n      label.className = 'bg-tc__scope-label';\n      label.textContent = 'Show:';\n      scope.appendChild(label);\n      var productScopeItems = this.serverMode ? [] : this.filteredItems({ skipScope: 'product' });\n      var products = this.scopeProductCounts(productScopeItems);\n      var allProductsCount = this.serverMode\n        ? (this.serverMeta && this.serverMeta.scopeCounts ? Math.max(0, number(this.serverMeta.scopeCounts.productsTotal, 0)) : 0)\n        : productScopeItems.length;\n      var all = this.scopeChip('', 'All products', allProductsCount);\n      scope.appendChild(all);\n      products.forEach(function (entry) {\n        scope.appendChild(self.scopeChip(entry.handle, entry.name, entry.count));\n      });\n      this.restoreFocusKey(scope, restoreKey);\n      this.syncScopeOverflow();\n      return;\n    }\n    // SCOPE-03: All Templates keeps the complete native product select for\n    // touch layouts and adds a searchable product picker for desktop (CSS\n    // decides which control shows). Both drive the same scopeProduct state.\n    var productSelect = document.createElement('select');\n    productSelect.className = 'bg-tc__scope-select bg-tc__scope-select--product';\n    productSelect.setAttribute('aria-label', 'Product');\n    productSelect.setAttribute('data-bg-tc-focus-key', 'scope:product');\n    productSelect.appendChild(new Option('Product: All', ''));\n    this.scopeProductCounts(this.serverMode ? [] : this.filteredItems({ skipScope: 'product' })).forEach(function (entry) {\n      productSelect.appendChild(new Option(entry.name + ' (' + entry.count + ')', entry.handle));\n    });\n    productSelect.value = this.scopeProduct;\n    productSelect.addEventListener('change', function () {\n      self.applyProductScope(productSelect.value);\n    });\n    scope.appendChild(productSelect);\n    this.renderProductPicker(scope);\n    var industrySelect = document.createElement('select');\n    industrySelect.className = 'bg-tc__scope-select';\n    industrySelect.setAttribute('aria-label', 'Industry');\n    industrySelect.setAttribute('data-bg-tc-focus-key', 'scope:industry');\n    industrySelect.appendChild(new Option('Industry: All', ''));\n    this.scopeIndustryCounts(this.serverMode ? [] : this.filteredItems({ skipScope: 'industry' })).forEach(function (entry) {\n      industrySelect.appendChild(new Option(entry.value + ' (' + entry.count + ')', entry.value));\n    });\n    industrySelect.value = this.scopeIndustry;\n    industrySelect.addEventListener('change', function () {\n      self.scopeIndustry = industrySelect.value;\n      self.visibleLimit = DISPLAY_STEP;\n      self.markMeaningfulBrowsing();\n      self.emit('tc_scope_changed', { field: 'industry', value: self.scopeIndustry || 'all' });\n      self.syncUrl();\n      self.render();\n    });\n    scope.appendChild(industrySelect);\n    this.restoreFocusKey(scope, restoreKey);\n    this.syncScopeOverflow();\n  };\n\n  TemplateCollectionController.prototype.applyProductScope = function (handle) {\n    this.scopeProduct = asText(handle).toLowerCase();\n    this.visibleLimit = DISPLAY_STEP;\n    this.markMeaningfulBrowsing();\n    this.emit('tc_scope_changed', { field: 'product', value: this.scopeProduct || 'all' });\n    this.syncUrl();\n    this.render();\n  };\n\n  // SCOPE-03: complete, searchable product selection for the broad catalog.\n  // A quiet button opens a popover with a search input over every product\n  // (plus counts); selection routes through the same canonical scope state\n  // as the native select and the URL.\n  TemplateCollectionController.prototype.renderProductPicker = function (scope) {\n    var self = this;\n    var wrap = document.createElement('div');\n    wrap.className = 'bg-tc__scope-picker';\n    wrap.setAttribute('data-bg-tc-product-picker', '');\n    var button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'bg-tc__facet-button bg-tc__scope-picker-button';\n    button.setAttribute('data-bg-tc-product-picker-button', '');\n    button.setAttribute('data-bg-tc-focus-key', 'scope:product-picker');\n    button.setAttribute('aria-haspopup', 'true');\n    button.setAttribute('aria-expanded', this.openProductPicker ? 'true' : 'false');\n    var selectedProduct = this.scopeProduct ? this.productsByHandle.get(this.scopeProduct) : null;\n    button.textContent = 'Product: ' + (selectedProduct ? productName(selectedProduct) : 'All');\n    var popover = document.createElement('div');\n    popover.className = 'bg-tc__facet-popover bg-tc__scope-picker-popover';\n    popover.setAttribute('role', 'group');\n    popover.setAttribute('aria-label', 'Choose a product');\n    popover.hidden = !this.openProductPicker;\n    var search = document.createElement('input');\n    search.type = 'search';\n    search.className = 'bg-tc__scope-picker-search';\n    search.setAttribute('aria-label', 'Search products');\n    search.setAttribute('placeholder', 'Search products');\n    search.setAttribute('autocomplete', 'off');\n    search.setAttribute('data-bg-tc-focus-key', 'scope:product-picker-search');\n    search.value = this.productPickerQuery;\n    var listWrap = document.createElement('div');\n    listWrap.className = 'bg-tc__scope-picker-list';\n    var entries = this.scopeProductCounts(this.serverMode ? [] : this.filteredItems({ skipScope: 'product' }));\n    var renderList = function () {\n      listWrap.innerHTML = '';\n      var query = normalizedText(self.productPickerQuery);\n      var options = [{ handle: '', name: 'All products', count: null }].concat(entries);\n      var productMatches = 0;\n      options.forEach(function (entry) {\n        if (query && entry.handle !== '' && normalizedText(entry.name).indexOf(query) === -1) return;\n        if (entry.handle !== '') productMatches += 1;\n        var option = document.createElement('button');\n        option.type = 'button';\n        option.className = 'bg-tc__scope-picker-option';\n        option.setAttribute('data-bg-tc-product-option', entry.handle || 'all');\n        option.setAttribute('aria-pressed', (entry.handle || '') === self.scopeProduct ? 'true' : 'false');\n        option.appendChild(document.createTextNode(entry.name + ' '));\n        if (entry.count !== null) {\n          var count = document.createElement('small');\n          count.textContent = '(' + entry.count + ')';\n          option.appendChild(count);\n        }\n        option.addEventListener('click', function () {\n          self.closeProductPicker(false);\n          self.applyProductScope(entry.handle);\n        });\n        listWrap.appendChild(option);\n      });\n      if (query && !productMatches) {\n        var none = document.createElement('p');\n        none.className = 'bg-tc__scope-picker-empty';\n        none.textContent = 'No products match that search.';\n        listWrap.appendChild(none);\n      }\n    };\n    search.addEventListener('input', function () {\n      self.productPickerQuery = search.value;\n      renderList();\n    });\n    button.addEventListener('click', function () {\n      if (self.openProductPicker) {\n        self.closeProductPicker(false);\n        return;\n      }\n      self.closeFacetMenu(false);\n      self.openProductPicker = true;\n      button.setAttribute('aria-expanded', 'true');\n      popover.hidden = false;\n      search.focus();\n    });\n    renderList();\n    popover.append(search, listWrap);\n    wrap.append(button, popover);\n    scope.appendChild(wrap);\n  };\n\n  TemplateCollectionController.prototype.closeProductPicker = function (returnFocus) {\n    if (!this.openProductPicker) return;\n    this.openProductPicker = false;\n    this.productPickerQuery = '';\n    var button = this.els.scope.querySelector('[data-bg-tc-product-picker-button]');\n    var popover = this.els.scope.querySelector('.bg-tc__scope-picker-popover');\n    if (button) button.setAttribute('aria-expanded', 'false');\n    if (popover) {\n      popover.hidden = true;\n      var search = popover.querySelector('.bg-tc__scope-picker-search');\n      if (search) search.value = '';\n    }\n    if (returnFocus && button) button.focus();\n  };\n\n  // SCOPE-01/02: keep the horizontal scope row honest. While the row\n  // overflows, a data attribute drives the CSS continuation fade for the\n  // side(s) holding more choices, and the selected chip is scrolled into\n  // view so the active scope is never hidden off-screen.\n  TemplateCollectionController.prototype.updateScopeOverflowCue = function () {\n    var scope = this.els.scope;\n    if (!scope || scope.hidden) return;\n    var max = scope.scrollWidth - scope.clientWidth;\n    if (max <= 1) {\n      scope.removeAttribute('data-bg-tc-scope-overflow');\n      return;\n    }\n    var left = scope.scrollLeft;\n    scope.setAttribute(\n      'data-bg-tc-scope-overflow',\n      left <= 1 ? 'end' : left >= max - 1 ? 'start' : 'both'\n    );\n  };\n\n  TemplateCollectionController.prototype.syncScopeOverflow = function () {\n    var scope = this.els.scope;\n    if (!scope || scope.hidden) return;\n    var max = scope.scrollWidth - scope.clientWidth;\n    if (max > 1) {\n      var selected = scope.querySelector('.bg-tc__scope-chip[aria-pressed=\"true\"]');\n      if (selected && typeof selected.getBoundingClientRect === 'function') {\n        // Rect deltas, not offsetLeft: offsetLeft is offsetParent-relative\n        // and the scope row is not positioned. Center the selected chip; a\n        // chip wider than the viewport left-aligns so its start is visible.\n        var scopeRect = scope.getBoundingClientRect();\n        var chipRect = selected.getBoundingClientRect();\n        var delta = (chipRect.left - scopeRect.left)\n          - Math.max(0, (scope.clientWidth - chipRect.width) / 2);\n        scope.scrollLeft = Math.max(0, Math.min(scope.scrollLeft + delta, max));\n      }\n    }\n    this.updateScopeOverflowCue();\n  };\n\n  TemplateCollectionController.prototype.markMeaningfulBrowsing = function () {\n    if (this.meaningfulBrowsing) return;\n    this.meaningfulBrowsing = true;\n    if (this.experience) this.renderRescuePlacement(this.filteredItems());\n  };\n\n  TemplateCollectionController.prototype.styleScopeChip = function (id, name, count) {\n    var self = this;\n    var selected = id ? !!this.scopeStyle && !!this.findStyleScope(this.scopeStyle) && this.findStyleScope(this.scopeStyle).id === id : !this.scopeStyle || !this.findStyleScope(this.scopeStyle);\n    var button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'bg-tc__scope-chip';\n    button.setAttribute('data-bg-tc-style-scope', id || 'all');\n    button.setAttribute('data-bg-tc-focus-key', 'scope:style:' + (id || 'all'));\n    button.setAttribute('aria-pressed', selected ? 'true' : 'false');\n    var chipName = document.createElement('span');\n    chipName.className = 'bg-tc__scope-chip-name';\n    chipName.textContent = name;\n    button.appendChild(chipName);\n    button.appendChild(document.createTextNode(' '));\n    var small = document.createElement('small');\n    small.textContent = '(' + count + ')';\n    button.appendChild(small);\n    button.addEventListener('click', function () {\n      self.scopeStyle = id;\n      self.visibleLimit = DISPLAY_STEP;\n      self.markMeaningfulBrowsing();\n      self.emit('tc_scope_changed', { field: 'style', value: id || 'all' });\n      self.syncUrl();\n      self.render();\n    });\n    return button;\n  };\n\n  TemplateCollectionController.prototype.scopeChip = function (handle, name, count) {\n    var self = this;\n    var button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'bg-tc__scope-chip';\n    button.setAttribute('data-bg-tc-focus-key', 'scope:product:' + (handle || 'all'));\n    button.setAttribute('aria-pressed', this.scopeProduct === handle ? 'true' : 'false');\n    var chipName = document.createElement('span');\n    chipName.className = 'bg-tc__scope-chip-name';\n    chipName.textContent = name;\n    button.appendChild(chipName);\n    button.appendChild(document.createTextNode(' '));\n    var small = document.createElement('small');\n    small.textContent = '(' + count + ')';\n    button.appendChild(small);\n    button.addEventListener('click', function () {\n      self.applyProductScope(handle);\n    });\n    return button;\n  };\n\n  // TC-RESCUE-01 placement semantics. 'both' and 'after_first_results' keep\n  // their historical meaning for admin overrides. 'bottom' shows only the\n  // bottom block during successful browsing. 'after_meaningful_browsing'\n  // keeps the bottom block and reveals the mid-page block only once the\n  // customer has meaningfully browsed (see the threshold definition on the\n  // meaningfulBrowsing latch). A zero-result state offers the mid-page\n  // rescue immediately on every placement except 'hidden'.\n  TemplateCollectionController.prototype.renderRescuePlacement = function (filtered) {\n    var placement = this.experience && this.experience.rescuePlacement || 'both';\n    var resultCount = this.serverMode\n      ? (this.queryLoading || this.queryError\n        ? 1\n        : this.serverMeta ? this.serverMeta.total : 1)\n      : filtered\n        ? filtered.length\n        : this.experience ? this.filteredItems().length : 1;\n    var empty = resultCount === 0;\n    var meaningful = this.meaningfulBrowsing;\n    this.els.rescues.forEach(function (rescue) {\n      var position = rescue.getAttribute('data-bg-tc-rescue');\n      var hiddenByPlacement;\n      if (placement === 'hidden') {\n        hiddenByPlacement = true;\n      } else if (position === 'bottom') {\n        hiddenByPlacement = placement === 'after_first_results';\n      } else if (empty) {\n        hiddenByPlacement = false;\n      } else {\n        hiddenByPlacement = placement === 'bottom'\n          || (placement === 'after_meaningful_browsing' && !meaningful);\n      }\n      rescue.hidden = rescue.getAttribute('data-bg-tc-rescue-available') === 'false' || hiddenByPlacement;\n    });\n  };\n\n  TemplateCollectionController.prototype.productSupportsRescue = function (product, mode) {\n    if (!product || !mode) return false;\n    var binding = product.designerProductBinding && typeof product.designerProductBinding === 'object'\n      ? product.designerProductBinding\n      : {};\n    var config = product.artworkSection && typeof product.artworkSection === 'object'\n      ? product.artworkSection\n      : product.artworkSectionConfig && typeof product.artworkSectionConfig === 'object'\n        ? product.artworkSectionConfig\n        : binding.artworkSection && typeof binding.artworkSection === 'object'\n          ? binding.artworkSection\n          : {};\n    var modes = new Set(list(binding.allowedArtworkModes).map(function (value) {\n      return normalizedText(value).replace(/\\s+/g, '');\n    }));\n    var showHaveDesign = bool(config.showHaveDesign) !== false;\n    var showNeedDesign = bool(config.showNeedDesign) !== false;\n    if (mode === 'uploadfiles') {\n      return modes.has('uploadfiles') && showHaveDesign && bool(config.showUploadFiles) !== false;\n    }\n    if (mode === 'uploadcanva') {\n      return modes.has('uploadcanva') && showHaveDesign && bool(config.showShareCanva) !== false;\n    }\n    if (mode === 'reorder') {\n      return showHaveDesign && (modes.has('reorder') || bool(config.showReorder) === true);\n    }\n    if (mode === 'customdesign') {\n      return showNeedDesign\n        && bool(config.showCustomDesign) !== false\n        && (modes.has('customdesign') || number(product.customDesignCost, 0) > 0);\n    }\n    return false;\n  };\n\n  TemplateCollectionController.prototype.rescueProducts = function (mode) {\n    var self = this;\n    function entries(items) {\n      return self.productsWithCounts(items).map(function (entry) {\n        return { handle: entry.handle, product: self.productsByHandle.get(entry.handle), count: entry.count };\n      }).filter(function (entry) {\n        return !!entry.product && self.productSupportsRescue(entry.product, mode);\n      });\n    }\n    if (this.experience && this.experience.preset === 'product_specific') {\n      var mainHandle = asText(this.mapping && this.mapping.productHandle).toLowerCase();\n      var mainProduct = mainHandle ? this.productsByHandle.get(mainHandle) : null;\n      if (!mainProduct || !this.productSupportsRescue(mainProduct, mode)) return [];\n      var mainCount = this.serverMode && this.serverMeta\n        ? this.serverMeta.catalogTotal\n        : this.items.filter(function (item) { return productHandle(item) === mainHandle; }).length;\n      return [{ handle: mainHandle, product: mainProduct, count: mainCount }];\n    }\n    if (this.serverMode) {\n      // Server mode: the current query's product counts first (respecting an\n      // active product scope), then the catalog-wide counts as the empty-\n      // result fallback \u2014 the same shapes the full-load path computes.\n      var scopeCounts = this.serverMeta && this.serverMeta.scopeCounts ? this.serverMeta.scopeCounts : {};\n      var fromCounts = function (countEntries, applyScope) {\n        var mapped = [];\n        (Array.isArray(countEntries) ? countEntries : []).forEach(function (entry) {\n          var handle = asText(entry && entry.handle).toLowerCase();\n          var product = handle ? self.productsByHandle.get(handle) : null;\n          if (!product || !self.productSupportsRescue(product, mode)) return;\n          if (applyScope && self.scopeProduct && handle !== self.scopeProduct) return;\n          mapped.push({ handle: handle, name: productName(product) || handle, product: product, count: Math.max(0, number(entry.count, 0)) });\n        });\n        return mapped.sort(function (a, b) { return a.name.localeCompare(b.name); });\n      };\n      var queryProducts = fromCounts(scopeCounts.products, true).filter(function (entry) { return entry.count > 0; });\n      return queryProducts.length ? queryProducts : fromCounts(scopeCounts.catalogProducts, false);\n    }\n    var products = entries(this.filteredItems());\n    return products.length ? products : entries(this.items);\n  };\n\n  TemplateCollectionController.prototype.renderRescueAvailability = function () {\n    var self = this;\n    this.els.rescues.forEach(function (rescue) {\n      var available = false;\n      rescue.querySelectorAll('[data-bg-tc-rescue-action]').forEach(function (button) {\n        var supported = self.rescueProducts(button.getAttribute('data-bg-tc-rescue-action')).length > 0;\n        button.hidden = !supported;\n        button.disabled = !supported;\n        if (supported) available = true;\n      });\n      rescue.setAttribute('data-bg-tc-rescue-available', available ? 'true' : 'false');\n    });\n  };\n\n  TemplateCollectionController.prototype.productsWithCounts = function (items) {\n    var self = this;\n    var counts = new Map();\n    (items || []).forEach(function (item) {\n      var handle = productHandle(item);\n      if (!handle || !self.productsByHandle.has(handle)) return;\n      counts.set(handle, (counts.get(handle) || 0) + 1);\n    });\n    return Array.from(counts.keys()).map(function (handle) {\n      return { handle: handle, name: productName(self.productsByHandle.get(handle)) || handle, count: counts.get(handle) };\n    }).sort(function (a, b) { return a.name.localeCompare(b.name); });\n  };\n\n  TemplateCollectionController.prototype.scopeProductCounts = function (items) {\n    if (this.serverMode) return this.serverScopeProductEntries();\n    var entries = this.productsWithCounts(items);\n    if (this.scopeProduct && !entries.some(function (entry) { return entry.handle === this.scopeProduct; }, this)) {\n      var product = this.productsByHandle.get(this.scopeProduct);\n      if (product) entries.push({ handle: this.scopeProduct, name: productName(product) || this.scopeProduct, count: 0 });\n    }\n    return entries.sort(function (a, b) { return a.name.localeCompare(b.name); });\n  };\n\n  TemplateCollectionController.prototype.scopeIndustryCounts = function (items) {\n    if (this.serverMode) return this.serverScopeIndustryEntries();\n    var entries = this.valueCounts(items, 'industry');\n    if (this.scopeIndustry) {\n      var selected = normalizedText(this.scopeIndustry);\n      if (!entries.some(function (entry) { return normalizedText(entry.value) === selected; })) {\n        entries.push({ value: this.scopeIndustry, count: 0 });\n      }\n    }\n    return entries.sort(function (a, b) { return a.value.localeCompare(b.value); });\n  };\n\n  // Server-mode scope entries mirror the client-computed shapes exactly: the\n  // server counts skip the scope's own narrowing (like the skipScope lanes)\n  // and the selected value is kept visible with a zero count.\n  TemplateCollectionController.prototype.serverScopeProductEntries = function () {\n    var self = this;\n    var counts = this.serverMeta && this.serverMeta.scopeCounts && Array.isArray(this.serverMeta.scopeCounts.products)\n      ? this.serverMeta.scopeCounts.products\n      : [];\n    var entries = [];\n    counts.forEach(function (entry) {\n      var handle = asText(entry && entry.handle).toLowerCase();\n      if (!handle || !self.productsByHandle.has(handle)) return;\n      entries.push({\n        handle: handle,\n        name: productName(self.productsByHandle.get(handle)) || handle,\n        count: Math.max(0, number(entry.count, 0))\n      });\n    });\n    if (this.scopeProduct && !entries.some(function (entry) { return entry.handle === this.scopeProduct; }, this)) {\n      var product = this.productsByHandle.get(this.scopeProduct);\n      if (product) entries.push({ handle: this.scopeProduct, name: productName(product) || this.scopeProduct, count: 0 });\n    }\n    return entries.sort(function (a, b) { return a.name.localeCompare(b.name); });\n  };\n\n  TemplateCollectionController.prototype.serverScopeIndustryEntries = function () {\n    var counts = this.serverMeta && this.serverMeta.scopeCounts && Array.isArray(this.serverMeta.scopeCounts.industries)\n      ? this.serverMeta.scopeCounts.industries\n      : [];\n    var entries = counts.filter(function (entry) {\n      return entry && typeof entry === 'object' && asText(entry.value);\n    }).map(function (entry) {\n      return { value: asText(entry.value), count: Math.max(0, number(entry.count, 0)) };\n    });\n    if (this.scopeIndustry) {\n      var selected = normalizedText(this.scopeIndustry);\n      if (!entries.some(function (entry) { return normalizedText(entry.value) === selected; })) {\n        entries.push({ value: this.scopeIndustry, count: 0 });\n      }\n    }\n    return entries.sort(function (a, b) { return a.value.localeCompare(b.value); });\n  };\n\n  TemplateCollectionController.prototype.valueCounts = function (items, field) {\n    var counts = new Map();\n    (items || []).forEach(function (item) {\n      itemValues(item, field).forEach(function (value) {\n        var key = normalizedText(value);\n        if (!key) return;\n        var current = counts.get(key) || { value: value, count: 0 };\n        current.count += 1;\n        counts.set(key, current);\n      });\n    });\n    return Array.from(counts.values()).sort(function (a, b) { return a.value.localeCompare(b.value); });\n  };\n\n  TemplateCollectionController.prototype.cloneFilters = function (source) {\n    var next = new Map();\n    source.forEach(function (values, field) { next.set(field, new Set(Array.from(values))); });\n    return next;\n  };\n\n  TemplateCollectionController.prototype.activeFilterCount = function () {\n    var count = 0;\n    this.filters.forEach(function (values) { count += values.size; });\n    return count + (this.query ? 1 : 0);\n  };\n\n  TemplateCollectionController.prototype.applySearch = function (value) {\n    var next = asText(value);\n    if (next === this.query) return;\n    this.query = next;\n    this.visibleLimit = DISPLAY_STEP;\n    this.markMeaningfulBrowsing();\n    this.syncUrl();\n    var filtered = this.filteredItems();\n    this.emit('tc_search', { hasResults: filtered.length > 0 });\n    this.render();\n  };\n\n  TemplateCollectionController.prototype.matchesQuery = function (item) {\n    var query = normalizedText(this.query);\n    if (!query) return true;\n    var haystack = [\n      item && item.template_name,\n      item && item.designnum,\n      item && item.product,\n      item && item.category,\n      item && item.industry,\n      item && item.size,\n      item && item.style,\n      item && item.styles_themes,\n      item && item.color,\n      item && item.material,\n      item && item.tags\n    ].flatMap(list).join(' ');\n    return normalizedText(haystack).indexOf(query) !== -1;\n  };\n\n  TemplateCollectionController.prototype.matchesScope = function (item, skipScope) {\n    if (skipScope !== 'product' && this.scopeProduct && productHandle(item) !== this.scopeProduct) return false;\n    if (skipScope !== 'industry' && this.scopeIndustry) {\n      var wantedIndustry = normalizedText(this.scopeIndustry);\n      if (!itemValues(item, 'industry').some(function (value) { return normalizedText(value) === wantedIndustry; })) return false;\n    }\n    if (skipScope !== 'style' && this.scopeStyle) {\n      var scope = this.findStyleScope(this.scopeStyle);\n      // All Styles is the default and scope never gates browsing: an\n      // unresolved or unknown style value narrows nothing.\n      if (scope) {\n        var families = designFamilyHandles(item);\n        if (!scope.families.some(function (family) { return families.indexOf(family) !== -1; })) return false;\n      }\n    }\n    return true;\n  };\n\n  TemplateCollectionController.prototype.matchesFilters = function (item, skipField, source) {\n    var filters = source || this.filters;\n    var matches = true;\n    filters.forEach(function (wanted, field) {\n      if (!matches || field === skipField || !wanted.size) return;\n      var available = new Set(itemValues(item, field).map(normalizedText));\n      matches = Array.from(wanted).some(function (value) { return available.has(normalizedText(value)); });\n    });\n    return matches;\n  };\n\n  TemplateCollectionController.prototype.filteredItems = function (options) {\n    var self = this;\n    var opts = options || {};\n    // Server mode: items are already the server-filtered, server-sorted pages\n    // of the current query; re-filtering locally would be a no-op and count\n    // consumers read serverMeta instead of skip-variants.\n    if (this.serverMode) return this.items.slice();\n    var sourceFilters = opts.filters || this.filters;\n    var filtered = this.items.filter(function (item) {\n      return self.matchesQuery(item)\n        && self.matchesScope(item, opts.skipScope)\n        && self.matchesFilters(item, opts.skipField, sourceFilters);\n    });\n    return this.sortItems(filtered);\n  };\n\n  TemplateCollectionController.prototype.sortItems = function (items) {\n    var next = items.map(function (item, index) { return { item: item, index: index }; });\n    if (this.sort === 'newest') {\n      next.sort(function (a, b) {\n        var bDate = Date.parse(asText(b.item.created_at || b.item.createdAt || b.item.published_at || b.item.updated_at)) || number(b.item.id, 0);\n        var aDate = Date.parse(asText(a.item.created_at || a.item.createdAt || a.item.published_at || a.item.updated_at)) || number(a.item.id, 0);\n        return bDate - aDate || a.index - b.index;\n      });\n    } else {\n      next.sort(function (a, b) {\n        var bPopularity = number(b.item.popularity || b.item.most_popular || b.item.total_sales || b.item.views, 0);\n        var aPopularity = number(a.item.popularity || a.item.most_popular || a.item.total_sales || a.item.views, 0);\n        return bPopularity - aPopularity || a.index - b.index;\n      });\n    }\n    return next.map(function (entry) { return entry.item; });\n  };\n\n  TemplateCollectionController.prototype.render = function () {\n    if (!this.experience) return;\n    // Server mode: make sure the loaded data matches the current query state\n    // before painting; while a query fetch is pending the previous cards stay\n    // visible under an explicit busy state (never silently stale).\n    var queryReady = this.ensureQueryData();\n    if (queryReady) this.maybeFetchMoreForVisibleLimit();\n    var filtered = this.filteredItems();\n    this.renderScope();\n    this.renderFacets();\n    this.renderChips();\n    this.renderCards(filtered);\n    this.renderCounts(filtered);\n    this.renderLoadMore(filtered);\n    this.renderEmptyState(filtered);\n    this.renderRescueAvailability();\n    this.renderRescuePlacement(filtered);\n    this.els.grid.setAttribute('aria-busy', this.serverMode && (this.queryLoading || this.loadingMorePage) ? 'true' : 'false');\n    this.els.laterError.hidden = this.serverMode\n      ? this.failedQueryOffset === -1\n      : this.failedOffsets.length === 0;\n    this.scheduleReturnRestore();\n  };\n\n  TemplateCollectionController.prototype.availableFacets = function (filterSource) {\n    var self = this;\n    if (this.serverMode) return this.serverFacets(filterSource);\n    return (this.experience.visibleFilters || []).map(function (field) {\n      var source = self.filteredItems({ skipField: field, filters: filterSource || self.filters });\n      return { field: field, values: self.valueCounts(source, field) };\n    }).filter(function (facet) { return facet.values.length >= 2; });\n  };\n\n  // Server-mode facets come from the server's skip-field value counts for the\n  // relevant filter set: the applied filters ride the current query's meta;\n  // the mobile sheet's PENDING filters ride a debounced counts-only request.\n  TemplateCollectionController.prototype.serverFacets = function (filterSource) {\n    var meta = this.serverMeta;\n    if (filterSource && filterSource !== this.filters\n      && this.queryStateKey(filterSource) !== this.loadedQueryKey) {\n      var pending = this.pendingSheetMeta;\n      if (pending && pending.key === this.queryStateKey(filterSource)) meta = pending;\n      else this.schedulePendingSheetCounts(filterSource);\n    }\n    var facets = meta && meta.facets && typeof meta.facets === 'object' ? meta.facets : {};\n    return (this.experience.visibleFilters || []).map(function (field) {\n      var values = Array.isArray(facets[field]) ? facets[field] : [];\n      return {\n        field: field,\n        values: values.filter(function (entry) {\n          return entry && typeof entry === 'object' && asText(entry.value);\n        }).map(function (entry) {\n          return { value: asText(entry.value), count: Math.max(0, number(entry.count, 0)) };\n        })\n      };\n    }).filter(function (facet) { return facet.values.length >= 2; });\n  };\n\n  // Debounced counts-only lookup for the mobile filter sheet's pending\n  // combination (server mode): same endpoint, limit=0, stale responses\n  // ignored via key comparison.\n  TemplateCollectionController.prototype.schedulePendingSheetCounts = function (filterSource) {\n    var self = this;\n    var key = this.queryStateKey(filterSource);\n    if (this.pendingSheetMeta && this.pendingSheetMeta.key === key) return;\n    if (this.pendingSheetRequestedKey === key) return;\n    window.clearTimeout(this.pendingSheetTimer);\n    var filtersCopy = this.cloneFilters(filterSource);\n    this.pendingSheetTimer = window.setTimeout(function () {\n      self.pendingSheetRequestedKey = key;\n      self.fetchPayload(0, false, {\n        snapshot: self.buildQuerySnapshot({ filters: filtersCopy }),\n        countsOnly: true\n      }).then(function (payload) {\n        if (payload.queryMode !== true) return;\n        self.pendingSheetMeta = {\n          key: key,\n          total: Math.max(0, number(payload.total, 0)),\n          facets: payload.facets && typeof payload.facets === 'object' ? payload.facets : {}\n        };\n        if (self.pendingSheetRequestedKey === key) self.pendingSheetRequestedKey = '';\n        if (self.openOverlay === 'filters') self.renderFilterSheet();\n      }).catch(function () {\n        if (self.pendingSheetRequestedKey === key) self.pendingSheetRequestedKey = '';\n      });\n    }, 250);\n  };\n\n  TemplateCollectionController.prototype.renderFacets = function () {\n    var self = this;\n    var facets = this.availableFacets();\n    var restoreKey = this.focusKey(this.els.facets);\n    this.els.facets.innerHTML = '';\n    facets.forEach(function (facet) {\n      var definition = FILTER_DEFINITIONS[facet.field];\n      var menu = document.createElement('div');\n      menu.className = 'bg-tc__facet-menu';\n      menu.setAttribute('data-bg-tc-facet-menu', facet.field);\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'bg-tc__facet-button';\n      button.setAttribute('data-bg-tc-facet-button', facet.field);\n      button.setAttribute('data-bg-tc-focus-key', 'facet-button:' + facet.field);\n      button.setAttribute('aria-haspopup', 'true');\n      button.setAttribute('aria-expanded', self.openFacetField === facet.field ? 'true' : 'false');\n      var popoverId = 'BgTcFacet-' + self.instanceId + '-' + facet.field;\n      button.setAttribute('aria-controls', popoverId);\n      var active = self.filters.get(facet.field) || new Set();\n      button.textContent = definition.label + ': ' + (active.size === 0\n        ? 'Any'\n        : active.size === 1\n          ? Array.from(active)[0]\n          : active.size + ' selected');\n      var popover = document.createElement('div');\n      popover.id = popoverId;\n      popover.className = 'bg-tc__facet-popover';\n      popover.setAttribute('role', 'group');\n      popover.setAttribute('aria-label', definition.label + ' filters');\n      popover.hidden = self.openFacetField !== facet.field;\n      facet.values.forEach(function (entry) {\n        var label = document.createElement('label');\n        label.className = 'bg-tc__facet-option';\n        var input = document.createElement('input');\n        input.type = 'checkbox';\n        input.value = entry.value;\n        var inputFocusKey = 'facet:' + facet.field + ':' + normalizedText(entry.value);\n        input.setAttribute('data-bg-tc-focus-key', inputFocusKey);\n        input.checked = active.has(entry.value);\n        var text = document.createElement('span');\n        text.textContent = entry.value;\n        var count = document.createElement('small');\n        count.textContent = String(entry.count);\n        input.addEventListener('change', function () {\n          var values = self.filters.get(facet.field) || new Set();\n          if (input.checked) values.add(entry.value);\n          else values.delete(entry.value);\n          if (values.size) self.filters.set(facet.field, values);\n          else self.filters.delete(facet.field);\n          self.openFacetField = facet.field;\n          self.visibleLimit = DISPLAY_STEP;\n          self.markMeaningfulBrowsing();\n          self.emit('tc_filter_changed', { field: facet.field, added: input.checked });\n          self.syncUrl();\n          self.render();\n          self.restoreFocusKey(self.els.facets, inputFocusKey, self.els.facets.querySelector('[data-bg-tc-facet-button=\"' + facet.field + '\"]'));\n        });\n        label.append(input, text, count);\n        popover.appendChild(label);\n      });\n      var clear = document.createElement('button');\n      clear.type = 'button';\n      clear.className = 'bg-tc__facet-clear';\n      clear.textContent = 'Clear ' + definition.label.toLowerCase();\n      clear.disabled = active.size === 0;\n      clear.addEventListener('click', function () {\n        self.filters.delete(facet.field);\n        self.openFacetField = facet.field;\n        self.visibleLimit = DISPLAY_STEP;\n        self.markMeaningfulBrowsing();\n        self.emit('tc_filter_changed', { field: facet.field, added: false });\n        self.syncUrl();\n        self.render();\n        var replacement = self.els.facets.querySelector('[data-bg-tc-facet-button=\"' + facet.field + '\"]');\n        if (replacement) replacement.focus();\n      });\n      popover.appendChild(clear);\n      button.addEventListener('click', function () {\n        if (self.openFacetField === facet.field) {\n          self.closeFacetMenu(false);\n          return;\n        }\n        self.closeFacetMenu(false);\n        self.openFacetField = facet.field;\n        button.setAttribute('aria-expanded', 'true');\n        popover.hidden = false;\n      });\n      menu.append(button, popover);\n      self.els.facets.appendChild(menu);\n    });\n    if (this.openFacetField && !this.els.facets.querySelector('[data-bg-tc-facet-menu=\"' + this.openFacetField + '\"]')) {\n      this.openFacetField = '';\n    }\n    this.restoreFocusKey(this.els.facets, restoreKey);\n    this.els.filtersOpen.hidden = facets.length === 0;\n    var filterCount = this.activeFilterCount();\n    this.els.filtersCount.hidden = filterCount === 0;\n    this.els.filtersCount.textContent = String(filterCount);\n  };\n\n  TemplateCollectionController.prototype.closeFacetMenu = function (returnFocus) {\n    var field = this.openFacetField;\n    if (!field) return;\n    var button = this.els.facets.querySelector('[data-bg-tc-facet-button=\"' + field + '\"]');\n    var popover = this.els.facets.querySelector('[data-bg-tc-facet-menu=\"' + field + '\"] .bg-tc__facet-popover');\n    this.openFacetField = '';\n    if (button) button.setAttribute('aria-expanded', 'false');\n    if (popover) popover.hidden = true;\n    if (returnFocus && button) button.focus();\n  };\n\n  TemplateCollectionController.prototype.handleFacetKeydown = function (event) {\n    if (!this.openFacetField || event.key !== 'Escape') return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.closeFacetMenu(true);\n  };\n\n  TemplateCollectionController.prototype.renderChips = function () {\n    var self = this;\n    var chips = this.els.chips;\n    chips.innerHTML = '';\n    function addChip(label, aria, remove) {\n      var chip = document.createElement('span');\n      chip.className = 'bg-tc__chip';\n      chip.appendChild(document.createTextNode(label));\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.setAttribute('aria-label', aria);\n      button.textContent = '\u00D7';\n      button.addEventListener('click', remove);\n      chip.appendChild(button);\n      chips.appendChild(chip);\n    }\n    if (this.query) {\n      addChip('\u201C' + this.query + '\u201D', 'Remove search term', function () {\n        self.query = '';\n        self.els.search.value = '';\n        self.visibleLimit = DISPLAY_STEP;\n        self.syncUrl();\n        self.render();\n      });\n    }\n    this.filters.forEach(function (values, field) {\n      values.forEach(function (value) {\n        addChip(value, 'Remove ' + FILTER_DEFINITIONS[field].label.toLowerCase() + ' filter ' + value, function () {\n          var current = self.filters.get(field);\n          if (current) current.delete(value);\n          if (!current || !current.size) self.filters.delete(field);\n          self.visibleLimit = DISPLAY_STEP;\n          self.markMeaningfulBrowsing();\n          self.emit('tc_filter_changed', { field: field, added: false });\n          self.syncUrl();\n          self.render();\n        });\n      });\n    });\n    if (this.query || this.filters.size) {\n      var clear = document.createElement('button');\n      clear.type = 'button';\n      clear.className = 'bg-tc__clear-all';\n      clear.textContent = 'Clear all';\n      clear.addEventListener('click', function () { self.clearSearchAndFilters(); });\n      chips.appendChild(clear);\n    }\n  };\n\n  TemplateCollectionController.prototype.clearSearchAndFilters = function () {\n    this.query = '';\n    this.filters = new Map();\n    this.els.search.value = '';\n    this.visibleLimit = DISPLAY_STEP;\n    this.markMeaningfulBrowsing();\n    this.syncUrl();\n    this.render();\n  };\n\n  TemplateCollectionController.prototype.renderCards = function (filtered) {\n    var self = this;\n    var shown = filtered.slice(0, this.visibleLimit);\n    this.els.grid.innerHTML = '';\n    var visibleProductCount = this.productsWithCounts(filtered).length;\n    var showStyleBadges = this.viewMixesStyles(filtered);\n    shown.forEach(function (item, index) {\n      var listItem = document.createElement('li');\n      var card = document.createElement('button');\n      card.type = 'button';\n      card.className = 'bg-tc__card';\n      var key = designKey(item);\n      card.setAttribute('data-design-key', key);\n      card.setAttribute('data-bg-tc-focus-key', 'card:' + key);\n      if (key && key === self.returnViewedDesignKey) {\n        card.classList.add('is-viewed');\n        card.setAttribute('aria-current', 'true');\n      }\n      var name = designName(item, index);\n      card.setAttribute('aria-label', 'View details for ' + name);\n\n      var media = document.createElement('span');\n      media.className = 'bg-tc__card-media';\n      var preview = designPreviews(item)[0];\n      if (preview) {\n        var image = document.createElement('img');\n        image.src = preview;\n        image.alt = '';\n        image.loading = 'lazy';\n        media.appendChild(image);\n      } else {\n        var fallback = document.createElement('span');\n        fallback.className = 'bg-tc__card-name';\n        fallback.textContent = name;\n        media.appendChild(fallback);\n      }\n      var badges = self.cardBadges(item).map(function (badge) {\n        return { text: badge, kind: badge === 'New' ? 'new' : '' };\n      });\n      if (showStyleBadges) {\n        // TC-YARD-02: the style badge appears only while the current view\n        // mixes styles; it carries the customer-facing style name, never a\n        // source handle. Multi-style templates truthfully show each style.\n        self.styleScopesForItem(item).forEach(function (scope) {\n          badges.push({ text: scope.label, kind: 'style' });\n        });\n      }\n      if (badges.length) {\n        var badgeRow = document.createElement('span');\n        badgeRow.className = 'bg-tc__card-badges';\n        badges.forEach(function (badge) {\n          var badgeEl = document.createElement('span');\n          badgeEl.className = 'bg-tc__card-badge' + (badge.kind ? ' bg-tc__card-badge--' + badge.kind : '');\n          badgeEl.textContent = badge.text;\n          badgeRow.appendChild(badgeEl);\n        });\n        media.appendChild(badgeRow);\n      }\n\n      var body = document.createElement('span');\n      body.className = 'bg-tc__card-body';\n      var strong = document.createElement('strong');\n      strong.className = 'bg-tc__card-name';\n      strong.textContent = name;\n      body.appendChild(strong);\n      var fields = self.experience.cardFields || ['name'];\n      var product = self.productsByHandle.get(productHandle(item));\n      var showProduct = fields.indexOf('product') !== -1\n        && product\n        && (self.experience.preset === 'all_templates' || visibleProductCount > 1);\n      if (showProduct) {\n        var productLabel = document.createElement('span');\n        productLabel.className = 'bg-tc__card-product';\n        productLabel.textContent = productName(product);\n        body.appendChild(productLabel);\n      }\n      var metaParts = [];\n      if (fields.indexOf('size_or_format') !== -1) {\n        var size = actualDesignSizeValues(item)[0] || asText(item.format || item.shape);\n        var relatedSizes = unique(self.relatedDesigns(item).flatMap(actualDesignSizeValues));\n        if (size && (self.experience.preset === 'all_templates' || relatedSizes.length > 1)) metaParts.push(size);\n      }\n      if (fields.indexOf('front_and_back') !== -1 && designPreviews(item).length > 1) metaParts.push('Front & back');\n      if (metaParts.length) {\n        var meta = document.createElement('span');\n        meta.className = 'bg-tc__card-meta';\n        meta.textContent = metaParts.join(' \u00B7 ');\n        body.appendChild(meta);\n      }\n      if (key && key === self.returnViewedDesignKey) {\n        var viewed = document.createElement('span');\n        viewed.className = 'bg-tc__card-viewed';\n        viewed.textContent = 'Viewed just now';\n        body.appendChild(viewed);\n      }\n      card.append(media, body);\n      card.addEventListener('click', function () { self.openDetail(item, card); });\n      listItem.appendChild(card);\n      self.els.grid.appendChild(listItem);\n    });\n    this.els.grid.hidden = shown.length === 0;\n    this.els.grid.setAttribute('aria-busy', this.loadingRemainder ? 'true' : 'false');\n    this.els.grid.setAttribute('aria-label', shown.length + ' designs shown');\n  };\n\n  // Badges differentiate only when the visible result set actually spans more\n  // than one style (or mixes styled and unstyled templates). A single-style\n  // view \u2014 including a narrowed style scope \u2014 needs no badge.\n  TemplateCollectionController.prototype.viewMixesStyles = function (filtered) {\n    if (!this.styleScopeActive()) return false;\n    var self = this;\n    var labels = new Set();\n    var hasUnstyled = false;\n    (filtered || []).forEach(function (item) {\n      var scopes = self.styleScopesForItem(item);\n      if (!scopes.length) {\n        hasUnstyled = true;\n        return;\n      }\n      scopes.forEach(function (scope) { labels.add(scope.id); });\n    });\n    return labels.size >= 2 || (labels.size >= 1 && hasUnstyled);\n  };\n\n  TemplateCollectionController.prototype.cardBadges = function (item) {\n    var badges = [];\n    var tags = list(item && item.tags).map(normalizedText);\n    var isNew = bool(item && (item.is_new || item.new_release)) === true || tags.indexOf('new') !== -1 || tags.indexOf('new release') !== -1;\n    var free = bool(item && item.free_personalization) === true || tags.indexOf('free personalization') !== -1;\n    if (isNew) badges.push('New');\n    if (free) badges.push('Free personalization');\n    return badges;\n  };\n\n  TemplateCollectionController.prototype.renderCounts = function (filtered) {\n    if (this.serverMode) {\n      this.renderServerCounts(filtered);\n      return;\n    }\n    var total = this.complete ? this.items.length : Math.max(this.total, this.items.length);\n    var shown = Math.min(this.visibleLimit, filtered.length);\n    var metaTotal = total || number(this.config.cachedCount, 0);\n    var self = this;\n    var scopedTotal = this.scopeProduct || this.scopeIndustry || (this.scopeStyle && this.findStyleScope(this.scopeStyle))\n      ? this.items.filter(function (item) { return self.matchesScope(item); }).length\n      : metaTotal;\n    this.els.meta.textContent = metaTotal\n      ? metaTotal + ' designs \u00B7 personalized free \u00B7 proof before print'\n      : 'Loading designs\u2026';\n    if (this.loadingRemainder) {\n      this.els.count.textContent = filtered.length + ' matching designs loaded \u00B7 loading more\u2026';\n      return;\n    }\n    this.els.count.textContent = filtered.length === this.items.length\n      ? filtered.length + ' designs'\n      : filtered.length + ' of ' + this.items.length + ' designs';\n    if (!this.complete && this.failedOffsets.length) {\n      this.els.count.textContent += ' \u00B7 more may be available';\n    }\n    this.els.search.placeholder = this.experience.preset === 'all_templates'\n      ? 'Search all ' + (scopedTotal || 0) + ' designs'\n      : 'Search ' + (scopedTotal || 0) + ' designs';\n    this.els.loadMoreMeta.textContent = shown + ' of ' + filtered.length + ' shown';\n  };\n\n  // Server-mode counts come from the server's authoritative totals for the\n  // current query, mirroring the copy the client-computed mode shows once a\n  // catalog is fully loaded (\"N designs\" / \"X of Y designs\").\n  TemplateCollectionController.prototype.renderServerCounts = function (filtered) {\n    var meta = this.serverMeta || { total: filtered.length, catalogTotal: filtered.length, scopedTotal: filtered.length };\n    var metaTotal = meta.catalogTotal || number(this.config.cachedCount, 0);\n    var shown = Math.min(this.visibleLimit, filtered.length);\n    this.els.meta.textContent = metaTotal\n      ? metaTotal + ' designs \u00B7 personalized free \u00B7 proof before print'\n      : 'Loading designs\u2026';\n    if (this.queryLoading) {\n      this.els.count.textContent = 'Updating designs\u2026';\n      return;\n    }\n    if (this.queryError) {\n      this.els.count.textContent = 'Designs unavailable';\n      return;\n    }\n    this.els.count.textContent = meta.total === meta.catalogTotal\n      ? meta.total + ' designs'\n      : meta.total + ' of ' + meta.catalogTotal + ' designs';\n    var scopedTotal = this.scopeProduct || this.scopeIndustry || this.activeStyleFamilies().length\n      ? meta.scopedTotal\n      : meta.catalogTotal;\n    this.els.search.placeholder = this.experience.preset === 'all_templates'\n      ? 'Search all ' + (scopedTotal || 0) + ' designs'\n      : 'Search ' + (scopedTotal || 0) + ' designs';\n    this.els.loadMoreMeta.textContent = shown + ' of ' + meta.total + ' shown';\n  };\n\n  TemplateCollectionController.prototype.renderLoadMore = function (filtered) {\n    if (this.serverMode) {\n      var meta = this.serverMeta || { total: filtered.length };\n      var shownOnServer = Math.min(this.visibleLimit, filtered.length);\n      this.els.loadMore.hidden = this.queryLoading || this.queryError || shownOnServer >= meta.total;\n      this.els.loadMore.disabled = this.loadingMorePage;\n      this.els.loadMore.setAttribute('aria-busy', this.loadingMorePage ? 'true' : 'false');\n      this.els.loadMoreMeta.textContent = shownOnServer + ' of ' + meta.total + ' shown';\n      return;\n    }\n    this.els.loadMore.disabled = false;\n    this.els.loadMore.setAttribute('aria-busy', 'false');\n    var shown = Math.min(this.visibleLimit, filtered.length);\n    this.els.loadMore.hidden = shown >= filtered.length;\n    this.els.loadMoreMeta.textContent = shown + ' of ' + filtered.length + ' shown';\n  };\n\n  TemplateCollectionController.prototype.renderEmptyState = function (filtered) {\n    var self = this;\n    // PERF-08: a failed query request renders a retryable error, never the\n    // empty state; the empty state is reserved for a server-confirmed zero.\n    if (this.serverMode && this.queryError) {\n      this.renderQueryErrorState();\n      return;\n    }\n    if (this.serverMode && this.queryLoading) {\n      this.els.state.innerHTML = '';\n      this.els.state.hidden = true;\n      return;\n    }\n    this.els.state.innerHTML = '';\n    this.els.state.hidden = filtered.length > 0;\n    if (filtered.length) return;\n    var cause = [];\n    if (this.query) cause.push('\u201C' + this.query + '\u201D');\n    this.filters.forEach(function (values) { cause = cause.concat(Array.from(values)); });\n    if (this.scopeProduct) cause.push(productName(this.productsByHandle.get(this.scopeProduct)) || this.scopeProduct);\n    if (this.scopeIndustry) cause.push(this.scopeIndustry);\n    var emptyStyleScope = this.findStyleScope(this.scopeStyle);\n    if (emptyStyleScope) cause.push(emptyStyleScope.label);\n    var state = document.createElement('div');\n    state.className = 'bg-tc__state';\n    state.setAttribute('role', 'status');\n    var title = document.createElement('strong');\n    title.textContent = cause.length\n      ? 'No designs match ' + cause.join(' at ')\n      : 'No designs are available for this page';\n    var copy = document.createElement('span');\n    copy.textContent = 'Try removing a filter or searching a broader term \u2014 or start from your own artwork below.';\n    var actions = document.createElement('div');\n    actions.className = 'bg-tc__state-actions';\n    var clear = document.createElement('button');\n    clear.type = 'button';\n    clear.className = 'primary';\n    clear.textContent = 'Clear filters';\n    clear.addEventListener('click', function () { self.clearSearchAndFilters(); });\n    var browse = document.createElement('button');\n    browse.type = 'button';\n    browse.className = 'quiet';\n    browse.textContent = 'Browse all '\n      + (this.serverMode && this.serverMeta ? this.serverMeta.catalogTotal : this.items.length)\n      + ' designs';\n    browse.addEventListener('click', function () {\n      self.scopeProduct = '';\n      self.scopeIndustry = '';\n      self.scopeStyle = '';\n      self.clearSearchAndFilters();\n    });\n    actions.append(clear, browse);\n    state.append(title, copy, actions);\n    this.els.state.appendChild(state);\n    this.emit('tc_state', { state: 'empty' });\n  };\n\n  TemplateCollectionController.prototype.urlForState = function () {\n    var url = new URL(window.location.href);\n    var params = new URLSearchParams(url.search);\n    ['q', 'product', 'industry', 'style', 'sort'].forEach(function (key) { params.delete(key); });\n    Array.from(params.keys()).forEach(function (key) {\n      if (key.indexOf('filter_') === 0) params.delete(key);\n    });\n    if (this.query) params.set('q', this.query);\n    if (this.scopeProduct) params.set('product', this.scopeProduct);\n    if (this.scopeIndustry) params.set('industry', this.scopeIndustry);\n    if (this.scopeStyle) params.set('style', this.scopeStyle);\n    if (this.sort === 'newest') params.set('sort', 'newest');\n    this.filters.forEach(function (values, field) {\n      if (values.size) params.set('filter_' + field, Array.from(values).join(','));\n    });\n    return url.pathname + (params.toString() ? '?' + params.toString() : '') + url.hash;\n  };\n\n  TemplateCollectionController.prototype.syncUrl = function () {\n    window.history.replaceState(window.history.state, '', this.urlForState());\n  };\n\n  TemplateCollectionController.prototype.openFilters = function () {\n    this.pendingFilters = this.cloneFilters(this.filters);\n    this.renderFilterSheet();\n    this.openOwnedOverlay('filters', this.els.filtersOpen, 'filters');\n  };\n\n  TemplateCollectionController.prototype.focusKey = function (container) {\n    var active = document.activeElement;\n    return active && container && container.contains(active)\n      ? asText(active.getAttribute('data-bg-tc-focus-key'))\n      : '';\n  };\n\n  TemplateCollectionController.prototype.restoreFocusKey = function (container, key, fallback) {\n    if (!container || !key) return false;\n    var target = Array.from(container.querySelectorAll('[data-bg-tc-focus-key]')).find(function (element) {\n      return element.getAttribute('data-bg-tc-focus-key') === key;\n    });\n    if (!target || !visibleFocusable(target)) target = fallback || null;\n    if (!target || typeof target.focus !== 'function') return false;\n    target.focus();\n    return true;\n  };\n\n  TemplateCollectionController.prototype.renderFilterSheet = function (focusKey) {\n    var self = this;\n    var body = this.els.filterBody;\n    var restoreKey = focusKey || this.focusKey(body);\n    body.innerHTML = '';\n    var facets = this.availableFacets(this.pendingFilters);\n    facets.forEach(function (facet) {\n      var group = document.createElement('div');\n      group.className = 'bg-tc-filtersheet__group';\n      var heading = document.createElement('strong');\n      heading.textContent = FILTER_DEFINITIONS[facet.field].label;\n      group.appendChild(heading);\n      facet.values.forEach(function (entry) {\n        var label = document.createElement('label');\n        label.className = 'bg-tc-filtersheet__option';\n        var input = document.createElement('input');\n        input.type = 'checkbox';\n        input.value = entry.value;\n        var inputFocusKey = 'filter:' + facet.field + ':' + normalizedText(entry.value);\n        input.setAttribute('data-bg-tc-focus-key', inputFocusKey);\n        input.checked = !!(self.pendingFilters.get(facet.field) && self.pendingFilters.get(facet.field).has(entry.value));\n        var text = document.createElement('span');\n        text.textContent = entry.value;\n        var count = document.createElement('small');\n        count.textContent = String(entry.count);\n        input.addEventListener('change', function () {\n          var values = self.pendingFilters.get(facet.field) || new Set();\n          if (input.checked) values.add(entry.value);\n          else values.delete(entry.value);\n          if (values.size) self.pendingFilters.set(facet.field, values);\n          else self.pendingFilters.delete(facet.field);\n          self.renderFilterSheet(inputFocusKey);\n        });\n        label.append(input, text, count);\n        group.appendChild(label);\n      });\n      body.appendChild(group);\n    });\n    var pendingCount;\n    if (this.serverMode) {\n      var pendingKey = this.queryStateKey(this.pendingFilters);\n      pendingCount = pendingKey === this.loadedQueryKey && this.serverMeta\n        ? this.serverMeta.total\n        : this.pendingSheetMeta && this.pendingSheetMeta.key === pendingKey\n          ? this.pendingSheetMeta.total\n          : null;\n    } else {\n      pendingCount = this.filteredItems({ filters: this.pendingFilters }).length;\n    }\n    this.els.filterApply.textContent = pendingCount === null\n      ? 'Show matching designs'\n      : 'Show ' + pendingCount + ' design' + (pendingCount === 1 ? '' : 's');\n    this.restoreFocusKey(body, restoreKey, restoreKey ? this.els.filterApply : null);\n  };\n\n  TemplateCollectionController.prototype.getBackgroundTargets = function () {\n    var targets = [];\n    var node = this.host;\n    if (this.root) targets.push(this.root);\n    while (node && node.parentElement && node.parentElement !== document.documentElement) {\n      Array.from(node.parentElement.children).forEach(function (sibling) {\n        if (sibling !== node && targets.indexOf(sibling) === -1) targets.push(sibling);\n      });\n      if (node.parentElement === document.body) break;\n      node = node.parentElement;\n    }\n    return targets;\n  };\n\n  TemplateCollectionController.prototype.inertBackground = function () {\n    this.backgroundStates = this.getBackgroundTargets().map(function (element) {\n      var state = {\n        element: element,\n        inert: element.hasAttribute('inert'),\n        ariaHidden: element.getAttribute('aria-hidden')\n      };\n      element.setAttribute('inert', '');\n      element.setAttribute('aria-hidden', 'true');\n      return state;\n    });\n    this.bodyHadOverlayClass = document.body.classList.contains('bg-tc-overlay-open');\n    document.body.classList.add('bg-tc-overlay-open');\n  };\n\n  TemplateCollectionController.prototype.restoreBackground = function () {\n    this.backgroundStates.forEach(function (state) {\n      if (!state.inert) state.element.removeAttribute('inert');\n      if (state.ariaHidden === null) state.element.removeAttribute('aria-hidden');\n      else state.element.setAttribute('aria-hidden', state.ariaHidden);\n    });\n    this.backgroundStates = [];\n    if (!this.bodyHadOverlayClass) document.body.classList.remove('bg-tc-overlay-open');\n  };\n\n  TemplateCollectionController.prototype.openOwnedOverlay = function (type, opener, stableKey) {\n    if (this.openOverlay) this.closeOverlayDirect(false);\n    this.pendingCloseUrl = '';\n    this.openOverlay = type;\n    this.overlayReturn = {\n      element: opener && opener instanceof window.HTMLElement ? opener : null,\n      stableKey: asText(stableKey)\n    };\n    var overlay = type === 'detail' ? this.els.detailOverlay : this.els.filterOverlay;\n    var dialog = type === 'detail' ? this.els.detailDialog : this.els.filterDialog;\n    overlay.hidden = false;\n    overlay.removeAttribute('inert');\n    overlay.setAttribute('aria-hidden', 'false');\n    this.inertBackground();\n    var state = Object.assign({}, window.history.state && typeof window.history.state === 'object' ? window.history.state : {});\n    state.bgTcOverlay = { owner: this.instanceId, type: type };\n    window.history.pushState(state, '', window.location.href);\n    var self = this;\n    window.requestAnimationFrame(function () { dialog.focus(); });\n    this.emit(type === 'detail' ? 'tc_detail_opened' : 'tc_filter_changed', type === 'detail'\n      ? { designKey: stableKey }\n      : { field: 'mobile_sheet', added: true });\n  };\n\n  TemplateCollectionController.prototype.requestOverlayClose = function (committedUrl) {\n    if (!this.openOverlay) return;\n    this.pendingCloseUrl = asText(committedUrl);\n    var marker = window.history.state && window.history.state.bgTcOverlay;\n    if (marker && marker.owner === this.instanceId) {\n      var self = this;\n      window.history.back();\n      window.clearTimeout(this.historyFallback);\n      this.historyFallback = window.setTimeout(function () {\n        if (!self.openOverlay) return;\n        window.history.replaceState(currentStateWithoutOverlay(), '', window.location.href);\n        self.closeOverlayDirect(false);\n      }, 450);\n      return;\n    }\n    this.closeOverlayDirect(false);\n  };\n\n  TemplateCollectionController.prototype.closeOverlayDirect = function (fromHistory, suppressFocus) {\n    if (!this.openOverlay) return;\n    window.clearTimeout(this.historyFallback);\n    var type = this.openOverlay;\n    // Slice 6: closing the sheet disposes the viewer fully; the next open of\n    // any design starts on 2D (design handoff sheet/closed).\n    if (type === 'detail' && this.sheetPreview3dOpen()) {\n      this.closeSheetPreview3d({ silent: true });\n      if (this.detail) this.detail.viewMode = '2d';\n    }\n    var committedUrl = this.pendingCloseUrl;\n    this.pendingCloseUrl = '';\n    var overlay = type === 'detail' ? this.els.detailOverlay : this.els.filterOverlay;\n    overlay.hidden = true;\n    overlay.setAttribute('inert', '');\n    overlay.setAttribute('aria-hidden', 'true');\n    this.openOverlay = null;\n    this.restoreBackground();\n    if (!fromHistory) {\n      var marker = window.history.state && window.history.state.bgTcOverlay;\n      if (marker && marker.owner === this.instanceId) {\n        window.history.replaceState(currentStateWithoutOverlay(), '', window.location.href);\n      }\n    }\n    if (committedUrl) {\n      window.history.replaceState(currentStateWithoutOverlay(), '', committedUrl);\n    }\n    var returnState = this.overlayReturn;\n    this.overlayReturn = null;\n    var target = returnState && returnState.element && returnState.element.isConnected\n      ? returnState.element\n      : null;\n    if (!target && returnState && returnState.stableKey) {\n      target = this.root.querySelector('[data-design-key=\"' + escapeSelector(returnState.stableKey) + '\"]');\n    }\n    if (!suppressFocus && target && typeof target.focus === 'function') {\n      window.requestAnimationFrame(function () { target.focus(); });\n    }\n  };\n\n  TemplateCollectionController.prototype.handleOverlayKeydown = function (event) {\n    if (!this.openOverlay) return;\n    // While the shared confirmation dialog is above the sheet it owns the\n    // keyboard: Escape cancels the CONFIRMATION (not the sheet) and Tab stays\n    // trapped inside it. This capture-phase handler must stand down or it\n    // would close the sheet underneath the open dialog (TC-DIALOG-01).\n    var confirmDialog = window.BgStorefrontConfirm;\n    if (confirmDialog && typeof confirmDialog.isOpen === 'function' && confirmDialog.isOpen()) return;\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      // Slice 6: Esc steps back one level \u2014 an open 3D view returns to Flat\n      // design (focus lands on the switch); the sheet itself closes on the\n      // next Esc. Device/browser Back still closes the whole sheet.\n      if (this.openOverlay === 'detail' && this.sheetPreview3dOpen()) {\n        if (this.detail) this.detail.viewMode = '2d';\n        this.closeSheetPreview3d({ announce: 'Closed 3D preview' });\n        this.renderDetailBody('view-mode:2d');\n        return;\n      }\n      this.requestOverlayClose();\n      return;\n    }\n    if (event.key !== 'Tab') return;\n    var dialog = this.openOverlay === 'detail' ? this.els.detailDialog : this.els.filterDialog;\n    var focusable = Array.from(dialog.querySelectorAll(FOCUSABLE_SELECTOR)).filter(visibleFocusable);\n    if (!focusable.length) {\n      event.preventDefault();\n      dialog.focus();\n      return;\n    }\n    var first = focusable[0];\n    var last = focusable[focusable.length - 1];\n    if (document.activeElement === dialog) {\n      event.preventDefault();\n      (event.shiftKey ? last : first).focus();\n    } else if (!dialog.contains(document.activeElement)) {\n      event.preventDefault();\n      first.focus();\n    } else 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  TemplateCollectionController.prototype.relatedDesigns = function (design) {\n    var key = designKey(design);\n    var suite = asText(design.design_suite);\n    var matches = [];\n    if (suite) {\n      matches = this.items.filter(function (candidate) {\n        return asText(candidate.design_suite) === suite;\n      });\n    } else {\n      var linked = new Set(list(\n        design['linked designs string']\n        || design.linked_designs\n        || design.linkedDesigns\n      ).map(asText));\n      if (key) linked.add(key);\n      if (linked.size) {\n        matches = this.items.filter(function (candidate) {\n          return linked.has(designKey(candidate));\n        });\n      }\n    }\n    return matches.length ? matches : [design];\n  };\n\n  TemplateCollectionController.prototype.compatibleProducts = function (design) {\n    var self = this;\n    var byHandle = new Map();\n    this.relatedDesigns(design).forEach(function (candidate) {\n      var handle = productHandle(candidate);\n      var product = self.productsByHandle.get(handle);\n      if (!handle || !product || byHandle.has(handle)) return;\n      var availability = self.designAvailabilityForProduct(candidate, product);\n      if (!availability.online && !availability.canEdit) return;\n      byHandle.set(handle, { handle: handle, product: product, design: candidate });\n    });\n    if (!byHandle.size) {\n      var handle = productHandle(design);\n      var product = this.productsByHandle.get(handle);\n      if (product) byHandle.set(handle, { handle: handle, product: product, design: design });\n    }\n    return Array.from(byHandle.values());\n  };\n\n  TemplateCollectionController.prototype.refreshOpenDetail = function () {\n    if (this.openOverlay !== 'detail' || !this.detail) return;\n    if (this.detail.mode === 'rescue') {\n      var rescueProducts = this.rescueProducts(this.detail.rescueMode);\n      this.detail.products = rescueProducts;\n      if (!rescueProducts.some(function (entry) { return entry.handle === this.detail.selectedProductHandle; }, this)) {\n        this.detail.selectedProductHandle = rescueProducts[0] && rescueProducts[0].handle || '';\n      }\n      this.renderRescueProductChooser();\n      return;\n    }\n    var detail = this.detail;\n    var original = this.items.find(function (item) {\n      return designKey(item) === detail.originalKey;\n    });\n    if (!original) {\n      detail.mode = 'unavailable';\n      detail.selectedDesign = null;\n      detail.selectedProductHandle = '';\n      detail.selectedBacker = '';\n      detail.products = [];\n      this.renderDetailBody();\n      return;\n    }\n    var selectedKey = designKey(detail.selectedDesign);\n    var selectedHandle = detail.selectedProductHandle;\n    detail.group = this.relatedDesigns(original);\n    detail.products = this.compatibleProducts(original);\n    var selected = detail.group.find(function (item) { return designKey(item) === selectedKey; })\n      || detail.products.find(function (entry) { return entry.handle === selectedHandle; })?.design\n      || detail.products[0]?.design\n      || original;\n    detail.selectedDesign = selected;\n    detail.selectedProductHandle = productHandle(selected) || detail.products[0] && detail.products[0].handle || '';\n    if (designKey(selected) !== selectedKey) {\n      detail.selectedBacker = '';\n      detail.previewSide = 'front';\n    } else if (detail.selectedBacker) {\n      var backers = Array.isArray(selected.backers) ? selected.backers : [];\n      if (!backers.some(function (backer) { return asText(backer && (backer.id || backer.label)) === detail.selectedBacker; })) {\n        detail.selectedBacker = '';\n      }\n    }\n    this.renderDetailBody();\n  };\n\n  // \u2500\u2500 Slice 6 sheet 3D lane \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  // Background (the surface behind the product): two or more offered \u2192 the\n  // Background select in the control row replaces the light/dark toggle; a\n  // single staff-chosen background shows neither; none \u2192 the toggle exactly\n  // as before. Both show only while the viewer is active.\n  TemplateCollectionController.prototype.syncSheetPreview3dBackdrops = function (environmentButton, snapshot) {\n    var body = this.els && this.els.detailBody;\n    var field = body ? body.querySelector('[data-bg-tc-3d-backdrop-field]') : null;\n    var select = body ? body.querySelector('[data-bg-tc-3d-backdrop-select]') : null;\n    var state = this.preview3d;\n    var active = !!state && (state.status === 'active' || snapshot && snapshot.updating);\n    var backdrops = snapshot && Array.isArray(snapshot.backdrops) ? snapshot.backdrops : [];\n    var activeId = asText(snapshot && snapshot.backdropId);\n    var chooser = backdrops.length > 1;\n    if (environmentButton) environmentButton.hidden = !active || chooser || Boolean(activeId);\n    if (!field || !select) return;\n    field.hidden = !active || !chooser;\n    if (!chooser) {\n      select.innerHTML = '';\n      select.removeAttribute('data-bg-tc-3d-backdrop-select-key');\n      return;\n    }\n    var key = backdrops.map(function (backdrop) { return asText(backdrop && backdrop.id); }).join('|');\n    if (select.getAttribute('data-bg-tc-3d-backdrop-select-key') !== key) {\n      select.setAttribute('data-bg-tc-3d-backdrop-select-key', key);\n      select.innerHTML = '';\n      backdrops.forEach(function (backdrop) {\n        var option = document.createElement('option');\n        option.value = asText(backdrop.id);\n        option.textContent = asText(backdrop.label) || asText(backdrop.id);\n        select.appendChild(option);\n      });\n    }\n    if (activeId && select.value !== activeId) select.value = activeId;\n  };\n\n  // The control row mirrors the viewer: the light/dark toggle label and the\n  // Background chooser (the Front | Back pressed state syncs on side change).\n  TemplateCollectionController.prototype.syncSheetPreview3dControls = function (snapshotInput) {\n    var state = this.preview3d;\n    var snapshot = snapshotInput || (state && state.viewer ? state.viewer.state : null);\n    var body = this.els && this.els.detailBody;\n    var active = !!state && (state.status === 'active' || snapshot && snapshot.updating);\n    var rotate = body ? body.querySelector('[data-bg-tc-auto-rotate]') : null;\n    var ground = body ? body.querySelector('[data-bg-tc-show-ground]') : null;\n    if (rotate) { rotate.hidden = !active || snapshot && snapshot.viewMode === '2d'; rotate.setAttribute('aria-checked', snapshot && snapshot.autoRotate ? 'true' : 'false'); }\n    if (ground) { ground.hidden = !active || !(snapshot && snapshot.groundAvailable); ground.setAttribute('aria-checked', snapshot && snapshot.groundVisible ? 'true' : 'false'); }\n    var environmentButton = body ? body.querySelector('[data-bg-tc-3d-environment]') : null;\n    if (environmentButton) {\n      var dark = Boolean(snapshot && snapshot.environmentMode === 'dark');\n      environmentButton.setAttribute('aria-pressed', dark ? 'true' : 'false');\n      environmentButton.textContent = dark ? 'Light background' : 'Dark background';\n      environmentButton.setAttribute('aria-label', dark ? 'Light background' : 'Dark background');\n    }\n    this.syncSheetPreview3dBackdrops(environmentButton, snapshot);\n  };\n\n  // Background chooser (a native select with its caption) and the light/dark\n  // toggle, at the right of the control row. Both start hidden; the viewer\n  // state sync shows the one the product calls for once the viewer is active.\n  TemplateCollectionController.prototype.renderSheetPreview3dLookControls = function (row) {\n    var self = this;\n    var field = document.createElement('label');\n    field.className = 'bg-tc-sheet__backdrop';\n    field.setAttribute('data-bg-tc-3d-backdrop-field', '');\n    field.hidden = true;\n    var caption = document.createElement('span');\n    caption.textContent = 'Background';\n    var select = document.createElement('select');\n    select.setAttribute('data-bg-tc-3d-backdrop-select', '');\n    select.setAttribute('data-bg-tc-focus-key', '3d-backdrop');\n    select.addEventListener('change', function () {\n      var state = self.preview3d;\n      if (!state || !state.viewer || typeof state.viewer.setBackdrop !== 'function') return;\n      state.viewer.setBackdrop(asText(select.value));\n    });\n    field.appendChild(caption);\n    field.appendChild(select);\n    row.appendChild(field);\n    // Slice 8: light/dark preview background (real button, pressed state\n    // mirrors the viewer, announced by the runtime).\n    var environment = document.createElement('button');\n    environment.type = 'button';\n    environment.className = 'bg-tc-sheet__environment';\n    environment.setAttribute('data-bg-tc-3d-environment', '');\n    environment.setAttribute('data-bg-tc-focus-key', '3d-environment');\n    environment.setAttribute('aria-pressed', 'false');\n    environment.setAttribute('aria-label', 'Dark background');\n    environment.textContent = 'Dark background';\n    environment.hidden = true;\n    environment.addEventListener('click', function () {\n      var state = self.preview3d;\n      if (!state || !state.viewer) return;\n      var mode = state.viewer.state && state.viewer.state.environmentMode === 'dark' ? 'dark' : 'light';\n      state.viewer.setEnvironmentMode(mode === 'dark' ? 'light' : 'dark');\n    });\n    row.appendChild(environment);\n    [{ key: 'auto-rotate', label: 'Auto Rotate' }, { key: 'show-ground', label: 'Show ground' }].forEach(function (entry) {\n      var button = document.createElement('button');\n      button.type = 'button'; button.className = 'bg-tc-sheet__switch'; button.hidden = true;\n      button.setAttribute('role', 'switch'); button.setAttribute('aria-checked', 'false');\n      button.setAttribute('data-bg-tc-' + entry.key, ''); button.setAttribute('data-bg-tc-focus-key', entry.key);\n      button.innerHTML = '<span>' + entry.label + '</span><span class=\"bg-tc-sheet__switch-track\" aria-hidden=\"true\"></span>';\n      button.addEventListener('click', function () {\n        var viewer = self.preview3d && self.preview3d.viewer; if (!viewer) return;\n        if (entry.key === 'auto-rotate') viewer.setAutoRotate({ enabled: !viewer.state.autoRotate });\n        else viewer.setGroundVisible(!viewer.state.groundVisible);\n      });\n      row.appendChild(button);\n    });\n  };\n\n  TemplateCollectionController.prototype.ensureSheetPreview3d = function () {\n    if (this.preview3d) return this.preview3d;\n    var self = this;\n    var stage = document.createElement('div');\n    stage.className = 'bg-tc-sheet__stage3d';\n    stage.setAttribute('data-bg-tc-3d-stage', '');\n    stage.hidden = true;\n    stage.innerHTML = '' +\n      '<div class=\"bg-tc-sheet__stage3d-canvas\" data-bg-tc-3d-canvas-host></div>' +\n      '<span class=\"bg-tc-sheet__updating\" data-bg-tc-preview-updating role=\"status\" aria-label=\"Updating preview\" hidden></span>' +\n      '<div class=\"bg-tc-sheet__stage3d-loading\" data-bg-tc-3d-loading hidden>' +\n        '<p>' + PRODUCT_PREVIEW_SHEET_LOADING_COPY + '</p>' +\n        '<div class=\"bg-tc-sheet__stage3d-progress\" aria-hidden=\"true\"><span data-bg-tc-3d-progress-bar></span></div>' +\n        '<button type=\"button\" data-bg-tc-3d-cancel data-bg-tc-focus-key=\"3d-cancel\">Cancel</button>' +\n      '</div>' +\n      '<div class=\"bg-tc-sheet__stage3d-zoom\" data-bg-tc-3d-controls role=\"group\" aria-label=\"3D zoom controls\" hidden>' +\n        '<button type=\"button\" data-bg-tc-3d-zoom-in data-bg-tc-focus-key=\"3d-zoom-in\" aria-label=\"Zoom in\">+</button>' +\n        '<button type=\"button\" data-bg-tc-3d-zoom-out data-bg-tc-focus-key=\"3d-zoom-out\" aria-label=\"Zoom out\">&minus;</button>' +\n        '<button type=\"button\" data-bg-tc-3d-reset data-bg-tc-focus-key=\"3d-reset\" aria-label=\"Reset view\">' + PRODUCT_PREVIEW_SHEET_RESET_ICON + '</button>' +\n      '</div>';\n    stage.addEventListener('click', function (event) {\n      var target = event.target && event.target.closest ? event.target : null;\n      if (!target) return;\n      if (target.closest('[data-bg-tc-3d-cancel]')) {\n        event.preventDefault();\n        if (self.detail) self.detail.viewMode = '2d';\n        self.closeSheetPreview3d({ announce: 'Closed 3D preview' });\n        self.renderDetailBody('view-mode:2d');\n        return;\n      }\n      var state = self.preview3d;\n      if (!state || !state.viewer) return;\n      if (target.closest('[data-bg-tc-3d-zoom-in]')) {\n        event.preventDefault();\n        state.viewer.zoomIn();\n        return;\n      }\n      if (target.closest('[data-bg-tc-3d-zoom-out]')) {\n        event.preventDefault();\n        state.viewer.zoomOut();\n        return;\n      }\n      if (target.closest('[data-bg-tc-3d-reset]')) {\n        event.preventDefault();\n        state.viewer.resetView();\n      }\n    });\n    var liveRegion = document.createElement('span');\n    liveRegion.className = 'visually-hidden';\n    liveRegion.setAttribute('aria-live', 'polite');\n    liveRegion.setAttribute('data-bg-tc-3d-live', '');\n    if (this.els.detailDialog) this.els.detailDialog.appendChild(liveRegion);\n    // The page is unloading: only disposal matters (Customize/Personalize\n    // navigation included) \u2014 never touch history or focus here.\n    window.addEventListener('pagehide', function () {\n      self.closeSheetPreview3d({ silent: true });\n    });\n    this.preview3d = {\n      status: 'inactive',\n      viewer: null,\n      runtimePromise: null,\n      generation: 0,\n      stage: stage,\n      canvasHost: stage.querySelector('[data-bg-tc-3d-canvas-host]'),\n      loading: stage.querySelector('[data-bg-tc-3d-loading]'),\n      updating: stage.querySelector('[data-bg-tc-preview-updating]'),\n      progressBar: stage.querySelector('[data-bg-tc-3d-progress-bar]'),\n      controls: stage.querySelector('[data-bg-tc-3d-controls]'),\n      liveRegion: liveRegion,\n      previewBox: null,\n      side: 'front',\n      pairsKey: '',\n      textureUrls: [],\n      projectionKey: '',\n      notice: { text: '', retry: false, key: '' },\n      eligibleKey: ''\n    };\n    return this.preview3d;\n  };\n\n  // Slice 8: a see-through product carries the exact clear-product disclaimer.\n  TemplateCollectionController.prototype.sheetPreview3dDisclaimer = function () {\n    var state = this.preview3d;\n    var snapshot = state && state.viewer ? state.viewer.state : null;\n    return snapshot && snapshot.transmissive ? PRODUCT_PREVIEW_SHEET_DISCLAIMER_CLEAR : PRODUCT_PREVIEW_SHEET_DISCLAIMER;\n  };\n\n  TemplateCollectionController.prototype.syncSheetPreview3dDisclaimer = function () {\n    var caption = this.els && this.els.detailDialog ? this.els.detailDialog.querySelector('[data-bg-tc-3d-caption]') : null;\n    if (caption) caption.textContent = this.sheetPreview3dDisclaimer();\n  };\n\n  TemplateCollectionController.prototype.sheetPreview3dOpen = function () {\n    var state = this.preview3d;\n    return !!state && (state.status === 'loading' || state.status === 'active');\n  };\n\n  TemplateCollectionController.prototype.announceSheetPreview3d = function (message) {\n    var state = this.preview3d;\n    if (state && state.liveRegion) state.liveRegion.textContent = asText(message);\n  };\n\n  TemplateCollectionController.prototype.emitSheetPreview3dEvent = function (name, payload) {\n    this.emit(name, Object.assign({ pageSurface: 'template_collection' }, payload || {}));\n  };\n\n  // One stable identity for the sheet's current 3D claim: the resolved\n  // product plus the selected design. Notices and the eligible-once latch key\n  // on it so a product or design change never carries stale state across.\n  TemplateCollectionController.prototype.detailPreviewContextKey = function () {\n    var detail = this.detail;\n    if (!detail || detail.mode !== 'template') return '';\n    return asText(detail.selectedProductHandle) + '|' + designKey(detail.selectedDesign);\n  };\n\n  // The flag-gated, cached product resolution. Returns the cache entry\n  // ('pending' fetches are represented so re-renders never re-fetch), or null\n  // when the resolved product does not carry the listing flag \u2014 the real-page\n  // path: zero requests, zero markup, byte-identical behavior.\n  TemplateCollectionController.prototype.detailProductPreviewEntry = function () {\n    var detail = this.detail;\n    if (!detail || detail.mode !== 'template') return null;\n    var handle = asText(detail.selectedProductHandle);\n    if (!handle) return null;\n    var product = this.productsByHandle.get(handle);\n    if (!product || product.productPreviewInteractive !== true) return null;\n    var entry = this.productPreviewConfigs.get(handle);\n    if (!entry) {\n      entry = { status: 'pending', projection: null, holders: [] };\n      this.productPreviewConfigs.set(handle, entry);\n      this.loadProductPreviewConfig(handle, entry);\n    }\n    return entry;\n  };\n\n  TemplateCollectionController.prototype.loadProductPreviewConfig = function (handle, entry) {\n    var self = this;\n    this.readReferenceProductConfig(handle).then(function (payload) {\n      var root = payload && payload.result && typeof payload.result === 'object' ? payload.result : (payload || {});\n      var projection = root.ok === false ? null : readSheetPreviewProjection(root);\n      var bundle = root.productCommerceBundle && typeof root.productCommerceBundle === 'object' ? root.productCommerceBundle : {};\n      entry.status = projection ? 'ready' : 'none';\n      entry.projection = projection;\n      entry.holders = Array.isArray(bundle.optionHolders) ? bundle.optionHolders : [];\n      entry.rules = Array.isArray(bundle.rules) ? bundle.rules : [];\n      entry.editorSync = bundle.editorSync || {};\n      if (self.openOverlay === 'detail' && self.detail && asText(self.detail.selectedProductHandle) === handle) {\n        self.renderDetailBody();\n      }\n    }).catch(function () {\n      entry.status = 'none';\n      entry.projection = null;\n      entry.holders = [];\n    });\n  };\n\n  // Map the sheet's own selection vocabulary (the selected design's size row)\n  // onto the product's option holders: targetingId first (the stable bridge \u2014\n  // design and holder LABELS can disagree on axis order), label fallback.\n  // Returns the option pairs the viewer applies plus the truthful\n  // incompatibility verdict: a size the product's size holder cannot resolve,\n  // or a resolved pair the projection leaves unbound, cannot claim 3D.\n  function sheetPreviewActiveVariations(holder) {\n    var ids = holder && Array.isArray(holder.variationIds) ? holder.variationIds : [];\n    return (holder && Array.isArray(holder.variations) ? holder.variations : []).filter(function (variation) {\n      return variation && variation.outOfStock !== true && (!ids.length || ids.indexOf(variation.id) !== -1);\n    });\n  }\n\n  // Resolve the sheet's defaults under the same ordered visibility rules as\n  // the PDP. A sheet cannot guess conditions requiring quantity or document\n  // state it does not own: those configurations keep the ordinary 2D preview.\n  function resolveSheetPreviewChoices(holders, rules, selected, explicit) {\n    var seen = new Set();\n    var hidden = {}, disabled = {}, sidesMode = '';\n    function conditionMatches(condition) {\n      if (condition.type === 'always') return true;\n      if (condition.type !== 'holder_value') return null;\n      var choice = selected[asText(condition.holderId)];\n      if (!choice) return false;\n      var candidates = [asText(choice.id), asText(choice.targetingId), asText(choice.label)];\n      var values = condition.operator === 'in' || condition.operator === 'not_in'\n        ? (Array.isArray(condition.values) ? condition.values : [])\n        : [condition.valueId || condition.value];\n      var match = values.some(function (value) { return candidates.indexOf(asText(value)) !== -1; });\n      return condition.operator === 'not_in' || condition.operator === 'is_not' ? !match : match;\n    }\n    function matches(conditions, operator) {\n      if (!conditions.length) return false;\n      var values = conditions.map(conditionMatches);\n      if (values.indexOf(null) !== -1) return null;\n      return operator === 'or' ? values.some(Boolean) : values.every(Boolean);\n    }\n    function unavailable(holderId, valueId) {\n      return hidden[holderId] || disabled[holderId] || hidden[holderId + '|' + valueId] || disabled[holderId + '|' + valueId];\n    }\n    for (var pass = 0; pass <= holders.length + 1; pass += 1) {\n      var key = JSON.stringify(Object.keys(selected).map(function (id) { return [id, selected[id].id]; }));\n      if (seen.has(key)) return { pairs: [], incompatible: true };\n      seen.add(key);\n      hidden = {}; disabled = {}; sidesMode = '';\n      var unknown = false;\n      rules.slice().reverse().forEach(function (rule) {\n        var actions = (rule.actions || []).filter(function (action) { return /^(show|hide|enable|disable)_(holder|value)$/.test(action.type) || action.type === 'set_sides_policy'; });\n        if (!actions.length) return;\n        var groups = Array.isArray(rule.conditionGroups) && rule.conditionGroups.length ? rule.conditionGroups : [{ conditions: rule.conditions || [], operator: rule.operator }];\n        var checks = groups.map(function (group) { return matches(group.conditions || [], group.operator); });\n        if (checks.indexOf(null) !== -1) { unknown = true; return; }\n        var matched = rule.operator === 'or' ? checks.some(Boolean) : checks.every(Boolean);\n        actions.forEach(function (action) {\n          if ((action.branch === 'false') === matched) return;\n          if (action.type === 'set_sides_policy') { sidesMode = asText(action.value && action.value.mode); return; }\n          var target = asText(action.holderId) + (/_value$/.test(action.type) ? '|' + asText(action.valueId) : '');\n          if (/^(show|hide)_/.test(action.type)) hidden[target] = /^hide_/.test(action.type);\n          else disabled[target] = /^disable_/.test(action.type);\n        });\n      });\n      if (unknown) return { pairs: [], incompatible: true };\n      var changed = false, incompatible = false;\n      holders.forEach(function (holder) {\n        var id = asText(holder.id), choice = selected[id];\n        if (!choice) return;\n        if (!unavailable(id, asText(choice.id))) return;\n        if (explicit[id]) { incompatible = true; return; }\n        if (hidden[id] || disabled[id]) return;\n        var available = sheetPreviewActiveVariations(holder).filter(function (variation) { return !unavailable(id, asText(variation.id)); });\n        var replacement = available.find(function (variation) { return variation.defaultValue === true; }) || available[0];\n        if (!replacement) { incompatible = true; return; }\n        selected[id] = replacement;\n        changed = true;\n      });\n      if (incompatible) return { pairs: [], incompatible: true };\n      if (!changed) return {\n        pairs: holders.filter(function (holder) { return selected[holder.id] && !unavailable(holder.id, selected[holder.id].id); })\n          .map(function (holder) { return { optionId: asText(holder.id), valueId: asText(selected[holder.id].id) }; }),\n        incompatible: false,\n        sidesMode: sidesMode\n      };\n    }\n    return { pairs: [], incompatible: true };\n  }\n\n  TemplateCollectionController.prototype.detailPreviewSelection = function (entry, designInput) {\n    var detail = this.detail;\n    var design = designInput || (detail && detail.selectedDesign);\n    var projection = entry && entry.projection;\n    var holders = entry && Array.isArray(entry.holders) ? entry.holders : [];\n    var sync = entry && entry.editorSync || {};\n    var style = this.resolveStyleForDesign(design);\n    var templateKeys = list(design && design.shape_targetingID)\n      .concat(list(design && design.orientation_targetingID))\n      .concat(style ? [style.id] : []).map(asText).filter(Boolean);\n    var selectedKeys = new Set(\n      list(design && design.size_targetingID)\n        .concat(actualDesignSizeValues(design))\n        .map(normalizedText)\n        .filter(Boolean)\n    );\n    var groupKeys = new Set(selectedKeys);\n    ((detail && detail.group) || []).forEach(function (member) {\n      list(member && member.size_targetingID)\n        .concat(actualDesignSizeValues(member))\n        .map(normalizedText)\n        .filter(Boolean)\n        .forEach(function (key) { groupKeys.add(key); });\n    });\n    var selectedByHolder = {};\n    var explicit = {};\n    var incompatible = false;\n    var shapeKeys = list(design && design.shape_targetingID);\n    var shapeLabels = shapeKeys.length ? [] : list(design && design.shape);\n    // Legacy option metadata carries a stable semantic bridge even when a\n    // fixed-shape style hides this holder. Descriptive template metadata must\n    // not revive that hidden option, or silently choose a visible default.\n    var shapeHolders = holders.filter(function (holder) { return holder.metadata && holder.metadata.htmlId === 'shape'; });\n    var requestedShapes = {};\n    var unresolvedShape = false;\n    shapeKeys.concat(shapeLabels).forEach(function (key) {\n      var matches = [];\n      holders.forEach(function (holder) {\n        (holder.variations || []).forEach(function (variation) {\n          if (shapeKeys.length ? [asText(variation.id), asText(variation.targetingId)].indexOf(key) !== -1 : normalizedText(variation.label) === normalizedText(key)) matches.push({ holder: holder, variation: variation });\n        });\n      });\n      if (matches.length !== 1 || sheetPreviewActiveVariations(matches[0].holder).indexOf(matches[0].variation) === -1) { unresolvedShape = true; return; }\n      if (shapeHolders.indexOf(matches[0].holder) === -1) shapeHolders.push(matches[0].holder);\n      requestedShapes[matches[0].holder.id] = asText(matches[0].variation.id);\n      templateKeys.push(asText(matches[0].variation.id));\n    });\n    holders.forEach(function (holder) {\n      if (incompatible) return;\n      var holderId = asText(holder && holder.id);\n      var variations = sheetPreviewActiveVariations(holder);\n      if (!holderId || !variations.length) return;\n      var requested = variations.filter(function (variation) {\n        return templateKeys.some(function (key) { return key === asText(variation.id) || key === asText(variation.targetingId); });\n      });\n      if (requested.length > 1) { incompatible = true; return; }\n      var fallback = variations.find(function (variation) { return variation.defaultValue === true; }) || variations[0];\n      selectedByHolder[holderId] = requested[0] || fallback;\n      if (requested.length && !requestedShapes[holderId]) explicit[holderId] = true;\n      var variationKeys = function (variation) {\n        return [asText(variation && variation.id), asText(variation && variation.targetingId), asText(variation && variation.label)]\n          .map(normalizedText)\n          .filter(Boolean);\n      };\n      var carriesGroupVocabulary = holderId === asText(sync.sizeHolderId) || variations.some(function (variation) {\n        return variationKeys(variation).some(function (key) { return groupKeys.has(key); });\n      });\n      if (!carriesGroupVocabulary) return;\n      var selected = null;\n      for (var index = 0; index < variations.length && !selected; index += 1) {\n        if (variationKeys(variations[index]).some(function (key) { return selectedKeys.has(key); })) {\n          selected = variations[index];\n        }\n      }\n      if (selected) {\n        selectedByHolder[holderId] = selected;\n        explicit[holderId] = true;\n      } else if (selectedKeys.size) {\n        // The design names a size this holder cannot resolve: the model\n        // cannot truthfully claim it.\n        incompatible = true;\n      }\n    });\n    var configured = resolveSheetPreviewChoices(holders, entry && entry.rules || [], selectedByHolder, explicit);\n    var pairs = configured.pairs;\n    if (unresolvedShape && (!shapeHolders.length || shapeHolders.some(function (holder) {\n      return pairs.some(function (pair) { return pair.optionId === holder.id; });\n    }))) incompatible = true;\n    Object.keys(requestedShapes).forEach(function (holderId) {\n      var active = pairs.find(function (pair) { return pair.optionId === holderId; });\n      if (active && active.valueId !== requestedShapes[holderId]) incompatible = true;\n    });\n    var sizeChoice = selectedByHolder[asText(sync.sizeHolderId)];\n    var size = (Array.isArray(sync.sizeValues) ? sync.sizeValues : []).find(function (value) { return sizeChoice && asText(value.valueId) === asText(sizeChoice.id); }) || {};\n    var orientationValues = list(design && design.orientation).concat(list(design && design.orientation_targetingID));\n    var orientations = unique(orientationValues.map(function (value) { return previewOrientationSemantic(value, 0, 0); }).filter(Boolean));\n    if (orientations.length > 1) incompatible = true;\n    var dimensionOrientation = previewOrientationSemantic('', size.width, size.height);\n    var orientation = dimensionOrientation === 'orientation:square' ? dimensionOrientation : orientations[0] || dimensionOrientation;\n    if (orientation) pairs.push({ semantic: orientation });\n    incompatible = incompatible || configured.incompatible;\n    var sidesValue = selectedByHolder[asText(sync.sidesHolderId)];\n    var sidesPolicy = (Array.isArray(sync.sidesPolicies) ? sync.sidesPolicies : []).find(function (policy) {\n      return sidesValue && asText(policy.valueId) === asText(sidesValue.id);\n    }) || sync.defaultSidesPolicy || {};\n    if (!incompatible && sheetPreviewUnboundSelection(projection, pairs)) incompatible = true;\n    return { pairs: pairs, incompatible: incompatible, sidesMode: asText(configured.sidesMode || sidesPolicy.mode) };\n  };\n\n  TemplateCollectionController.prototype.detailPreviewResolution = function () {\n    var entry = this.detailProductPreviewEntry();\n    if (!entry || entry.status !== 'ready' || !entry.projection) return null;\n    var selection = this.detailPreviewSelection(entry);\n    return {\n      entry: entry,\n      projection: entry.projection,\n      pairs: selection.pairs,\n      sidesMode: selection.sidesMode,\n      incompatible: selection.incompatible,\n      available: !selection.incompatible\n    };\n  };\n\n  // Runs at the top of every detail render \u2014 the single re-resolution point\n  // (product, size, and backer handlers all land in renderDetailBody):\n  // an open viewer closes when the claim no longer holds (with the designed\n  // copy when options are the reason), restarts in place when the resolved\n  // product now carries a DIFFERENT projection, and stale notices clear when\n  // their context is gone.\n  TemplateCollectionController.prototype.syncSheetPreview3dBeforeRender = function (resolution) {\n    var state = this.preview3d;\n    if (!state) return;\n    var contextKey = this.detailPreviewContextKey();\n    if (state.notice.text && state.notice.key !== contextKey) {\n      state.notice = { text: '', retry: false, key: '' };\n    }\n    if (this.sheetPreview3dOpen()) {\n      if (!resolution || !resolution.available) {\n        if (this.detail) this.detail.viewMode = '2d';\n        if (resolution && resolution.incompatible) {\n          this.emitSheetPreview3dEvent('product_preview_fallback', { reason: 'option_incompatible' });\n          this.closeSheetPreview3d({\n            notice: PRODUCT_PREVIEW_SHEET_INCOMPATIBLE_COPY,\n            announce: PRODUCT_PREVIEW_SHEET_INCOMPATIBLE_COPY\n          });\n        } else {\n          this.closeSheetPreview3d({ silent: true });\n        }\n        return;\n      }\n      var projectionKey = asText(resolution.projection.profileRevisionId) + '|'\n        + asText(resolution.projection.model && resolution.projection.model.desktop && resolution.projection.model.desktop.url);\n      if (state.projectionKey && state.projectionKey !== projectionKey) {\n        // A compatible product switch resolved a different profile: stay on\n        // the product view and reload the new model in place.\n        this.closeSheetPreview3d({ silent: true, keepMode: true });\n      }\n    } else if (state.status === 'error' && resolution && resolution.available && state.notice.key !== contextKey) {\n      state.status = 'inactive';\n    }\n  };\n\n  TemplateCollectionController.prototype.loadSheetPreviewRuntime = function () {\n    if (window.QpsProductPreviewRuntime && typeof window.QpsProductPreviewRuntime.createProductPreviewViewer === 'function') {\n      return Promise.resolve(window.QpsProductPreviewRuntime);\n    }\n    var state = this.ensureSheetPreview3d();\n    if (state.runtimePromise) return state.runtimePromise;\n    var src = asText(this.config.productPreviewRuntimeSrc);\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  TemplateCollectionController.prototype.setSheetPreview3dPhase = function (phase) {\n    var state = this.preview3d;\n    if (!state) return;\n    if (!phase) {\n      state.stage.hidden = true;\n      state.stage.removeAttribute('data-bg-tc-3d-phase');\n      if (state.loading) state.loading.hidden = true;\n      if (state.updating) state.updating.hidden = true;\n      if (state.controls) state.controls.hidden = true;\n      if (state.canvasHost) state.canvasHost.innerHTML = '';\n      if (state.progressBar) state.progressBar.style.width = '0%';\n      if (state.previewBox && state.previewBox.isConnected) state.previewBox.removeAttribute('data-bg-tc-3d-phase');\n      state.previewBox = null;\n      return;\n    }\n    state.stage.hidden = false;\n    state.stage.setAttribute('data-bg-tc-3d-phase', phase);\n    if (state.loading) state.loading.hidden = phase !== 'loading';\n    if (state.controls) state.controls.hidden = phase !== 'active' && phase !== 'updating';\n    if (state.updating) state.updating.hidden = phase !== 'updating';\n    if (state.previewBox && state.previewBox.isConnected) state.previewBox.setAttribute('data-bg-tc-3d-phase', phase);\n    // The body is rebuilt on every render: the row's 3D-only controls take\n    // their state from the viewer each time the stage re-attaches.\n    this.syncSheetPreview3dControls();\n  };\n\n  TemplateCollectionController.prototype.closeSheetPreview3d = function (options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var state = this.preview3d;\n    if (!state) return;\n    state.generation += 1;\n    if (state.viewer) {\n      try { state.viewer.dispose(); } catch (_) {}\n      state.viewer = null;\n    }\n    state.status = settings.error === true ? 'error' : 'inactive';\n    state.pairsKey = '';\n    state.textureUrls = [];\n    if (!settings.keepMode) state.projectionKey = '';\n    state.side = 'front';\n    this.setSheetPreview3dPhase('');\n    if (settings.notice) {\n      state.notice = {\n        text: asText(settings.notice),\n        retry: settings.retry === true,\n        key: this.detailPreviewContextKey()\n      };\n    } else if (!settings.silent) {\n      state.notice = { text: '', retry: false, key: '' };\n    }\n    if (settings.announce) this.announceSheetPreview3d(settings.announce);\n  };\n\n  TemplateCollectionController.prototype.failSheetPreview3d = function (reason) {\n    this.emitSheetPreview3dEvent('product_preview_failed', { reason: asText(reason) });\n    if (this.detail) this.detail.viewMode = '2d';\n    this.closeSheetPreview3d({\n      error: true,\n      notice: PRODUCT_PREVIEW_SHEET_ERROR_COPY,\n      retry: true,\n      announce: PRODUCT_PREVIEW_SHEET_ERROR_COPY\n    });\n    if (this.openOverlay === 'detail' && this.detail) this.renderDetailBody('3d-retry');\n  };\n\n  TemplateCollectionController.prototype.sheetPreview3dTextureUrls = function (resolution) {\n    var design = this.detail && this.detail.selectedDesign || {};\n    var backer = (Array.isArray(design.backers) ? design.backers : []).find(function (entry) { return asText(entry.id) === asText(this.detail.selectedBacker); }, this);\n    // A board list preserves missing and repeated images. The 2D gallery's\n    // deduplication must never move back artwork onto the front face.\n    var previews = backer && Array.isArray(backer.previews) && backer.previews.length ? backer.previews\n      : Array.isArray(design.previews) && design.previews.length ? design.previews : this.activeDetailPreviews();\n    var runtime = window.QpsProductPreviewRuntime;\n    var urls = [];\n    (Array.isArray(resolution.projection.surfaces) ? resolution.projection.surfaces : []).forEach(function (mapping) {\n      var board = mapping && mapping.board && typeof mapping.board === 'object' ? mapping.board : {};\n      var boardIndex = Math.max(0, Math.round(Number(board.boardIndex) || 0));\n      var side = asText(board.side);\n      var sourceIndex = runtime && typeof runtime.resolveSurfaceSourceBoardIndex === 'function'\n        ? runtime.resolveSurfaceSourceBoardIndex(resolution.projection, mapping, { sidesMode: resolution.sidesMode }) : boardIndex;\n      urls.push({ side: side, boardIndex: boardIndex, url: sourceIndex === null ? '' : asText(previews[sourceIndex]) });\n    });\n    return urls;\n  };\n\n  // Public template preview textures onto the model boards, front board\n  // required. Single-preview templates leave the physical back blank \u2014\n  // truthful, matching the PDP lane.\n  TemplateCollectionController.prototype.applySheetPreview3dTextures = function (resolution, generation) {\n    var state = this.preview3d;\n    var viewer = state && state.viewer;\n    if (!viewer || state.generation !== generation) return Promise.resolve(false);\n    var urls = this.sheetPreview3dTextureUrls(resolution);\n    var pending = [];\n    urls.forEach(function (entry) {\n      if (!entry.url) {\n        if (typeof viewer.clearSurfaceTexture === 'function') viewer.clearSurfaceTexture({ side: entry.side, boardIndex: entry.boardIndex });\n        return;\n      }\n      var textureUrl = productPreviewSheetTextureUrl(entry.url);\n      var applied = viewer.setSurfaceTextureFromUrl({ side: entry.side, boardIndex: entry.boardIndex }, textureUrl)\n        .catch(function () { return false; });\n      pending.push(applied);\n    });\n    if (!pending.length) return Promise.resolve(false);\n    return Promise.all(pending).then(function (results) { return results.every(Boolean); });\n  };\n\n  TemplateCollectionController.prototype.activateSheetPreview3d = function (resolution) {\n    var self = this;\n    var state = this.ensureSheetPreview3d();\n    if (state.status === 'loading' || state.status === 'active') return;\n    var generation = ++state.generation;\n    state.status = 'loading';\n    state.notice = { text: '', retry: false, key: '' };\n    state.projectionKey = asText(resolution.projection.profileRevisionId) + '|'\n      + asText(resolution.projection.model && resolution.projection.model.desktop && resolution.projection.model.desktop.url);\n    this.setSheetPreview3dPhase('loading');\n    this.announceSheetPreview3d(PRODUCT_PREVIEW_SHEET_LOADING_COPY);\n    this.emitSheetPreview3dEvent('product_preview_opened', {\n      profileRevisionId: asText(resolution.projection.profileRevisionId)\n    });\n    this.loadSheetPreviewRuntime().then(function (runtime) {\n      if (state.generation !== generation || state.status !== 'loading') return null;\n      resolution = self.detailPreviewResolution();\n      if (!resolution || !resolution.available) { self.failSheetPreview3d('configuration_unavailable'); return null; }\n      if (!state.canvasHost) return null;\n      state.canvasHost.innerHTML = '';\n      var productTitle = productName(self.currentDetailProduct()) || 'this product';\n      var viewer = runtime.createProductPreviewViewer({\n        container: state.canvasHost,\n        projection: resolution.projection,\n        selections: resolution.pairs,\n        viewMode: self.detail && self.detail.viewMode === '2d' ? '2d' : '3d',\n        modelDescription: '3D model of ' + productTitle + ' showing your design on the {side}.',\n        onAnnounce: function (message) { self.announceSheetPreview3d(message); },\n        onProgress: function (progress) {\n          if (!state.progressBar || state.generation !== generation) return;\n          var total = Number(progress && progress.totalBytes) || 0;\n          var loaded = Number(progress && progress.loadedBytes) || 0;\n          if (total > 0) state.progressBar.style.width = Math.max(0, Math.min(100, Math.round((loaded / total) * 100))) + '%';\n        },\n        onTelemetry: function (fact) {\n          if (!fact || !asText(fact.event)) return;\n          self.emitSheetPreview3dEvent(asText(fact.event), {\n            profileRevisionId: asText(fact.profileRevisionId) || undefined,\n            rendererVersion: asText(fact.rendererVersion) || undefined,\n            modelBytes: Number(fact.modelBytes) > 0 ? Number(fact.modelBytes) : undefined,\n            durationMs: Number(fact.durationMs) > 0 ? Number(fact.durationMs) : undefined,\n            reason: asText(fact.reason) || undefined,\n            surface: asText(fact.surface) || undefined,\n            cameraId: asText(fact.cameraId) || undefined,\n            bindingKind: asText(fact.bindingKind) || undefined\n          });\n        },\n        onStateChange: function (snapshot) {\n          if (state.generation !== generation || !snapshot) return;\n          self.syncSheetPreview3dControls(snapshot);\n          if (snapshot && snapshot.state === 'active') self.syncSheetPreview3dDisclaimer();\n          if (snapshot.state === '2d-fallback') {\n            self.failSheetPreview3d(asText(snapshot.fallbackReason) || 'viewer_fallback');\n            return;\n          }\n          if (snapshot.state === 'loading' || snapshot.state === 'active') {\n            state.status = snapshot.state;\n            self.setSheetPreview3dPhase(snapshot.updating ? 'updating' : snapshot.state);\n          }\n          var side = asText(snapshot && snapshot.surfaceSide);\n          if (!side) return;\n          state.side = side;\n          if (self.detail) self.detail.previewSide = side;\n          Array.prototype.slice.call(self.els.detailBody.querySelectorAll('[data-bg-tc-preview-side]')).forEach(function (button) {\n            button.setAttribute('aria-pressed', asText(button.getAttribute('data-bg-tc-preview-side')) === side ? 'true' : 'false');\n          });\n        }\n      });\n      state.viewer = viewer;\n      state.pairsKey = JSON.stringify(resolution.pairs);\n      state.textureUrls = self.sheetPreview3dTextureUrls(resolution).map(function (entry) { return entry.url; });\n      // Queue artwork before model loading. The runtime replays the latest\n      // sources after every replacement, including changes made while loading.\n      var textureKey = resolution.sidesMode + '|' + JSON.stringify(self.sheetPreview3dTextureUrls(resolution));\n      state.textureKey = textureKey;\n      var textureEpoch = state.textureEpoch = (state.textureEpoch || 0) + 1;\n      self.applySheetPreview3dTextures(resolution, generation).then(function (applied) {\n        if (state.generation === generation && state.textureEpoch === textureEpoch && !applied) self.failSheetPreview3d('texture_failed');\n      });\n      return viewer.activate().then(function (snapshot) {\n        if (state.generation !== generation) return;\n        // An option change can supersede this activation. The current viewer\n        // state callback owns loading/fallback; an old promise cannot undo it.\n        if (!snapshot || snapshot.state !== 'active') return;\n        var desiredSide = asText(self.detail && self.detail.previewSide) || 'front';\n        if (desiredSide !== 'front') viewer.setSurface(desiredSide);\n        var canvas = state.canvasHost ? state.canvasHost.querySelector('canvas') : null;\n        if (canvas && typeof canvas.focus === 'function') {\n          try { canvas.focus(); } catch (_) {}\n        }\n      });\n    }).catch(function () {\n      if (state.generation === generation) self.failSheetPreview3d('runtime_load_failed');\n    });\n  };\n\n  // The in-place update lane for an OPEN viewer after a re-render: new option\n  // pairs apply, changed textures re-apply, and a side chosen while the\n  // viewer was closed syncs. A side that LOST its image (e.g. a backer with a\n  // back preview swapped for one without) restarts the viewer instead \u2014 a\n  // stale texture would be untruthful.\n  TemplateCollectionController.prototype.updateSheetPreview3d = function (resolution) {\n    var self = this;\n    var state = this.preview3d;\n    if (!state || (state.status !== 'active' && state.status !== 'loading') || !state.viewer) return;\n    var generation = state.generation;\n    var pairsKey = JSON.stringify(resolution.pairs);\n    var selectionsChanged = state.pairsKey !== pairsKey;\n    if (selectionsChanged) {\n      state.pairsKey = pairsKey;\n      state.viewer.applySelections(resolution.pairs);\n    }\n    var urls = this.sheetPreview3dTextureUrls(resolution);\n    var textureKey = resolution.sidesMode + '|' + JSON.stringify(urls);\n    if (selectionsChanged || state.textureKey !== textureKey) {\n      state.textureKey = textureKey;\n      var textureEpoch = state.textureEpoch = (state.textureEpoch || 0) + 1;\n      state.textureUrls = urls.map(function (entry) { return entry.url; });\n      this.applySheetPreview3dTextures(resolution, generation).then(function (frontApplied) {\n        if (state.generation !== generation || state.textureEpoch !== textureEpoch) return;\n        if (!frontApplied) self.failSheetPreview3d('texture_failed');\n      });\n    }\n    var desiredSide = asText(this.detail && this.detail.previewSide) || 'front';\n    if (desiredSide !== state.side) {\n      state.side = desiredSide;\n      state.viewer.setSurface(desiredSide);\n    }\n  };\n\n  // \"2D | 3D\" \u2014 renders ONLY when the resolved product proved a live\n  // compatible projection (design handoff \u00A73: absent until one product is\n  // resolved; default 2D). Appended to the control row above the preview box.\n  TemplateCollectionController.prototype.renderDetailPreviewSwitch = function (body, resolution) {\n    var self = this;\n    var detail = this.detail;\n    if (!resolution || !resolution.available) return;\n    var state = this.ensureSheetPreview3d();\n    var contextKey = this.detailPreviewContextKey();\n    if (state.eligibleKey !== contextKey && !this.sheetPreview3dOpen()) {\n      state.eligibleKey = contextKey;\n      this.emitSheetPreview3dEvent('product_preview_eligible', { sourceType: 'template' });\n    }\n    var group = document.createElement('div');\n    group.className = 'bg-tc-sheet__preview-switch';\n    group.setAttribute('role', 'group');\n    group.setAttribute('aria-label', 'Preview mode');\n    [\n      { id: '2d', label: '2D' },\n      { id: '3d', label: '3D' }\n    ].forEach(function (option) {\n      var selected = (detail.viewMode === '3d') === (option.id === '3d');\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.textContent = option.label;\n      var focusKey = 'view-mode:' + option.id;\n      button.setAttribute('data-bg-tc-preview-renderer', option.id);\n      button.setAttribute('data-bg-tc-focus-key', focusKey);\n      button.setAttribute('aria-pressed', selected ? 'true' : 'false');\n      button.addEventListener('click', function () {\n        if ((detail.viewMode === '3d') === (option.id === '3d')) return;\n        if (option.id === '2d') {\n          detail.viewMode = '2d';\n          if (!(resolution.projection.display && resolution.projection.display.modelView2d)) self.closeSheetPreview3d({ announce: 'Closed 3D preview' });\n        } else {\n          detail.viewMode = '3d';\n        }\n        if (state.viewer && resolution.projection.display && resolution.projection.display.modelView2d) state.viewer.setViewMode(detail.viewMode);\n        self.renderDetailBody(focusKey);\n      });\n      group.appendChild(button);\n    });\n    body.appendChild(group);\n  };\n\n  TemplateCollectionController.prototype.renderSheetPreview3dNotice = function (body, resolution) {\n    var self = this;\n    var state = this.preview3d;\n    if (!state || !state.notice.text) return;\n    if (state.notice.key !== this.detailPreviewContextKey()) return;\n    var notice = document.createElement('p');\n    notice.className = 'bg-tc-sheet__3d-notice';\n    var text = document.createElement('span');\n    text.textContent = state.notice.text;\n    notice.appendChild(text);\n    if (state.notice.retry && resolution && resolution.available) {\n      var retry = document.createElement('button');\n      retry.type = 'button';\n      retry.textContent = 'Try again';\n      retry.setAttribute('data-bg-tc-focus-key', '3d-retry');\n      retry.addEventListener('click', function () {\n        if (!self.detail) return;\n        self.detail.viewMode = '3d';\n        var current = self.preview3d;\n        if (current) current.notice = { text: '', retry: false, key: '' };\n        self.renderDetailBody('view-mode:3d');\n      });\n      notice.appendChild(retry);\n    }\n    body.appendChild(notice);\n  };\n\n  TemplateCollectionController.prototype.openDetail = function (design, opener) {\n    // Opening another design disposes any open viewer fully BEFORE the next\n    // sheet content renders (design handoff sheet/closed).\n    if (this.sheetPreview3dOpen()) this.closeSheetPreview3d({ silent: true });\n    var products = this.compatibleProducts(design);\n    this.detail = {\n      mode: 'template',\n      originalKey: designKey(design),\n      group: this.relatedDesigns(design),\n      selectedDesign: design,\n      products: products,\n      selectedProductHandle: productHandle(design) || products[0] && products[0].handle || '',\n      selectedBacker: '',\n      selectedFinish: '',\n      previewSide: 'front',\n      viewMode: '2d'\n    };\n    this.renderDetailBody();\n    this.openOwnedOverlay('detail', opener, designKey(design));\n  };\n\n  TemplateCollectionController.prototype.renderDetailBody = function (focusKey) {\n    var self = this;\n    var detail = this.detail;\n    if (!detail) return;\n    var body = this.els.detailBody;\n    var restoreKey = focusKey || this.focusKey(body);\n    body.innerHTML = '';\n    // Slice 6: the wipe above detached the persistent 3D stage (the element\n    // and its WebGL canvas survive by reference); non-template renders\n    // dispose outright, template renders re-resolve below.\n    if (detail.mode !== 'template' && this.sheetPreview3dOpen()) this.closeSheetPreview3d({ silent: true });\n    this.els.detailSecondary.hidden = false;\n    if (detail.mode === 'unavailable') {\n      this.els.detailTitle.textContent = 'Template unavailable';\n      var unavailable = document.createElement('p');\n      unavailable.setAttribute('role', 'alert');\n      unavailable.textContent = 'This template is no longer available for this product. Return to the collection and choose another design.';\n      body.appendChild(unavailable);\n      this.els.detailPrimary.disabled = true;\n      this.els.detailSecondary.disabled = true;\n      this.restoreFocusKey(body, restoreKey, this.els.detailDialog);\n      return;\n    }\n    if (detail.mode === 'rescue') {\n      this.renderRescueProductChooser(restoreKey);\n      return;\n    }\n    var design = detail.selectedDesign;\n    var name = designName(design, 0);\n    this.els.detailTitle.textContent = name;\n    var previews = this.activeDetailPreviews();\n    // Slice 6: re-resolve the 3D claim BEFORE building the preview region \u2014\n    // every product/size/backer change lands here, so this is the single\n    // re-resolution point (mirrors TC-FINISH-01 below).\n    var preview3dResolution = this.detailPreviewResolution();\n    this.syncSheetPreview3dBeforeRender(preview3dResolution);\n    var mode3d = !!(preview3dResolution && preview3dResolution.available) && (detail.viewMode === '3d' || preview3dResolution.projection.display && preview3dResolution.projection.display.modelView2d && !(this.preview3d && this.preview3d.status === 'error'));\n    if (detail.viewMode === '3d' && !mode3d) detail.viewMode = '2d';\n    // One control row above the preview box: Front | Back, the 2D | 3D\n    // toggle, and (in 3D) the Background chooser or light/dark toggle.\n    // Nothing but the zoom cluster sits over the canvas.\n    var controls = document.createElement('div');\n    controls.className = 'bg-tc-sheet__preview-controls';\n    var surfaceSides = mode3d ? sheetPreviewSurfaceSides(preview3dResolution.projection) : null;\n    if (previews.length > 1 || (surfaceSides && surfaceSides.length > 1)) {\n      var sides = document.createElement('div');\n      sides.className = 'bg-tc-sheet__sides' + (mode3d ? ' bg-tc-sheet__sides--3d' : '');\n      sides.setAttribute('role', 'group');\n      sides.setAttribute('aria-label', 'Preview side');\n      (surfaceSides && surfaceSides.length > 1 ? surfaceSides : ['front', 'back']).forEach(function (side) {\n        var button = document.createElement('button');\n        button.type = 'button';\n        button.textContent = side.charAt(0).toUpperCase() + side.slice(1);\n        var sideFocusKey = 'preview-side:' + side;\n        button.setAttribute('data-bg-tc-focus-key', sideFocusKey);\n        button.setAttribute('data-bg-tc-preview-side', side);\n        button.setAttribute('aria-pressed', detail.previewSide === side ? 'true' : 'false');\n        button.addEventListener('click', function () {\n          detail.previewSide = side;\n          if (mode3d && self.preview3d && self.preview3d.viewer) self.preview3d.viewer.setSurface(side);\n          self.renderDetailBody(sideFocusKey);\n        });\n        sides.appendChild(button);\n      });\n      controls.appendChild(sides);\n    }\n    this.renderDetailPreviewSwitch(controls, preview3dResolution);\n    if (mode3d) this.renderSheetPreview3dLookControls(controls);\n    if (controls.childNodes.length) body.appendChild(controls);\n    var preview = document.createElement('div');\n    preview.className = 'bg-tc-sheet__preview';\n    if (previews.length) {\n      var image = document.createElement('img');\n      image.src = detail.previewSide === 'back' && previews[1] ? previews[1] : previews[0];\n      image.alt = detail.previewSide === 'back' ? name + ' back preview' : name + ' front preview';\n      preview.appendChild(image);\n    } else {\n      preview.textContent = name;\n    }\n    body.appendChild(preview);\n    this.renderSheetPreview3dNotice(body, preview3dResolution);\n    if (mode3d) {\n      var caption = document.createElement('p');\n      caption.className = 'bg-tc-sheet__3d-caption';\n      caption.setAttribute('data-bg-tc-3d-caption', '');\n      caption.textContent = this.sheetPreview3dDisclaimer();\n      body.appendChild(caption);\n    }\n    this.renderDetailStyle(body);\n    this.renderDetailProducts(body);\n    this.renderDetailSizes(body);\n    this.renderDetailBackers(body);\n    // TC-FINISH-01: finish availability re-resolves on every rerender (the\n    // product, size, and backer handlers all land here), so a product or size\n    // change truthfully updates which finish routes exist and which is chosen.\n    var availability = this.designAvailabilityForProduct(detail.selectedDesign, this.currentDetailProduct());\n    var finishMode = this.resolveDetailFinish(availability);\n    detail.selectedFinish = finishMode;\n    var bothFinishes = availability.online && availability.canEdit;\n    if (bothFinishes) {\n      this.renderDetailFinishChoices(body, finishMode);\n      this.els.detailPrimary.textContent = finishMode === 'editservice'\n        ? 'Continue with personalization'\n        : 'Continue with customize online';\n    } else {\n      // One supported route collapses to the single direct action.\n      this.els.detailPrimary.textContent = availability.online ? 'Customize this design' : 'Personalize this design';\n    }\n    this.els.detailPrimary.disabled = !this.currentDetailProductUrl() || (!availability.online && !availability.canEdit);\n    this.els.detailSecondary.disabled = !this.currentDetailProductUrl();\n    if (mode3d) {\n      // Re-attach the persistent stage into the freshly built preview box\n      // (the WebGL canvas survives the detach), then activate or update in\n      // place. ONE viewer page-wide: this stage is the page's only mount.\n      var preview3dState = this.ensureSheetPreview3d();\n      preview3dState.previewBox = preview;\n      preview.appendChild(preview3dState.stage);\n      if (preview3dState.status === 'active' && preview3dState.viewer) {\n        this.setSheetPreview3dPhase('active');\n        this.updateSheetPreview3d(preview3dResolution);\n      } else if (preview3dState.status === 'loading') {\n        this.setSheetPreview3dPhase(preview3dState.viewer && preview3dState.viewer.state.updating ? 'updating' : 'loading');\n        this.updateSheetPreview3d(preview3dResolution);\n      } else {\n        this.activateSheetPreview3d(preview3dResolution);\n      }\n    }\n    this.restoreFocusKey(body, restoreKey, restoreKey ? this.els.detailDialog : null);\n  };\n\n  // The truthful finish for the current template + product: the customer's\n  // explicit choice while both routes exist, the single supported route when\n  // only one exists, and '' when neither does. Never leaves a stale choice\n  // pointing at a route the current selection cannot fulfill (FINISH-06).\n  TemplateCollectionController.prototype.resolveDetailFinish = function (availability) {\n    var requested = asText(this.detail && this.detail.selectedFinish);\n    if (availability.online && availability.canEdit) {\n      return requested === 'editservice' ? 'editservice' : 'designonline';\n    }\n    if (availability.online) return 'designonline';\n    if (availability.canEdit) return 'editservice';\n    return '';\n  };\n\n  TemplateCollectionController.prototype.personalizationBrandLabel = function () {\n    return asText(window.__siteCfg && window.__siteCfg.personalization_service_label);\n  };\n\n  // Canonical edit-service price for the personalize choice. Mirrors the\n  // storefront runtime's getTemplateEditServicePriceMeta semantics on the\n  // fields the collection payload carries: edit_service_cost is the base,\n  // edit_service_sale overrides it, and the 'Free Edit Service' tag zeroes it.\n  TemplateCollectionController.prototype.editServicePrice = function (design) {\n    var rawCost = design ? design.edit_service_cost : null;\n    var rawSale = design ? design.edit_service_sale : null;\n    var cost = rawCost == null || rawCost === '' ? NaN : number(rawCost, NaN);\n    var sale = rawSale == null || rawSale === '' ? NaN : number(rawSale, NaN);\n    var effective = Number.isFinite(cost) ? cost : NaN;\n    if (Number.isFinite(sale) && sale >= 0) effective = sale;\n    var freeTag = list(design && design.tags).some(function (tag) {\n      return normalizedText(tag) === 'free edit service';\n    });\n    if (freeTag) effective = 0;\n    if (!Number.isFinite(effective)) return null;\n    return Math.round(effective * 100) / 100;\n  };\n\n  TemplateCollectionController.prototype.renderDetailFinishChoices = function (body, finishMode) {\n    var self = this;\n    var detail = this.detail;\n    var brandLabel = this.personalizationBrandLabel();\n    var editPrice = this.editServicePrice(detail.selectedDesign);\n    var editPriceLabel = editPrice == null\n      ? ''\n      : editPrice > 0 ? '$' + editPrice.toFixed(2) + ' \u2014 ' : 'Free \u2014 ';\n    var choices = [\n      {\n        id: 'designonline',\n        title: 'Customize online',\n        description: 'Edit the design yourself in our online editor.'\n      },\n      {\n        id: 'editservice',\n        title: brandLabel ? 'Have ' + brandLabel + ' personalize it' : 'Have us personalize it',\n        description: editPriceLabel + 'We update the design and send your proof before printing.'\n      }\n    ];\n    var group = document.createElement('div');\n    group.className = 'bg-tc-sheet__group';\n    group.setAttribute('role', 'radiogroup');\n    group.setAttribute('aria-label', 'How would you like to finish it?');\n    var heading = document.createElement('strong');\n    heading.textContent = 'How would you like to finish it?';\n    group.appendChild(heading);\n    choices.forEach(function (choice) {\n      var selected = choice.id === finishMode;\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'bg-tc-sheet__finish' + (selected ? ' is-selected' : '');\n      var finishFocusKey = 'finish:' + choice.id;\n      button.setAttribute('data-bg-tc-focus-key', finishFocusKey);\n      button.setAttribute('data-bg-tc-finish', choice.id);\n      button.setAttribute('role', 'radio');\n      button.setAttribute('aria-checked', selected ? 'true' : 'false');\n      var radio = document.createElement('span');\n      radio.className = 'bg-tc-sheet__radio';\n      radio.setAttribute('aria-hidden', 'true');\n      var copy = document.createElement('span');\n      var title = document.createElement('strong');\n      title.textContent = choice.title;\n      var description = document.createElement('small');\n      description.textContent = choice.description;\n      copy.append(title, description);\n      button.append(radio, copy);\n      button.addEventListener('click', function () {\n        detail.selectedFinish = choice.id;\n        self.renderDetailBody(finishFocusKey);\n      });\n      group.appendChild(button);\n    });\n    body.appendChild(group);\n  };\n\n  TemplateCollectionController.prototype.activeDetailPreviews = function () {\n    var detail = this.detail;\n    if (!detail) return [];\n    var design = detail.selectedDesign;\n    var backers = Array.isArray(design.backers) ? design.backers : [];\n    var backer = backers.find(function (entry) { return asText(entry.id) === detail.selectedBacker; });\n    return backer && Array.isArray(backer.previews) && backer.previews.length\n      ? backer.previews.map(asText).filter(Boolean)\n      : designPreviews(design);\n  };\n\n  // YTC-04: on a page with style scopes the sheet states the selected\n  // template's style truthfully \u2014 the customer-facing name(s) derived from\n  // the same product rules that gate the PDP. Re-renders with every product\n  // or size change, so the line always describes the current selection.\n  TemplateCollectionController.prototype.renderDetailStyle = function (body) {\n    var detail = this.detail;\n    if (!detail || !this.styleScopeActive()) return;\n    var scopes = this.styleScopesForItem(detail.selectedDesign);\n    if (!scopes.length) return;\n    var line = document.createElement('p');\n    line.className = 'bg-tc-sheet__style';\n    var label = document.createElement('strong');\n    label.textContent = 'Style:';\n    line.appendChild(label);\n    line.appendChild(document.createTextNode(' ' + scopes.map(function (scope) { return scope.label; }).join(' \u00B7 ')));\n    body.appendChild(line);\n  };\n\n  TemplateCollectionController.prototype.renderDetailProducts = function (body) {\n    var self = this;\n    var detail = this.detail;\n    if (!detail || detail.products.length <= 1) return;\n    var group = document.createElement('div');\n    group.className = 'bg-tc-sheet__group';\n    group.setAttribute('role', 'radiogroup');\n    group.setAttribute('aria-label', 'Product');\n    var heading = document.createElement('strong');\n    heading.textContent = 'Product';\n    group.appendChild(heading);\n    detail.products.forEach(function (entry) {\n      var selected = entry.handle === detail.selectedProductHandle;\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'bg-tc-sheet__product' + (selected ? ' is-selected' : '');\n      var productFocusKey = 'product:' + entry.handle;\n      button.setAttribute('data-bg-tc-focus-key', productFocusKey);\n      button.setAttribute('role', 'radio');\n      button.setAttribute('aria-checked', selected ? 'true' : 'false');\n      var radio = document.createElement('span');\n      radio.className = 'bg-tc-sheet__radio';\n      radio.setAttribute('aria-hidden', 'true');\n      var copy = document.createElement('span');\n      var title = document.createElement('strong');\n      title.textContent = productName(entry.product) || entry.handle;\n      var price = document.createElement('small');\n      price.textContent = self.startingPriceLabel(entry.design);\n      copy.append(title, price);\n      button.append(radio, copy);\n      button.addEventListener('click', function () {\n        detail.selectedProductHandle = entry.handle;\n        detail.selectedDesign = entry.design;\n        detail.selectedBacker = '';\n        detail.previewSide = 'front';\n        self.emit('tc_product_resolved', { productHandle: entry.handle });\n        self.renderDetailBody(productFocusKey);\n      });\n      group.appendChild(button);\n    });\n    body.appendChild(group);\n  };\n\n  TemplateCollectionController.prototype.detailDesignsForProduct = function () {\n    var detail = this.detail;\n    if (!detail) return [];\n    var self = this;\n    var selectedStyle = this.resolveStyleForDesign(detail.selectedDesign);\n    var entry = this.detailProductPreviewEntry();\n    var selected = entry && entry.status === 'ready' ? this.detailPreviewSelection(entry) : null;\n    var shapeHolderIds = entry && entry.status === 'ready' ? entry.holders.filter(function (holder) {\n      return holder.metadata && holder.metadata.htmlId === 'shape';\n    }).map(function (holder) { return holder.id; }) : [];\n    var activeShapes = selected ? selected.pairs.filter(function (pair) { return shapeHolderIds.indexOf(pair.optionId) !== -1; }) : [];\n    return detail.group.filter(function (design) {\n      if (productHandle(design) !== detail.selectedProductHandle) return false;\n      var style = self.resolveStyleForDesign(design);\n      if (selectedStyle && (!style || style.id !== selectedStyle.id)) return false;\n      if (!activeShapes.length) return true;\n      var candidate = self.detailPreviewSelection(entry, design);\n      return activeShapes.every(function (shape) {\n        return candidate.pairs.some(function (pair) { return pair.optionId === shape.optionId && pair.valueId === shape.valueId; });\n      });\n    });\n  };\n\n  TemplateCollectionController.prototype.renderDetailSizes = function (body) {\n    var self = this;\n    var detail = this.detail;\n    var designs = this.detailDesignsForProduct();\n    var bySize = new Map();\n    designs.forEach(function (design) {\n      actualDesignSizeValues(design).forEach(function (size) {\n        if (!bySize.has(normalizedText(size))) bySize.set(normalizedText(size), { label: size, design: design });\n      });\n    });\n    if (bySize.size <= 1) {\n      // Unsized native/legacy shape templates use the product's resolved\n      // default. Show that size instead of a blank menu of other geometries.\n      if (!actualDesignSizeValues(detail.selectedDesign).length) {\n        var entry = this.detailProductPreviewEntry();\n        var selection = entry && entry.status === 'ready' ? this.detailPreviewSelection(entry) : null;\n        var sizeHolderId = asText(entry && entry.editorSync && entry.editorSync.sizeHolderId);\n        var pair = selection && !selection.incompatible && selection.pairs.find(function (value) { return value.optionId === sizeHolderId; });\n        var holder = pair && entry.holders.find(function (value) { return value.id === sizeHolderId; });\n        var size = holder && holder.variations.find(function (value) { return value.id === pair.valueId; });\n        if (size && asText(size.label)) {\n          var summary = document.createElement('p');\n          var title = document.createElement('strong');\n          title.textContent = 'Size: ';\n          summary.append(title, document.createTextNode(asText(size.label)));\n          body.appendChild(summary);\n        }\n      }\n      return;\n    }\n    var group = document.createElement('label');\n    group.className = 'bg-tc-sheet__group';\n    var heading = document.createElement('strong');\n    heading.textContent = 'Size';\n    var select = document.createElement('select');\n    select.className = 'bg-tc-sheet__select';\n    select.setAttribute('aria-label', 'Size');\n    select.setAttribute('data-bg-tc-focus-key', 'size');\n    bySize.forEach(function (entry, key) { select.appendChild(new Option(entry.label, key)); });\n    select.value = normalizedText(actualDesignSizeValues(detail.selectedDesign)[0]);\n    select.addEventListener('change', function () {\n      var match = bySize.get(select.value);\n      if (!match) return;\n      detail.selectedDesign = match.design;\n      detail.selectedBacker = '';\n      detail.previewSide = 'front';\n      self.renderDetailBody('size');\n    });\n    group.append(heading, select);\n    body.appendChild(group);\n  };\n\n  TemplateCollectionController.prototype.renderDetailBackers = function (body) {\n    var self = this;\n    var detail = this.detail;\n    var design = detail && detail.selectedDesign;\n    var backers = Array.isArray(design && design.backers) ? design.backers.filter(function (entry) {\n      return entry && asText(entry.id || entry.label);\n    }) : [];\n    if (!backers.length) return;\n    if (!detail.selectedBacker) detail.selectedBacker = asText(design.default_backer_id || backers[0].id);\n    var group = document.createElement('div');\n    group.className = 'bg-tc-sheet__group';\n    group.setAttribute('role', 'radiogroup');\n    group.setAttribute('aria-label', 'Back side');\n    var heading = document.createElement('strong');\n    heading.textContent = 'Back side';\n    group.appendChild(heading);\n    backers.forEach(function (backer) {\n      var id = asText(backer.id || backer.label);\n      var selected = id === detail.selectedBacker;\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'bg-tc-sheet__backer';\n      var backerFocusKey = 'backer:' + id;\n      button.setAttribute('data-bg-tc-focus-key', backerFocusKey);\n      button.setAttribute('role', 'radio');\n      button.setAttribute('aria-checked', selected ? 'true' : 'false');\n      var radio = document.createElement('span');\n      radio.className = 'bg-tc-sheet__radio';\n      radio.setAttribute('aria-hidden', 'true');\n      var copy = document.createElement('span');\n      var title = document.createElement('strong');\n      title.textContent = asText(backer.label || backer.id);\n      var description = document.createElement('small');\n      description.textContent = 'Preview this back side';\n      copy.append(title, description);\n      button.append(radio, copy);\n      button.addEventListener('click', function () {\n        detail.selectedBacker = id;\n        detail.previewSide = 'back';\n        self.renderDetailBody(backerFocusKey);\n      });\n      group.appendChild(button);\n    });\n    body.appendChild(group);\n  };\n\n  // BD-B66 (same rule as the product page runtime): a card opens online only\n  // through a Studio template lookup or a real old-editor design id. A legacy\n  // row with an empty design id carries its Foundation row id (or a made-up\n  // designnum:/legacy: id) there instead, which no editor can open.\n  function designHasEditorSource(design) {\n    var source = design && typeof design === 'object' ? design : {};\n    if (asText(source.template_lookup || source.templateLookup || source.template_public_id\n      || source.templatePublicId || source.public_id || source.publicId)) return true;\n    var designId = asText(source.id);\n    if (!designId || designId === asText(source.__foundationTemplateId)) return false;\n    return !/^(?:designnum:|legacy:|legacy_design_template_)/.test(designId);\n  }\n\n  TemplateCollectionController.prototype.designAvailability = function (design) {\n    var online = bool(design && design.design_online_available);\n    var editability = normalizedText(design && design.editability);\n    var editServiceOnly = editability === 'edit service only';\n    var edit = bool(design && design.edit_service_available);\n    var canEdit = editServiceOnly || edit === true || (edit !== false && design && design.edit_service_cost != null);\n    return { online: !editServiceOnly && online !== false && designHasEditorSource(design), canEdit: canEdit };\n  };\n\n  TemplateCollectionController.prototype.productSupportsTemplateFinish = function (product, mode) {\n    if (!product || !mode) return false;\n    var binding = product.designerProductBinding && typeof product.designerProductBinding === 'object'\n      ? product.designerProductBinding\n      : {};\n    var config = product.artworkSection && typeof product.artworkSection === 'object'\n      ? product.artworkSection\n      : product.artworkSectionConfig && typeof product.artworkSectionConfig === 'object'\n        ? product.artworkSectionConfig\n        : binding.artworkSection && typeof binding.artworkSection === 'object'\n          ? binding.artworkSection\n          : {};\n    var modes = new Set(list(binding.allowedArtworkModes).map(function (value) {\n      return normalizedText(value).replace(/\\s+/g, '');\n    }));\n    return bool(config.showUseTemplate) !== false && modes.has(mode);\n  };\n\n  TemplateCollectionController.prototype.designAvailabilityForProduct = function (design, product) {\n    var availability = this.designAvailability(design);\n    return {\n      online: availability.online && this.productSupportsTemplateFinish(product, 'designonline'),\n      canEdit: availability.canEdit && this.productSupportsTemplateFinish(product, 'editservice')\n    };\n  };\n\n  // TC-DIALOG-01: the AI disclaimer rides the SHARED in-page confirmation\n  // dialog (bg-storefront-confirm.js \u2014 the same implementation the PDP\n  // runtime uses), never native window.confirm (dead in iframes, auto-\n  // dismissed by unattended browsers). Copy matches the runtime's\n  // confirmAiGeneratedEditServiceTemplate. Resolves true when the customer\n  // may proceed; fails closed as declined if the shared asset is missing.\n  TemplateCollectionController.prototype.confirmAiGeneratedEditService = function (design) {\n    if (bool(design && design.include_ai_gen_disclaimer) !== true) return Promise.resolve(true);\n    var shared = window.BgStorefrontConfirm;\n    if (!shared || typeof shared.open !== 'function') return Promise.resolve(false);\n    return shared.open({\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  // Admin reference totals include the page's default paid options and sale.\n  // Only a successful public read with no commerce configuration permits the\n  // existing legacy reference-price selection below.\n  TemplateCollectionController.prototype.startingPrice = function (design) {\n    var self = this;\n    var reader = window.BGReferencePricing;\n    if (!reader) return null;\n    var handle = reader.handle(design);\n    if (!handle || reader.linksElsewhere(design)) return null;\n    var options = { storeKey: this.config.storeKey, productHandle: handle, fetch: this.fetch };\n    var entry = reader.peek(options);\n    if (!this.referencePriceReads.has(handle)) {\n      this.referencePriceReads.add(handle);\n      reader.load(options).then(function () {\n        if (self.openOverlay === 'detail' && self.detail) self.renderDetailBody();\n      });\n    }\n    if (!entry || entry.status === 'pending' || entry.status === 'unavailable') return null;\n    if (entry.status === 'admin') {\n      // The choices the product page link selects: the template's printing\n      // and the Style buildTemplateUrl hands the page.\n      var handoffStyle = this.resolveStyleForDesign(design);\n      var adminRows = reader.rows(entry, Object.assign({}, design, {\n        Printing_targetingID: this.designPrinting(design) || design.Printing_targetingID,\n        Style_targetingID: handoffStyle ? handoffStyle.id : ''\n      }));\n      if (!adminRows) return null;\n      var details = entry.root.productDetails || entry.root.productData || {};\n      var normal = number(details.productPageConfig && details.productPageConfig.pricing && details.productPageConfig.pricing.normalQuantity, 0);\n      var product = this.productsByHandle.get(handle);\n      if (!normal) normal = number(product && product.normalQuantity, 0);\n      return adminRows.find(function (row) { return row.quantity === normal; })\n        || adminRows.find(function (row) { return row.isDefault; })\n        || adminRows[Math.floor((adminRows.length - 1) / 2)];\n    }\n    if (entry.status !== 'legacy') return null;\n    var prefix = asText(design && design.base_partial_sku);\n    if (!prefix) return null;\n    var pricing = this.pricing || {};\n    var rows = [];\n    Object.keys(pricing).forEach(function (sku) {\n      if (sku.indexOf(prefix + '-q') !== 0) return;\n      var quantityMatch = sku.match(/-q(\\d+(?:\\.\\d+)?)$/i);\n      var quantity = quantityMatch ? number(quantityMatch[1], 0) : 0;\n      var total = exactRowAmount(number(pricing[sku] && pricing[sku].price, 0));\n      if (!quantity || total <= 0) return;\n      rows.push({\n        quantity: quantity,\n        total: total,\n        isDefault: bool(pricing[sku] && pricing[sku].defaultQty) === true\n      });\n    });\n    if (!rows.length) return null;\n    rows.sort(function (a, b) { return a.quantity - b.quantity; });\n    var product = this.productsByHandle.get(productHandle(design));\n    var normalQuantity = number(product && product.normalQuantity, 0);\n    var chosen = null;\n    if (normalQuantity > 0) {\n      chosen = rows.find(function (row) { return row.quantity === normalQuantity; }) || null;\n    }\n    if (!chosen) chosen = rows.find(function (row) { return row.isDefault; }) || null;\n    if (!chosen) chosen = rows[Math.floor((rows.length - 1) / 2)];\n    return { quantity: chosen.quantity, total: chosen.total, unit: chosen.total / chosen.quantity };\n  };\n\n  TemplateCollectionController.prototype.startingPriceLabel = function (design) {\n    var price = this.startingPrice(design);\n    if (!price) return 'Pricing on product page';\n    if (price.quantity === 1) return 'From $' + price.total.toFixed(2);\n    return 'From $' + price.total.toFixed(2) + ' for ' + price.quantity;\n  };\n\n  TemplateCollectionController.prototype.currentDetailProduct = function () {\n    var detail = this.detail;\n    if (!detail) return null;\n    return this.productsByHandle.get(detail.selectedProductHandle) || null;\n  };\n\n  TemplateCollectionController.prototype.currentDetailProductUrl = function () {\n    var detail = this.detail;\n    if (!detail) return '';\n    return designProductUrl(detail.selectedDesign, this.productsByHandle) || productUrl(this.currentDetailProduct());\n  };\n\n  TemplateCollectionController.prototype.templateLookup = function (design) {\n    return asText(design && (\n      design.templateLookup\n      || design.templatePublicId\n      || design.template_public_id\n      || design.publicId\n      || design.public_id\n      || design.lookup\n    ));\n  };\n\n  TemplateCollectionController.prototype.designPrinting = function (design) {\n    var tags = list(design && design.tags);\n    for (var index = 0; index < tags.length; index += 1) {\n      var value = normalizedText(tags[index]);\n      if (/^(?:print )?(?:1|one) colou?r/.test(value)) return 'print-1-color';\n      if (/^(?:print )?full colou?r/.test(value)) return 'print-full-color';\n    }\n    return '';\n  };\n\n  TemplateCollectionController.prototype.buildTemplateUrl = function (finish) {\n    var detail = this.detail;\n    var design = detail && detail.selectedDesign;\n    var base = normalizeSameOriginUrl(this.currentDetailProductUrl());\n    if (!design || !base) return '';\n    var availability = this.designAvailabilityForProduct(design, this.currentDetailProduct());\n    if (finish && !availability.online && !availability.canEdit) return '';\n    var params = Object.assign({ from: 'templates' }, this.navigationContextParams());\n    if (design.id) params.id = design.id;\n    if (design.designnum) params.designnum = design.designnum;\n    var lookup = this.templateLookup(design);\n    if (lookup) params.templateLookup = lookup;\n    if (finish) {\n      // TC-FINISH-01: the handoff carries the CHOSEN finish, not an online\n      // auto-preference. resolveDetailFinish already collapsed the choice to\n      // a genuinely supported route for the current template + product.\n      var finishMode = this.resolveDetailFinish(availability);\n      if (finishMode === 'designonline') {\n        params.artwork = 'designonline';\n        params.designonline = 'true';\n        params.bg_template_action = 'customize_online';\n      } else if (finishMode === 'editservice') {\n        params.artwork = 'editservice';\n        params.editservice = 'true';\n        params.bg_template_action = 'edit_service';\n      }\n    }\n    // YTC-05: style and template travel together. The PDP preselects the\n    // compatible style from the template identity through the same option-\n    // source rules (ST1's arrival lane); the explicit Style param keeps the\n    // shared URL honest about the style the customer resolved here.\n    var handoffStyle = this.resolveStyleForDesign(design);\n    if (handoffStyle) params.Style = handoffStyle.id;\n    // The selected design identity is a hint. Product options, compatibility,\n    // pricing, fulfillment, and cart truth are resolved again on the PDP.\n    if (detail.selectedBacker) params.backer = detail.selectedBacker;\n    return appendParams(base, params);\n  };\n\n  // The style this template resolves to for the PDP handoff: the customer's\n  // active style scope when the template belongs to it, otherwise the first\n  // configured style containing the template's family \u2014 the same precedence\n  // the PDP's rule-driven arrival preselect lands on.\n  TemplateCollectionController.prototype.resolveStyleForDesign = function (design) {\n    var scopes = this.styleScopesForItem(design);\n    if (!scopes.length) return null;\n    var active = this.findStyleScope(this.scopeStyle);\n    if (active && scopes.some(function (scope) { return scope.id === active.id; })) return active;\n    return scopes[0];\n  };\n\n  TemplateCollectionController.prototype.runDetailPrimary = function () {\n    if (!this.detail) return;\n    if (this.detail.mode === 'rescue') {\n      this.runRescueSelection();\n      return;\n    }\n    var url = this.buildTemplateUrl(true);\n    if (!url) return;\n    var availability = this.designAvailabilityForProduct(this.detail.selectedDesign, this.currentDetailProduct());\n    var finishMode = this.resolveDetailFinish(availability);\n    if (!finishMode) return;\n    var self = this;\n    var design = this.detail.selectedDesign;\n    var proceed = function () {\n      if (!self.detail || self.detail.mode !== 'template' || self.openOverlay !== 'detail') return;\n      self.emit('tc_template_selected', { designKey: designKey(design) });\n      self.emit('tc_handoff', { finish: finishMode });\n      self.navigateOut(url);\n    };\n    if (finishMode === 'editservice') {\n      // Async: the AI disclaimer (when flagged) rides the shared in-page\n      // dialog mid-flow of the edit-service handoff.\n      void this.confirmAiGeneratedEditService(design).then(function (accepted) {\n        if (accepted) proceed();\n      });\n      return;\n    }\n    proceed();\n  };\n\n  TemplateCollectionController.prototype.runDetailSecondary = function () {\n    if (!this.detail || this.detail.mode !== 'template') return;\n    var url = this.buildTemplateUrl(false);\n    if (!url) return;\n    this.emit('tc_handoff', { finish: 'product_options' });\n    this.navigateOut(url);\n  };\n\n  TemplateCollectionController.prototype.handleRescue = function (mode, opener) {\n    var products = this.rescueProducts(mode);\n    if (!products.length) return;\n    this.emit('tc_rescue_selected', { action: mode });\n    if (this.experience.preset === 'product_specific') {\n      var direct = this.buildRescueUrl(products[0].product, mode);\n      if (direct) this.navigateOut(direct);\n      return;\n    }\n    this.detail = {\n      mode: 'rescue',\n      rescueMode: mode,\n      products: products,\n      selectedProductHandle: products[0] && products[0].handle || ''\n    };\n    this.renderRescueProductChooser();\n    this.openOwnedOverlay('detail', opener, 'rescue-' + mode);\n  };\n\n  TemplateCollectionController.prototype.renderRescueProductChooser = function (focusKey) {\n    var self = this;\n    var detail = this.detail;\n    if (!detail || detail.mode !== 'rescue') return;\n    this.els.detailTitle.textContent = 'Choose a product';\n    var restoreKey = focusKey || this.focusKey(this.els.detailBody);\n    this.els.detailBody.innerHTML = '';\n    var group = document.createElement('div');\n    group.className = 'bg-tc-sheet__group';\n    group.setAttribute('role', 'radiogroup');\n    group.setAttribute('aria-label', 'Product');\n    var heading = document.createElement('strong');\n    heading.textContent = 'Product';\n    group.appendChild(heading);\n    detail.products.forEach(function (entry) {\n      var selected = entry.handle === detail.selectedProductHandle;\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'bg-tc-sheet__product' + (selected ? ' is-selected' : '');\n      var productFocusKey = 'rescue-product:' + entry.handle;\n      button.setAttribute('data-bg-tc-focus-key', productFocusKey);\n      button.setAttribute('role', 'radio');\n      button.setAttribute('aria-checked', selected ? 'true' : 'false');\n      var radio = document.createElement('span');\n      radio.className = 'bg-tc-sheet__radio';\n      radio.setAttribute('aria-hidden', 'true');\n      var copy = document.createElement('span');\n      var title = document.createElement('strong');\n      title.textContent = productName(entry.product) || entry.handle;\n      var count = document.createElement('small');\n      count.textContent = entry.count + ' matching design' + (entry.count === 1 ? '' : 's');\n      copy.append(title, count);\n      button.append(radio, copy);\n      button.addEventListener('click', function () {\n        detail.selectedProductHandle = entry.handle;\n        self.emit('tc_product_resolved', { productHandle: entry.handle });\n        self.renderRescueProductChooser(productFocusKey);\n      });\n      group.appendChild(button);\n    });\n    this.els.detailBody.appendChild(group);\n    var labels = {\n      uploadfiles: 'Upload my design',\n      uploadcanva: 'Share a Canva link',\n      reorder: 'Reorder a past design',\n      customdesign: 'Custom design service'\n    };\n    this.els.detailPrimary.textContent = labels[detail.rescueMode] || 'Continue';\n    this.els.detailPrimary.disabled = !detail.selectedProductHandle;\n    this.els.detailSecondary.disabled = true;\n    this.els.detailSecondary.hidden = true;\n    this.restoreFocusKey(this.els.detailBody, restoreKey, restoreKey ? this.els.detailDialog : null);\n  };\n\n  TemplateCollectionController.prototype.buildRescueUrl = function (product, mode) {\n    if (!this.productSupportsRescue(product, mode)) return '';\n    var base = normalizeSameOriginUrl(productUrl(product) || asText(this.config.fallbackUploadUrl));\n    if (!base) return '';\n    var params = Object.assign({ artwork: mode }, this.navigationContextParams());\n    params[mode] = 'true';\n    return appendParams(base, params);\n  };\n\n  TemplateCollectionController.prototype.runRescueSelection = function () {\n    var detail = this.detail;\n    if (!detail || detail.mode !== 'rescue') return;\n    var entry = detail.products.find(function (product) { return product.handle === detail.selectedProductHandle; });\n    if (!entry) return;\n    var url = this.buildRescueUrl(entry.product, detail.rescueMode);\n    if (!url) return;\n    this.emit('tc_handoff', { finish: detail.rescueMode });\n    this.navigateOut(url);\n  };\n\n  TemplateCollectionController.prototype.navigateOut = function (url) {\n    var design = this.detail && this.detail.selectedDesign;\n    this.persistReturnState(design);\n    var destination = appendParams(normalizeSameOriginUrl(url), this.navigationContextParams());\n    if (!destination) return;\n    var marker = window.history.state && window.history.state.bgTcOverlay;\n    if (marker && marker.owner === this.instanceId) {\n      window.history.replaceState(currentStateWithoutOverlay(), '', window.location.href);\n      this.closeOverlayDirect(true, true);\n      // Replace the transient sheet entry with the PDP. The original\n      // collection entry remains the single browser-Back destination.\n      this.replaceNavigate(destination);\n      return;\n    }\n    this.navigate(destination);\n  };\n\n  function boot(root, options) {\n    var target = root || document.querySelector('[data-bg-tc-root]');\n    if (!target || target.__bgTemplateCollectionController) return target && target.__bgTemplateCollectionController || null;\n    var controller = new TemplateCollectionController(target, options || {});\n    target.__bgTemplateCollectionController = controller;\n    return controller.init();\n  }\n\n  window.BGTemplateCollectionProduction = {\n    boot: boot,\n    Controller: TemplateCollectionController,\n    normalizePayload: normalizePayload,\n    normalizeExperience: normalizeExperience,\n    normalizeSameOriginPath: normalizeSameOriginPath,\n    normalizeSameOriginUrl: normalizeSameOriginUrl,\n    designKey: designKey,\n    designName: designName,\n    appendParams: appendParams\n  };\n\n  function bootAll() {\n    document.querySelectorAll('[data-bg-tc-root]').forEach(function (root) { boot(root); });\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bootAll, { once: true });\n  else window.setTimeout(bootAll, 0);\n})(window, document);\n"],
  "mappings": "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",
  "names": ["window", "document", "productHandle", "handle", "product", "size", "entry"]
}
