{
  "version": 3,
  "sources": ["/cdn/shop/t/25/assets/aner-jewelry-visualizer.js?av=2026-09-29a"],
  "sourcesContent": ["(function () {\n  'use strict';\n\n  const ROOT_SELECTOR = '[data-aner-jewelry-visualizer]';\n  const STONE_ROOT_SELECTOR = '[data-aner-main-stone-visualizer]';\n  const imageCache = new Map();\n  const boundsCache = new Map();\n\n  // Characteristic luminance percentiles (1%, 5%, 25%, 50%, 75%, 95%, 99%)\n  // for each finished metal. Used to remap the tone of a source photo whose\n  // metal is darker than the selected one.\n  const TONE_TARGETS = {\n    unplated: [0.10, 0.24, 0.48, 0.70, 0.87, 0.965, 0.995],\n    white: [0.11, 0.26, 0.50, 0.72, 0.88, 0.970, 0.995],\n    rose: [0.10, 0.23, 0.46, 0.68, 0.86, 0.960, 0.990],\n    yellow: [0.11, 0.25, 0.49, 0.70, 0.87, 0.965, 0.990],\n    black: [0.11, 0.25, 0.49, 0.70, 0.87, 0.965, 0.990],\n  };\n\n  const PRESETS = {\n    unplated: { target: [226, 231, 239], strength: 0.75, valueScale: 0.95, sourceKeep: 0.04, shadowKeep: 0.12, highlightLift: 0.04 },\n    white: { target: [226, 231, 239], strength: 0.75, valueScale: 1, sourceKeep: 0.04, shadowKeep: 0.12, highlightLift: 0.04 },\n    rose: { target: [210, 137, 119], strength: 0.65, valueScale: 1.07, sourceKeep: 0.08, shadowKeep: 0.28, highlightLift: 0 },\n    // Yellow gold approved 2026-10-07: the previous [207,163,72] target at\n    // strength 0.72 rendered too pale and too green (midtone hue 40.9deg at\n    // 42.9% saturation against a 31deg / 51% real-gold reference). The shop\n    // compared this higher-strength target against a less-yellow alternative\n    // on the live store and kept this one: measured midtone RGB(225,175,76),\n    // 66.2% saturation, hue 39.9deg.\n    yellow: { target: [222, 160, 38], strength: 0.95, valueScale: 1, sourceKeep: 0.08, shadowKeep: 0.28, highlightLift: 0.08, warmer: true },\n    black: { target: [30, 32, 36], strength: 0.82, valueScale: 1, sourceKeep: 0.01, shadowKeep: 0.05, highlightLift: 0.03, blackCurve: true },\n  };\n\n  const clamp = (value, min, max) => Math.max(min, Math.min(max, value));\n\n  function normalize(value) {\n    return String(value || '').toLowerCase().replace(/[\\s_\\-\u2013\u2014]/g, '').trim();\n  }\n\n  // The metal option values are translated by the shop (Translate & Adapt), so\n  // the colour words are matched in every language the storefront serves.\n  // Order matters: a colour has to be recognised before the S925 catch-all,\n  // otherwise \"S925 + Gelbgold plattiert\" would fall through to unplated.\n  function metalKey(value) {\n    const normalized = normalize(value);\n    if (/rose|ros\u00E9|rosa|\u73AB\u7470|\u73AB\u91D1/.test(normalized)) return 'rose';\n    if (/white|blanc|blanco|bianco|wei\u00DF|weiss|\u767D\u91D1|\u767D\u8272\u91D1/.test(normalized)) return 'white';\n    if (/yellow|jaune|amarillo|gelb|giallo|\u9EC4\u91D1|\u9EC4k|\u91D1\u8272/.test(normalized)) return 'yellow';\n    if (/black|noir|negro|schwarz|nero|\u9ED1\u91D1|\u9ED1\u8272\u91D1/.test(normalized)) return 'black';\n    if (/unplated|unbeschichtet|sinchapado|sinba\u00F1o|nonplaqu\u00E9|nonplaque|s925|925|\u672A\u7535\u9540|\u4E0D\u9540\u91D1/.test(normalized)) return 'unplated';\n    return null;\n  }\n\n  function loadImage(url) {\n    if (!url) return Promise.reject(new Error('Missing image URL'));\n    if (!imageCache.has(url)) {\n      const image = new Image();\n      image.crossOrigin = 'anonymous';\n      image.decoding = 'async';\n      image.src = url;\n      imageCache.set(url, new Promise((resolve, reject) => {\n        image.onload = () => resolve(image);\n        image.onerror = () => reject(new Error('Unable to load ' + url));\n      }));\n    }\n    return imageCache.get(url);\n  }\n\n  // Per-row silhouette of an image: where the opaque (or lit) pixels start and\n  // end on every scanline, plus the overall bounds. One pass, cached per URL.\n  function rowProfile(image, alphaMode) {\n    const key = `${image.src}:${alphaMode}`;\n    if (boundsCache.has(key)) return boundsCache.get(key);\n\n    const width = image.naturalWidth || image.width;\n    const height = image.naturalHeight || image.height;\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    const context = canvas.getContext('2d', { willReadFrequently: true });\n    context.drawImage(image, 0, 0, width, height);\n    const pixels = context.getImageData(0, 0, width, height).data;\n\n    const left = new Int32Array(height).fill(-1);\n    const right = new Int32Array(height).fill(-1);\n    let top = -1;\n    let bottom = -1;\n    let minX = width;\n    let maxX = -1;\n\n    for (let y = 0; y < height; y += 1) {\n      let lo = -1;\n      let hi = -1;\n      let hits = 0;\n      for (let x = 0; x < width; x += 1) {\n        const index = (y * width + x) * 4;\n        const value = alphaMode\n          ? pixels[index + 3]\n          : Math.max(pixels[index], pixels[index + 1], pixels[index + 2]);\n        if (value > 32) {\n          if (lo < 0) lo = x;\n          hi = x;\n          hits += 1;\n        }\n      }\n      // A row needs a couple of real pixels so a lone speck is not a silhouette.\n      if (hits < 2) continue;\n      left[y] = lo;\n      right[y] = hi;\n      if (top < 0) top = y;\n      bottom = y;\n      if (lo < minX) minX = lo;\n      if (hi > maxX) maxX = hi;\n    }\n\n    const profile = {\n      width,\n      height,\n      left,\n      right,\n      top,\n      bottom,\n      minX: maxX < 0 ? 0 : minX,\n      maxX: maxX < 0 ? width - 1 : maxX,\n      empty: maxX < 0,\n    };\n    boundsCache.set(key, profile);\n    return profile;\n  }\n\n  function profileBounds(profile) {\n    if (profile.empty) return { x: 0, y: 0, width: profile.width, height: profile.height };\n    return {\n      x: profile.minX,\n      y: profile.top,\n      width: profile.maxX - profile.minX + 1,\n      height: profile.bottom - profile.top + 1,\n    };\n  }\n\n  // Luminance percentiles of the base photo inside the arm mask. Computed on a\n  // small resample: percentiles do not need full resolution and this keeps the\n  // page responsive. Cached per image pair.\n  function armLuminancePercentiles(baseImage, maskImage) {\n    const key = `tone:${baseImage.src}:${maskImage.src}`;\n    if (boundsCache.has(key)) return boundsCache.get(key);\n    // Measured at full resolution: resampling first shifted the mask coverage\n    // and the tone distribution, which moved the mapping curve and made two\n    // products with the same settings come out different.\n    const width = baseImage.naturalWidth || baseImage.width;\n    const height = baseImage.naturalHeight || baseImage.height;\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    const context = canvas.getContext('2d', { willReadFrequently: true });\n    context.drawImage(baseImage, 0, 0, width, height);\n    const baseData = context.getImageData(0, 0, width, height).data;\n    context.clearRect(0, 0, width, height);\n    context.drawImage(maskImage, 0, 0, width, height);\n    const maskData = context.getImageData(0, 0, width, height).data;\n    const values = [];\n    for (let i = 0; i < baseData.length; i += 4) {\n      if (maskData[i] > 127) {\n        values.push((0.2126 * baseData[i] + 0.7152 * baseData[i + 1] + 0.0722 * baseData[i + 2]) / 255);\n      }\n    }\n    values.sort((a, b) => a - b);\n    const anchors = [0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99];\n    const result = values.length\n      ? anchors.map((p) => values[Math.min(values.length - 1, Math.floor(p * values.length))])\n      : anchors.slice();\n    boundsCache.set(key, result);\n    return result;\n  }\n\n  function findMainImage() {\n    const selectors = [\n      '.hdt-product__media-item:not([hidden]) img',\n      '.hdt-product-media__main .hdt-product__media-item img',\n      '.t4s-product__media-item.is-selected img',\n      '.t4s-product__media-item.is-active img',\n      '.product__media-item.is-active img',\n      '[data-product-media-container] img',\n      '.product-single__media img',\n      'product-gallery img',\n    ];\n    for (const selector of selectors) {\n      const image = [...document.querySelectorAll(selector)].find((item) => item.offsetWidth > 0 && item.offsetHeight > 0);\n      if (image) return image;\n    }\n    return null;\n  }\n\n  // Shops name the metal option differently from product to product\n  // (\"Plating\", \"Ring Type\", \"Band Color\", ...), so an option is recognised\n  // either by the configured name or by its values being metals we know.\n  function metalOptionInput(productId, optionName) {\n    const configured = normalize(optionName || '');\n    return [...document.querySelectorAll('input[type=\"radio\"][is-value]')].find((item) => {\n      const formId = item.getAttribute('form') || item.closest('form')?.id || '';\n      if (!productId || !formId.endsWith(productId)) return false;\n      if (configured && normalize(item.name) === configured) return true;\n      return metalKey(item.value) !== null;\n    }) || null;\n  }\n\n  function findPlatingAnchor(productId, optionName) {\n    const input = metalOptionInput(productId, optionName);\n    if (!input) return null;\n    return input.closest('fieldset, [data-option-name], .hdt-product-form__option, .hdt-product-form__options, .hdt-product-form__input, .hdt-product-form__item') || input.closest('label') || input;\n  }\n\n  function makeShader(gl, type, source) {\n    const shader = gl.createShader(type);\n    gl.shaderSource(shader, source);\n    gl.compileShader(shader);\n    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n      const error = gl.getShaderInfoLog(shader);\n      gl.deleteShader(shader);\n      throw new Error(error || 'Shader compilation failed');\n    }\n    return shader;\n  }\n\n  function makeProgram(gl) {\n    const vertex = makeShader(gl, gl.VERTEX_SHADER, `#version 300 es\n      in vec2 a_position;\n      out vec2 v_uv;\n      void main() {\n        v_uv = vec2((a_position.x + 1.0) * 0.5, (1.0 - a_position.y) * 0.5);\n        gl_Position = vec4(a_position, 0.0, 1.0);\n      }\n    `);\n    const fragment = makeShader(gl, gl.FRAGMENT_SHADER, `#version 300 es\n      precision highp float;\n      uniform sampler2D u_base;\n      uniform sampler2D u_metal_mask;\n      uniform sampler2D u_stone_mask;\n      uniform sampler2D u_stone;\n      uniform vec3 u_target;\n      uniform float u_strength;\n      uniform float u_value_scale;\n      uniform float u_source_keep;\n      uniform float u_shadow_keep;\n      uniform float u_highlight_lift;\n      uniform float u_black_curve;\n      uniform float u_warmer;\n      uniform float u_has_metal;\n      uniform float u_has_stone;\n      uniform vec2 u_base_size;\n      uniform vec2 u_source_size;\n      uniform vec4 u_source_rect;\n      uniform vec4 u_stone_box;\n      uniform vec2 u_stone_origin;\n      uniform vec2 u_stone_center;\n      uniform float u_stone_scale;\n      uniform float u_stone_rotation;\n      uniform float u_mask_grow;\n      uniform float u_tone_blend;\n      uniform float u_metal_gamma;\n      uniform float u_src_p[7];\n      uniform float u_dst_p[7];\n      in vec2 v_uv;\n      out vec4 out_color;\n\n      float luminance(vec3 color) {\n        return dot(color, vec3(0.2126, 0.7152, 0.0722));\n      }\n\n      // Piecewise linear remap of the source metal tone onto the target\n      // metal's characteristic tone. A dark source photo (black gold) cannot\n      // become bright yellow gold by recolouring alone, which is why the tone\n      // has to be remapped, not just tinted.\n      float toneMapLuma(float l) {\n        if (l <= u_src_p[0]) return u_dst_p[0];\n        if (l >= u_src_p[6]) return u_dst_p[6];\n        for (int i = 0; i < 6; i++) {\n          float a = u_src_p[i];\n          float b = u_src_p[i + 1];\n          if (l >= a && l <= b) {\n            float t = (b - a) > 0.0001 ? (l - a) / (b - a) : 0.0;\n            return mix(u_dst_p[i], u_dst_p[i + 1], t);\n          }\n        }\n        return l;\n      }\n\n      void main() {\n        vec4 base = texture(u_base, v_uv);\n        vec3 color = base.rgb;\n\n        if (u_has_metal > 0.5) {\n          float mask = texture(u_metal_mask, v_uv).r;\n          vec3 target = u_target;\n          float target_luma = max(luminance(target), 0.0001);\n          vec3 delta = target - vec3(target_luma);\n          // Tone remap: only lifts (a source metal darker than the target),\n          // so photos that already match keep their approved look.\n          float source_luma = luminance(color);\n          float luma = mix(source_luma, toneMapLuma(source_luma), u_tone_blend);\n          float highlight = clamp((luma - (u_black_curve > 0.5 ? 0.60 : 0.58)) / (u_black_curve > 0.5 ? 0.30 : 0.34), 0.0, 1.0);\n          float shadow = 1.0 - clamp((luma - (u_black_curve > 0.5 ? 0.10 : 0.12)) / (u_black_curve > 0.5 ? 0.28 : 0.30), 0.0, 1.0);\n          float mapped_luma = luma;\n          if (u_black_curve > 0.5) {\n            mapped_luma = luma <= 0.60\n              ? 0.025 + 0.18 * pow(luma / 0.60, 2.2)\n              : 0.205 + 0.70 * pow((luma - 0.60) / 0.40, 0.75);\n          }\n          float strength = u_strength * (1.0 - 0.78 * highlight - 0.45 * shadow);\n          strength = clamp(strength, u_black_curve > 0.5 ? 0.12 : 0.06, u_strength);\n          float source_keep = u_source_keep + u_shadow_keep * shadow;\n          vec3 mapped = vec3(mapped_luma) + (mapped_luma / target_luma) * delta * strength + (color - vec3(source_luma)) * source_keep;\n          float lift = 1.0 + u_highlight_lift * pow(highlight, u_black_curve > 0.5 ? 1.5 : 1.7);\n          mapped *= u_value_scale * lift;\n          if (u_warmer > 0.5) {\n            float blue_scale = 1.0 - 0.06 * (1.0 - 0.45 * highlight);\n            float new_blue = mapped.b * blue_scale;\n            float luma_loss = 0.0722 * (mapped.b - new_blue);\n            mapped.r += luma_loss * (0.2126 / 0.9278);\n            mapped.g += luma_loss * (0.7152 / 0.9278);\n            mapped.b = new_blue;\n          }\n          // Optional per-product lift for one metal: a gamma below 1 raises the\n          // mid tones without clipping the highlights.\n          vec3 finished = pow(clamp(mapped, 0.0, 1.0), vec3(u_metal_gamma));\n          color = mix(color, finished, mask);\n        }\n\n        if (u_has_stone > 0.5) {\n          // Work in image pixels so the stone keeps its aspect ratio exactly.\n          // The placement box comes from the product's own stone mask, so no\n          // per-product hand measurement is needed.\n          vec2 point = v_uv * u_base_size - u_stone_center;\n          float c = cos(-u_stone_rotation);\n          float s = sin(-u_stone_rotation);\n          point = vec2(c * point.x - s * point.y, s * point.x + c * point.y) + u_stone_center;\n          vec2 source_pixel = u_source_rect.xy + (point - u_stone_origin) / u_stone_scale;\n          vec2 stone_uv = source_pixel / u_source_size;\n          vec4 stone = texture(u_stone, stone_uv);\n          float inside = step(0.0, stone_uv.x) * step(stone_uv.x, 1.0)\n                       * step(0.0, stone_uv.y) * step(stone_uv.y, 1.0);\n          // Optional outward growth of the hand-made mask, so a mask that was\n          // traced slightly inside the real stone cannot leave a rim of the\n          // original gem behind. It never touches the mask file itself.\n          // u_stone_center is in image pixels, so convert it before mixing it\n          // with the UV coordinates of the current fragment.\n          vec2 mask_center_uv = u_stone_center / u_base_size;\n          vec2 mask_uv = mask_center_uv + (v_uv - mask_center_uv) / u_mask_grow;\n          float mask_inside = step(0.0, mask_uv.x) * step(mask_uv.x, 1.0)\n                            * step(0.0, mask_uv.y) * step(mask_uv.y, 1.0);\n          float mask = texture(u_stone_mask, clamp(mask_uv, 0.0, 1.0)).r * mask_inside;\n          float alpha = stone.a * mask * inside;\n          color = mix(color, stone.rgb, clamp(alpha, 0.0, 1.0));\n        }\n\n        out_color = vec4(clamp(color, 0.0, 1.0), 1.0);\n      }\n    `);\n    const program = gl.createProgram();\n    gl.attachShader(program, vertex);\n    gl.attachShader(program, fragment);\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) || 'Program link failed');\n    gl.deleteShader(vertex);\n    gl.deleteShader(fragment);\n    return program;\n  }\n\n  function createTexture(gl, image, unit) {\n    const texture = gl.createTexture();\n    gl.activeTexture(gl.TEXTURE0 + unit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // The vertex shader already maps V so that v_uv.y = 0 is the top of the\n    // displayed canvas, so the texture must NOT be flipped on upload.\n    // Flipping here as well mirrored the whole product photo vertically.\n    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return texture;\n  }\n\n  class JewelryVisualizer {\n    constructor(root) {\n      this.root = root;\n      this.stoneRoot = document.querySelector(STONE_ROOT_SELECTOR);\n      this.stoneLabel = this.stoneRoot ? this.stoneRoot.querySelector('[data-aner-stone-label]') : null;\n      this.canvas = document.createElement('canvas');\n      this.canvas.className = 'aner-metal-preview-canvas aner-jewelry-preview-canvas';\n      this.canvas.setAttribute('aria-hidden', 'true');\n      this.canvas.addEventListener('webglcontextlost', (event) => {\n        event.preventDefault();\n        this.gl = null;\n        this.program = null;\n        this.textures.clear();\n      });\n      this.canvas.addEventListener('webglcontextrestored', () => {\n        this.render();\n      });\n      this.gl = null;\n      this.program = null;\n      this.textures = new Map();\n      this.baseImage = null;\n      this.armMaskImage = null;\n      this.stoneMaskImage = null;\n      this.activeMetal = null;\n      this.activeStone = null;\n      this.geometryCache = new Map();\n      this.renderGeneration = 0;\n      this.attachScheduled = false;\n      this.bindEvents();\n      this.observeGallery();\n      this.placeBelowPlating();\n      this.attachCanvas();\n    }\n\n    bindEvents() {\n      document.addEventListener('change', (event) => {\n        const input = event.target;\n        if (!(input instanceof Element) || !this.isCurrentMetalControl(input)) return;\n        const value = input.checked ? input.value : '';\n        const key = metalKey(value);\n        if (key) {\n          this.activeMetal = key;\n          this.render();\n        }\n      }, true);\n\n      this.stoneRoot?.addEventListener('click', (event) => {\n        const button = event.target.closest('.aner-main-stone-thumb');\n        if (!button || !this.stoneRoot.contains(button)) return;\n        event.preventDefault();\n        this.activeStone = {\n          key: button.dataset.anerStone,\n          url: button.dataset.anerStoneSrc,\n          button,\n        };\n        this.stoneRoot.querySelectorAll('.aner-main-stone-thumb').forEach((item) => {\n          const selected = item === button;\n          item.classList.toggle('is-selected', selected);\n          item.setAttribute('aria-pressed', String(selected));\n        });\n        if (this.stoneLabel) {\n          const stoneName = button.getAttribute('aria-label') || button.textContent.trim();\n          this.stoneLabel.textContent = stoneName ? ' ' + stoneName : '';\n        }\n        this.render();\n      });\n    }\n\n    isCurrentMetalControl(element) {\n      const label = element.closest('label');\n      const linkedInput = label?.control || (label?.htmlFor ? document.getElementById(label.htmlFor) : null);\n      const input = element.matches('input[type=\"radio\"][is-value]') ? element : linkedInput || element.closest('input[type=\"radio\"][is-value]');\n      if (!input) return false;\n      // The product id comes from the section, so the same asset serves every\n      // product and no id is baked into this file.\n      const productId = String(this.root.dataset.productId || '');\n      const formId = input.getAttribute('form') || input.closest('form')?.id || '';\n      if (!productId || !formId.endsWith(productId)) return false;\n      const configured = normalize(this.root.dataset.optionName || '');\n      if (configured && normalize(input.name) === configured) return true;\n      // Products name this option differently (\"Plating\", \"Ring Type\", ...), so\n      // any option whose values are metals we know counts as the metal option.\n      return metalKey(input.value) !== null;\n    }\n\n    observeGallery() {\n      this.observer = new MutationObserver(() => this.scheduleAttach());\n      this.observer.observe(document.body, { childList: true, subtree: true });\n      window.addEventListener('resize', () => this.scheduleAttach(), { passive: true });\n    }\n\n    scheduleAttach() {\n      if (this.attachScheduled) return;\n      this.attachScheduled = true;\n      requestAnimationFrame(() => {\n        this.attachScheduled = false;\n        this.placeBelowPlating();\n        this.attachCanvas();\n      });\n    }\n\n    placeBelowPlating() {\n      const anchor = findPlatingAnchor(String(this.root.dataset.productId || ''), this.root.dataset.optionName || '');\n      if (!anchor || !anchor.parentElement || !this.stoneRoot || this.stoneRoot === anchor) return;\n      if (this.stoneRoot.previousElementSibling !== anchor) anchor.parentElement.insertBefore(this.stoneRoot, anchor.nextElementSibling);\n    }\n\n    attachCanvas() {\n      const image = findMainImage();\n      if (!image) return;\n      const host = image.closest('.hdt-product__media-item, .hdt-product__media, .hdt-product-media__main, .t4s-product__media-item, .product__media-item, [data-product-media-container], .product-single__media') || image.parentElement;\n      if (!host) return;\n      if (getComputedStyle(host).position === 'static') host.style.position = 'relative';\n      if (this.canvas.parentElement !== host) host.appendChild(this.canvas);\n      this.galleryHost = host;\n      if (this.baseImage) {\n        this.canvas.width = this.baseImage.naturalWidth || this.baseImage.width;\n        this.canvas.height = this.baseImage.naturalHeight || this.baseImage.height;\n      }\n      if (this.activeMetal || this.activeStone) this.canvas.classList.add('is-active');\n    }\n\n    async ensureImages() {\n      if (!this.baseImage) this.baseImage = await loadImage(this.root.dataset.baseImage);\n      if (this.activeMetal && !this.armMaskImage) this.armMaskImage = await loadImage(this.root.dataset.armMask);\n      if (this.activeStone && !this.stoneMaskImage) this.stoneMaskImage = await loadImage(this.root.dataset.stoneMask);\n      const stoneImage = this.activeStone ? await loadImage(this.activeStone.url) : null;\n      return { stoneImage };\n    }\n\n    ensureGl() {\n      if (this.gl && this.program) return true;\n      this.gl = this.canvas.getContext('webgl2', { alpha: true, antialias: false, premultipliedAlpha: false, preserveDrawingBuffer: false });\n      if (!this.gl) return false;\n      this.program = makeProgram(this.gl);\n      const gl = this.gl;\n      const positions = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, positions);\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);\n      const location = gl.getAttribLocation(this.program, 'a_position');\n      gl.useProgram(this.program);\n      gl.enableVertexAttribArray(location);\n      gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0);\n      this.locations = {};\n      ['u_base', 'u_metal_mask', 'u_stone_mask', 'u_stone', 'u_target', 'u_strength', 'u_value_scale', 'u_source_keep', 'u_shadow_keep', 'u_highlight_lift', 'u_black_curve', 'u_warmer', 'u_has_metal', 'u_has_stone', 'u_base_size', 'u_source_size', 'u_source_rect', 'u_stone_box', 'u_stone_origin', 'u_stone_center', 'u_stone_scale', 'u_stone_rotation', 'u_mask_grow', 'u_tone_blend', 'u_src_p[0]', 'u_dst_p[0]', 'u_metal_gamma'].forEach((name) => {\n        this.locations[name] = gl.getUniformLocation(this.program, name);\n      });\n      return true;\n    }\n\n    stoneTuning() {\n      let tuning = null;\n      try {\n        tuning = JSON.parse(this.root.dataset.stoneTuning || '');\n      } catch (error) {\n        tuning = null;\n      }\n      return tuning && typeof tuning === 'object' ? tuning : {};\n    }\n\n    // The product's own stone mask defines where the stone belongs. The mask\n    // bounding box is used as the fit box, the stone is scaled by ONE factor\n    // (so its aspect ratio never changes) and centred inside that box.\n    // \"cover\" guarantees the whole masked area is filled, which is what a\n    // stone replacement needs: no sliver of the original stone can survive.\n    // A bounding box is not enough: two gems can share a box and still have\n    // different silhouettes. Find the smallest uniform scale whose gem outline\n    // covers the mask outline on every scanline, so no sliver of the original\n    // stone can survive while the aspect ratio stays untouched.\n    silhouetteCoverScale(context) {\n      const { maskProfile, scaleX, scaleY, box, centerX, centerY, maskGrow, sourceBounds, sourceProfile } = context;\n      const base = Math.max(box.width / sourceBounds.width, box.height / sourceBounds.height);\n      const limit = base * 2.5;\n      const maskCenterX = centerX / scaleX;\n      const maskCenterY = centerY / scaleY;\n      const halfHeight = (box.height * maskGrow) / scaleY / 2;\n      const rows = [];\n\n      for (let y = Math.ceil(centerY - (box.height * maskGrow) / 2); y <= Math.floor(centerY + (box.height * maskGrow) / 2); y += 2) {\n        const maskY = Math.round(maskCenterY + (y / scaleY - maskCenterY) / maskGrow);\n        if (maskY < 0 || maskY >= maskProfile.height) continue;\n        const lo = maskProfile.left[maskY];\n        const hi = maskProfile.right[maskY];\n        if (lo < 0) continue;\n        const grownLeft = maskCenterX + (lo - maskCenterX) / maskGrow;\n        const grownRight = maskCenterX + (hi - maskCenterX) / maskGrow;\n        rows.push([y, grownLeft * scaleX, grownRight * scaleX]);\n      }\n      if (!rows.length) return base;\n\n      let scale = base;\n      for (let step = 0; step < 260 && scale <= limit; step += 1) {\n        const originX = centerX - (sourceBounds.width * scale) / 2;\n        const originY = centerY - (sourceBounds.height * scale) / 2;\n        let covered = true;\n        for (let index = 0; index < rows.length; index += 1) {\n          const [y, needLeft, needRight] = rows[index];\n          const sourceY = Math.round(sourceBounds.y + (y - originY) / scale);\n          if (sourceY < 0 || sourceY >= sourceProfile.height) { covered = false; break; }\n          const stoneLeft = sourceProfile.left[sourceY];\n          const stoneRight = sourceProfile.right[sourceY];\n          if (stoneLeft < 0) { covered = false; break; }\n          const haveLeft = originX + (stoneLeft - sourceBounds.x) * scale;\n          const haveRight = originX + (stoneRight - sourceBounds.x) * scale;\n          if (haveLeft > needLeft + 0.5 || haveRight < needRight - 0.5) { covered = false; break; }\n        }\n        if (covered) break;\n        scale *= 1.004;\n      }\n      return Math.min(scale, limit);\n    }\n\n    getStoneGeometry(maskImage, baseImage, sourceProfile) {\n      const tuning = this.stoneTuning();\n      const baseWidth = baseImage.naturalWidth || baseImage.width;\n      const baseHeight = baseImage.naturalHeight || baseImage.height;\n      const maskWidth = maskImage.naturalWidth || maskImage.width;\n      const maskHeight = maskImage.naturalHeight || maskImage.height;\n      const maskProfile = rowProfile(maskImage, false);\n      const bounds = profileBounds(maskProfile);\n      const sourceBounds = profileBounds(sourceProfile);\n      const scaleX = baseWidth / maskWidth;\n      const scaleY = baseHeight / maskHeight;\n      const box = {\n        x: bounds.x * scaleX,\n        y: bounds.y * scaleY,\n        width: bounds.width * scaleX,\n        height: bounds.height * scaleY,\n      };\n      const centerX = box.x + box.width / 2;\n      const centerY = box.y + box.height / 2;\n      const mode = tuning.fit === 'contain' ? 'contain' : 'cover';\n      // Default is no growth: a hand-traced mask that sits exactly on the gem\n      // edge must not be pushed outwards, or the new stone paints over the\n      // setting. Raise maskGrow only for a product whose mask is known to be\n      // traced inside the real gem.\n      const maskGrow = Math.max(1, 1 + (Number.isFinite(Number(tuning.maskGrow)) ? Number(tuning.maskGrow) : 0));\n      const multiplier = Number.isFinite(Number(tuning.scale)) ? Number(tuning.scale) : 1;\n      const ratio = mode === 'contain'\n        ? Math.min(box.width / sourceBounds.width, box.height / sourceBounds.height)\n        : this.silhouetteCoverScale({\n          maskProfile, scaleX, scaleY, box, centerX, centerY, maskGrow, sourceBounds, sourceProfile,\n        });\n      const scale = Math.max(ratio * multiplier, 1e-6);\n      const drawnWidth = sourceBounds.width * scale;\n      const drawnHeight = sourceBounds.height * scale;\n      return {\n        box,\n        scale,\n        originX: centerX - drawnWidth / 2 + (Number(tuning.offsetX) || 0),\n        originY: centerY - drawnHeight / 2 + (Number(tuning.offsetY) || 0),\n        centerX,\n        centerY,\n        rotation: Number(tuning.rotation) || 0,\n        maskGrow,\n      };\n    }\n\n    getTexture(key, image, unit) {\n      if (!this.textures.has(key)) this.textures.set(key, createTexture(this.gl, image, unit));\n      const texture = this.textures.get(key);\n      this.gl.activeTexture(this.gl.TEXTURE0 + unit);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      return texture;\n    }\n\n    async render() {\n      if (!this.activeMetal && !this.activeStone) return;\n      const generation = ++this.renderGeneration;\n      try {\n        const { stoneImage } = await this.ensureImages();\n        if (generation !== this.renderGeneration) return;\n        this.attachCanvas();\n        if (!this.galleryHost || !this.ensureGl()) return;\n        const gl = this.gl;\n        const baseWidth = this.baseImage.naturalWidth || this.baseImage.width;\n        const baseHeight = this.baseImage.naturalHeight || this.baseImage.height;\n        this.canvas.width = baseWidth;\n        this.canvas.height = baseHeight;\n        gl.viewport(0, 0, baseWidth, baseHeight);\n        gl.useProgram(this.program);\n        this.getTexture('base', this.baseImage, 0);\n        gl.uniform1i(this.locations.u_base, 0);\n        gl.uniform1f(this.locations.u_has_metal, this.activeMetal ? 1 : 0);\n        gl.uniform1f(this.locations.u_has_stone, this.activeStone ? 1 : 0);\n\n        if (this.activeMetal) {\n          const preset = PRESETS[this.activeMetal];\n          this.getTexture('arm-mask', this.armMaskImage, 1);\n          gl.uniform1i(this.locations.u_metal_mask, 1);\n          gl.uniform3fv(this.locations.u_target, new Float32Array(preset.target.map((value) => value / 255)));\n          gl.uniform1f(this.locations.u_strength, preset.strength);\n          gl.uniform1f(this.locations.u_value_scale, preset.valueScale);\n          gl.uniform1f(this.locations.u_source_keep, preset.sourceKeep);\n          gl.uniform1f(this.locations.u_shadow_keep, preset.shadowKeep);\n          gl.uniform1f(this.locations.u_highlight_lift, preset.highlightLift);\n          gl.uniform1f(this.locations.u_black_curve, preset.blackCurve ? 1 : 0);\n          gl.uniform1f(this.locations.u_warmer, preset.warmer ? 1 : 0);\n          const sourceTone = armLuminancePercentiles(this.baseImage, this.armMaskImage);\n          const targetTone = TONE_TARGETS[this.activeMetal];\n          gl.uniform1fv(this.locations['u_src_p[0]'], new Float32Array(sourceTone));\n          gl.uniform1fv(this.locations['u_dst_p[0]'], new Float32Array(targetTone));\n          const toneGap = targetTone[3] - sourceTone[3];\n          // toneLock keeps a product exactly as approved: the tone map is\n          // disabled and the source photo's own tone is used unchanged.\n          const toneLocked = this.stoneTuning().toneLock === true;\n          // Black gold always normalises: its dark look comes from the\n          // compression curve, so the input tone must not depend on the photo.\n          // Otherwise a bright source photo yields a much lighter black gold.\n          const blend = this.activeMetal === 'black'\n            ? 1\n            : Math.max(0, Math.min(1, (toneGap - 0.03) / 0.07));\n          gl.uniform1f(this.locations.u_tone_blend, toneLocked ? 0 : blend);\n          const gammaTable = this.stoneTuning().metalGamma;\n          const metalGamma = gammaTable && Number.isFinite(Number(gammaTable[this.activeMetal]))\n            ? Number(gammaTable[this.activeMetal])\n            : 1;\n          gl.uniform1f(this.locations.u_metal_gamma, metalGamma);\n        }\n\n        if (this.activeStone) {\n          const mask = this.stoneMaskImage;\n          const sourceProfile = rowProfile(stoneImage, true);\n          const sourceBounds = profileBounds(sourceProfile);\n          // The fit search costs a few tens of milliseconds, so remember it for\n          // every later click on the same stone.\n          const geometryKey = `${mask.src}|${this.activeStone.url}`;\n          let geometry = this.geometryCache.get(geometryKey);\n          if (!geometry) {\n            geometry = this.getStoneGeometry(mask, this.baseImage, sourceProfile);\n            this.geometryCache.set(geometryKey, geometry);\n          }\n          this.getTexture('stone-mask', mask, 2);\n          this.getTexture(`stone:${this.activeStone.url}`, stoneImage, 3);\n          gl.uniform1i(this.locations.u_stone_mask, 2);\n          gl.uniform1i(this.locations.u_stone, 3);\n          const sourceWidth = stoneImage.naturalWidth || stoneImage.width;\n          const sourceHeight = stoneImage.naturalHeight || stoneImage.height;\n          gl.uniform2f(this.locations.u_base_size, baseWidth, baseHeight);\n          gl.uniform2f(this.locations.u_source_size, sourceWidth, sourceHeight);\n          gl.uniform4f(this.locations.u_source_rect, sourceBounds.x, sourceBounds.y, sourceBounds.width, sourceBounds.height);\n          gl.uniform4f(this.locations.u_stone_box, geometry.box.x, geometry.box.y, geometry.box.width, geometry.box.height);\n          gl.uniform2f(this.locations.u_stone_origin, geometry.originX, geometry.originY);\n          gl.uniform2f(this.locations.u_stone_center, geometry.centerX, geometry.centerY);\n          gl.uniform1f(this.locations.u_stone_scale, geometry.scale);\n          gl.uniform1f(this.locations.u_stone_rotation, geometry.rotation * Math.PI / 180);\n          gl.uniform1f(this.locations.u_mask_grow, geometry.maskGrow);\n        }\n\n        gl.clearColor(0, 0, 0, 0);\n        gl.clear(gl.COLOR_BUFFER_BIT);\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n        if (generation === this.renderGeneration) this.canvas.classList.add('is-active');\n      } catch (error) {\n        console.warn('[ANER jewelry visualizer]', error.message);\n      }\n    }\n  }\n\n  function boot() {\n    document.querySelectorAll(ROOT_SELECTOR).forEach((root) => {\n      if (root.dataset.anerVisualizerInstance === 'true') return;\n      // Nothing to do when the section did not render its configuration.\n      if (!root.dataset.productId || !root.dataset.baseImage) return;\n      root.dataset.anerVisualizerInstance = 'true';\n      new JewelryVisualizer(root);\n    });\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true });\n  else boot();\n})();\n"],
  "mappings": "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",
  "names": []
}
