{"version":3,"file":"revealLens.mjs","names":[],"sources":["../../../../package/common/revealLens/revealLens.tsx"],"sourcesContent":["import { useRef, type PointerEvent as ReactPointerEvent, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport { useComponentDefaults } from '../configProvider';\nimport type { RevealLensProps } from './revealLens.types';\nimport styles from './revealLens.module.pcss';\n\nfunction buildMaskImage(x: number, y: number, radius: number, feather: number): string {\n  const inner = Math.max(radius - feather, 0);\n  return `radial-gradient(circle ${radius}px at ${x}px ${y}px, transparent ${inner}px, transparent ${inner}px, white ${radius}px)`;\n}\n\nfunction applyMask(overlay: HTMLDivElement, value: string) {\n  overlay.style.setProperty('mask-image', value);\n  overlay.style.setProperty('-webkit-mask-image', value);\n}\n\nfunction clearMask(overlay: HTMLDivElement) {\n  overlay.style.removeProperty('mask-image');\n  overlay.style.removeProperty('-webkit-mask-image');\n}\n\nfunction RevealLens(props: RevealLensProps): ReactElement {\n  const {\n    background,\n    overlay,\n    radius = 120,\n    feather = 24,\n    shape = 'circle',\n    maskImage,\n    disabled = false,\n    className,\n    style,\n    classNames,\n    styles: slotStyles,\n    ...rest\n  } = useComponentDefaults('RevealLens', props);\n\n  const rootRef = useRef<HTMLDivElement>(null);\n  const overlayRef = useRef<HTMLDivElement>(null);\n\n  const updateMask = (clientX: number, clientY: number) => {\n    const root = rootRef.current;\n    const overlayEl = overlayRef.current;\n    if (!root || !overlayEl) return;\n\n    const rect = root.getBoundingClientRect();\n    const x = clientX - rect.left;\n    const y = clientY - rect.top;\n\n    overlayEl.classList.remove(styles.revealLensOverlayTransitioning);\n    applyMask(overlayEl, maskImage ?? buildMaskImage(x, y, radius, feather));\n  };\n\n  const resetMask = () => {\n    const overlayEl = overlayRef.current;\n    if (!overlayEl) return;\n\n    overlayEl.classList.add(styles.revealLensOverlayTransitioning);\n    clearMask(overlayEl);\n  };\n\n  const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n    if (disabled) return;\n    event.currentTarget.setPointerCapture?.(event.pointerId);\n    updateMask(event.clientX, event.clientY);\n  };\n\n  const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n    if (disabled) return;\n    updateMask(event.clientX, event.clientY);\n  };\n\n  const handlePointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n    if (disabled || event.pointerType === 'mouse') return;\n    resetMask();\n  };\n\n  // pointerleave/pointercancel can fire spuriously, with the pointer still physically over the\n  // element, when it's nested inside two coincident 3D transform contexts (e.g. Tilt + Flip\n  // composed per the docs, where Flip fills Tilt exactly and their perspective-origins land on\n  // the same pixel). At that shared origin point, Chromium's hit-test can misresolve to an\n  // ancestor instead of the actual topmost content. elementFromPoint reads that same broken\n  // result, so it can't be trusted there either. The event's own clientX/clientY are real,\n  // unaffected viewport coordinates, so check those directly against our own (transform-aware)\n  // bounding rect first. A leave that's still geometrically inside us is never real.\n  const handlePointerEnd = (event: ReactPointerEvent<HTMLDivElement>) => {\n    if (disabled) return;\n    const root = rootRef.current;\n    if (root) {\n      const rect = root.getBoundingClientRect();\n      const stillInside =\n        event.clientX >= rect.left &&\n        event.clientX <= rect.right &&\n        event.clientY >= rect.top &&\n        event.clientY <= rect.bottom;\n      if (stillInside) return;\n\n      if (typeof document.elementFromPoint === 'function') {\n        const target = document.elementFromPoint(event.clientX, event.clientY);\n        if (target && root.contains(target)) return;\n      }\n    }\n    resetMask();\n  };\n\n  return (\n    <div\n      {...rest}\n      ref={rootRef}\n      className={cx(styles.revealLens, className, classNames?.root)}\n      style={{ ...style, ...slotStyles?.root }}\n      data-reveal-shape={shape}\n      onPointerDown={handlePointerDown}\n      onPointerMove={handlePointerMove}\n      onPointerUp={handlePointerUp}\n      onPointerCancel={handlePointerEnd}\n      onPointerLeave={handlePointerEnd}\n    >\n      <div className={cx(styles.revealLensBackground, classNames?.background)} style={slotStyles?.background}>\n        {background}\n      </div>\n      <div ref={overlayRef} className={cx(styles.revealLensOverlay, classNames?.overlay)} style={slotStyles?.overlay}>\n        {overlay}\n      </div>\n    </div>\n  );\n}\n\nexport default RevealLens;\n"],"mappings":"iPAOA,SAAS,EAAe,EAAW,EAAW,EAAgB,EAAyB,CACrF,IAAM,EAAQ,KAAK,IAAI,EAAS,EAAS,CAAC,EAC1C,MAAO,0BAA0B,EAAO,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAM,kBAAkB,EAAM,YAAY,EAAO,IAC9H,CAEA,SAAS,EAAU,EAAyB,EAAe,CACzD,EAAQ,MAAM,YAAY,aAAc,CAAK,EAC7C,EAAQ,MAAM,YAAY,qBAAsB,CAAK,CACvD,CAEA,SAAS,EAAU,EAAyB,CAC1C,EAAQ,MAAM,eAAe,YAAY,EACzC,EAAQ,MAAM,eAAe,oBAAoB,CACnD,CAEA,SAAS,EAAW,EAAsC,CACxD,GAAM,CACJ,aACA,UACA,SAAS,IACT,UAAU,GACV,QAAQ,SACR,YACA,WAAW,GACX,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACD,EAAqB,aAAc,CAAK,EAEtC,EAAU,EAAuB,IAAI,EACrC,EAAa,EAAuB,IAAI,EAExC,GAAc,EAAiB,IAAoB,CACvD,IAAM,EAAO,EAAQ,QACf,EAAY,EAAW,QAC7B,GAAI,CAAC,GAAQ,CAAC,EAAW,OAEzB,IAAM,EAAO,EAAK,sBAAsB,EAClC,EAAI,EAAU,EAAK,KACnB,EAAI,EAAU,EAAK,IAEzB,EAAU,UAAU,OAAO,EAAO,8BAA8B,EAChE,EAAU,EAAW,GAAa,EAAe,EAAG,EAAG,EAAQ,CAAO,CAAC,CACzE,EAEM,MAAkB,CACtB,IAAM,EAAY,EAAW,QACxB,IAEL,EAAU,UAAU,IAAI,EAAO,8BAA8B,EAC7D,EAAU,CAAS,EACrB,EAEM,EAAqB,GAA6C,CAClE,IACJ,EAAM,cAAc,oBAAoB,EAAM,SAAS,EACvD,EAAW,EAAM,QAAS,EAAM,OAAO,EACzC,EAEM,EAAqB,GAA6C,CAClE,GACJ,EAAW,EAAM,QAAS,EAAM,OAAO,CACzC,EAEM,EAAmB,GAA6C,CAChE,GAAY,EAAM,cAAgB,SACtC,EAAU,CACZ,EAUM,EAAoB,GAA6C,CACrE,GAAI,EAAU,OACd,IAAM,EAAO,EAAQ,QACrB,GAAI,EAAM,CACR,IAAM,EAAO,EAAK,sBAAsB,EAMxC,GAJE,EAAM,SAAW,EAAK,MACtB,EAAM,SAAW,EAAK,OACtB,EAAM,SAAW,EAAK,KACtB,EAAM,SAAW,EAAK,OACP,OAEjB,GAAI,OAAO,SAAS,kBAAqB,WAAY,CACnD,IAAM,EAAS,SAAS,iBAAiB,EAAM,QAAS,EAAM,OAAO,EACrE,GAAI,GAAU,EAAK,SAAS,CAAM,EAAG,MACvC,CACF,CACA,EAAU,CACZ,EAEA,OACE,EAAC,MAAD,CACE,GAAI,EACJ,IAAK,EACL,UAAW,EAAG,EAAO,WAAY,EAAW,GAAY,IAAI,EAC5D,MAAO,CAAE,GAAG,EAAO,GAAG,GAAY,IAAK,EACvC,oBAAmB,EACnB,cAAe,EACf,cAAe,EACf,YAAa,EACb,gBAAiB,EACjB,eAAgB,EAVlB,SAAA,CAYE,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,qBAAsB,GAAY,UAAU,EAAG,MAAO,GAAY,WACzF,SAAA,CACE,CAAA,EACL,EAAC,MAAD,CAAK,IAAK,EAAY,UAAW,EAAG,EAAO,kBAAmB,GAAY,OAAO,EAAG,MAAO,GAAY,QACpG,SAAA,CACE,CAAA,CACF,GAET"}