{"version":3,"file":"SoundOnHover.ab6PxrTh.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/QYLn6GsAt9DFmuNGRa6o/2tpUmCFDuUpEL2DrCD4m/SoundOnHover.js"],"sourcesContent":["// Sound on hover component - plays uploaded MP3 file once per hover\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useRef,useEffect}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// Shared audio context for all instances\nlet sharedAudioContext=null;function getAudioContext(){if(typeof window===\"undefined\")return null;if(!sharedAudioContext){sharedAudioContext=new(window.AudioContext||window.webkitAudioContext);}// Resume context if suspended\nif(sharedAudioContext.state===\"suspended\"){sharedAudioContext.resume();}return sharedAudioContext;}/**\n * Sound on Hover\n *\n * @framerIntrinsicWidth 100\n * @framerIntrinsicHeight 100\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function SoundOnHover(props){const{enabled=true,audioFile=\"https://framerusercontent.com/assets/ggOEU6aLcKu4RihKDJkUltCLE.mp3\",volume=.5,clickAudioFile=\"https://framerusercontent.com/assets/ggOEU6aLcKu4RihKDJkUltCLE.mp3\",clickVolume=.5}=props;const audioContextRef=useRef(null);const hoverBufferRef=useRef(null);const clickBufferRef=useRef(null);const hoverSourceRef=useRef(null);const clickSourceRef=useRef(null);const isPlayingRef=useRef(false);const isClickPlayingRef=useRef(false);// Initialize audio context\nuseEffect(()=>{if(typeof window!==\"undefined\"){audioContextRef.current=getAudioContext();}},[]);// Load hover audio buffer\nuseEffect(()=>{const ctx=getAudioContext();if(!ctx||!audioFile)return;const loadAudio=async()=>{try{const response=await fetch(audioFile);const arrayBuffer=await response.arrayBuffer();const audioBuffer=await ctx.decodeAudioData(arrayBuffer);hoverBufferRef.current=audioBuffer;}catch(error){console.error(\"Failed to load hover audio:\",error);}};loadAudio();},[audioFile]);// Load click audio buffer\nuseEffect(()=>{const ctx=getAudioContext();if(!ctx||!clickAudioFile)return;const loadAudio=async()=>{try{const response=await fetch(clickAudioFile);const arrayBuffer=await response.arrayBuffer();const audioBuffer=await ctx.decodeAudioData(arrayBuffer);clickBufferRef.current=audioBuffer;}catch(error){console.error(\"Failed to load click audio:\",error);}};loadAudio();},[clickAudioFile]);const handleMouseEnter=async()=>{const ctx=getAudioContext();if(!enabled||!ctx||!hoverBufferRef.current)return;// Ensure audio context is running\nif(ctx.state===\"suspended\"){await ctx.resume();}// Stop any existing hover sound\nif(hoverSourceRef.current){try{hoverSourceRef.current.stop();}catch(e){// Already stopped\n}}// Create new source node\nconst source=ctx.createBufferSource();source.buffer=hoverBufferRef.current;// Create gain node for volume control\nconst gainNode=ctx.createGain();gainNode.gain.setValueAtTime(volume,ctx.currentTime);// Connect nodes\nsource.connect(gainNode);gainNode.connect(ctx.destination);// Set up playback tracking\nisPlayingRef.current=true;source.onended=()=>{isPlayingRef.current=false;hoverSourceRef.current=null;};hoverSourceRef.current=source;source.start(0);};const handleMouseLeave=()=>{if(hoverSourceRef.current){try{hoverSourceRef.current.stop();}catch(e){// Already stopped\n}hoverSourceRef.current=null;}isPlayingRef.current=false;};const handleClick=async()=>{const ctx=getAudioContext();if(!enabled||!ctx||!clickBufferRef.current)return;// Ensure audio context is running\nif(ctx.state===\"suspended\"){await ctx.resume();}// Stop any existing click sound\nif(clickSourceRef.current){try{clickSourceRef.current.stop();}catch(e){// Already stopped\n}}// Create new source node\nconst source=ctx.createBufferSource();source.buffer=clickBufferRef.current;// Create gain node for volume control\nconst gainNode=ctx.createGain();gainNode.gain.setValueAtTime(clickVolume,ctx.currentTime);// Connect nodes\nsource.connect(gainNode);gainNode.connect(ctx.destination);// Set up playback tracking\nisClickPlayingRef.current=true;source.onended=()=>{isClickPlayingRef.current=false;clickSourceRef.current=null;};clickSourceRef.current=source;source.start(0);};return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",position:\"relative\"},onMouseEnter:handleMouseEnter,onMouseLeave:handleMouseLeave,onClick:handleClick});}addPropertyControls(SoundOnHover,{enabled:{type:ControlType.Boolean,title:\"Enable Sound\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\"},audioFile:{type:ControlType.File,title:\"Hover Sound\",allowedFileTypes:[\"mp3\",\"wav\",\"ogg\"]},volume:{type:ControlType.Number,title:\"Hover Volume\",defaultValue:.5,min:0,max:1,step:.1},clickAudioFile:{type:ControlType.File,title:\"Click Sound\",allowedFileTypes:[\"mp3\",\"wav\",\"ogg\"]},clickVolume:{type:ControlType.Number,title:\"Click Volume\",defaultValue:.5,min:0,max:1,step:.1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SoundOnHover\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"100\",\"framerIntrinsicWidth\":\"100\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SoundOnHover.map"],"mappings":"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"}