{"version":3,"file":"FormValidation.D6c8eCmd.mjs","names":["useRef","__esmMin","init_npm_react_18_3_1","window","init_ssg_sandbox_shims","ce","init_jsx_runtime","J","de","withNoBlankSubmissions","localRef","mountedAt","el","form","honeypot","clearValidity","field","event","looksLikeGibberish","trimmed","value","isSuspiciousEmail","match","block","message","onSubmit","fields","firstInvalid","invalidMessage","problem","rest","props","Component","style","node","ref","init_FormValidation"],"sources":["https:/framerusercontent.com/modules/kkhx9Fpz4o2p0FrPyVst/VgaiEb9G1h5e05EmOb9E/FormValidation.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect,useRef}from\"react\";// Blocks form submissions where required fields contain only whitespace,\n// trims values, and rejects common bot patterns:\n// - honeypot field that only bots fill\n// - submissions made unrealistically fast after the page loads\n// - gibberish single-token messages and dot-riddled Gmail aliases\nexport function withNoBlankSubmissions(Component){return /*#__PURE__*/forwardRef(function NoBlankSubmissions(props,ref){const localRef=useRef(null);const mountedAt=useRef(Date.now());useEffect(()=>{mountedAt.current=Date.now();const el=localRef.current;if(!el)return;const form=el.tagName===\"FORM\"?el:el.querySelector(\"form\");if(!form)return;// Honeypot: invisible to humans, autofilled by bots\nconst honeypot=document.createElement(\"input\");honeypot.type=\"text\";honeypot.name=\"website_url_confirm\";honeypot.autocomplete=\"off\";honeypot.tabIndex=-1;honeypot.setAttribute(\"aria-hidden\",\"true\");honeypot.style.cssText=\"position:absolute;left:-9999px;top:auto;width:1px;height:1px;opacity:0;pointer-events:none;\";form.appendChild(honeypot);const clearValidity=event=>{const field=event.target;if(field&&\"setCustomValidity\"in field)field.setCustomValidity(\"\");};const looksLikeGibberish=value=>{const trimmed=value.trim();// Single token, long, mixed case with no real word shape\nif(trimmed.length>=12&&!/\\s/.test(trimmed)&&/[a-z]/.test(trimmed)&&/[A-Z]/.test(trimmed)){const caseSwitches=(trimmed.match(/[a-z][A-Z]|[A-Z]{2,}[a-z]/g)||[]).length;if(caseSwitches>=3)return true;}return false;};const isSuspiciousEmail=value=>{const match=value.trim().toLowerCase().match(/^([^@]+)@(gmail|googlemail)\\.com$/);if(!match)return false;const dots=(match[1].match(/\\./g)||[]).length;// Gmail ignores dots; 4+ dots in the local part is a known spam alias trick\nreturn dots>=4;};const block=(event,field,message)=>{event.preventDefault();event.stopImmediatePropagation();if(field&&message){field.setCustomValidity(message);field.reportValidity();field.focus();}};const onSubmit=event=>{// Bot traps: silently drop the submission\nif(honeypot.value.trim()!==\"\")return block(event);if(Date.now()-mountedAt.current<3e3)return block(event);const fields=form.querySelectorAll(\"input[type=text], input[type=email], input[type=url], input[type=tel], textarea\");let firstInvalid=null;let invalidMessage=\"\";fields.forEach(field=>{if(field===honeypot)return;// Trim whitespace so stored values are clean\nconst trimmed=field.value.replace(/\\s+/g,\" \").trim();if(trimmed!==field.value){const setter=Object.getOwnPropertyDescriptor(field.tagName===\"TEXTAREA\"?window.HTMLTextAreaElement.prototype:window.HTMLInputElement.prototype,\"value\")?.set;setter?.call(field,trimmed);field.dispatchEvent(new Event(\"input\",{bubbles:true}));}let problem=\"\";if(field.required&&trimmed.length===0){problem=\"Please fill in this field.\";}else if(field.tagName===\"TEXTAREA\"&&looksLikeGibberish(trimmed)){problem=\"Please enter a valid message.\";}else if(field.type===\"email\"&&isSuspiciousEmail(trimmed)){problem=\"Please use a valid email address.\";}else{field.setCustomValidity(\"\");}if(problem&&!firstInvalid){firstInvalid=field;invalidMessage=problem;}});if(firstInvalid)block(event,firstInvalid,invalidMessage);};form.addEventListener(\"submit\",onSubmit,true);form.addEventListener(\"input\",clearValidity,true);return()=>{honeypot.remove();form.removeEventListener(\"submit\",onSubmit,true);form.removeEventListener(\"input\",clearValidity,true);};},[]);const{style,...rest}=props;return /*#__PURE__*/_jsx(Component,{...rest,style:{...style},ref:node=>{localRef.current=node;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;}});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withNoBlankSubmissions\":{\"type\":\"reactHoc\",\"name\":\"withNoBlankSubmissions\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FormValidation.map"],"mappings":"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"}