{"version":3,"file":"LocalStorageField.CG5Is4S3.mjs","names":["useState","useMemo"],"sources":["https:/framerusercontent.com/modules/sdQeg8vkXajaH9JzPMnD/Mlh6iF4ooEWRjcuU6aMP/LocalStorageField.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useState,useMemo}from\"react\";/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicWidth 200\n * @framerIntrinsicHeight 40\n */function LocalStorageField(props){const{templateText,fallbackText,nameTransform,emailTransform,font,fontColor,padding,textAlign,wrapText}=props;const[storageValues,setStorageValues]=useState({});const isCanvas=RenderTarget.current()===RenderTarget.canvas;// Find localStorage key that contains the search term\nconst findMatchingKey=searchTerm=>{if(!searchTerm||typeof window===\"undefined\"||!window.localStorage)return null;const keys=Object.keys(window.localStorage);const lowerSearchTerm=searchTerm.toLowerCase();// Find the first key that contains the search term (case-insensitive)\nreturn keys.find(key=>key.toLowerCase().includes(lowerSearchTerm));};// Clean value by removing quotes and parsing JSON if needed\nconst cleanValue=value=>{if(!value)return\"\";// Try to parse as JSON first (for objects/arrays)\ntry{const parsed=JSON.parse(value);// If it's an object or array, return the parsed value\nif(typeof parsed===\"object\"&&parsed!==null){return parsed;}}catch(e){// Not valid JSON, continue with string cleaning\n}// Remove leading and trailing quotes (both single and double)\nreturn value.replace(/^[\"']|[\"']$/g,\"\");};// Helper function to get nested property value\nconst getNestedProperty=(obj,path)=>{if(!obj||typeof obj!==\"object\")return null;const keys=path.split(\".\");let current=obj;for(const key of keys){if(current[key]===undefined)return null;current=current[key];}return current;};// Load all localStorage values\nconst loadStorageValues=()=>{if(typeof window===\"undefined\"||!window.localStorage)return{};const values={};// Common field patterns to look for\nconst fieldPatterns=[\"firstName\",\"lastname\",\"email\",\"phone\",\"company\",\"city\",\"country\"];fieldPatterns.forEach(pattern=>{const matchingKey=findMatchingKey(pattern);if(matchingKey){const value=window.localStorage.getItem(matchingKey);values[pattern.toLowerCase()]=cleanValue(value)||\"\";}});// Also check for any other variables in the template\nconst variableMatches=templateText?.match(/\\{([^}]+)\\}/g)||[];variableMatches.forEach(match=>{const varName=match.slice(1,-1);const lowerVarName=varName.toLowerCase();// Check if this is a nested property (contains dot notation)\nif(varName.includes(\".\")){const[rootKey,...restPath]=varName.split(\".\");const matchingKey=findMatchingKey(rootKey);if(matchingKey){const value=window.localStorage.getItem(matchingKey);const cleanedValue=cleanValue(value);if(typeof cleanedValue===\"object\"&&cleanedValue!==null){// Store the full path as key for easy access later\nconst nestedValue=getNestedProperty(cleanedValue,restPath.join(\".\"));if(nestedValue!==null&&nestedValue!==undefined){values[varName]=nestedValue;}}}}else if(!values[lowerVarName]){const matchingKey=findMatchingKey(varName);if(matchingKey){const value=window.localStorage.getItem(matchingKey);values[lowerVarName]=cleanValue(value)||\"\";}}});return values;};// Read from localStorage with SSR safety\nuseEffect(()=>{if(isCanvas)return;try{const values=loadStorageValues();setStorageValues(values);}catch(error){console.error(\"Error reading localStorage:\",error);setStorageValues({});}},[templateText,isCanvas]);// Listen for storage events (when localStorage changes in another tab/window)\nuseEffect(()=>{if(isCanvas)return;const handleStorageChange=()=>{// Reload all values when any storage changes\nconst values=loadStorageValues();setStorageValues(values);};window.addEventListener(\"storage\",handleStorageChange);return()=>window.removeEventListener(\"storage\",handleStorageChange);},[templateText,isCanvas]);// Text transformation functions\nconst transformText=(text,transform)=>{if(!text||!transform||transform===\"none\")return text;switch(transform){case\"uppercase\":return text.toUpperCase();case\"lowercase\":return text.toLowerCase();case\"capitalize\":return text.charAt(0).toUpperCase()+text.slice(1).toLowerCase();case\"startCase\":return text.toLowerCase().split(\" \").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(\" \");default:return text;}};// Apply transformations to specific field types\nconst applyFieldTransform=(value,fieldName)=>{const lowerFieldName=fieldName.toLowerCase();// Apply name transformations to name fields\nif((lowerFieldName.includes(\"firstname\")||lowerFieldName.includes(\"lastname\")||lowerFieldName.includes(\"name\"))&&nameTransform){return transformText(value,nameTransform);}// Apply email transformations to email fields\nif(lowerFieldName.includes(\"email\")&&emailTransform){return transformText(value,emailTransform);}return value;};// Process template text and replace variables\nconst processTemplate=()=>{if(!templateText)return\"\";let processed=templateText;let hasReplacements=false;// Replace all {variable} patterns\nconst variableMatches=templateText.match(/\\{([^}]+)\\}/g)||[];variableMatches.forEach(match=>{const varName=match.slice(1,-1);const lowerVarName=varName.toLowerCase();// Check both exact match and lowercase for backwards compatibility\nconst value=storageValues[varName]||storageValues[lowerVarName];if(value!==undefined&&value!==null){// Convert non-string values to string\nconst stringValue=typeof value===\"string\"?value:String(value);const transformedValue=applyFieldTransform(stringValue,varName.split(\".\").pop()// Use the last part of the path for field detection\n);processed=processed.replace(match,transformedValue);hasReplacements=true;}});// If no replacements were made and we have a fallback, use it\nif(!hasReplacements&&fallbackText){return fallbackText;}return processed;};// Memoize the display text\nconst displayText=useMemo(()=>{if(isCanvas){return templateText||\"{Your text with {variables}}\";}return processTemplate();},[isCanvas,templateText,fallbackText,storageValues,nameTransform,emailTransform]);// Compute text styles\nconst textStyles=useMemo(()=>{const styles={padding:typeof padding===\"number\"?`${padding}px`:padding,display:\"block\",width:\"100%\",wordBreak:wrapText?\"break-word\":\"normal\",whiteSpace:wrapText?\"normal\":\"nowrap\",overflow:wrapText?\"visible\":\"hidden\",textOverflow:wrapText?\"clip\":\"ellipsis\",color:fontColor,textAlign:textAlign||\"left\"};// Apply all font properties\nif(font){if(font.fontFamily)styles.fontFamily=font.fontFamily;if(font.fontSize!==undefined)styles.fontSize=typeof font.fontSize===\"number\"?`${font.fontSize}px`:font.fontSize;if(font.fontWeight!==undefined)styles.fontWeight=font.fontWeight;if(font.lineHeight!==undefined)styles.lineHeight=font.lineHeight;if(font.letterSpacing!==undefined)styles.letterSpacing=typeof font.letterSpacing===\"number\"?`${font.letterSpacing}px`:font.letterSpacing;// Only use font.textAlign if textAlign prop is not explicitly set\nif(font.textAlign&&!textAlign)styles.textAlign=font.textAlign;}return styles;},[padding,font,fontColor,textAlign,wrapText]);return /*#__PURE__*/_jsx(\"div\",{style:textStyles,children:displayText});}// Export the component\nexport default LocalStorageField;// Property Controls\naddPropertyControls(LocalStorageField,{templateText:{type:ControlType.String,title:\"Template Text\",defaultValue:\"Hello {firstName}!\",placeholder:\"Text with {variables}\",description:\"Use {variableName} or {object.property} for nested values\",displayTextArea:true},fallbackText:{type:ControlType.String,title:\"Fallback Text\",defaultValue:\"\",placeholder:\"Text when no variables found\",description:\"Text to display when no localStorage variables are found\"},nameTransform:{type:ControlType.Enum,title:\"Name Transform\",defaultValue:\"startCase\",options:[\"none\",\"uppercase\",\"lowercase\",\"capitalize\",\"startCase\"],optionTitles:[\"None\",\"UPPERCASE\",\"lowercase\",\"Capitalize\",\"Start Case\"],description:\"Transform for name fields (firstName, lastName, etc.)\"},emailTransform:{type:ControlType.Enum,title:\"Email Transform\",defaultValue:\"lowercase\",options:[\"none\",\"uppercase\",\"lowercase\"],optionTitles:[\"None\",\"UPPERCASE\",\"lowercase\"],description:\"Transform for email fields\"},// Font with Framer's native font picker and extended controls\nfont:{type:\"font\",title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontFamily:\"Inter\",fontSize:16,fontWeight:400,lineHeight:1.5,letterSpacing:0,textAlign:\"left\"}},fontColor:{type:ControlType.Color,title:\"Font Color\",defaultValue:\"#000000\"},textAlign:{type:ControlType.Enum,title:\"Text Align\",defaultValue:\"left\",options:[\"left\",\"center\",\"right\",\"justify\"],optionTitles:[\"Left\",\"Center\",\"Right\",\"Justify\"],description:\"How to align the text horizontally\"},wrapText:{type:ControlType.Boolean,title:\"Wrap Text\",defaultValue:true,description:\"Whether to wrap text to multiple lines\"},// Layout\npadding:{type:ControlType.FusedNumber,title:\"Padding\",defaultValue:0,toggleKey:\"paddingMixed\",toggleTitles:[\"All\",\"Individual\"],valueKeys:[\"paddingTop\",\"paddingRight\",\"paddingBottom\",\"paddingLeft\"],valueLabels:[\"T\",\"R\",\"B\",\"L\"],min:0}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LocalStorageField\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"200\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"40\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LocalStorageField.map"],"mappings":"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"}