{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/ring-atmosphere.js?build=20260906-breathing-reflections"],
  "sourcesContent": ["import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';\n\nconst STYLE_ID = 'privateparts-ring-atmosphere-style';\nconst rendererStates = new WeakMap();\nconst reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\nconst ensureStyles = () => {\n  if (document.getElementById(STYLE_ID)) return;\n  const style = document.createElement('style');\n  style.id = STYLE_ID;\n  style.textContent = `\n    .cobalt-product .product-shell {\n      position: relative;\n      isolation: isolate;\n    }\n    .privateparts-ring-light {\n      position: absolute;\n      left: var(--pp-ring-light-x, 45%);\n      top: var(--pp-ring-light-y, 46%);\n      width: var(--pp-ring-light-size, 1050px);\n      height: calc(var(--pp-ring-light-size, 1050px) * .78);\n      border-radius: 50%;\n      pointer-events: none;\n      z-index: 20;\n      opacity: var(--pp-ring-light-opacity, 0);\n      transform: translate3d(-50%, -50%, 0) scale(var(--pp-ring-light-scale, 1));\n      transform-origin: 50% 50%;\n      background:\n        radial-gradient(\n          ellipse at 50% 50%,\n          rgba(255,255,255,.18) 0%,\n          rgba(248,251,255,.10) 24%,\n          rgba(232,240,250,.040) 48%,\n          rgba(255,255,255,0) 74%\n        ),\n        radial-gradient(\n          ellipse at 70% 47%,\n          rgba(162,190,255,.070) 0%,\n          rgba(130,166,255,.025) 37%,\n          rgba(120,150,255,0) 68%\n        );\n      mix-blend-mode: screen;\n      will-change: opacity, transform;\n    }\n    @media (prefers-reduced-motion: reduce) {\n      .privateparts-ring-light {\n        transform: translate3d(-50%, -50%, 0);\n        opacity: .16;\n      }\n    }\n  `;\n  document.head.appendChild(style);\n};\n\nconst makeState = renderer => {\n  const viewer = renderer?.domElement?.closest?.('[data-ring-viewer]');\n  if (!viewer) return null;\n  const shell = viewer.closest('.product-shell');\n  if (!shell) return null;\n\n  ensureStyles();\n\n  let light = shell.querySelector('.privateparts-ring-light');\n  if (!light) {\n    light = document.createElement('span');\n    light.className = 'privateparts-ring-light';\n    light.setAttribute('aria-hidden', 'true');\n    shell.appendChild(light);\n  }\n\n  const state = {\n    viewer,\n    shell,\n    light,\n    pointers: new Set(),\n    activity: 0,\n    currentOpacity: 0,\n    seed: Math.random() * Math.PI * 2,\n    directionalLights: [],\n    chromeMaterials: []\n  };\n\n  const positionLight = () => {\n    const shellRect = shell.getBoundingClientRect();\n    const viewerRect = viewer.getBoundingClientRect();\n    if (!shellRect.width || !viewerRect.width) return;\n\n    const x = viewerRect.left - shellRect.left + viewerRect.width * .72;\n    const y = viewerRect.top - shellRect.top + viewerRect.height * .50;\n    const span = Math.max(viewerRect.width, viewerRect.height);\n    const size = Math.max(760, Math.min(1320, span * 1.48));\n\n    shell.style.setProperty('--pp-ring-light-x', `${x}px`);\n    shell.style.setProperty('--pp-ring-light-y', `${y}px`);\n    shell.style.setProperty('--pp-ring-light-size', `${size}px`);\n  };\n\n  const wake = amount => {\n    state.activity = Math.min(1, Math.max(state.activity, amount));\n  };\n\n  viewer.addEventListener('pointerdown', event => {\n    state.pointers.add(event.pointerId);\n    wake(.42);\n  }, { passive: true });\n  viewer.addEventListener('pointermove', event => {\n    if (state.pointers.has(event.pointerId)) wake(.68);\n  }, { passive: true });\n  const release = event => {\n    state.pointers.delete(event.pointerId);\n    wake(.38);\n  };\n  viewer.addEventListener('pointerup', release, { passive: true });\n  viewer.addEventListener('pointercancel', release, { passive: true });\n  viewer.addEventListener('wheel', () => wake(.42), { passive: true });\n\n  const visibilityObserver = new MutationObserver(() => {\n    if (!viewer.classList.contains('is-active')) {\n      shell.style.setProperty('--pp-ring-light-opacity', '0');\n    } else {\n      shell.style.setProperty('--pp-ring-light-opacity', state.currentOpacity.toFixed(3));\n      positionLight();\n    }\n  });\n  visibilityObserver.observe(viewer, { attributes: true, attributeFilter: ['class'] });\n\n  const resizeObserver = new ResizeObserver(positionLight);\n  resizeObserver.observe(viewer);\n  resizeObserver.observe(shell);\n  positionLight();\n\n  rendererStates.set(renderer, state);\n  return state;\n};\n\nconst collectSceneResponse = (state, scene) => {\n  if (!state.directionalLights.length) {\n    state.directionalLights = scene.children\n      .filter(child => child.isDirectionalLight)\n      .map(light => ({\n        light,\n        baseIntensity: light.intensity,\n        basePosition: light.position.clone()\n      }));\n  }\n\n  if (!state.chromeMaterials.length) {\n    const seen = new Set();\n    scene.traverse(node => {\n      if (!node.isMesh) return;\n      const materials = Array.isArray(node.material) ? node.material : [node.material];\n      materials.forEach(material => {\n        if (!material?.isMeshPhysicalMaterial || material.metalness < .8 || seen.has(material)) return;\n        seen.add(material);\n        state.chromeMaterials.push({\n          material,\n          baseEnvMapIntensity: material.envMapIntensity\n        });\n      });\n    });\n  }\n};\n\nconst originalRender = RenderPass.prototype.render;\n\nRenderPass.prototype.render = function(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {\n  const state = rendererStates.get(renderer) || makeState(renderer);\n  const scene = this.scene;\n\n  if (state && scene) {\n    const t = performance.now() * .001;\n    const seed = state.seed;\n    collectSceneResponse(state, scene);\n\n    const breath = .5\n      + .33 * Math.sin(t * .19 + seed)\n      + .14 * Math.sin(t * .31 + 2.1)\n      + .06 * Math.sin(t * .53 + 4.0 + seed);\n    const clampedBreath = Math.max(0, Math.min(1, breath));\n\n    state.activity *= .972;\n    const activity = reduceMotion.matches ? 0 : state.activity;\n\n    if (!reduceMotion.matches) {\n      // Important: do not touch the ring group's quaternion. The original\n      // microscopic ambient rotation in ring-viewer.js remains exactly intact.\n      if (scene.environmentRotation?.set) {\n        scene.environmentRotation.set(\n          .020 * Math.sin(t * .15 + seed) + .009 * Math.sin(t * .37 + 1.4),\n          .043 * Math.sin(t * .13 + .8 + seed) + .013 * Math.sin(t * .27 + 2.3),\n          .012 * Math.sin(t * .11 + 2.6 + seed)\n        );\n      }\n\n      // Move the studio lights slightly so broad chrome highlights actually\n      // travel over the surface instead of relying only on HDRI rotation.\n      state.directionalLights.forEach(({ light, baseIntensity, basePosition }, index) => {\n        const phase = t * (.12 + index * .027) + seed + index * 1.9;\n        const amount = index === 1 ? .42 : .28;\n        light.position.set(\n          basePosition.x + Math.sin(phase) * amount,\n          basePosition.y + Math.cos(phase * .83 + .6) * amount * .55,\n          basePosition.z + Math.sin(phase * .71 + 2.0) * amount * .42\n        );\n        const intensityLift = index === 1\n          ? 1.01 + (clampedBreath - .5) * .055\n          : .995 + (clampedBreath - .5) * .035;\n        light.intensity = baseIntensity * intensityLift;\n      });\n\n      const envLift = (clampedBreath - .5) * .12 + activity * .025;\n      state.chromeMaterials.forEach(({ material, baseEnvMapIntensity }) => {\n        material.envMapIntensity = Math.max(.05, baseEnvMapIntensity + envLift);\n      });\n    } else {\n      if (scene.environmentRotation?.set) scene.environmentRotation.set(0, 0, 0);\n      state.directionalLights.forEach(({ light, baseIntensity, basePosition }) => {\n        light.position.copy(basePosition);\n        light.intensity = baseIntensity;\n      });\n      state.chromeMaterials.forEach(({ material, baseEnvMapIntensity }) => {\n        material.envMapIntensity = baseEnvMapIntensity;\n      });\n    }\n\n    const opacity = reduceMotion.matches\n      ? .16\n      : .24 + clampedBreath * .18 + activity * .045;\n    const scale = reduceMotion.matches\n      ? 1\n      : .975 + clampedBreath * .045 + activity * .008;\n\n    state.currentOpacity = opacity;\n    state.shell.style.setProperty(\n      '--pp-ring-light-opacity',\n      state.viewer.classList.contains('is-active') ? opacity.toFixed(3) : '0'\n    );\n    state.shell.style.setProperty('--pp-ring-light-scale', scale.toFixed(4));\n  }\n\n  return originalRender.call(this, renderer, writeBuffer, readBuffer, deltaTime, maskActive);\n};\n"],
  "mappings": "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",
  "names": []
}
