{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/craftdiy-preview-direct-edit-v1.js?craftdiy_release=v44-final.3"],
  "sourcesContent": ["(() => {\n  'use strict';\n\n  /*\n   * CRAFTDIY layered live preview v10\n   *\n   * This restores the rendering model used by the original three clear test\n   * products (663 / 1223 / 1273): the untouched base artwork remains a native\n   * <img>, while customer photo, birthstone colour and engraving are rendered\n   * on separate transparent canvases. The customizer's original combined\n   * canvas stays alive, hidden, and remains the source for cart/export data.\n   */\n  const VERSION = '6.0.2-v44-ring1387-live-slot-preview';\n  const STAGE_REFERENCE_WIDTH = 1000;\n  /* The visible photo, stone and text layers are displayed inside the real\n   * gallery stage and can then be enlarged by the customer's preview transform.\n   * A 1x bitmap is visibly resampled on Retina iPhones, so every transparent\n   * layer is rendered at 2x while its logical coordinates follow the stage. */\n  const LAYER_RENDER_SCALE_MIN = 2;\n  const LAYER_RENDER_SCALE_MAX = 3.25;\n  const LAYER_MAX_PIXELS = 14000000;\n  const PHOTO_ZOOM_MIN = 1;\n  const PHOTO_ZOOM_MAX = 3;\n  const PHOTO_OFFSET_MIN = -1;\n  const PHOTO_OFFSET_MAX = 1;\n  const PREVIEW_SCALE_MIN = 1;\n  const PREVIEW_SCALE_MAX = 3.25;\n  const boundCustomizers = new WeakSet();\n\n  /* Offline-measured artwork framing. Only SKUs whose product occupies less\n   * than about half of the white reference image are listed. Keeping this map\n   * explicit avoids runtime canvas pixel reads and leaves all other products,\n   * especially photo-locket masks, on their approved 1\u00D7 framing. */\n  const PREVIEW_ARTWORK_PRESETS = {\n    'birthstone-engraved-rings/2': { scale: 1.5, cx: 0.5194, cy: 0.5028 },\n    'birthstone-engraved-rings/3': { scale: 1.5, cx: 0.5194, cy: 0.5 },\n    'birthstone-engraved-rings/4': { scale: 1.5, cx: 0.5194, cy: 0.5056 },\n    'birthstone-engraved-rings/6': { scale: 1.5, cx: 0.5056, cy: 0.5472 },\n    'birthstone-engraved-rings/7': { scale: 1.5, cx: 0.5083, cy: 0.5472 },\n    'birthstone-engraved-rings/8': { scale: 1.5, cx: 0.5, cy: 0.5528 },\n    'birthstone-engraved-rings/33': { scale: 1.5, cx: 0.5083, cy: 0.5056 },\n    'birthstone-engraved-rings/34': { scale: 1.5, cx: 0.5056, cy: 0.5056 },\n    'birthstone-engraved-rings/35': { scale: 1.5, cx: 0.5139, cy: 0.4972 },\n  };\n\n  const clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n  const percentX = (value, canvas) => (Number(value || 0) / 100) * canvas.width;\n  const percentY = (value, canvas) => (Number(value || 0) / 100) * canvas.height;\n\n  function injectStyles() {\n    if (document.querySelector('[data-craftdiy-layered-preview-style]')) return;\n    const style = document.createElement('style');\n    style.dataset.craftdiyLayeredPreviewStyle = VERSION;\n    style.textContent = `\n      .craftdiy-layered-stage{position:relative!important;overflow:hidden!important}\n      .craftdiy-layered-art{\n        position:absolute!important;\n        inset:0!important;\n        z-index:6!important;\n        width:100%!important;\n        height:100%!important;\n        overflow:visible!important;\n        transform-origin:50% 50%!important;\n        touch-action:none!important;\n        overscroll-behavior:contain!important;\n        user-select:none!important;\n        -webkit-user-select:none!important;\n        -webkit-user-drag:none!important;\n        cursor:grab!important;\n        contain:layout style;\n      }\n      .craftdiy-layered-art.is-dragging{cursor:grabbing!important}\n      .craftdiy-layered-art>img,\n      .craftdiy-layered-art>canvas{\n        position:absolute!important;\n        inset:0!important;\n        display:block!important;\n        width:100%!important;\n        height:100%!important;\n        max-width:none!important;\n        max-height:none!important;\n        margin:0!important;\n        padding:0!important;\n        border:0!important;\n        transform:none!important;\n        filter:none!important;\n        -webkit-filter:none!important;\n        image-rendering:auto!important;\n        backface-visibility:visible!important;\n        -webkit-backface-visibility:visible!important;\n        pointer-events:none!important;\n      }\n      .craftdiy-layered-base{z-index:1!important;object-fit:contain!important;object-position:center center!important}\n      .craftdiy-layered-photo{z-index:2!important}\n      .craftdiy-layered-stone{z-index:4!important;mix-blend-mode:normal!important}\n      .craftdiy-layered-text{z-index:5!important;mix-blend-mode:multiply!important}\n      .craftdiy-birthstone-notice{\n        position:absolute!important;\n        left:50%!important;\n        bottom:16px!important;\n        z-index:12!important;\n        width:max-content!important;\n        max-width:calc(100% - 32px)!important;\n        transform:translateX(-50%)!important;\n        padding:9px 15px!important;\n        border:1px solid rgba(177,119,51,.5)!important;\n        border-radius:999px!important;\n        background:rgba(255,248,236,.96)!important;\n        box-shadow:0 7px 22px rgba(111,73,34,.15)!important;\n        color:#81531f!important;\n        font:700 12px/1.35 Arial,sans-serif!important;\n        letter-spacing:.025em!important;\n        text-align:center!important;\n        pointer-events:none!important;\n        backdrop-filter:blur(7px)!important;\n        -webkit-backdrop-filter:blur(7px)!important;\n        animation:craftdiy-birthstone-notice-pulse 1.45s ease-in-out infinite!important;\n      }\n      .craftdiy-birthstone-notice[hidden]{display:none!important}\n      canvas.craftdiy-layered-source{\n        position:absolute!important;\n        inset:0!important;\n        display:block!important;\n        width:100%!important;\n        height:100%!important;\n        z-index:0!important;\n        opacity:0!important;\n        visibility:hidden!important;\n        pointer-events:none!important;\n      }\n      .cv9__custom-preview .craftdiy-layered-art,\n      .cv9__custom-preview .craftdiy-layered-art>img,\n      .cv9__custom-preview .craftdiy-layered-art>canvas{\n        filter:none!important;\n        -webkit-filter:none!important;\n      }\n      .cv9__custom-preview .craftdiy-layered-art>img,\n      .cv9__custom-preview .craftdiy-layered-art>canvas{\n        image-rendering:auto!important;\n      }\n      @supports (-webkit-touch-callout:none){\n        .cv9__custom-preview .craftdiy-layered-base{\n          image-rendering:-webkit-optimize-contrast!important;\n        }\n      }\n      @keyframes craftdiy-live-preview-pulse{\n        0%,100%{opacity:.5;box-shadow:0 0 0 2px rgba(118,214,154,.12),0 0 0 rgba(118,214,154,0)}\n        45%{opacity:1;box-shadow:0 0 0 4px rgba(118,214,154,.24),0 0 12px rgba(118,214,154,.92)}\n      }\n      @keyframes craftdiy-birthstone-notice-pulse{\n        0%,100%{opacity:.68;box-shadow:0 7px 18px rgba(111,73,34,.09)}\n        50%{opacity:1;box-shadow:0 7px 24px rgba(177,119,51,.24)}\n      }\n      .cv9__live-preview-badge i{\n        animation:craftdiy-live-preview-pulse 1.15s ease-in-out infinite!important;\n        will-change:opacity,box-shadow;\n      }\n      @media(prefers-reduced-motion:reduce){\n        .cv9__live-preview-badge i{animation:none!important;opacity:1!important}\n        .craftdiy-birthstone-notice{animation:none!important;opacity:1!important}\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  function zonePoints(zone, canvas) {\n    if (Array.isArray(zone?.points) && zone.points.length > 2) {\n      return zone.points.map((point) => ({\n        x: percentX(point.x, canvas),\n        y: percentY(point.y, canvas),\n      }));\n    }\n    const cx = percentX(zone?.x, canvas);\n    const cy = percentY(zone?.y, canvas);\n    const halfW = percentX(zone?.w, canvas) / 2;\n    const halfH = percentY(zone?.h, canvas) / 2;\n    return [\n      { x: cx - halfW, y: cy - halfH },\n      { x: cx + halfW, y: cy - halfH },\n      { x: cx + halfW, y: cy + halfH },\n      { x: cx - halfW, y: cy + halfH },\n    ];\n  }\n\n  function boundsForPoints(points) {\n    const xs = points.map((point) => point.x);\n    const ys = points.map((point) => point.y);\n    const minX = Math.min(...xs);\n    const maxX = Math.max(...xs);\n    const minY = Math.min(...ys);\n    const maxY = Math.max(...ys);\n    return {\n      x: minX,\n      y: minY,\n      width: Math.max(1, maxX - minX),\n      height: Math.max(1, maxY - minY),\n      cx: (minX + maxX) / 2,\n      cy: (minY + maxY) / 2,\n    };\n  }\n\n  function unionBounds(bounds) {\n    if (!bounds.length) return null;\n    const minX = Math.min(...bounds.map((item) => item.x));\n    const minY = Math.min(...bounds.map((item) => item.y));\n    const maxX = Math.max(...bounds.map((item) => item.x + item.width));\n    const maxY = Math.max(...bounds.map((item) => item.y + item.height));\n    return {\n      x: minX,\n      y: minY,\n      width: Math.max(1, maxX - minX),\n      height: Math.max(1, maxY - minY),\n      cx: (minX + maxX) / 2,\n      cy: (minY + maxY) / 2,\n    };\n  }\n\n  function pointInPolygon(point, polygon) {\n    let inside = false;\n    for (let index = 0, previous = polygon.length - 1; index < polygon.length; previous = index++) {\n      const currentPoint = polygon[index];\n      const previousPoint = polygon[previous];\n      const intersects = ((currentPoint.y > point.y) !== (previousPoint.y > point.y))\n        && (point.x < ((previousPoint.x - currentPoint.x) * (point.y - currentPoint.y))\n          / ((previousPoint.y - currentPoint.y) || 0.00001) + currentPoint.x);\n      if (intersects) inside = !inside;\n    }\n    return inside;\n  }\n\n  function pointInZone(point, zone, canvas) {\n    const points = zonePoints(zone, canvas);\n    if (Array.isArray(zone?.points) && zone.points.length > 2) return pointInPolygon(point, points);\n    const bounds = boundsForPoints(points);\n    const angle = -(Number(zone?.rotation || 0) * Math.PI) / 180;\n    const dx = point.x - bounds.cx;\n    const dy = point.y - bounds.cy;\n    const rotatedX = dx * Math.cos(angle) - dy * Math.sin(angle) + bounds.cx;\n    const rotatedY = dx * Math.sin(angle) + dy * Math.cos(angle) + bounds.cy;\n    if (zone?.shape === 'ellipse') {\n      const radiusX = bounds.width / 2 || 1;\n      const radiusY = bounds.height / 2 || 1;\n      return ((rotatedX - bounds.cx) / radiusX) ** 2\n        + ((rotatedY - bounds.cy) / radiusY) ** 2 <= 1;\n    }\n    return rotatedX >= bounds.x && rotatedX <= bounds.x + bounds.width\n      && rotatedY >= bounds.y && rotatedY <= bounds.y + bounds.height;\n  }\n\n  function surfacePoint(surface, canvas, clientX, clientY) {\n    const rect = surface.getBoundingClientRect();\n    if (!rect.width || !rect.height) return null;\n    return {\n      x: ((clientX - rect.left) / rect.width) * canvas.width,\n      y: ((clientY - rect.top) / rect.height) * canvas.height,\n    };\n  }\n\n  function clientDistance(entries) {\n    if (entries.length < 2) return 0;\n    return Math.hypot(\n      entries[0].clientX - entries[1].clientX,\n      entries[0].clientY - entries[1].clientY,\n    );\n  }\n\n  function weightedBoundary(values, ratio) {\n    const total = values.reduce((sum, value) => sum + value, 0);\n    if (!total) return ratio < 0.5 ? 0 : values.length - 1;\n    const target = total * ratio;\n    let sum = 0;\n    for (let index = 0; index < values.length; index += 1) {\n      sum += values[index];\n      if (sum >= target) return index;\n    }\n    return values.length - 1;\n  }\n\n  function detectArtworkBounds(image) {\n    if (!image) return null;\n    try {\n      const size = 180;\n      const sample = document.createElement('canvas');\n      sample.width = size;\n      sample.height = size;\n      const context = sample.getContext('2d', { willReadFrequently: true });\n      context.imageSmoothingEnabled = true;\n      context.imageSmoothingQuality = 'high';\n      context.drawImage(image, 0, 0, size, size);\n      const pixels = context.getImageData(0, 0, size, size).data;\n      const columns = Array(size).fill(0);\n      const rows = Array(size).fill(0);\n      for (let y = 0; y < size; y += 1) {\n        for (let x = 0; x < size; x += 1) {\n          const offset = (y * size + x) * 4;\n          if (pixels[offset + 3] < 20) continue;\n          const red = pixels[offset];\n          const green = pixels[offset + 1];\n          const blue = pixels[offset + 2];\n          const darkness = Math.max(0, 250 - ((red + green + blue) / 3));\n          const colour = Math.max(red, green, blue) - Math.min(red, green, blue);\n          const weight = darkness + colour * 0.42;\n          if (weight < 5) continue;\n          columns[x] += weight;\n          rows[y] += weight;\n        }\n      }\n      const left = weightedBoundary(columns, 0.055) / size;\n      const right = (weightedBoundary(columns, 0.945) + 1) / size;\n      const top = weightedBoundary(rows, 0.055) / size;\n      const bottom = (weightedBoundary(rows, 0.945) + 1) / size;\n      return {\n        x: left,\n        y: top,\n        width: Math.max(0.08, right - left),\n        height: Math.max(0.08, bottom - top),\n        cx: (left + right) / 2,\n        cy: (top + bottom) / 2,\n      };\n    } catch (error) {\n      return null;\n    }\n  }\n\n  function editableFocusBounds(customizer, canvas) {\n    const zones = [\n      ...(customizer.config?.photoZones || []),\n      ...(customizer.config?.textZones || []),\n    ];\n    const bounds = zones.map((zone) => boundsForPoints(zonePoints(zone, canvas)));\n    if (!bounds.length) return null;\n    const union = unionBounds(bounds);\n    return {\n      x: union.x / canvas.width,\n      y: union.y / canvas.height,\n      width: union.width / canvas.width,\n      height: union.height / canvas.height,\n      cx: union.cx / canvas.width,\n      cy: union.cy / canvas.height,\n    };\n  }\n\n  function defaultPreviewPreset(customizer, canvas, surface) {\n    const explicit = customizer.config?.previewViewport || {};\n    if (explicit.scale || explicit.x || explicit.y) {\n      return {\n        scale: clamp(Number(explicit.scale || 1.35), PREVIEW_SCALE_MIN, PREVIEW_SCALE_MAX),\n        x: Number(explicit.x || 0),\n        y: Number(explicit.y || 0),\n      };\n    }\n    /* Fit the photographed product more naturally inside the live-preview\n     * card, but only when no customer-photo zone exists. Photo lockets keep the\n     * neutral transform because their inside-mask drag coordinates must remain\n     * visually identical to the approved production mask. The full art group\n     * is transformed together, so metal, stones and engraving cannot drift. */\n    const artwork = PREVIEW_ARTWORK_PRESETS[customizer.config?.key];\n    if (artwork) {\n      const scale = artwork.scale;\n      const surfaceWidth = Number(surface?.clientWidth || surface?.getBoundingClientRect?.().width || 0);\n      const surfaceHeight = Number(surface?.clientHeight || surface?.getBoundingClientRect?.().height || 0);\n      return {\n        scale,\n        x: surfaceWidth ? (0.5 - artwork.cx) * surfaceWidth * scale : 0,\n        y: surfaceHeight ? (0.5 - artwork.cy) * surfaceHeight * scale : 0,\n      };\n    }\n    const scale = clamp(Number(customizer.config?.previewScale || 1), 1, 1.35);\n    return {\n      scale,\n      x: 0,\n      y: 0,\n    };\n  }\n\n  function makeCanvas(className, sourceCanvas) {\n    const canvas = document.createElement('canvas');\n    canvas.className = className;\n    canvas.width = 1;\n    canvas.height = 1;\n    canvas.setAttribute('aria-hidden', 'true');\n    return canvas;\n  }\n\n  function allBirthstonesSelected(customizer) {\n    const expected = Number(customizer.config?.birthstoneSlots || 0);\n    if (!expected) return false;\n    const selected = (customizer.birthstoneState || [])\n      .slice(0, expected)\n      .filter((state) => Boolean(state?.month)).length;\n    return selected === expected;\n  }\n\n  function visibleBaseImage(customizer) {\n    if (customizer.ring1387SettingReference && !allBirthstonesSelected(customizer)) {\n      return customizer.ring1387SettingReference;\n    }\n    return customizer.baseImage;\n  }\n\n  function createLayeredView(customizer, sourceCanvas) {\n    const shell = customizer.closest?.('[data-craft-product-shell]');\n    const previewMount = shell?.querySelector('[data-craftdiy-preview-mount]');\n    if (previewMount) {\n      /* The production canvas is technically still the source of cart/export\n       * data, but its DOM node must live inside the product gallery mount so\n       * the native base image and transparent live layers share one stage. */\n      previewMount.replaceChildren(sourceCanvas);\n    }\n    const stage = previewMount\n      || sourceCanvas.closest?.('.cpm__stage,.craftdiy-customizer__canvas-wrap')\n      || sourceCanvas.parentElement;\n    if (!stage) return null;\n    stage.classList.add('craftdiy-layered-stage');\n    sourceCanvas.classList.add('craftdiy-layered-source');\n    sourceCanvas.dataset.craftdiyCombinedPreviewSource = VERSION;\n\n    const art = document.createElement('div');\n    art.className = 'craftdiy-layered-art';\n    art.dataset.craftdiyLayeredArt = VERSION;\n    art.setAttribute('role', 'img');\n    art.setAttribute('aria-label', 'Live product personalization preview. Drag an uploaded photo inside its photo area, or drag outside the photo area to move the full preview.');\n\n    const base = document.createElement('img');\n    base.className = 'craftdiy-layered-base';\n    base.alt = '';\n    base.draggable = false;\n    base.decoding = 'sync';\n    base.fetchPriority = 'high';\n    const visibleBase = visibleBaseImage(customizer);\n    base.src = visibleBase?.currentSrc || visibleBase?.src || customizer.dataset.baseImageUrl || '';\n\n    const photo = makeCanvas('craftdiy-layered-photo', sourceCanvas);\n    const stone = makeCanvas('craftdiy-layered-stone', sourceCanvas);\n    const text = makeCanvas('craftdiy-layered-text', sourceCanvas);\n    art.append(base, photo, stone, text);\n    stage.appendChild(art);\n    const birthstoneNotice = document.createElement('div');\n    birthstoneNotice.className = 'craftdiy-birthstone-notice';\n    birthstoneNotice.setAttribute('role', 'status');\n    birthstoneNotice.setAttribute('aria-live', 'polite');\n    birthstoneNotice.textContent = '\u2726 Select all birthstones below to complete your preview';\n    birthstoneNotice.hidden = !Number(customizer.config?.birthstoneSlots || 0);\n    stage.appendChild(birthstoneNotice);\n\n    return {\n      stage,\n      art,\n      base,\n      photo,\n      stone,\n      text,\n      birthstoneNotice,\n      sourceCanvas,\n      renderScale: LAYER_RENDER_SCALE_MIN,\n      activeLayers: {\n        photo: Boolean(customizer.config?.photoZones?.length),\n        stone: Boolean(customizer.config?.birthstoneSlots),\n        text: Boolean(customizer.config?.textZones?.length),\n      },\n    };\n  }\n\n  function syncLayerDimensions(view) {\n    const width = Math.max(1, Math.round(view.logicalWidth * view.renderScale));\n    const height = Math.max(1, Math.round(view.logicalHeight * view.renderScale));\n    [\n      [view.photo, view.activeLayers.photo],\n      [view.stone, view.activeLayers.stone],\n      [view.text, view.activeLayers.text],\n    ].forEach(([canvas, active]) => {\n      const targetWidth = active ? width : 1;\n      const targetHeight = active ? height : 1;\n      if (canvas.width !== targetWidth) canvas.width = targetWidth;\n      if (canvas.height !== targetHeight) canvas.height = targetHeight;\n      const context = canvas.getContext('2d');\n      context.imageSmoothingEnabled = true;\n      context.imageSmoothingQuality = 'high';\n    });\n  }\n\n  function renderScaleForZoom(view, zoom) {\n    const cssWidth = Number(view.stage?.getBoundingClientRect?.().width || view.stage?.clientWidth || 0);\n    const dpr = Math.max(1, Number(window.devicePixelRatio || 1));\n    const required = cssWidth > 0\n      ? (cssWidth * dpr * Math.max(1, Number(zoom || 1))) / Math.max(1, view.logicalWidth)\n      : LAYER_RENDER_SCALE_MIN;\n    const maxByArea = Math.sqrt(\n      LAYER_MAX_PIXELS / Math.max(1, view.logicalWidth * view.logicalHeight),\n    );\n    const safeMax = Math.min(LAYER_RENDER_SCALE_MAX, maxByArea);\n    const rounded = Math.ceil(Math.max(LAYER_RENDER_SCALE_MIN, required * 1.04) * 4) / 4;\n    return clamp(rounded, LAYER_RENDER_SCALE_MIN, safeMax);\n  }\n\n  function stageLogicalSize(stage) {\n    const rect = stage?.getBoundingClientRect?.();\n    const width = Number(rect?.width || stage?.clientWidth || 0);\n    const height = Number(rect?.height || stage?.clientHeight || 0);\n    const ratio = width > 0 && height > 0 ? height / width : 1;\n    return {\n      width: STAGE_REFERENCE_WIDTH,\n      height: Math.max(1, Math.round(STAGE_REFERENCE_WIDTH * ratio)),\n    };\n  }\n\n  function syncLayerBox(view) {\n    view.art.style.setProperty('inset', '0', 'important');\n    view.art.style.setProperty('left', '0', 'important');\n    view.art.style.setProperty('top', '0', 'important');\n    view.art.style.setProperty('width', '100%', 'important');\n    view.art.style.setProperty('height', '100%', 'important');\n  }\n\n  function sourceToStageMetrics(customizer, stageWidth, stageHeight) {\n    const sourceWidth = Math.max(1, Number(\n      customizer.config?.image?.width || customizer.baseImage?.naturalWidth || stageWidth,\n    ));\n    const sourceHeight = Math.max(1, Number(\n      customizer.config?.image?.height || customizer.baseImage?.naturalHeight || stageHeight,\n    ));\n    const scale = Math.min(stageWidth / sourceWidth, stageHeight / sourceHeight);\n    return {\n      sourceWidth,\n      sourceHeight,\n      scale,\n      offsetX: (stageWidth - sourceWidth * scale) / 2,\n      offsetY: (stageHeight - sourceHeight * scale) / 2,\n      stageWidth,\n      stageHeight,\n    };\n  }\n\n  function zoneToStage(zone, metrics) {\n    const xToPercent = (value) => (\n      (metrics.offsetX + (Number(value || 0) / 100) * metrics.sourceWidth * metrics.scale)\n      / metrics.stageWidth\n    ) * 100;\n    const yToPercent = (value) => (\n      (metrics.offsetY + (Number(value || 0) / 100) * metrics.sourceHeight * metrics.scale)\n      / metrics.stageHeight\n    ) * 100;\n    const widthToPercent = (value) => (\n      ((Number(value || 0) / 100) * metrics.sourceWidth * metrics.scale) / metrics.stageWidth\n    ) * 100;\n    const heightToPercent = (value) => (\n      ((Number(value || 0) / 100) * metrics.sourceHeight * metrics.scale) / metrics.stageHeight\n    ) * 100;\n    const fontScale = (metrics.sourceWidth * metrics.scale) / metrics.stageWidth;\n    return {\n      ...zone,\n      x: xToPercent(zone.x),\n      y: yToPercent(zone.y),\n      w: widthToPercent(zone.w),\n      h: heightToPercent(zone.h),\n      points: Array.isArray(zone.points)\n        ? zone.points.map((point) => ({ x: xToPercent(point.x), y: yToPercent(point.y) }))\n        : zone.points,\n      fontSize: Number(zone.fontSize || 18) * fontScale,\n      minFontSize: Number(zone.minFontSize || 8) * fontScale,\n      letterSpacing: Number(zone.letterSpacing || 0) * fontScale,\n    };\n  }\n\n  function syncViewGeometry(customizer, view) {\n    const logical = stageLogicalSize(view.stage);\n    const changed = view.logicalWidth !== logical.width || view.logicalHeight !== logical.height;\n    view.logicalWidth = logical.width;\n    view.logicalHeight = logical.height;\n    view.metrics = sourceToStageMetrics(customizer, logical.width, logical.height);\n    view.photoZones = (customizer.config?.photoZones || []).map((zone) => zoneToStage(zone, view.metrics));\n    view.textZones = (customizer.config?.textZones || []).map((zone) => zoneToStage(zone, view.metrics));\n    syncLayerDimensions(view);\n    return changed;\n  }\n\n  function renderBirthstonesOnStage(customizer, view) {\n    const context = view.stone.getContext('2d');\n    const renderScale = view.stone.width / view.logicalWidth;\n    context.clearRect(0, 0, view.stone.width, view.stone.height);\n    const expectedSlots = Number(customizer.config?.birthstoneSlots || 0);\n    const selectedSlots = (customizer.birthstoneState || []).filter((state) => Boolean(state?.month)).length;\n    if (view.birthstoneNotice) view.birthstoneNotice.hidden = !expectedSlots || selectedSlots >= expectedSlots;\n\n    if (customizer.fittedBirthstoneMasks?.length) {\n      if (typeof customizer.drawFittedBirthstones !== 'function') return;\n      customizer.drawFittedBirthstones(context, view.metrics, renderScale);\n      return;\n    }\n\n    /* The visible product-gallery layer must use the same per-SKU v33 atlas\n     * as the production canvas. Drawing each transparent crop directly keeps\n     * the photographed facets, exact setting boundary and selected month; it\n     * also prevents the old grey/colorized fallback from reappearing only in\n     * the customer-facing preview. */\n    const rasterEntry = customizer.birthstoneRasterEntry;\n    const rasterSprite = customizer.birthstoneRasterSprite;\n    if (rasterEntry && rasterSprite && Array.isArray(rasterEntry.slots)) {\n      const tileWidth = Number(rasterEntry.tileWidth);\n      rasterEntry.slots.slice(0, expectedSlots).forEach((slot, index) => {\n        const state = customizer.birthstoneState?.[index];\n        const stone = state?.month ? customizer.birthstoneForMonth?.(state.month) : null;\n        if (!stone) return;\n        const width = Number(slot.width);\n        const height = Number(slot.height);\n        const destinationX = (view.metrics.offsetX + Number(slot.x) * view.metrics.scale) * renderScale;\n        const destinationY = (view.metrics.offsetY + Number(slot.y) * view.metrics.scale) * renderScale;\n        context.drawImage(\n          rasterSprite,\n          Number(stone.index) * tileWidth,\n          Number(slot.sourceY),\n          width,\n          height,\n          destinationX,\n          destinationY,\n          width * view.metrics.scale * renderScale,\n          height * view.metrics.scale * renderScale,\n        );\n      });\n      return;\n    }\n\n    if (!customizer.birthstoneSlotMasks?.length) return;\n    customizer.birthstoneSlotMasks.forEach((mask, index) => {\n      const state = customizer.birthstoneState?.[index];\n      if (!state || !mask) return;\n      if (!state.month) return;\n      const stone = customizer.birthstoneForMonth?.(state.month);\n      if (!stone) return;\n      const colourLayer = document.createElement('canvas');\n      colourLayer.width = mask.width;\n      colourLayer.height = mask.height;\n      if (typeof customizer.paintBirthstoneLayer === 'function') {\n        customizer.paintBirthstoneLayer(colourLayer, mask, stone);\n      } else {\n        const colourContext = colourLayer.getContext('2d');\n        colourContext.drawImage(mask, 0, 0, colourLayer.width, colourLayer.height);\n        colourContext.globalCompositeOperation = 'source-in';\n        colourContext.fillStyle = stone.color;\n        colourContext.fillRect(0, 0, colourLayer.width, colourLayer.height);\n      }\n      context.drawImage(\n        colourLayer,\n        view.metrics.offsetX * renderScale,\n        view.metrics.offsetY * renderScale,\n        view.metrics.sourceWidth * view.metrics.scale * renderScale,\n        view.metrics.sourceHeight * view.metrics.scale * renderScale,\n      );\n    });\n  }\n\n  function drawOn(customizer, canvas, drawing) {\n    const originalCanvas = customizer.canvas;\n    const originalContext = customizer.context;\n    const context = canvas.getContext('2d');\n    context.setTransform(1, 0, 0, 1, 0, 0);\n    context.globalAlpha = 1;\n    context.globalCompositeOperation = 'source-over';\n    context.clearRect(0, 0, canvas.width, canvas.height);\n    customizer.canvas = canvas;\n    customizer.context = context;\n    try {\n      drawing();\n    } finally {\n      customizer.canvas = originalCanvas;\n      customizer.context = originalContext;\n    }\n  }\n\n  function renderLayered(customizer, view) {\n    if (!view.art.isConnected) return;\n    syncLayerBox(view);\n    syncLayerDimensions(view);\n    const visibleBase = visibleBaseImage(customizer);\n    if (visibleBase) {\n      const source = visibleBase.currentSrc || visibleBase.src;\n      if (source && view.base.src !== source) view.base.src = source;\n    }\n\n    drawOn(customizer, view.photo, () => {\n      if (typeof customizer.drawPhotoZone !== 'function') return;\n      view.photoZones.forEach((zone, index) => {\n        customizer.drawPhotoZone(zone, customizer.photoState?.[index]);\n      });\n    });\n\n    renderBirthstonesOnStage(customizer, view);\n\n    drawOn(customizer, view.text, () => {\n      if (typeof customizer.drawTextZone !== 'function') return;\n      view.textZones.forEach((zone, index) => {\n        customizer.drawTextZone(zone, customizer.textState?.[index]);\n      });\n    });\n  }\n\n  function activateLivePreview(customizer) {\n    const shell = customizer.closest?.('[data-craft-product-shell]');\n    if (!shell) return;\n    const customPreview = shell.querySelector('[data-custom-preview]');\n    const mainImage = shell.querySelector('[data-main-image]');\n    const mainMedia = shell.querySelector('.cv9__main-media');\n    const previewThumb = shell.querySelector('[data-preview-thumb]');\n    if (!customPreview || !mainMedia || !previewThumb) return;\n\n    customPreview.hidden = false;\n    if (mainImage) mainImage.hidden = true;\n    mainMedia.classList.add('is-custom-preview');\n    shell.querySelectorAll('[data-thumb]').forEach((thumb) => thumb.classList.remove('is-active'));\n    previewThumb.classList.add('is-active');\n  }\n\n  function bindLayeredPreview(customizer) {\n    if (!customizer || boundCustomizers.has(customizer)) return;\n    const sourceCanvas = customizer.canvas || customizer.querySelector?.('[data-preview-canvas]');\n    const hasLayerApi = typeof customizer.drawPhotoZone === 'function'\n      && typeof customizer.drawTextZone === 'function';\n    if (!sourceCanvas || !customizer.config || !hasLayerApi || !customizer.baseImage) return;\n\n    boundCustomizers.add(customizer);\n    injectStyles();\n    const view = createLayeredView(customizer, sourceCanvas);\n    if (!view) return;\n    /* Unhide the real gallery first, then measure its actual aspect ratio.\n     * This keeps every mask in the same coordinate space as object-fit:contain\n     * on both mobile and desktop instead of forcing the old 1122\u00D71402 stage. */\n    activateLivePreview(customizer);\n    syncViewGeometry(customizer, view);\n    customizer.dataset.layeredPreview = VERSION;\n\n    const originalDrawCanvas = customizer.drawCanvas?.bind(customizer);\n    if (originalDrawCanvas) {\n      customizer.drawCanvas = function layeredDrawCanvas() {\n        /* The hidden original remains the combined production/cart proof. */\n        originalDrawCanvas();\n        renderLayered(customizer, view);\n      };\n    }\n    renderLayered(customizer, view);\n    activateLivePreview(customizer);\n\n    /* Repaint once the storefront fonts have finished loading.  Without this,\n     * Safari can preserve the first low-quality fallback-font raster even\n     * after the selected engraving font becomes available. */\n    if (document.fonts?.ready) {\n      document.fonts.ready.then(() => {\n        if (!view.art.isConnected) return;\n        renderLayered(customizer, view);\n        activateLivePreview(customizer);\n      }).catch(() => {});\n    }\n\n    const pointers = new Map();\n    let activePhotoIndex = -1;\n    let gestureOwner = '';\n    let photoDrag = null;\n    let photoPinch = null;\n    let previewDrag = null;\n    let previewPinch = null;\n    let tapCandidate = null;\n    let lastTap = null;\n    let ignoreDblClickUntil = 0;\n    /* Bump the key so a previously stored 1\u00D7 preview cannot suppress v29's\n     * corrected first-load framing. Customer zoom/pan is still remembered. */\n    const storageKey = `craftdiy-old-three-stage-v12:${customizer.dataset.sku || customizer.dataset.configKey || location.pathname}`;\n    let saved = null;\n    try { saved = JSON.parse(sessionStorage.getItem(storageKey) || 'null'); } catch (error) { saved = null; }\n    const preset = defaultPreviewPreset(customizer, sourceCanvas, view.art);\n    const previewState = {\n      scale: clamp(Number(saved?.scale || preset.scale), PREVIEW_SCALE_MIN, PREVIEW_SCALE_MAX),\n      x: Number(saved?.x ?? preset.x ?? 0),\n      y: Number(saved?.y ?? preset.y ?? 0),\n    };\n\n    function rememberPreviewTransform() {\n      try { sessionStorage.setItem(storageKey, JSON.stringify(previewState)); } catch (error) { /* no-op */ }\n    }\n\n    function previewLimits(scale = previewState.scale) {\n      return {\n        x: Math.max(0, view.stage.clientWidth * (scale - 1) * 0.58),\n        y: Math.max(0, view.stage.clientHeight * (scale - 1) * 0.58),\n      };\n    }\n\n    function applyPreviewTransform() {\n      const limits = previewLimits();\n      previewState.x = clamp(previewState.x, -limits.x, limits.x);\n      previewState.y = clamp(previewState.y, -limits.y, limits.y);\n      const nextRenderScale = renderScaleForZoom(view, previewState.scale);\n      if (Math.abs(nextRenderScale - view.renderScale) > 0.01) {\n        view.renderScale = nextRenderScale;\n        syncLayerDimensions(view);\n        renderLayered(customizer, view);\n      }\n      const isNeutral = Math.abs(previewState.x) < 0.01\n        && Math.abs(previewState.y) < 0.01\n        && Math.abs(previewState.scale - 1) < 0.0001;\n      view.art.style.transform = isNeutral\n        ? 'none'\n        : `translate(${previewState.x}px, ${previewState.y}px) scale(${previewState.scale})`;\n      view.art.dataset.craftdiyPreviewScale = String(previewState.scale);\n      view.art.dataset.craftdiyPreviewX = String(previewState.x);\n      view.art.dataset.craftdiyPreviewY = String(previewState.y);\n    }\n\n    function resetPreviewTransform() {\n      const next = defaultPreviewPreset(customizer, sourceCanvas, view.art);\n      previewState.scale = next.scale;\n      previewState.x = next.x;\n      previewState.y = next.y;\n      applyPreviewTransform();\n      rememberPreviewTransform();\n    }\n\n    function togglePreviewZoom(clientX, clientY) {\n      if (previewState.scale > 1.08) {\n        previewState.scale = 1;\n        previewState.x = 0;\n        previewState.y = 0;\n      } else {\n        const rect = view.art.getBoundingClientRect();\n        const targetScale = 2;\n        const localX = clientX - rect.left - rect.width / 2;\n        const localY = clientY - rect.top - rect.height / 2;\n        previewState.scale = targetScale;\n        previewState.x = -localX * (targetScale - 1);\n        previewState.y = -localY * (targetScale - 1);\n      }\n      applyPreviewTransform();\n      rememberPreviewTransform();\n    }\n\n    function uploadedPhotoAt(clientX, clientY) {\n      const point = surfacePoint(view.art, view.photo, clientX, clientY);\n      if (!point) return -1;\n      const zones = view.photoZones;\n      for (let index = zones.length - 1; index >= 0; index -= 1) {\n        if (!customizer.photoState?.[index]?.image) continue;\n        if (pointInZone(point, zones[index], view.photo)) return index;\n      }\n      return -1;\n    }\n\n    function syncPhotoControls(index) {\n      const state = customizer.photoState?.[index];\n      if (!state) return;\n      const values = {\n        zoom: state.zoom,\n        offsetX: state.offsetX,\n        offsetY: state.offsetY,\n        rotation: state.rotation,\n      };\n      const router = customizer.closest?.('[data-craftdiy-sku-router]');\n      Object.entries(values).forEach(([name, value]) => {\n        const selector = `[data-photo-control=\"${name}\"][data-photo-control-index=\"${index}\"]`;\n        const input = customizer.querySelector?.(selector) || router?.querySelector(selector);\n        if (input) input.value = String(value);\n      });\n    }\n\n    function commitPhoto(index) {\n      syncPhotoControls(index);\n      if (typeof customizer.onStateChange === 'function') customizer.onStateChange();\n      else {\n        customizer.queueCanvasRender?.();\n        customizer.syncPayload?.();\n        renderLayered(customizer, view);\n      }\n    }\n\n    function startPhotoDrag(index, pointer) {\n      const zone = view.photoZones[index];\n      const state = customizer.photoState[index];\n      const point = surfacePoint(view.art, view.photo, pointer.clientX, pointer.clientY);\n      if (!zone || !state || !point) return;\n      activePhotoIndex = index;\n      photoDrag = {\n        index,\n        pointerId: pointer.pointerId,\n        start: point,\n        offsetX: Number(state.offsetX || 0),\n        offsetY: Number(state.offsetY || 0),\n        bounds: boundsForPoints(zonePoints(zone, view.photo)),\n      };\n    }\n\n    function startPhotoPinch() {\n      if (activePhotoIndex < 0 || pointers.size < 2) return;\n      const state = customizer.photoState[activePhotoIndex];\n      if (!state?.image) return;\n      const entries = Array.from(pointers.values()).slice(0, 2);\n      photoPinch = {\n        index: activePhotoIndex,\n        distance: Math.max(1, clientDistance(entries)),\n        zoom: Number(state.zoom || 1),\n      };\n      photoDrag = null;\n    }\n\n    function startPreviewDrag(pointer) {\n      previewDrag = {\n        pointerId: pointer.pointerId,\n        clientX: pointer.clientX,\n        clientY: pointer.clientY,\n        x: previewState.x,\n        y: previewState.y,\n      };\n    }\n\n    function startPreviewPinch() {\n      if (pointers.size < 2) return;\n      const entries = Array.from(pointers.values()).slice(0, 2);\n      previewPinch = {\n        distance: Math.max(1, clientDistance(entries)),\n        scale: previewState.scale,\n      };\n      previewDrag = null;\n    }\n\n    const hitTest = (clientX, clientY) => (uploadedPhotoAt(clientX, clientY) >= 0 ? 'photo' : 'preview');\n    customizer.cpmHitTest = hitTest;\n    const engine = customizer.closest?.('[data-craft-mask-engine]');\n    if (engine) engine.cpmHitTest = hitTest;\n\n    /*\n     * Product galleries commonly listen for touch events on an ancestor and\n     * interpret an edit drag as \"next media\".  Keep all touch gestures that\n     * begin on the live canvas inside the customizer.  Pointer events below\n     * continue to own the actual drag/pinch work.\n     */\n    ['touchstart', 'touchmove', 'touchend', 'touchcancel'].forEach((type) => {\n      view.art.addEventListener(type, (event) => {\n        if (event.cancelable) event.preventDefault();\n        event.stopPropagation();\n      }, { capture: true, passive: false });\n    });\n\n    view.art.addEventListener('dragstart', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n    });\n\n    view.art.addEventListener('pointerdown', (event) => {\n      const index = uploadedPhotoAt(event.clientX, event.clientY);\n      pointers.set(event.pointerId, {\n        pointerId: event.pointerId,\n        clientX: event.clientX,\n        clientY: event.clientY,\n      });\n      try { view.art.setPointerCapture(event.pointerId); } catch (error) { /* no-op */ }\n\n      if (pointers.size === 1) {\n        tapCandidate = {\n          pointerId: event.pointerId,\n          clientX: event.clientX,\n          clientY: event.clientY,\n          moved: false,\n        };\n        gestureOwner = index >= 0 ? 'photo' : 'preview';\n        if (gestureOwner === 'photo') startPhotoDrag(index, event);\n        else startPreviewDrag(event);\n        view.art.dataset.craftdiyGestureOwner = gestureOwner;\n        view.art.classList.add('is-dragging');\n      } else {\n        tapCandidate = null;\n        if (gestureOwner === 'photo') startPhotoPinch();\n        else startPreviewPinch();\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n    });\n\n    view.art.addEventListener('pointermove', (event) => {\n      if (!pointers.has(event.pointerId)) return;\n      pointers.set(event.pointerId, {\n        pointerId: event.pointerId,\n        clientX: event.clientX,\n        clientY: event.clientY,\n      });\n      if (tapCandidate?.pointerId === event.pointerId) {\n        const movedX = event.clientX - tapCandidate.clientX;\n        const movedY = event.clientY - tapCandidate.clientY;\n        if (Math.hypot(movedX, movedY) > 10) tapCandidate.moved = true;\n      }\n\n      if (gestureOwner === 'photo' && photoPinch && pointers.size >= 2) {\n        const entries = Array.from(pointers.values()).slice(0, 2);\n        const state = customizer.photoState[photoPinch.index];\n        state.zoom = clamp(\n          photoPinch.zoom * (clientDistance(entries) / photoPinch.distance),\n          PHOTO_ZOOM_MIN,\n          PHOTO_ZOOM_MAX,\n        );\n        commitPhoto(photoPinch.index);\n      } else if (gestureOwner === 'preview' && previewPinch && pointers.size >= 2) {\n        const entries = Array.from(pointers.values()).slice(0, 2);\n        previewState.scale = clamp(\n          previewPinch.scale * (clientDistance(entries) / previewPinch.distance),\n          PREVIEW_SCALE_MIN,\n          PREVIEW_SCALE_MAX,\n        );\n        applyPreviewTransform();\n      } else if (gestureOwner === 'photo' && photoDrag && photoDrag.pointerId === event.pointerId) {\n        const point = surfacePoint(view.art, view.photo, event.clientX, event.clientY);\n        if (!point) return;\n        const state = customizer.photoState[photoDrag.index];\n        state.offsetX = clamp(\n          photoDrag.offsetX + ((point.x - photoDrag.start.x) / (photoDrag.bounds.width * 0.5)),\n          PHOTO_OFFSET_MIN,\n          PHOTO_OFFSET_MAX,\n        );\n        state.offsetY = clamp(\n          photoDrag.offsetY + ((point.y - photoDrag.start.y) / (photoDrag.bounds.height * 0.5)),\n          PHOTO_OFFSET_MIN,\n          PHOTO_OFFSET_MAX,\n        );\n        commitPhoto(photoDrag.index);\n      } else if (gestureOwner === 'preview' && previewDrag && previewDrag.pointerId === event.pointerId) {\n        previewState.x = previewDrag.x + event.clientX - previewDrag.clientX;\n        previewState.y = previewDrag.y + event.clientY - previewDrag.clientY;\n        applyPreviewTransform();\n      } else return;\n\n      event.preventDefault();\n      event.stopPropagation();\n    });\n\n    function endPointer(event) {\n      if (!pointers.has(event.pointerId)) return;\n      if (event.cancelable) event.preventDefault();\n      event.stopPropagation();\n      const completedTap = event.pointerType === 'touch'\n        && tapCandidate?.pointerId === event.pointerId\n        && !tapCandidate.moved\n        && pointers.size === 1;\n      pointers.delete(event.pointerId);\n      if (pointers.size < 2) {\n        photoPinch = null;\n        previewPinch = null;\n      }\n      if (!pointers.size) {\n        photoDrag = null;\n        previewDrag = null;\n        gestureOwner = '';\n        view.art.dataset.craftdiyGestureOwner = '';\n        view.art.classList.remove('is-dragging');\n        rememberPreviewTransform();\n      }\n      if (completedTap) {\n        const now = performance.now();\n        const isDoubleTap = lastTap\n          && now - lastTap.time < 340\n          && Math.hypot(event.clientX - lastTap.clientX, event.clientY - lastTap.clientY) < 34;\n        if (isDoubleTap) {\n          togglePreviewZoom(event.clientX, event.clientY);\n          ignoreDblClickUntil = now + 500;\n          lastTap = null;\n        } else {\n          lastTap = { time: now, clientX: event.clientX, clientY: event.clientY };\n        }\n      }\n      tapCandidate = null;\n    }\n\n    view.art.addEventListener('pointerup', endPointer);\n    view.art.addEventListener('pointercancel', endPointer);\n    view.art.addEventListener('lostpointercapture', endPointer);\n    view.art.addEventListener('click', (event) => event.stopPropagation());\n    view.art.addEventListener('wheel', (event) => {\n      const index = uploadedPhotoAt(event.clientX, event.clientY);\n      if (index >= 0) {\n        const state = customizer.photoState[index];\n        state.zoom = clamp(\n          Number(state.zoom || 1) * (event.deltaY < 0 ? 1.06 : 0.94),\n          PHOTO_ZOOM_MIN,\n          PHOTO_ZOOM_MAX,\n        );\n        activePhotoIndex = index;\n        commitPhoto(index);\n      } else {\n        previewState.scale = clamp(\n          previewState.scale * (event.deltaY < 0 ? 1.08 : 0.92),\n          PREVIEW_SCALE_MIN,\n          PREVIEW_SCALE_MAX,\n        );\n        applyPreviewTransform();\n        rememberPreviewTransform();\n      }\n      event.preventDefault();\n      event.stopPropagation();\n    }, { passive: false });\n\n    view.art.addEventListener('contextmenu', (event) => event.preventDefault());\n    view.art.addEventListener('dblclick', (event) => {\n      if (performance.now() < ignoreDblClickUntil) return;\n      togglePreviewZoom(event.clientX, event.clientY);\n      event.preventDefault();\n      event.stopPropagation();\n    });\n\n    customizer.addEventListener('craftdiy:photo-selected', (event) => {\n      activePhotoIndex = Number(event.detail?.index ?? 0);\n      customizer.setStatus?.(\n        'Photo added. Drag inside the photo area to move the photo; drag outside it to move the full preview.',\n        'success',\n      );\n    });\n\n    /* Direct gestures replace the four old photo sliders. */\n    const router = customizer.closest?.('[data-craftdiy-sku-router]');\n    [customizer, router].filter(Boolean).forEach((scope) => {\n      scope.querySelectorAll?.('.cpm__photo-tools,.craftdiy-photo-tools,[data-photo-tools]').forEach((node) => {\n        node.hidden = true;\n        node.setAttribute('aria-hidden', 'true');\n      });\n    });\n\n    applyPreviewTransform();\n    if (typeof ResizeObserver === 'function') {\n      const layerResizeObserver = new ResizeObserver(() => {\n        syncLayerBox(view);\n        syncViewGeometry(customizer, view);\n        renderLayered(customizer, view);\n        applyPreviewTransform();\n      });\n      layerResizeObserver.observe(view.stage);\n      layerResizeObserver.observe(sourceCanvas);\n    }\n    requestAnimationFrame(() => {\n      syncLayerBox(view);\n      renderLayered(customizer, view);\n      applyPreviewTransform();\n      activateLivePreview(customizer);\n    });\n  }\n\n  function bindWhenReady(customizer) {\n    if (!customizer || boundCustomizers.has(customizer)) return;\n    if (customizer.readyPromise) {\n      customizer.readyPromise.then(() => bindLayeredPreview(customizer)).catch(() => {});\n    } else if (customizer.config && customizer.baseImage) bindLayeredPreview(customizer);\n  }\n\n  function scan(root = document) {\n    root.querySelectorAll?.('craftdiy-customizer').forEach(bindWhenReady);\n  }\n\n  if (globalThis.__CRAFTDIY_TEST_HOOKS__) {\n    globalThis.__CRAFTDIY_TEST_HOOKS__.preview = {\n      VERSION,\n      renderScaleForZoom,\n    };\n  }\n\n  document.addEventListener('craftdiy:customizer-ready', (event) => {\n    bindWhenReady(event.detail?.customizer || event.target);\n  });\n  document.addEventListener('craftdiy:router-configured', (event) => {\n    bindWhenReady(event.detail?.customizer);\n  });\n\n  const observer = new MutationObserver((mutations) => {\n    mutations.forEach((mutation) => mutation.addedNodes.forEach((node) => {\n      if (!(node instanceof Element)) return;\n      if (node.matches('craftdiy-customizer')) bindWhenReady(node);\n      else scan(node);\n    }));\n  });\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => {\n      scan();\n      observer.observe(document.documentElement, { childList: true, subtree: true });\n    }, { once: true });\n  } else {\n    scan();\n    observer.observe(document.documentElement, { childList: true, subtree: true });\n  }\n})();\n"],
  "mappings": "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",
  "names": ["sum", "scale", "router"]
}
