{"version":3,"file":"SoundOnHover.BRsKLMY3.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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"}