{
  "version": 3,
  "sources": ["/cdn/shop/t/564/assets/pj-design-lab-renderer.js?n=1794669114411"],
  "sourcesContent": ["(function (root, factory) {\n  var api = factory(root);\n\n  root.PjDesignLabRenderer = api;\n\n  if (typeof module === 'object' && module.exports) {\n    module.exports = api;\n  }\n})(typeof window !== 'undefined' ? window : globalThis, function (root) {\n  'use strict';\n\n  var ZOOM_DEFAULT = 1;\n  // The client's accessory artboards are 3\" x 3\"; petBox values are inches on one.\n  var ARTBOARD_INCHES = 3;\n  var ZOOM_MIN = 0.4;\n  var ZOOM_MAX = 4;\n  var ZOOM_STEP = 0.25;\n\n  function clampPercent(value) {\n    var percent = Number(value);\n    if (!Number.isFinite(percent)) return 0;\n    return Math.min(100, Math.max(0, percent));\n  }\n\n  function clampZoom(value) {\n    var scale = Number(value);\n    if (!Number.isFinite(scale)) return ZOOM_DEFAULT;\n    return Math.min(ZOOM_MAX, Math.max(ZOOM_MIN, scale));\n  }\n\n  // `=` is the unshifted plus key on a US keyboard; numpad reports `+` / `-`\n  // or the older `Add` / `Subtract` keys depending on the browser.\n  function zoomDeltaFromKey(event) {\n    if (!event || event.ctrlKey || event.metaKey || event.altKey) return 0;\n\n    var key = event.key;\n    if (key === '+' || key === '=' || key === 'Add') return ZOOM_STEP;\n    if (key === '-' || key === '_' || key === 'Subtract') return -ZOOM_STEP;\n\n    var code = event.code;\n    if (code === 'NumpadAdd') return ZOOM_STEP;\n    if (code === 'NumpadSubtract') return -ZOOM_STEP;\n    return 0;\n  }\n\n  function isEditableTarget(target) {\n    if (!target) return false;\n    var tag = String(target.tagName || '').toUpperCase();\n    if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n    return Boolean(target.isContentEditable);\n  }\n\n  function normalizeMediaId(value) {\n    var raw = String(value == null ? '' : value).trim();\n    if (!raw) return '';\n    var parts = raw.split('/');\n    return parts[parts.length - 1] || raw;\n  }\n\n  function imageSource(image) {\n    if (!image) return '';\n    return (\n      image.getAttribute('data-full-src') ||\n      image.currentSrc ||\n      image.getAttribute('src') ||\n      image.src ||\n      ''\n    );\n  }\n\n  function resolveProductImage(doc, mediaId) {\n    var targetId = normalizeMediaId(mediaId);\n    if (!targetId || !doc || typeof doc.querySelectorAll !== 'function') return '';\n\n    var media = doc.querySelectorAll('[data-media-id]');\n    for (var index = 0; index < media.length; index += 1) {\n      if (normalizeMediaId(media[index].getAttribute('data-media-id')) !== targetId) continue;\n      var image =\n        media[index].tagName === 'IMG'\n          ? media[index]\n          : media[index].querySelector && media[index].querySelector('img');\n      var source = imageSource(image);\n      if (source) return source;\n    }\n\n    return '';\n  }\n\n  // The base image comes from the template's media key only. Alt text and\n  // data-title cannot tell a flat lay apart from a model shot, and a pet must\n  // never land on model imagery, so an unconfigured color reports itself here\n  // instead of guessing at a gallery slide.\n  function listGalleryMedia(doc) {\n    if (!doc || typeof doc.querySelectorAll !== 'function') return [];\n\n    var nodes = doc.querySelectorAll('[data-media-id]');\n    var seen = {};\n    var media = [];\n\n    for (var index = 0; index < nodes.length; index += 1) {\n      var node = nodes[index];\n      var mediaId = normalizeMediaId(node.getAttribute('data-media-id'));\n      if (!mediaId || seen[mediaId]) continue;\n\n      var image = node.tagName === 'IMG' ? node : node.querySelector && node.querySelector('img');\n      seen[mediaId] = true;\n      media.push({\n        mediaId: mediaId,\n        title:\n          node.getAttribute('data-title') ||\n          (image && typeof image.getAttribute === 'function' ? image.getAttribute('alt') : '') ||\n          '',\n      });\n    }\n\n    return media;\n  }\n\n  function selectedBackground(doc) {\n    if (!doc || typeof doc.querySelector !== 'function') return '';\n    var selected =\n      doc.querySelector('input[name*=\"-Color-\"]:checked') ||\n      doc.querySelector('input[name*=\"-Background-\"]:checked') ||\n      doc.querySelector('input[name*=\"-Colour-\"]:checked') ||\n      doc.querySelector('input[name*=\"Color\"]:checked');\n    if (selected && selected.value) return String(selected.value).trim();\n\n    var background = doc.querySelector(\n      '.backgroundHiddenInput:not(.backgroundHiddenInputBandana)'\n    );\n    return background && background.value ? String(background.value).trim() : '';\n  }\n\n  // Garment configuration (Long Sleeve Set, Pants Only, ...). Read live from the\n  // PDP form because the shopper can switch it while the studio is open.\n  function selectedStyle(doc) {\n    if (!doc || typeof doc.querySelector !== 'function') return '';\n    var select =\n      doc.querySelector('#surge-combined-listing-shell .native-style-select') ||\n      doc.querySelector('.native-style-select');\n    if (!select || (select.classList && select.classList.contains('placeholder-active'))) {\n      return '';\n    }\n    return select.value ? String(select.value).trim() : '';\n  }\n\n  function productColors(doc) {\n    if (!doc || typeof doc.getElementById !== 'function') return [];\n\n    var node = doc.getElementById('pjDesignLabPlacementRequiredColors');\n    if (!node) return [];\n\n    try {\n      var parsed = JSON.parse(node.textContent || node.innerHTML || '[]');\n      return Array.isArray(parsed) ? parsed : [];\n    } catch (error) {\n      return [];\n    }\n  }\n\n  // Colors reach us three ways: chosen by the shopper, implied because the\n  // product only sells one color, or not at all on a color-split product where\n  // the lone template owns the page. Only a real multi-color product with\n  // nothing chosen yet gets the ticket's Pink Dream default.\n  function resolveColor(doc, contextColor) {\n    var chosen = contextColor == null ? '' : String(contextColor).trim();\n    if (chosen) return chosen;\n\n    var colors = productColors(doc).filter(function (color) {\n      return color != null && String(color).trim();\n    });\n    if (colors.length === 1) return String(colors[0]).trim();\n    if (colors.length > 1) return soleTemplateColor(doc, colors) || 'Pink Dream';\n\n    return '';\n  }\n\n  function soleTemplateColor(doc, colors) {\n    if (!doc || typeof doc.getElementById !== 'function') return '';\n    var node = doc.getElementById('pjDesignLabPlacementConfig');\n    if (!node) return '';\n\n    var catalog;\n    try {\n      catalog = JSON.parse(node.textContent || node.innerHTML || 'null');\n    } catch (error) {\n      return '';\n    }\n    var templates = catalog && Array.isArray(catalog.templates) ? catalog.templates : [];\n    var placementApi = root.PjDesignLabPlacement;\n    var keyOf = function (value) {\n      return placementApi && typeof placementApi.normalizeColorKey === 'function'\n        ? placementApi.normalizeColorKey(value)\n        : String(value || '').trim().toLowerCase();\n    };\n\n    var color = '';\n    var key = '';\n    for (var index = 0; index < templates.length; index += 1) {\n      var template = templates[index];\n      var templateColor = template && String(template.color || template.colorKey || '').trim();\n      if (!templateColor) continue;\n      var templateKey = keyOf(templateColor);\n      if (key && templateKey !== key) return '';\n      if (!key) {\n        key = templateKey;\n        color = templateColor;\n      }\n    }\n    if (!key) return '';\n\n    var offered = colors.some(function (candidate) {\n      return keyOf(candidate) === key;\n    });\n    return offered ? color : '';\n  }\n\n  function buildComposition(placement, context) {\n    var petImages = context && Array.isArray(context.petImages) ? context.petImages : [];\n    if (!placement || !placement.ok) {\n      return { ok: false, reason: (placement && placement.reason) || 'missing-template' };\n    }\n    if (!placement.imageUrl && !placement.mediaId) {\n      return { ok: false, reason: 'missing-flat-lay' };\n    }\n    if (petImages.length < placement.petCount || petImages.slice(0, placement.petCount).some(function (url) {\n      return !url;\n    })) {\n      return { ok: false, reason: 'missing-pet-image' };\n    }\n\n    var settings = context && Array.isArray(context.petSettings) ? context.petSettings : [];\n    var shaded = Boolean(placement.flatUrl && placement.shadeUrl);\n    var activePet = Math.max(0, Number(context && context.activePet) || 0);\n    var activeSpot = -1;\n    // One entry per print spot; a pet repeated across the pattern has several.\n    return {\n      ok: true,\n      color: placement.color,\n      colorKey: placement.colorKey,\n      mediaId: placement.mediaId,\n      imageUrl: placement.imageUrl,\n      blank: Boolean(placement.blank),\n      // Fabric folds for the pets: base = flatUrl, pets, then shadeUrl\n      // multiplied on top (flat x shade = the blank as photographed).\n      flatUrl: shaded ? placement.flatUrl : '',\n      shadeUrl: shaded ? placement.shadeUrl : '',\n      // Print-layer masks, bottom to top (see PjGarmentLayers); each pet's\n      // slot.layer picks one. Empty: the blank itself is the only mask.\n      layerMasks: Array.isArray(placement.layerMasks) ? placement.layerMasks : [],\n      pets: placement.slots.map(function (slot, spotIndex) {\n        var index = slot.petIndex != null ? slot.petIndex : spotIndex;\n        var petSetting = settings[index] || {};\n        var overlay = petSetting.accessoryOverlay;\n        return {\n          petIndex: index,\n          imageUrl: petSetting.processedImage || petImages[index],\n          // On a repeat print the face keeps the spot's size; elsewhere the\n          // accessory artboard keeps its established order geometry.\n          slot: placement.blank && overlay && overlay.petBox ? artboardSlot(slot, overlay.petBox) : slot,\n          // One ring per active pet, on its first spot: a repeat print would\n          // otherwise ring every copy.\n          active: index === activePet && activeSpot < 0 && (activeSpot = spotIndex) >= 0,\n          processed: Boolean(petSetting.processedImage),\n          // A failed pet shows its untouched upload rather than the previous\n          // mode's output, so no stale cutout is passed off as the new mode.\n          processingFailed: Boolean(petSetting.processingError),\n          styleUnavailable: Boolean(petSetting.styleUnavailable),\n          extractionMode: petSetting.extractionMode || 'background',\n          style: petSetting.style || '',\n          accessory: petSetting.accessory || '',\n          accessoryOverlay: petSetting.accessoryOverlay || null,\n          accessoryAdjust: petSetting.accessoryAdjust || null,\n          scale: Number(petSetting.scale) > 0 ? Number(petSetting.scale) : 1,\n          offsetX: Number(petSetting.offsetX) || 0,\n          offsetY: Number(petSetting.offsetY) || 0,\n        };\n      }),\n    };\n  }\n\n  // An accessory artboard fits the pet into its smaller petBox. Grow the spot\n  // so that box, not the whole artboard, keeps the print spot's size and\n  // centre: the face stays as big as without an accessory and the accessory\n  // reaches past the spot.\n  // ponytail: assumes a square flat lay (all blanks and examples are).\n  function artboardSlot(slot, petBox) {\n    var boxSide = petBox.fit === 'height' ? petBox.height : Math.min(petBox.width, petBox.height);\n    if (!(boxSide > 0)) return slot;\n    var width = (slot.width * ARTBOARD_INCHES) / boxSide;\n    var boxCenterY = (petBox.y + petBox.height / 2) / ARTBOARD_INCHES;\n    return Object.assign({}, slot, {\n      width: width,\n      y: slot.y + (0.5 - boxCenterY) * width,\n    });\n  }\n\n  // First print spot of each pet, in pet order. Per-pet consumers (the order\n  // payload, the per-pet final images) want one entry per pet, not per spot.\n  function uniquePets(pets) {\n    var byPet = [];\n    pets.forEach(function (pet) {\n      if (!byPet[pet.petIndex]) byPet[pet.petIndex] = pet;\n    });\n    return byPet.filter(Boolean);\n  }\n\n  // ---- Accessory artboards -------------------------------------------------\n  // An accessory published with a `petBox` is a square artboard: its artwork\n  // is drawn whole and untouched over the pet's slot, and the pet is fitted\n  // into the box on it - scaled proportionally to the largest size that fits,\n  // centred on the artboard horizontally, and either top-aligned to the box or\n  // centred in it (`anchor`). The fit uses the pet's visible pixels, not the\n  // image edges: the style filters return a padded 1024px square, and padding\n  // would otherwise shrink and lower the pet against the accessory.\n\n  var FULL_BOUNDS = { x: 0, y: 0, width: 1, height: 1 };\n  var ALPHA_VISIBLE = 16;\n\n  // Visible-pixel box of RGBA pixel data, as fractions of the image. An image\n  // with nothing visible counts as all visible, so it still draws. `threshold`\n  // is the alpha a pixel must exceed to count (default ALPHA_VISIBLE).\n  function alphaBounds(data, width, height, threshold) {\n    var visibleAlpha = threshold == null ? ALPHA_VISIBLE : threshold;\n    var minX = width;\n    var minY = height;\n    var maxX = -1;\n    var maxY = -1;\n    for (var y = 0; y < height; y += 1) {\n      for (var x = 0; x < width; x += 1) {\n        if (data[(y * width + x) * 4 + 3] <= visibleAlpha) continue;\n        if (x < minX) minX = x;\n        if (x > maxX) maxX = x;\n        if (y < minY) minY = y;\n        if (y > maxY) maxY = y;\n      }\n    }\n    if (maxX < 0) return FULL_BOUNDS;\n    return {\n      x: minX / width,\n      y: minY / height,\n      width: (maxX - minX + 1) / width,\n      height: (maxY - minY + 1) / height,\n    };\n  }\n\n  // Where the whole pet image sits on the artboard, in fractions of the\n  // artboard, so that its visible `bounds` land in the box.\n  function fitPetToArtboard(petBox, imageWidth, imageHeight, bounds) {\n    var visible = bounds || FULL_BOUNDS;\n    var boxY = petBox.y / ARTBOARD_INCHES;\n    var boxW = petBox.width / ARTBOARD_INCHES;\n    var boxH = petBox.height / ARTBOARD_INCHES;\n    var visibleW = visible.width * imageWidth;\n    var visibleH = visible.height * imageHeight;\n\n    // One factor for both axes, so the pet is never stretched. `fit: height`\n    // fills the box top to bottom for accessories that touch both ends of the\n    // pet (the elf's hat and collar), letting a wide face run past the box's\n    // sides but never off the artboard.\n    var scale =\n      petBox.fit === 'height'\n        ? Math.min(boxH / visibleH, 1 / visibleW)\n        : Math.min(boxW / visibleW, boxH / visibleH);\n    var width = imageWidth * scale;\n    var height = imageHeight * scale;\n    var visibleTop =\n      petBox.anchor === 'center' ? boxY + (boxH - visibleH * scale) / 2 : boxY;\n\n    // Centred on the artboard, not the box: the sheet's Santa box sits\n    // 0.0084\" right of centre, and the spec is centre = 1.5\" on every board.\n    return {\n      left: 0.5 - (visible.x + visible.width / 2) * width,\n      top: visibleTop - visible.y * height,\n      width: width,\n      height: height,\n    };\n  }\n\n  // A finished face cutout is already the crop, so it is fitted whole into the\n  // square slot instead of filling it and cutting the head a second time.\n  var WHOLE_SLOT_BOX = {\n    x: 0,\n    y: 0,\n    width: ARTBOARD_INCHES,\n    height: ARTBOARD_INCHES,\n    anchor: 'center',\n  };\n\n  function keepsWholeCutout(pet) {\n    return Boolean(\n      pet &&\n        pet.extractionMode === 'face-cutout' &&\n        pet.processed &&\n        !pet.processingFailed &&\n        !pet.accessoryOverlay\n    );\n  }\n\n  function measureImage(doc, image) {\n    var width = image.naturalWidth || image.width;\n    var height = image.naturalHeight || image.height;\n    if (!width || !height) return { width: 1, height: 1, bounds: FULL_BOUNDS };\n\n    // Full resolution: a downscaled scan averages faint edges (whiskers, the\n    // airbrush haze) below the threshold and shifts the fit.\n    var bounds = FULL_BOUNDS;\n    try {\n      var canvas = doc.createElement('canvas');\n      canvas.width = width;\n      canvas.height = height;\n      var ctx = canvas.getContext('2d');\n      ctx.drawImage(image, 0, 0);\n      bounds = alphaBounds(ctx.getImageData(0, 0, width, height).data, width, height);\n    } catch (error) {\n      // A tainted canvas can't be read; fit the whole image instead.\n    }\n    return { width: width, height: height, bounds: bounds };\n  }\n\n  function createPreviewRenderer(doc, options) {\n    var config = options || {};\n    var context = {};\n    var zoomScale = ZOOM_DEFAULT;\n    var initialized = false;\n\n    function region(name) {\n      var modal = doc.getElementById('pvModal');\n      return modal && modal.querySelector('[data-pv-region=\"' + name + '\"]');\n    }\n\n    function showError(reason) {\n      var loaded = region('loaded');\n      var error = region('error');\n      // Every suppression reason is logged, not just the template ones: a blank\n      // canvas with no console trail is undiagnosable from a QA report.\n      if (root.console && typeof root.console.warn === 'function') {\n        root.console.warn('[PJ Design Lab] Preview unavailable.', {\n          reason: reason,\n          petCount: context.petCount,\n          petImages: context.petImages,\n          petSettings: context.petSettings,\n        });\n      }\n      if (loaded) loaded.hidden = true;\n      if (!error) return false;\n\n      error.hidden = false;\n      error.innerHTML = '';\n\n      var panel = doc.createElement('div');\n      panel.className = 'pv-render-error';\n\n      var title = doc.createElement('strong');\n      title.textContent = 'Preview unavailable';\n\n      var message = doc.createElement('p');\n      message.textContent =\n        reason === 'missing-template' || reason === 'missing-slots'\n          ? 'This pajama color or style is not configured for preview yet.'\n          : 'We could not load the product preview. Your uploaded photos are still safe.';\n\n      panel.appendChild(title);\n      panel.appendChild(message);\n      error.appendChild(panel);\n      return false;\n    }\n\n    // A blank flat lay is a transparent PNG of the garment, so its alpha\n    // doubles as the print area: pets crossing an edge are cut there, like a\n    // real print. Other flat-lay photos keep the old unclipped behaviour.\n    function printOpacity() {\n      var layers = root.PjGarmentLayers;\n      return layers && layers.PRINT_OPACITY ? layers.PRINT_OPACITY : 1;\n    }\n\n    // One clipped container per print layer, bottom to top, inside overlay.\n    function appendPrintLayers(overlay, composition) {\n      var masks = composition.layerMasks.length ? composition.layerMasks : [composition.imageUrl];\n      return masks.map(function (maskUrl) {\n        var layer = doc.createElement('div');\n        layer.className = 'pv-composite-print';\n        layer.style.opacity = String(printOpacity());\n        clipToMask(layer, maskUrl);\n        overlay.appendChild(layer);\n        return layer;\n      });\n    }\n\n    function clipToMask(node, maskUrl) {\n      var value = 'url(\"' + String(maskUrl).replace(/\"/g, '%22') + '\")';\n      ['maskImage', 'webkitMaskImage'].forEach(function (prop) {\n        node.style[prop] = value;\n      });\n      ['maskSize', 'webkitMaskSize'].forEach(function (prop) {\n        node.style[prop] = '100% 100%';\n      });\n      ['maskRepeat', 'webkitMaskRepeat'].forEach(function (prop) {\n        node.style[prop] = 'no-repeat';\n      });\n    }\n\n    function compositeElement() {\n      var loaded = region('loaded');\n      if (!loaded) return null;\n      if (typeof loaded.querySelector === 'function') {\n        return loaded.querySelector('.pv-composite');\n      }\n      return Array.prototype.find.call(loaded.children || [], function (child) {\n        return child.className === 'pv-composite';\n      });\n    }\n\n    // Off unless the shop metafield turns it on (see pj-design-lab-preview-modal.liquid).\n    function watermarkEnabled() {\n      var modal = doc.getElementById('pvModal');\n      return Boolean(modal && modal.dataset && modal.dataset.watermarkEnabled === 'true');\n    }\n\n    // Display only: laid over the composite as its own layer, never drawn into\n    // the pet images, which are the same files that go to checkout and print.\n    function createWatermark() {\n      var mark = doc.createElement('div');\n      mark.className = 'pv-composite-watermark';\n      mark.setAttribute('aria-hidden', 'true');\n      return mark;\n    }\n\n    // Right-click \"Save image\" and dragging an image out both reach the clean\n    // pet file beneath the mark, so neither is offered while it is on.\n    function onSaveAttempt(event) {\n      if (!watermarkEnabled()) return;\n      var target = event && event.target;\n      if (!target || typeof target.closest !== 'function' || !target.closest('.pv-composite')) {\n        return;\n      }\n      event.preventDefault();\n    }\n\n    function applyZoom() {\n      var frame = compositeElement();\n      if (frame) frame.style.transform = 'scale(' + zoomScale + ')';\n      return zoomScale;\n    }\n\n    function setZoom(nextScale) {\n      zoomScale = clampZoom(nextScale);\n      return applyZoom();\n    }\n\n    function zoomIn() {\n      return setZoom(zoomScale + ZOOM_STEP);\n    }\n\n    function zoomOut() {\n      return setZoom(zoomScale - ZOOM_STEP);\n    }\n\n    function resetZoom() {\n      return setZoom(ZOOM_DEFAULT);\n    }\n\n    function createPet(pet) {\n      var image = doc.createElement('img');\n      image.className = 'pv-composite-pet';\n      if (pet.extractionMode === 'background') image.classList.add('mode-background');\n      if (pet.processingFailed) image.classList.add('is-unprocessed');\n      if (pet.active) image.classList.add('sel-ring');\n      image.src = pet.imageUrl;\n      image.alt = 'Uploaded pet ' + (pet.petIndex + 1);\n      image.dataset.petIndex = String(pet.petIndex);\n      // Size comes from the placement slot (system-controlled). The customer's\n      // drag offset is clamped so a pet can't leave its flat-lay.\n      image.style.left = clampPercent(pet.slot.x + (Number(pet.offsetX) || 0)) + '%';\n      image.style.top = clampPercent(pet.slot.y + (Number(pet.offsetY) || 0)) + '%';\n      image.style.width = pet.slot.width * pet.scale + '%';\n      image.style.transform =\n        'translate(-50%, -50%) rotate(' + (Number(pet.slot.rotation) || 0) + 'deg)';\n\n      return image;\n    }\n\n    // The accessory is a sibling of the pet's image rather than a wrapper\n    // around it, so the review editor keeps finding .pv-composite-pet exactly\n    // where it did. .pv-composite-pet is aspect-ratio: 1, so a pet's box is\n    // square and the catalog's placement percentages - both measured against\n    // that box, as the wireframe measures them - transfer directly.\n    //\n    // The vertical offset is expressed as a share of the accessory's own\n    // height: a `top` percentage resolves against the composite's height,\n    // while the pet's box is sized off the composite's width, so the two are\n    // not interchangeable. Ordering the transform as centre -> rotate -> lift\n    // also keeps the accessory square to a rotated slot.\n    function createAccessory(pet, asset, isBack) {\n      var overlay = pet.accessoryOverlay;\n      // Both the artwork and its geometry come from the catalog, and the\n      // controls layer only hands over an overlay once it has both - there is\n      // no geometry to invent here, so an incomplete one simply draws nothing.\n      var placement = overlay && overlay.placement;\n      if (!overlay || !asset || !placement) return null;\n\n      var width = Number(placement.width);\n      var bottom = Number(placement.bottom);\n      if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(bottom)) return null;\n\n      // Distance from the pet's centre up to the accessory's bottom edge,\n      // restated as a percentage of the accessory's own height.\n      var lift = 50 + ((bottom - 50) / width) * 100;\n\n      var image = doc.createElement('img');\n      image.className = isBack ? 'pv-acc-overlay pv-acc-overlay--back' : 'pv-acc-overlay';\n      image.src = asset;\n      image.alt = '';\n      image.dataset.petIndex = String(pet.petIndex);\n      image.style.left = clampPercent(pet.slot.x + (Number(pet.offsetX) || 0)) + '%';\n      image.style.top = clampPercent(pet.slot.y + (Number(pet.offsetY) || 0)) + '%';\n      image.style.width = pet.slot.width * pet.scale * (width / 100) + '%';\n      image.style.transform =\n        'translate(-50%, -50%) rotate(' +\n        (Number(pet.slot.rotation) || 0) +\n        'deg) translateY(-' +\n        lift +\n        '%)';\n      return image;\n    }\n\n    // Pet image sizes and visible-pixel bounds by URL. A pet's first render\n    // waits (hidden) on them and redraws once they land, so the pet never\n    // flashes at the wrong size.\n    var imageSizes = {};\n\n    function petImageSize(url) {\n      var cached = imageSizes[url];\n      if (cached) return cached === 'pending' ? null : cached;\n\n      imageSizes[url] = 'pending';\n      Promise.resolve()\n        .then(function () {\n          return loadCompositeImage(url);\n        })\n        .then(function (image) {\n          return measureImage(doc, image);\n        })\n        .catch(function () {\n          return { width: 1, height: 1, bounds: FULL_BOUNDS };\n        })\n        .then(function (measured) {\n          imageSizes[url] = measured;\n          render();\n        });\n      return null;\n    }\n\n    // Artboard layers cover the pet's whole slot at the artwork's own size,\n    // so the accessory never moves or scales against the pet.\n    function createArtboardLayer(pet, asset, isBack) {\n      if (!asset) return null;\n      var image = doc.createElement('img');\n      image.className = isBack ? 'pv-acc-overlay pv-acc-overlay--back' : 'pv-acc-overlay';\n      image.src = asset;\n      image.alt = '';\n      image.dataset.petIndex = String(pet.petIndex);\n      image.style.left = clampPercent(pet.slot.x + (Number(pet.offsetX) || 0)) + '%';\n      image.style.top = clampPercent(pet.slot.y + (Number(pet.offsetY) || 0)) + '%';\n      image.style.width = pet.slot.width * pet.scale + '%';\n      image.style.transform =\n        'translate(-50%, -50%) rotate(' +\n        (Number(pet.slot.rotation) || 0) +\n        'deg)' +\n        accessoryAdjustTransform(layerAdjust(pet, isBack));\n      return image;\n    }\n\n    // TEST ONLY: one layer's manual placement - the elf's hat (front) and\n    // collar (back) are moved separately.\n    function layerAdjust(pet, isBack) {\n      var adjust = pet && pet.accessoryAdjust;\n      return (adjust && adjust[isBack ? 'back' : 'front']) || null;\n    }\n\n    // TEST ONLY: the shopper's manual accessory placement, in the artboard's\n    // own frame. Percent translate is of the layer, which is the artboard.\n    function accessoryAdjustTransform(adjust) {\n      if (!adjust) return '';\n      return (\n        ' translate(' +\n        adjust.x * 100 +\n        '%, ' +\n        adjust.y * 100 +\n        '%) rotate(' +\n        adjust.rotation +\n        'deg) scale(' +\n        adjust.scale +\n        ')'\n      );\n    }\n\n    // Canvas twin of accessoryAdjustTransform, for an accessory filling a\n    // `size` square centred on the current origin.\n    function drawAdjustedAccessory(ctx, image, size, adjust) {\n      ctx.save();\n      if (adjust) {\n        ctx.translate(adjust.x * size, adjust.y * size);\n        ctx.rotate((adjust.rotation * Math.PI) / 180);\n        ctx.scale(adjust.scale, adjust.scale);\n      }\n      ctx.drawImage(image, -size / 2, -size / 2, size, size);\n      ctx.restore();\n    }\n\n    // Places a node by a rect in artboard fractions, offset from the\n    // artboard's centre in the slot's rotated frame - the same\n    // centre -> rotate -> shift order createAccessory() uses.\n    function placeOnArtboard(node, pet, rect) {\n      var shiftX = ((rect.left + rect.width / 2 - 0.5) / rect.width) * 100;\n      var shiftY = ((rect.top + rect.height / 2 - 0.5) / rect.height) * 100;\n      node.style.width = pet.slot.width * pet.scale * rect.width + '%';\n      node.style.transform =\n        'translate(-50%, -50%) rotate(' +\n        (Number(pet.slot.rotation) || 0) +\n        'deg) translate(' +\n        shiftX +\n        '%, ' +\n        shiftY +\n        '%)';\n    }\n\n    function appendArtboard(layer, pet) {\n      var accessory = pet.accessoryOverlay;\n      var petBox = accessory.petBox;\n      var measured = petImageSize(pet.imageUrl);\n      var back = createArtboardLayer(pet, accessory.backAsset, true);\n      var image = createPet(pet);\n      image.classList.add('pv-composite-pet--artboard');\n      if (measured) {\n        placeOnArtboard(\n          image,\n          pet,\n          fitPetToArtboard(petBox, measured.width, measured.height, measured.bounds)\n        );\n      }\n      var front = createArtboardLayer(pet, accessory.asset, false);\n\n      // The active pet's ring is the sheet's pet box, a thin frame on its own\n      // layer rather than a shadow on the pet.\n      var ring = null;\n      if (pet.active) {\n        image.classList.remove('sel-ring');\n        ring = doc.createElement('div');\n        ring.className = 'pv-composite-ring';\n        ring.style.left = image.style.left;\n        ring.style.top = image.style.top;\n        ring.style.aspectRatio = petBox.width + ' / ' + petBox.height;\n        placeOnArtboard(ring, pet, {\n          left: petBox.x / ARTBOARD_INCHES,\n          top: petBox.y / ARTBOARD_INCHES,\n          width: petBox.width / ARTBOARD_INCHES,\n          height: petBox.height / ARTBOARD_INCHES,\n        });\n      }\n\n      [back, image, front, ring].forEach(function (node) {\n        if (!node) return;\n        if (!measured) node.style.visibility = 'hidden';\n        layer.appendChild(node);\n      });\n    }\n\n    // petImageSize() records an image it could not load as 1x1.\n    function failedToMeasure(url) {\n      var measured = imageSizes[url];\n      return Boolean(measured && measured.width === 1 && measured.height === 1);\n    }\n\n    function appendWholeCutout(layer, pet) {\n      var measured = petImageSize(pet.imageUrl);\n      var image = createPet(pet);\n      image.classList.add('pv-composite-pet--whole');\n      if (measured) {\n        placeOnArtboard(\n          image,\n          pet,\n          fitPetToArtboard(WHOLE_SLOT_BOX, measured.width, measured.height, measured.bounds)\n        );\n      } else {\n        image.style.visibility = 'hidden';\n      }\n      layer.appendChild(image);\n\n      if (!pet.active) return;\n      image.classList.remove('sel-ring');\n      var ring = doc.createElement('div');\n      ring.className = 'pv-composite-ring pv-composite-ring--slot';\n      ring.style.left = image.style.left;\n      ring.style.top = image.style.top;\n      ring.style.width = pet.slot.width * pet.scale + '%';\n      ring.style.transform =\n        'translate(-50%, -50%) rotate(' + (Number(pet.slot.rotation) || 0) + 'deg)';\n      if (!measured) ring.style.visibility = 'hidden';\n      layer.appendChild(ring);\n    }\n\n    // Missing template degrades to default slots. The launcher passes no\n    // mediaId, so with no template nothing names the base photo; use the slide\n    // the shopper is looking at (else the first one) rather than suppressing.\n    function getSlots(api, catalog, query) {\n      var result = (api.getSlotsOrDefault || api.getSlots)(catalog, query);\n      if (result && result.fallback && !result.mediaId && !result.imageUrl) {\n        var active = doc.querySelector && doc.querySelector('.is-active[data-media-id]');\n        var first = (config.listGalleryMedia || listGalleryMedia)(doc)[0];\n        result = Object.assign({}, result, {\n          mediaId:\n            (active && normalizeMediaId(active.getAttribute('data-media-id'))) ||\n            (first && first.mediaId) ||\n            '',\n        });\n      }\n      return result;\n    }\n\n    // `style` names another flat lay of the gallery to draw the same design on.\n    function placementQuery(color, style) {\n      return {\n        color: color,\n        style: style || (config.selectedStyle || selectedStyle)(doc),\n        mediaId: context.mediaId,\n        petCount: context.petCount,\n      };\n    }\n\n    function render(nextContext) {\n      if (nextContext) context = Object.assign({}, context, nextContext);\n\n      var placementApi = config.placement || root.PjDesignLabPlacement;\n      var loadedPlacement = placementApi && placementApi.current && placementApi.current();\n      var color = (config.resolveColor || resolveColor)(doc, context.color);\n      var query = placementQuery(color);\n      var placement =\n        loadedPlacement && getSlots(placementApi, loadedPlacement.catalog, query);\n      // Spots still being detected: keep what is shown; placement-ready\n      // renders again.\n      if (placement && !placement.ok && placement.pending) return false;\n      if (\n        !placement ||\n        placement.fallback ||\n        (!placement.ok &&\n          ['missing-catalog', 'missing-template', 'missing-slots'].indexOf(placement.reason) >= 0)\n      ) {\n        if (root.console && typeof root.console.warn === 'function') {\n          root.console.warn(\n            '[PJ Design Lab] Preview suppressed: no usable placement template.',\n            {\n              reason: (placement && placement.reason) || 'missing-template',\n              requestedColor: color || '(no color axis on this product)',\n              requestedColorKey:\n                placementApi && placementApi.normalizeColorKey\n                  ? placementApi.normalizeColorKey(color)\n                  : color,\n              requestedStyle: query.style,\n              requestedStyleKey:\n                placementApi && placementApi.normalizeStyleKey\n                  ? placementApi.normalizeStyleKey(query.style)\n                  : query.style,\n              requestedPetCount: context.petCount,\n              placement: placement,\n              galleryMedia: (config.listGalleryMedia || listGalleryMedia)(doc),\n              diagnostics:\n                placementApi && placementApi.diagnose ? placementApi.diagnose(doc) : null,\n              hint: 'Compare requestedColorKey / requestedStyleKey against templates[].colorKey / styleKey, and requestedPetCount against templates[].petCountsConfigured.',\n            }\n          );\n        }\n      }\n      var composition = buildComposition(placement, context);\n      if (!composition.ok) return showError(composition.reason);\n\n      var flatLay =\n        composition.imageUrl ||\n        (config.resolveProductImage || resolveProductImage)(doc, composition.mediaId);\n      if (!flatLay) return showError('missing-flat-lay');\n\n      var loaded = region('loaded');\n      var error = region('error');\n      if (!loaded) return false;\n\n      loaded.innerHTML = '';\n      loaded.hidden = false;\n      if (error) error.hidden = true;\n\n      var frame = doc.createElement('div');\n      frame.className = 'pv-composite';\n      frame.dataset.color = composition.colorKey;\n      frame.dataset.style = query.style;\n      frame.dataset.mediaId = composition.mediaId;\n      frame.style.transform = 'scale(' + zoomScale + ')';\n\n      var base = doc.createElement('img');\n      base.className = 'pv-composite-base';\n      base.src = composition.flatUrl || flatLay;\n      base.alt = composition.color + ' pajamas preview';\n      frame.appendChild(base);\n\n      var overlay = doc.createElement('div');\n      overlay.className = 'pv-composite-overlay';\n      var printLayers = composition.blank ? appendPrintLayers(overlay, composition) : [overlay];\n      composition.pets.forEach(function (pet) {\n        if (pet.styleUnavailable) return;\n        var target = printLayers[pet.slot.layer] || printLayers[0];\n        // An accessory that wraps behind the pet is drawn as a second layer\n        // under it, so the pet hides whatever of that layer it overlaps and\n        // the artwork reads as worn rather than stamped on top. Order is\n        // back layer -> pet -> front layer.\n        var accessory = pet.accessoryOverlay;\n        if (accessory && accessory.petBox) return appendArtboard(target, pet);\n        if (keepsWholeCutout(pet) && !failedToMeasure(pet.imageUrl)) {\n          return appendWholeCutout(target, pet);\n        }\n        var back = accessory && createAccessory(pet, accessory.backAsset, true);\n        if (back) target.appendChild(back);\n        target.appendChild(createPet(pet));\n        var front = accessory && createAccessory(pet, accessory.asset, false);\n        if (front) target.appendChild(front);\n      });\n      frame.appendChild(overlay);\n      if (composition.shadeUrl) {\n        var shade = doc.createElement('img');\n        shade.className = 'pv-composite-shade';\n        shade.src = composition.shadeUrl;\n        shade.alt = '';\n        frame.appendChild(shade);\n      }\n      if (watermarkEnabled()) {\n        frame.dataset.watermarked = 'true';\n        frame.appendChild(createWatermark());\n      }\n      loaded.appendChild(frame);\n\n      // The composite is torn down and rebuilt from scratch on every render,\n      // so anything overlaid on a pet image (the accessory handles) needs to\n      // know to re-attach itself to the new element.\n      if (typeof doc.dispatchEvent === 'function' && typeof root.CustomEvent === 'function') {\n        doc.dispatchEvent(\n          new root.CustomEvent('pj-design-lab:composite-rendered', {\n            detail: { activePet: Math.max(0, Number(context.activePet) || 0) },\n          })\n        );\n      }\n      return true;\n    }\n\n    // --- Flat-lay composite export (design-persistence) ---------------------\n    // The live preview above is a stack of positioned/rotated <img> elements;\n    // this bakes the same geometry into a single raster image for the cart\n    // thumbnail, since Shopify line-item properties need a URL, not a DOM\n    // tree. Every formula here is the pixel-space twin of createPet()'s and\n    // createAccessory()'s CSS: same slot/offset/scale/rotation percentages,\n    // same square (aspect-ratio: 1) pet/accessory boxes, same \"cover\" fit,\n    // same rotated-local-frame lift for\n    // the accessory. Never throws - a failed export just means no thumbnail,\n    // not a broken Add to Cart.\n\n    // Fetches the bytes directly and loads the image from a same-origin blob\n    // URL, rather than setting crossOrigin='anonymous' on an <img src=\"...\">.\n    // The pet/accessory images here are frequently already displayed\n    // elsewhere on the page (the live Design Lab preview itself) via a plain\n    // <img> with no crossOrigin attribute; browsers cache a resource by its\n    // CORS mode along with its URL, so a later crossOrigin='anonymous'\n    // request for the same URL can silently fail against that already-cached\n    // opaque response. A blob URL sidesteps this entirely - no cross-origin\n    // request happens at Image-decode time at all.\n    function loadCompositeImage(src) {\n      if (!src) return Promise.reject(new Error('no image url'));\n      return root\n        .fetch(src)\n        .then(function (response) {\n          if (!response.ok) throw new Error('image fetch failed: ' + src);\n          return response.blob();\n        })\n        .then(function (blob) {\n          return new Promise(function (resolve, reject) {\n            var objectUrl = root.URL.createObjectURL(blob);\n            var image = new root.Image();\n            image.onload = function () {\n              root.URL.revokeObjectURL(objectUrl);\n              resolve(image);\n            };\n            image.onerror = function () {\n              root.URL.revokeObjectURL(objectUrl);\n              reject(new Error('image failed to decode: ' + src));\n            };\n            image.src = objectUrl;\n          });\n        });\n    }\n\n    function computePetGeometry(canvasWidth, canvasHeight, pet) {\n      var widthPx = ((Number(pet.slot.width) || 0) * pet.scale * canvasWidth) / 100;\n      return {\n        widthPx: widthPx,\n        // .pv-composite-pet is aspect-ratio: 1 - a square box sized by width,\n        // not by the percentage-of-height that a literal height% would give.\n        heightPx: widthPx,\n        centerX: (clampPercent(pet.slot.x + (Number(pet.offsetX) || 0)) * canvasWidth) / 100,\n        centerY: (clampPercent(pet.slot.y + (Number(pet.offsetY) || 0)) * canvasHeight) / 100,\n        rotation: ((Number(pet.slot.rotation) || 0) * Math.PI) / 180,\n      };\n    }\n\n    function drawCover(ctx, image, boxWidth, boxHeight, contain) {\n      var srcW = image.naturalWidth || image.width;\n      var srcH = image.naturalHeight || image.height;\n      if (!srcW || !srcH) return;\n      // `contain` fits the whole image in the box instead of filling it.\n      var scale = (contain ? Math.min : Math.max)(boxWidth / srcW, boxHeight / srcH);\n      var drawW = srcW * scale;\n      var drawH = srcH * scale;\n      ctx.drawImage(image, -drawW / 2, -drawH / 2, drawW, drawH);\n    }\n\n    function drawPetLayer(ctx, geom, petImage) {\n      ctx.save();\n      ctx.translate(geom.centerX, geom.centerY);\n      ctx.rotate(geom.rotation);\n      ctx.beginPath();\n      ctx.rect(-geom.widthPx / 2, -geom.heightPx / 2, geom.widthPx, geom.heightPx);\n      ctx.clip();\n      drawCover(ctx, petImage, geom.widthPx, geom.heightPx, geom.contain);\n      ctx.restore();\n    }\n\n    function drawAccessoryLayer(ctx, geom, accessoryImage, overlayPlacement) {\n      var width = Number(overlayPlacement.width);\n      var bottom = Number(overlayPlacement.bottom);\n      if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(bottom)) return;\n\n      // Same lift formula as createAccessory(): distance from the pet's\n      // centre to the accessory's bottom edge, as a % of the accessory's\n      // own height.\n      var lift = 50 + ((bottom - 50) / width) * 100;\n      var accWidthPx = geom.widthPx * (width / 100);\n      var accHeightPx = accWidthPx;\n\n      ctx.save();\n      ctx.translate(geom.centerX, geom.centerY);\n      ctx.rotate(geom.rotation);\n      // Lift is applied in the already-rotated local frame, same as the CSS\n      // transform order (translate -50%/-50% then rotate then translateY) -\n      // the accessory rides the pet's rotation rather than staying upright.\n      ctx.translate(0, -(lift / 100) * accHeightPx);\n      ctx.beginPath();\n      ctx.rect(-accWidthPx / 2, -accHeightPx / 2, accWidthPx, accHeightPx);\n      ctx.clip();\n      drawCover(ctx, accessoryImage, accWidthPx, accHeightPx);\n      ctx.restore();\n    }\n\n    // Pixel-space twin of appendArtboard(): the artboard is the pet's square\n    // slot, accessory layers fill it whole, and the pet lands where\n    // fitPetToArtboard() puts it.\n    function drawArtboardLayers(ctx, geom, layer, petBox) {\n      var size = geom.widthPx;\n      var measured = measureImage(doc, layer.petImage);\n      var fit = fitPetToArtboard(petBox, measured.width, measured.height, measured.bounds);\n      var petX = (fit.left - 0.5) * size;\n      var petY = (fit.top - 0.5) * size;\n      var petW = fit.width * size;\n      var petH = fit.height * size;\n\n      ctx.save();\n      ctx.translate(geom.centerX, geom.centerY);\n      ctx.rotate(geom.rotation);\n      if (layer.backAccessoryImage) {\n        drawAdjustedAccessory(ctx, layer.backAccessoryImage, size, layerAdjust(layer.pet, true));\n      }\n      ctx.drawImage(layer.petImage, petX, petY, petW, petH);\n      if (layer.frontAccessoryImage) {\n        drawAdjustedAccessory(ctx, layer.frontAccessoryImage, size, layerAdjust(layer.pet, false));\n      }\n      ctx.restore();\n    }\n\n    // Pixel-space twin of appendWholeCutout().\n    function drawWholeCutout(ctx, geom, petImage, url) {\n      var size = geom.widthPx;\n      var cached = imageSizes[url];\n      var measured =\n        cached && cached !== 'pending' && cached.width === (petImage.naturalWidth || petImage.width)\n          ? cached\n          : measureImage(doc, petImage);\n      imageSizes[url] = measured;\n      var fit = fitPetToArtboard(WHOLE_SLOT_BOX, measured.width, measured.height, measured.bounds);\n      ctx.save();\n      ctx.translate(geom.centerX, geom.centerY);\n      ctx.rotate(geom.rotation);\n      ctx.drawImage(\n        petImage,\n        (fit.left - 0.5) * size,\n        (fit.top - 0.5) * size,\n        fit.width * size,\n        fit.height * size\n      );\n      ctx.restore();\n    }\n\n    function currentComposition(style) {\n      var placementApi = config.placement || root.PjDesignLabPlacement;\n      var loadedPlacement = placementApi && placementApi.current && placementApi.current();\n      var color = (config.resolveColor || resolveColor)(doc, context.color);\n      var placement =\n        loadedPlacement &&\n        getSlots(placementApi, loadedPlacement.catalog, placementQuery(color, style));\n      var composition = placement && buildComposition(placement, context);\n      if (!composition || !composition.ok) return null;\n\n      var flatLay =\n        composition.imageUrl ||\n        (config.resolveProductImage || resolveProductImage)(doc, composition.mediaId);\n      if (!flatLay) return null;\n\n      return {\n        composition: composition,\n        backgroundHex: placement.backgroundHex || '',\n        flatLay: flatLay,\n      };\n    }\n\n    function absoluteUrl(url) {\n      if (!url) return null;\n      try {\n        return new root.URL(url, root.location && root.location.href).href;\n      } catch (error) {\n        return null;\n      }\n    }\n\n    function renderedImageSize(src) {\n      if (typeof doc.querySelectorAll !== 'function') return null;\n      var images = doc.querySelectorAll('img');\n      for (var index = 0; index < images.length; index += 1) {\n        var image = images[index];\n        if (\n          image.getAttribute('src') !== src &&\n          image.currentSrc !== src &&\n          image.src !== src\n        ) {\n          continue;\n        }\n        if (image.complete && image.naturalWidth > 0 && image.naturalHeight > 0) {\n          return { width: image.naturalWidth, height: image.naturalHeight };\n        }\n      }\n      return null;\n    }\n\n    function describeComposition() {\n      if (typeof root.Promise === 'undefined') return null;\n\n      var current = currentComposition();\n      if (!current) return Promise.resolve(null);\n\n      var rendered = renderedImageSize(current.flatLay);\n      var frameSize = rendered\n        ? Promise.resolve(rendered)\n        : typeof root.Image === 'undefined'\n          ? Promise.resolve(null)\n          : loadCompositeImage(current.flatLay).then(function (baseImage) {\n              return {\n                width: baseImage.naturalWidth || baseImage.width,\n                height: baseImage.naturalHeight || baseImage.height,\n              };\n            });\n\n      return frameSize\n        .then(function (size) {\n          var width = size && size.width;\n          var height = size && size.height;\n          if (!(width > 0) || !(height > 0)) return null;\n          return {\n            frame: { width: width, height: height },\n            color: current.composition.color,\n            backgroundHex: current.backgroundHex,\n            pets: uniquePets(current.composition.pets).map(function (pet) {\n              var overlay = pet.accessoryOverlay;\n              var placement = overlay && overlay.placement;\n              var accessoryWidth = placement ? Number(placement.width) : NaN;\n              var accessoryBottom = placement ? Number(placement.bottom) : NaN;\n              var described = {\n                slot: {\n                  x: Number(pet.slot.x) || 0,\n                  y: Number(pet.slot.y) || 0,\n                  width: Number(pet.slot.width) || 0,\n                  rotation: Number(pet.slot.rotation) || 0,\n                },\n                accessoryLayers:\n                  Number.isFinite(accessoryWidth) && Number.isFinite(accessoryBottom)\n                    ? {\n                        front: absoluteUrl(overlay.asset),\n                        back: absoluteUrl(overlay.backAsset),\n                        placement: { width: accessoryWidth, bottom: accessoryBottom },\n                      }\n                    : null,\n              };\n              // Artboard accessories: what the preview actually drew. Production\n              // must fit the pet into this box rather than use `placement`.\n              if (overlay && overlay.petBox) {\n                described.accessoryLayers = {\n                  front: absoluteUrl(overlay.asset),\n                  back: absoluteUrl(overlay.backAsset),\n                  petBox: overlay.petBox,\n                };\n              }\n              return described;\n            }),\n          };\n        })\n        .catch(function () {\n          return null;\n        });\n    }\n\n    // A pattern repeats each pet across many spots; load each url once.\n    function loadPetLayers(pets) {\n      var loads = {};\n      function load(url) {\n        if (!url) return Promise.resolve(null);\n        if (!loads[url]) {\n          loads[url] = loadCompositeImage(url).catch(function () {\n            return null;\n          });\n        }\n        return loads[url];\n      }\n      return Promise.all(pets.map(function (pet) {\n        var accessory = pet.accessoryOverlay;\n        return Promise.all([\n          load(pet.imageUrl),\n          load(accessory && accessory.backAsset),\n          load(accessory && accessory.asset),\n        ]).then(function (results) {\n          return {\n            pet: pet,\n            petImage: results[0],\n            backAccessoryImage: results[1],\n            frontAccessoryImage: results[2],\n          };\n        });\n      }));\n    }\n\n    function drawPetWithAccessories(ctx, geom, layer) {\n      var petBox = layer.pet.accessoryOverlay && layer.pet.accessoryOverlay.petBox;\n      if (petBox) return drawArtboardLayers(ctx, geom, layer, petBox);\n      if (keepsWholeCutout(layer.pet)) {\n        return drawWholeCutout(ctx, geom, layer.petImage, layer.pet.imageUrl);\n      }\n      var overlayPlacement = layer.pet.accessoryOverlay && layer.pet.accessoryOverlay.placement;\n      if (layer.backAccessoryImage && overlayPlacement) {\n        drawAccessoryLayer(ctx, geom, layer.backAccessoryImage, overlayPlacement);\n      }\n      drawPetLayer(ctx, geom, layer.petImage);\n      if (layer.frontAccessoryImage && overlayPlacement) {\n        drawAccessoryLayer(ctx, geom, layer.frontAccessoryImage, overlayPlacement);\n      }\n    }\n\n    function uploadCompositeBlob(blob, filename) {\n      var modal = doc.getElementById('pvModal');\n      var endpoint = modal && modal.dataset && modal.dataset.uploadUrl;\n      var apiToken = modal && modal.dataset && modal.dataset.apiToken;\n      if (!blob || !endpoint || !apiToken || typeof root.fetch !== 'function') {\n        return Promise.resolve(null);\n      }\n      var formData = new root.FormData();\n      formData.append('image', blob, filename);\n      return root\n        .fetch(endpoint, { method: 'POST', headers: { 'api-token': apiToken }, body: formData })\n        .then(function (response) {\n          return response.ok ? response.json() : null;\n        })\n        .then(function (result) {\n          if (!result || !result.imageUrl) return null;\n          return /^https?:\\/\\//i.test(result.imageUrl)\n            ? result.imageUrl\n            : new root.URL(result.imageUrl, endpoint).toString();\n        });\n    }\n\n    // Draws the flat-lay with every pet and accessory on it. Shared by the\n    // upload export and the gallery preview so both are the same picture.\n    function renderCompositeBlob(style) {\n      if (\n        typeof doc.createElement !== 'function' ||\n        typeof root.Image === 'undefined' ||\n        typeof root.Promise === 'undefined'\n      ) {\n        return Promise.resolve(null);\n      }\n\n      var current = currentComposition(style);\n      if (!current) return Promise.resolve(null);\n      var composition = current.composition;\n\n      return loadCompositeImage(composition.flatUrl || current.flatLay)\n        .then(function (baseImage) {\n          var canvas = doc.createElement('canvas');\n          canvas.width = baseImage.naturalWidth || baseImage.width;\n          canvas.height = baseImage.naturalHeight || baseImage.height;\n          var ctx = canvas.getContext('2d');\n          ctx.drawImage(baseImage, 0, 0, canvas.width, canvas.height);\n\n          // Same print layers as appendPrintLayers(): a blank's pets go on one\n          // canvas per layer, cut to that layer's mask, then onto the base.\n          var masks = !composition.blank\n            ? Promise.resolve(null)\n            : composition.layerMasks.length\n              ? Promise.all(composition.layerMasks.map(loadCompositeImage))\n              : Promise.resolve([baseImage]);\n\n          return Promise.all([loadPetLayers(composition.pets), masks]).then(function (loaded) {\n            var layers = loaded[0];\n            var maskImages = loaded[1];\n            function drawPets(targetCtx, layerIndex) {\n              layers.forEach(function (layer) {\n                // A pet whose own image failed to load draws nothing rather\n                // than aborting the whole export - a partial thumbnail beats\n                // none.\n                if (!layer.petImage) return;\n                if (layerIndex != null && (layer.pet.slot.layer || 0) !== layerIndex) return;\n                drawPetWithAccessories(\n                  targetCtx,\n                  computePetGeometry(canvas.width, canvas.height, layer.pet),\n                  layer,\n                );\n              });\n            }\n            if (!maskImages) {\n              drawPets(ctx, null);\n            } else {\n              maskImages.forEach(function (maskImage, layerIndex) {\n                var printCanvas = doc.createElement('canvas');\n                printCanvas.width = canvas.width;\n                printCanvas.height = canvas.height;\n                var printCtx = printCanvas.getContext('2d');\n                drawPets(printCtx, maskImages.length > 1 ? layerIndex : null);\n                printCtx.globalCompositeOperation = 'destination-in';\n                printCtx.drawImage(maskImage, 0, 0, canvas.width, canvas.height);\n                ctx.globalAlpha = printOpacity();\n                ctx.drawImage(printCanvas, 0, 0);\n                ctx.globalAlpha = 1;\n              });\n            }\n\n            // Same fabric folds as the live preview's shade layer.\n            var shading = composition.shadeUrl\n              ? loadCompositeImage(composition.shadeUrl).catch(function () {\n                  return null;\n                })\n              : Promise.resolve(null);\n            return shading.then(function (shadeImage) {\n              if (shadeImage) {\n                ctx.globalCompositeOperation = 'multiply';\n                ctx.drawImage(shadeImage, 0, 0, canvas.width, canvas.height);\n                ctx.globalCompositeOperation = 'source-over';\n              }\n              return new Promise(function (resolve) {\n                canvas.toBlob(function (blob) {\n                  resolve(\n                    blob\n                      ? {\n                          blob: blob,\n                          mediaId: composition.mediaId,\n                          color: composition.colorKey,\n                        }\n                      : null,\n                  );\n                }, 'image/png');\n              });\n            });\n          });\n        })\n        .catch(function () {\n          return null;\n        });\n    }\n\n    function exportComposite() {\n      return renderCompositeBlob().then(function (rendered) {\n        return rendered ? uploadCompositeBlob(rendered.blob, 'flat-lay-composite.png') : null;\n      });\n    }\n\n    // The same composite as a local object URL for the PDP gallery. Never\n    // uploaded, so the caller owns the URL and must revoke it.\n    function previewComposite(style) {\n      return renderCompositeBlob(style).then(function (rendered) {\n        if (!rendered || !root.URL || typeof root.URL.createObjectURL !== 'function') {\n          return null;\n        }\n        return {\n          url: root.URL.createObjectURL(rendered.blob),\n          mediaId: rendered.mediaId,\n          color: rendered.color,\n        };\n      });\n    }\n    // One transparent PNG per pet - the pet (styled) with its own\n    // accessory layers, upright - so each pet's finished artwork is available\n    // separately from the garment composite. It is drawn on the pet's square\n    // artboard, PET_FINAL_SIZE px for its 3in, then cut to the artwork\n    // (finalCrop).\n    var PET_FINAL_SIZE = 1024;\n\n    function drawPetFinal(ctx, layer, shift) {\n      var size = PET_FINAL_SIZE;\n      var overlay = layer.pet.accessoryOverlay;\n      var hasArtboard = overlay && overlay.petBox;\n      // Artboard accessories fill the pet's own square; legacy ones sit above\n      // the pet, so shrink and drop the pet to leave room for them.\n      var petSize = hasArtboard ? size : size * 0.6;\n      drawPetWithAccessories(\n        ctx,\n        {\n          widthPx: petSize,\n          heightPx: petSize,\n          centerX: size / 2 + (shift ? shift.x : 0),\n          centerY: (hasArtboard || !overlay ? size / 2 : size * 0.62) + (shift ? shift.y : 0),\n          rotation: 0,\n          // The whole pet, never cut to fill the square (INT-1794628026).\n          contain: true,\n        },\n        layer,\n      );\n    }\n\n    // The part of the final's square the pet and its accessory cover, in\n    // pixels (INT-1794628026). The final is cut to it, so the PNG holds only\n    // the artwork with no padding, like a Cutout Pro file, at the artboard's\n    // scale - never larger than its 3x3in. Any visible pixel counts, so soft\n    // fur edges are kept. The whole square when the pixels can't be read.\n    function finalCrop(layer) {\n      var size = PET_FINAL_SIZE;\n      try {\n        var canvas = doc.createElement('canvas');\n        canvas.width = size;\n        canvas.height = size;\n        var ctx = canvas.getContext('2d');\n        drawPetFinal(ctx, layer);\n        var bounds = alphaBounds(ctx.getImageData(0, 0, size, size).data, size, size, 0);\n        return {\n          x: Math.round(bounds.x * size),\n          y: Math.round(bounds.y * size),\n          width: Math.max(1, Math.round(bounds.width * size)),\n          height: Math.max(1, Math.round(bounds.height * size)),\n        };\n      } catch (error) {\n        return { x: 0, y: 0, width: size, height: size };\n      }\n    }\n\n    function cropShift(crop) {\n      return { x: -crop.x, y: -crop.y };\n    }\n\n    function renderPetFinalBlob(layer) {\n      var crop = finalCrop(layer);\n      var canvas = doc.createElement('canvas');\n      canvas.width = crop.width;\n      canvas.height = crop.height;\n      drawPetFinal(canvas.getContext('2d'), layer, cropShift(crop));\n      return new Promise(function (resolve) {\n        canvas.toBlob(function (blob) {\n          resolve(blob || null);\n        }, 'image/png');\n      });\n    }\n\n    function exportPetFinals() {\n      if (\n        typeof doc.createElement !== 'function' ||\n        typeof root.Image === 'undefined' ||\n        typeof root.Promise === 'undefined'\n      ) {\n        return Promise.resolve([]);\n      }\n      var current = currentComposition();\n      if (!current) return Promise.resolve([]);\n\n      return loadPetLayers(uniquePets(current.composition.pets))\n        .then(function (layers) {\n          return Promise.all(\n            layers.map(function (layer, index) {\n              if (!layer.petImage) return null;\n              return renderPetFinalBlob(layer)\n                .then(function (blob) {\n                  return uploadCompositeBlob(blob, 'pet-' + (index + 1) + '-final.png');\n                })\n                .catch(function () {\n                  return null;\n                });\n            }),\n          );\n        })\n        .catch(function () {\n          return [];\n        });\n    }\n\n    // --- Clean finalize plan ------------------------------------------------\n    // While the Design Lab watermark is on, the images loaded here are\n    // watermarked copies, so the finished pictures are drawn by CORS from the\n    // clean ones instead. The same drawing code above runs against this\n    // recorder rather than a canvas, and the recorded draws (which image, at\n    // what size, cut and turned how, centred where) are what CORS repeats.\n    function createDrawRecorder(sourceOf) {\n      // Canvas transform [a, b, c, d, e, f]: x' = a*x + c*y + e, y' = b*x + d*y + f.\n      var matrix = [1, 0, 0, 1, 0, 0];\n      var clip = null;\n      var path = null;\n      var stack = [];\n      var draws = [];\n\n      function sameMatrix(other) {\n        for (var index = 0; index < 6; index += 1) {\n          if (Math.abs(other[index] - matrix[index]) > 1e-9) return false;\n        }\n        return true;\n      }\n\n      function intersect(first, second) {\n        var left = Math.max(first[0], second[0]);\n        var top = Math.max(first[1], second[1]);\n        var right = Math.min(first[0] + first[2], second[0] + second[2]);\n        var bottom = Math.min(first[1] + first[3], second[1] + second[3]);\n        return [left, top, right - left, bottom - top];\n      }\n\n      return {\n        draws: draws,\n        save: function () {\n          stack.push({ matrix: matrix.slice(), clip: clip });\n        },\n        restore: function () {\n          var saved = stack.pop();\n          if (!saved) return;\n          matrix = saved.matrix;\n          clip = saved.clip;\n        },\n        translate: function (x, y) {\n          matrix[4] += matrix[0] * x + matrix[2] * y;\n          matrix[5] += matrix[1] * x + matrix[3] * y;\n        },\n        rotate: function (angle) {\n          var cos = Math.cos(angle);\n          var sin = Math.sin(angle);\n          var a = matrix[0];\n          var b = matrix[1];\n          var c = matrix[2];\n          var d = matrix[3];\n          matrix[0] = a * cos + c * sin;\n          matrix[1] = b * cos + d * sin;\n          matrix[2] = c * cos - a * sin;\n          matrix[3] = d * cos - b * sin;\n        },\n        scale: function (x, y) {\n          matrix[0] *= x;\n          matrix[1] *= x;\n          matrix[2] *= y;\n          matrix[3] *= y;\n        },\n        beginPath: function () {\n          path = null;\n        },\n        rect: function (x, y, width, height) {\n          path = [x, y, width, height];\n        },\n        clip: function () {\n          if (!path) return;\n          var rect = clip && sameMatrix(clip.matrix) ? intersect(clip.rect, path) : path;\n          clip = { rect: rect, matrix: matrix.slice() };\n        },\n        drawImage: function (image, x, y, width, height) {\n          var source = sourceOf(image);\n          if (!source || !(width > 0) || !(height > 0)) return;\n          var drawn = [x, y, width, height];\n          // Every clip here is set in the frame the image is drawn in.\n          var visible = clip && sameMatrix(clip.matrix) ? intersect(clip.rect, drawn) : drawn;\n          if (!(visible[2] > 0) || !(visible[3] > 0)) return;\n\n          var scale = Math.sqrt(matrix[0] * matrix[0] + matrix[1] * matrix[1]);\n          var cut =\n            visible[0] !== x ||\n            visible[1] !== y ||\n            visible[2] !== width ||\n            visible[3] !== height;\n          var localX = visible[0] + visible[2] / 2;\n          var localY = visible[1] + visible[3] / 2;\n          draws.push({\n            source: source,\n            width: width * scale,\n            height: height * scale,\n            crop: cut\n              ? {\n                  left: (visible[0] - x) * scale,\n                  top: (visible[1] - y) * scale,\n                  width: visible[2] * scale,\n                  height: visible[3] * scale,\n                }\n              : null,\n            rotation: (Math.atan2(matrix[1], matrix[0]) * 180) / Math.PI,\n            centerX: matrix[0] * localX + matrix[2] * localY + matrix[4],\n            centerY: matrix[1] * localX + matrix[3] * localY + matrix[5],\n          });\n        },\n      };\n    }\n\n    // The flat-lay preview and each pet's final as draw plans, in the order of\n    // the composition's pets: `{ pet: N }` is that pet's own image, which CORS\n    // swaps for the clean one. Resolves null when there is nothing to plan.\n    function planFinalImages() {\n      if (typeof root.Image === 'undefined' || typeof root.Promise === 'undefined') {\n        return Promise.resolve(null);\n      }\n      var current = currentComposition();\n      if (!current) return Promise.resolve(null);\n      var composition = current.composition;\n      var background = absoluteUrl(current.flatLay);\n      if (!background) return Promise.resolve(null);\n\n      return Promise.all([loadCompositeImage(current.flatLay), loadPetLayers(composition.pets)])\n        .then(function (results) {\n          var baseImage = results[0];\n          var layers = results[1];\n          var width = baseImage.naturalWidth || baseImage.width;\n          var height = baseImage.naturalHeight || baseImage.height;\n          if (!(width > 0) || !(height > 0)) return null;\n\n          function sourceOf(image) {\n            for (var index = 0; index < layers.length; index += 1) {\n              var layer = layers[index];\n              var accessory = layer.pet.accessoryOverlay;\n              // A repeat print has one layer per spot: name the pet, not the spot.\n              if (image === layer.petImage) return { pet: layer.pet.petIndex != null ? layer.pet.petIndex : index };\n              if (image === layer.backAccessoryImage) return { url: absoluteUrl(accessory.backAsset) };\n              if (image === layer.frontAccessoryImage) return { url: absoluteUrl(accessory.asset) };\n            }\n            return null;\n          }\n\n          var preview = createDrawRecorder(sourceOf);\n          layers.forEach(function (layer) {\n            if (!layer.petImage) return;\n            drawPetWithAccessories(\n              preview,\n              computePetGeometry(width, height, layer.pet),\n              layer,\n            );\n          });\n\n          return {\n            preview: { width: width, height: height, background: background, draws: preview.draws },\n            // One final per pet: its first spot's layer.\n            finals: layers.filter(function (layer, index) {\n              var petIndex = layer.pet.petIndex != null ? layer.pet.petIndex : index;\n              return !layers.slice(0, index).some(function (earlier, earlierIndex) {\n                return (earlier.pet.petIndex != null ? earlier.pet.petIndex : earlierIndex) === petIndex;\n              });\n            }).map(function (layer) {\n              if (!layer.petImage) return null;\n              var final = createDrawRecorder(sourceOf);\n              var crop = finalCrop(layer);\n              drawPetFinal(final, layer, cropShift(crop));\n              return {\n                width: crop.width,\n                height: crop.height,\n                background: null,\n                draws: final.draws,\n              };\n            }),\n          };\n        })\n        .catch(function () {\n          return null;\n        });\n    }\n    // --- End flat-lay composite export --------------------------------------\n\n    function setContext(nextContext) {\n      context = Object.assign({}, context, nextContext || {});\n      return context;\n    }\n\n    function onLoadingComplete() {\n      render();\n    }\n\n    function onLoadingFailed() {\n      render();\n    }\n\n    function onVariantChange() {\n      if (!context || !context.petCount) return;\n      context.color = selectedBackground(doc);\n      render();\n    }\n\n    function onZoomClick(event) {\n      var target = event && event.target;\n      if (!target) return;\n      if (target.id === 'pvZoomIn') zoomIn();\n      if (target.id === 'pvZoomOut') zoomOut();\n    }\n\n    function previewIsOpen() {\n      var modal = doc.getElementById('pvModal');\n      return Boolean(modal && modal.classList && modal.classList.contains('open'));\n    }\n\n    function onZoomKeydown(event) {\n      if (!previewIsOpen() || isEditableTarget(event && event.target)) return;\n      var delta = zoomDeltaFromKey(event);\n      if (!delta) return;\n      if (typeof event.preventDefault === 'function') event.preventDefault();\n      setZoom(zoomScale + delta);\n    }\n\n    function init() {\n      if (initialized || !doc || typeof doc.addEventListener !== 'function') return;\n      initialized = true;\n      doc.addEventListener('pj-design-lab:preview-loading-complete', onLoadingComplete);\n      doc.addEventListener('pj-design-lab:preview-loading-failed', onLoadingFailed);\n      doc.addEventListener('variant:change', onVariantChange);\n      doc.addEventListener('change', onVariantChange);\n      doc.addEventListener('pj-design-lab:placement-ready', onVariantChange);\n      doc.addEventListener('click', onZoomClick);\n      doc.addEventListener('keydown', onZoomKeydown);\n      doc.addEventListener('contextmenu', onSaveAttempt);\n      doc.addEventListener('dragstart', onSaveAttempt);\n    }\n\n    init();\n\n    return {\n      setContext: setContext,\n      render: render,\n      setZoom: setZoom,\n      zoomIn: zoomIn,\n      zoomOut: zoomOut,\n      resetZoom: resetZoom,\n      exportComposite: exportComposite,\n      previewComposite: previewComposite,\n      exportPetFinals: exportPetFinals,\n      planFinalImages: planFinalImages,\n      describeComposition: describeComposition,\n      init: init,\n    };\n  }\n\n  var controller = root.document ? createPreviewRenderer(root.document) : null;\n\n  return {\n    normalizeMediaId: normalizeMediaId,\n    resolveProductImage: resolveProductImage,\n    listGalleryMedia: listGalleryMedia,\n    selectedBackground: selectedBackground,\n    selectedStyle: selectedStyle,\n    productColors: productColors,\n    resolveColor: resolveColor,\n    buildComposition: buildComposition,\n    alphaBounds: alphaBounds,\n    fitPetToArtboard: fitPetToArtboard,\n    keepsWholeCutout: keepsWholeCutout,\n    clampPercent: clampPercent,\n    clampZoom: clampZoom,\n    zoomDeltaFromKey: zoomDeltaFromKey,\n    createPreviewRenderer: createPreviewRenderer,\n    setContext: controller && controller.setContext,\n    render: controller && controller.render,\n    setZoom: controller && controller.setZoom,\n    zoomIn: controller && controller.zoomIn,\n    zoomOut: controller && controller.zoomOut,\n    resetZoom: controller && controller.resetZoom,\n    exportComposite: controller && controller.exportComposite,\n    previewComposite: controller && controller.previewComposite,\n    exportPetFinals: controller && controller.exportPetFinals,\n    planFinalImages: controller && controller.planFinalImages,\n    describeComposition: controller && controller.describeComposition,\n    init: controller && controller.init,\n  };\n});\n"],
  "mappings": "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",
  "names": []
}
