{"version":3,"file":"CopyButton.CArKJB5N.mjs","names":["useState","useRef","useCallback"],"sources":["https:/framerusercontent.com/modules/HVun45B7Vj7G4KEE6gFB/ax5woSv5MkucXEozRgeu/CopyButton.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useState,useRef,useEffect,useCallback,startTransition}from\"react\";import{addPropertyControls,ControlType,RenderTarget,// @ts-ignore\ngetPropertyControls}from\"framer\";import ButtonX from\"https://framerusercontent.com/modules/4qsgEiJMwmhCjkYCC8G4/HjWCxXxN4xOqfONcGmKQ/ButtonX.js\";// Get ButtonX property controls to reuse for each state\nconst btnProps=getPropertyControls(ButtonX);//console.log(btnProps)\n/**\n * @framerDisableUnlink\n */export default function CopyButtonWithButtonX(props){const{source,value,idle,copying,copied,failed,resetAfterMs}=props;const[state,setState]=useState(\"idle\");const resetTimeout=useRef(null);// Cleanup timeout on unmount\nuseEffect(()=>{return()=>{if(resetTimeout.current)window.clearTimeout(resetTimeout.current);};},[]);// Reset to idle state after delay\nuseEffect(()=>{if(state!==\"copied\"&&state!==\"failed\"||resetAfterMs<=0)return;if(resetTimeout.current)window.clearTimeout(resetTimeout.current);resetTimeout.current=window.setTimeout(()=>{startTransition(()=>setState(\"idle\"));},resetAfterMs);return()=>{if(resetTimeout.current)window.clearTimeout(resetTimeout.current);};},[state,resetAfterMs]);// Resolve the text to copy based on source\nconst resolveTextToCopy=()=>{if(source===\"pageUrl\"){return typeof window!==\"undefined\"?window.location.href:\"\";}return value??\"\";};// Copy text with fallback for older browsers\nconst copyWithFallback=async text=>{if(!text)return false;// Try modern clipboard API first\ntry{if(typeof navigator!==\"undefined\"&&\"clipboard\"in navigator&&window.isSecureContext){await navigator.clipboard.writeText(text);return true;}}catch{}// Fallback to execCommand for older browsers\ntry{if(typeof document===\"undefined\")return false;const ta=document.createElement(\"textarea\");ta.value=text;ta.setAttribute(\"readonly\",\"\");ta.style.position=\"fixed\";ta.style.opacity=\"0\";ta.style.pointerEvents=\"none\";document.body.appendChild(ta);ta.select();const ok=document.execCommand(\"copy\");document.body.removeChild(ta);return ok;}catch{return false;}};// Handle copy action\nconst handleCopy=useCallback(async()=>{if(state===\"copying\"||state===\"copied\")return;setState(\"copying\");const text=resolveTextToCopy();const ok=await copyWithFallback(text);startTransition(()=>{setState(ok?\"copied\":\"failed\");});},[state,source,value]);// Don't render in thumbnail view\nif(RenderTarget.current()===RenderTarget.thumbnail)return null;// Select the appropriate props based on current state\nconst currentButtonProps=state===\"idle\"?idle:state===\"copying\"?copying:state===\"copied\"?copied:failed// state === \"failed\"\n;return /*#__PURE__*/_jsx(ButtonX,{...currentButtonProps,onClick:handleCopy,disabled:state===\"copying\"||state===\"copied\",style:{width:\"100%\",height:\"100%\"}});}// Property controls for the Copy Button wrapper\naddPropertyControls(CopyButtonWithButtonX,{// Copy source configuration\nsource:{type:ControlType.Enum,title:\"Copy Source\",options:[\"custom\",\"pageUrl\"],optionTitles:[\"Custom Text\",\"Page URL\"],defaultValue:\"custom\"},value:{type:ControlType.String,title:\"Custom Value\",defaultValue:\"Hello, World!\",placeholder:\"Text to copy…\",hidden:({source})=>source!==\"custom\",description:\"The text that will be copied to clipboard.\"},// State-specific ButtonX configurations\nidle:{type:ControlType.Object,title:\"Idle State\",controls:{...btnProps}},copying:{type:ControlType.Object,title:\"Copying State\",controls:{...btnProps}},copied:{type:ControlType.Object,title:\"Copied State\",controls:{...btnProps}},failed:{type:ControlType.Object,title:\"Failed State\",controls:{...btnProps}},// Timing configuration\nresetAfterMs:{type:ControlType.Number,title:\"⏱️ Reset Delay (ms)\",defaultValue:2e3,min:0,max:1e4,step:100,displayStepper:true,description:\"Time before button returns to idle state after success/failure.\"}})// Alternative approach: Flattened properties for better UX\n;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CopyButtonWithButtonX\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"2RAKG,SAAwB,EAAsB,EAAM,CAAC,GAAK,CAAC,SAAO,QAAM,OAAK,UAAQ,SAAO,SAAO,gBAAc,EAAW,CAAC,EAAM,GAAUA,EAAS,MAAM,EAAQ,EAAaC,EAAO,IAAI,EAC/L,UAAyB,CAAI,EAAa,SAAQ,EAAO,aAAa,EAAa,OAAO,CAAE,EAAI,CAAC,CAAC,EAClG,MAAc,CAAI,SAAQ,UAAU,IAAQ,UAAU,GAAc,GAA6K,OAAjK,EAAa,SAAQ,EAAO,aAAa,EAAa,OAAO,EAAE,EAAa,QAAQ,EAAO,eAAe,CAAC,MAAoB,EAAS,MAAM,CAAC,CAAE,EAAE,CAAY,MAAY,CAAI,EAAa,SAAQ,EAAO,aAAa,EAAa,OAAO,CAAE,CAAE,EAAE,CAAC,EAAM,CAAY,CAAC,EACtV,IAAM,MAA0B,IAAS,UAAyB,IAAS,OAAiC,GAArB,EAAO,SAAS,KAAgB,GAAO,GACxH,EAAiB,KAAM,IAAM,CAAC,GAAG,CAAC,EAAK,MAAO,GACpD,GAAG,CAAC,GAAU,IAAY,QAAa,cAAc,GAAW,EAAO,gBAA2D,OAA1C,MAAM,EAAU,UAAU,UAAU,CAAI,EAAS,EAAM,MAAM,CAAC,CACtJ,GAAG,CAAC,GAAG,OAAO,SAAW,IAAY,MAAO,GAAM,IAAM,EAAG,SAAS,cAAc,UAAU,EAAE,EAAG,MAAM,EAAK,EAAG,aAAa,WAAW,EAAE,EAAE,EAAG,MAAM,SAAS,QAAQ,EAAG,MAAM,QAAQ,IAAI,EAAG,MAAM,cAAc,OAAO,SAAS,KAAK,YAAY,CAAE,EAAE,EAAG,OAAO,EAAE,IAAM,EAAG,SAAS,YAAY,MAAM,EAAgC,OAA9B,SAAS,KAAK,YAAY,CAAE,EAAS,CAAG,MAAM,CAAC,MAAO,EAAM,CAAC,EAC/V,EAAWC,EAAY,SAAS,CAAC,GAAG,IAAQ,WAAW,IAAQ,SAAS,OAAO,EAAS,SAAS,EAAE,IAAM,EAAK,EAAkB,EAAQ,EAAG,MAAM,EAAiB,CAAI,EAAE,MAAoB,CAAC,EAAS,EAAG,SAAS,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,EAAM,EAAO,CAAK,CAAC,EAG1P,OAFE,EAAa,QAAQ,IAAI,EAAa,UAAiB,KAErC,EAAK,EAAQ,CAAC,GADV,IAAQ,OAAO,EAAK,IAAQ,UAAU,EAAQ,IAAQ,SAAS,EAAO,EACtC,QAAQ,EAAW,SAAS,IAAQ,WAAW,IAAQ,SAAS,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,CAAC,CAAE,uBAfpH,IAAyE,IACnF,IAAgH,EAC1I,EAAS,EAAoB,CAAO,EAc1C,EAAoB,EAAsB,CAC1C,OAAO,CAAC,KAAK,EAAY,KAAK,MAAM,cAAc,QAAQ,CAAC,SAAS,SAAS,EAAE,aAAa,CAAC,cAAc,UAAU,EAAE,aAAa,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,aAAa,gBAAgB,YAAY,gBAAgB,QAAQ,CAAC,YAAU,IAAS,SAAS,YAAY,4CAA4C,EACxV,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,SAAS,CAAC,GAAG,CAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,gBAAgB,SAAS,CAAC,GAAG,CAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,SAAS,CAAC,GAAG,CAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,SAAS,CAAC,GAAG,CAAQ,CAAC,EAChT,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,sBAAsB,aAAa,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,eAAe,GAAK,YAAY,iEAAiE,CAAC,CAAC"}