{"version":3,"file":"WithEmailAndDemo.mLrQFOwt.mjs","names":[],"sources":["https:/framerusercontent.com/modules/DZUJunl9bI6yiknbAiu3/rAwShlIn7Du1dj7GpGL3/WithEmailAndDemo.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect}from\"react\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";/**\n * @framerDisableUnlink\n * @framerIntrinsicWidth 100\n * @framerIntrinsicHeight 100\n */// ─── Shared store ─────────────────────────────────────────────────────────────\n// Persists the captured email across pages so /book-a-demo/onboard can prefill\nconst useStore=createStore({email:\"\",calendlyURL:\"https://calendly.com/thomas-747/jimo-intro-call?hide_gdpr_banner=1&hide_event_type_details=1\",formFieldsValid:false});// ─── Utility ──────────────────────────────────────────────────────────────────\n/**\n * Sets a React-controlled input's value by using the native prototype setter\n * and dispatching a non-bubbling event so React reconciles without triggering\n * sibling/parent listeners.\n */function setNativeInputValue(input,value){const proto=input instanceof HTMLTextAreaElement?window.HTMLTextAreaElement.prototype:window.HTMLInputElement.prototype;const nativeSetter=Object.getOwnPropertyDescriptor(proto,\"value\")?.set;if(nativeSetter){nativeSetter.call(input,value);}else{input.value=value;}// Non-bubbling — updates React state for this field only, won't re-trigger\n// handlers on parent/sibling elements\ninput.dispatchEvent(new Event(\"input\",{bubbles:false}));input.dispatchEvent(new Event(\"change\",{bubbles:false}));}// ─── Shared email domain blocklist ────────────────────────────────────────────\nconst blockedEmailDomains=[\"gmail\",\"yahoo\",\"hotmail\",\"outlook\",\"live\",\"aol\",\"icloud\",\"mail\",\"protonmail\",\"zoho\",\"test\",\"gmai\",\"msn\",\"yandex\",\"gmx\",\"aim\",\"inbox\",\"example\",\"gmail.com\",\"10minutemail\",\"guerrillamail\",\"mailinator\",\"tempmail\",\"maildrop\",\"yopmail\",\"trashmail\",\"getnada\",\"mailnesia\",\"fakemail\",\"throwawaymail\",\"sharklasers\",\"spamgourmet\",\"moakt\",\"dispostable\",\"mailcatch\",\"mintemail\",\"mytempemail\",\"tempinbox\",\"spam4.me\",\"qq\",\"qq.com\",\"bhuxp.org\",\"volku.org\",\"laxiw.org\"];const emailPattern=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;/**\n * Sets custom validity on the email input — safe to call on every keystroke\n * because it does NOT call reportValidity() which would steal focus.\n */function validateEmailSilent(emailInput,value){const domain=value.split(\"@\")[1];if(value===\"\"){emailInput.setCustomValidity(\"\");}else if(!emailPattern.test(value)){emailInput.setCustomValidity(\"Please input your email in the valid format.\");}else if(domain&&blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase()))){emailInput.setCustomValidity(\"Please only enter your work email.\");}else{emailInput.setCustomValidity(\"\");}}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 1: withEmailCapture\n// Use this on the /book-a-demo page (email-only form).\n// Validates the email field, saves it to the store + URL on submit,\n// then redirects to /book-a-demo/onboard with ?email= in the URL.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withEmailCapture(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const emailInput=document.querySelector(\"input[name='email']\");const formElement=document.querySelector(\"form\");if(!emailInput||!formElement)return;// ── Handlers ────────────────────────────────────────────────────\n/**\n             * On every keystroke: silently validate only.\n             * No DOM writes to other fields → no React re-render loop →\n             * the email field accumulates characters normally.\n             */const handleEmailInput=()=>{const value=emailInput.value;validateEmailSilent(emailInput,value);// ─── DEBUG ───────────────────────────────────────────────────\nconst domain=value.split(\"@\")[1]??null;const isBlocked=domain?blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase())):false;console.group(`📧 [/book-a-demo] Email input — \"${value}\"`);console.log(\"Format valid (regex)   :\",emailPattern.test(value));console.log(\"Domain                 :\",domain??\"(no @ yet)\");console.log(\"Domain blocked         :\",isBlocked);console.log(\"Custom validity msg    :\",emailInput.validationMessage||\"(none — valid)\");console.log(\"checkValidity()        :\",emailInput.checkValidity());console.groupEnd();// ─── END DEBUG ───────────────────────────────────────────────\n};/** On blur: show validation tooltip (safe — user left the field) */const handleEmailBlur=()=>{validateEmailSilent(emailInput,emailInput.value);emailInput.reportValidity();};/**\n             * On submit: validate, save email to store + URL, redirect to\n             * /book-a-demo/onboard with email as a query param.\n             */const handleFormSubmit=event=>{event.preventDefault();validateEmailSilent(emailInput,emailInput.value);if(!formElement.checkValidity()){formElement.reportValidity();return;}const email=emailInput.value.trim();// Save to shared store — withFormValidation on /book-a-demo/onboard\n// reads this on mount to prefill the email field.\n// Navigation is handled by Framer — no redirect here.\nsetStore({email});console.log(\"✅ Email captured in store:\",email);};/** Allow Enter key to submit */const handleKeyDown=event=>{if(event.key===\"Enter\"){event.preventDefault();formElement.dispatchEvent(new Event(\"submit\",{bubbles:true,cancelable:true}));}};// ── Prefill from store (e.g. user navigated back to this page) ──\nif(store.email){setNativeInputValue(emailInput,store.email);validateEmailSilent(emailInput,store.email);console.log(\"Prefilled email from store:\",store.email);}// ── Attach hidden URL params to form ─────────────────────────────\nconst params=new URLSearchParams(window.location.search);params.forEach((value,key)=>{if(key!==\"email\"){let existing=formElement.querySelector(`input[name=\"${key}\"]`);if(existing){existing.value=value;}else{const input=document.createElement(\"input\");input.type=\"hidden\";input.name=key;input.value=value;formElement.appendChild(input);}}});// ── currentPage hidden field ─────────────────────────────────────\nconst pagePath=window.location.pathname===\"/\"?\"Homepage\":window.location.pathname;let pageInput=formElement.querySelector(\"input[name='currentPage']\");if(pageInput){pageInput.value=pagePath;}else{pageInput=document.createElement(\"input\");pageInput.type=\"hidden\";pageInput.name=\"currentPage\";pageInput.value=pagePath;formElement.appendChild(pageInput);}// ── Event listeners ──────────────────────────────────────────────\nemailInput.addEventListener(\"input\",handleEmailInput);emailInput.addEventListener(\"blur\",handleEmailBlur);emailInput.addEventListener(\"keydown\",handleKeyDown);formElement.addEventListener(\"submit\",handleFormSubmit);return()=>{emailInput.removeEventListener(\"input\",handleEmailInput);emailInput.removeEventListener(\"blur\",handleEmailBlur);emailInput.removeEventListener(\"keydown\",handleKeyDown);formElement.removeEventListener(\"submit\",handleFormSubmit);};},[]);return /*#__PURE__*/_jsx(Component,{...props});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 2: withCalendlyURL\n// Inject the dynamic Calendly URL from the store into any component as `url`\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withCalendlyURL(Component){return props=>{const[store]=useStore();return /*#__PURE__*/_jsx(Component,{...props,url:store.calendlyURL});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 3: withNextButton\n// Controls the Next button variant based on form validity\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withNextButton(Component){return props=>{const[store]=useStore();const variant=store.formFieldsValid?\"Small-Arrow\":\"Small Disabled\";return /*#__PURE__*/_jsx(Component,{...props,variant:variant});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 4: withSubmitButton\n// Wrap any button to submit the withFormValidation form.\n// Automatically disabled when the form is invalid, clickable when valid.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withSubmitButton(Component){return props=>{const[store]=useStore();const handleClick=()=>{if(!store.formFieldsValid)return;const formElement=document.querySelector(\"form\");if(!formElement){console.warn(\"withSubmitButton: no <form> found on page\");return;}// Dispatches a native submit event so Framer's own submit\n// handler fires exactly as if the user pressed Enter\nformElement.dispatchEvent(new Event(\"submit\",{bubbles:true,cancelable:true}));};const variant=store.formFieldsValid?\"Small-Arrow\":\"Small Disabled\";return /*#__PURE__*/_jsx(Component,{...props,variant:variant,onClick:handleClick,style:{...props.style,cursor:store.formFieldsValid?\"pointer\":\"not-allowed\"}});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 5: withFormValidation\n// Use this on the /book-a-demo/onboard page (full form).\n// Prefills the email from store or URL param, validates all fields,\n// auto-populates name/company/domain on blur, updates the Calendly URL.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withFormValidation(Component){return props=>{const[store,setStore]=useStore();const checkFormValidity=()=>{const emailInput=document.querySelector(\"input[name='email']\");const nameInput=document.querySelector(\"input[name='First Name']\");const lastNameInput=document.querySelector(\"input[name='Last Name']\");const companyInput=document.querySelector(\"input[name='Company Name']\");const isEmailValid=emailInput&&emailInput.value.trim()!==\"\"&&emailInput.checkValidity()&&emailInput.validationMessage===\"\";const isNameValid=nameInput&&nameInput.value.trim()!==\"\";const isLastNameValid=lastNameInput&&lastNameInput.value.trim()!==\"\";const isCompanyValid=companyInput&&companyInput.value.trim()!==\"\";const allFieldsValid=isEmailValid&&isNameValid&&isLastNameValid&&isCompanyValid;setStore({formFieldsValid:allFieldsValid});console.log(\"Form validity updated:\",allFieldsValid);return allFieldsValid;};useEffect(()=>{const phoneInput=document.querySelector(\"input[name='Phone Number']\");const emailInput=document.querySelector(\"input[name='email']\");const domainInput=document.querySelector(\"input[name='Domain']\");const companyInput=document.querySelector(\"input[name='Company Name']\");const nameInput=document.querySelector(\"input[name='First Name']\");const gclidInput=document.querySelector(\"input[name='gclid']\");const lastNameInput=document.querySelector(\"input[name='Last Name']\");const formElement=document.querySelector(`form.${props.className}`);// ── Derived field helpers ────────────────────────────────────────\n// ONLY called on blur or prefill — never during typing.\n// Calling setNativeInputValue mid-keystroke causes Framer to\n// re-render and reset the email field to 1 character.\n// Tracks whether derived fields have already been filled from the\n// current email value. Once filled, we skip re-applying on every\n// subsequent keystroke — only re-apply on blur (when email is final).\n// This prevents setNativeInputValue calls mid-typing from causing\n// Framer to re-render and erase the derived field values.\nlet derivedFieldsAppliedForEmail=\"\";/**\n             * Updates derived fields (name, company, domain) using\n             * setNativeInputValue so React properly commits the new values.\n             *\n             * SKIP if we already applied for this exact email string (prevents\n             * repeated calls mid-typing from triggering re-renders).\n             * force=true bypasses the skip — used on blur and prefill.\n             */const applyDerivedFieldsFromEmail=(email,force=false)=>{const parts=email.split(\"@\");const domain=parts[1]||\"\";// Only derive when domain looks complete (has a dot)\nconst domainLooksComplete=domain.includes(\".\");if(!force&&!domainLooksComplete)return;// Skip if already applied for this exact email — avoids calling\n// setNativeInputValue repeatedly which re-renders and erases values\nif(!force&&derivedFieldsAppliedForEmail===email)return;const companyName=domain.split(\".\")[0];const formattedCompany=companyName.charAt(0).toUpperCase()+companyName.slice(1);const name=parts[0]||\"\";const formattedName=name.charAt(0).toUpperCase()+name.slice(1);if(domainInput)setNativeInputValue(domainInput,domain);if(companyInput)setNativeInputValue(companyInput,formattedCompany);if(nameInput)setNativeInputValue(nameInput,name?formattedName:\"\");// Record which email we last derived from so we skip on next keystroke\nderivedFieldsAppliedForEmail=email;};const updateCalendlyURL=()=>{const gclid=gclidInput?.value??\"\";const email=emailInput?.value??\"\";const name=nameInput?.value??\"\";const newURL=`https://calendly.com/thomas-747/jimo-intro-call?name=${encodeURIComponent(name)}&email=${encodeURIComponent(email)}&gclid=${encodeURIComponent(gclid)}&autofill=true&hide_gdpr_banner=1&hide_event_type_details=1`;setStore({calendlyURL:newURL});};// ── Email handlers ───────────────────────────────────────────────\n/**\n             * ON INPUT: validate silently + update derived fields via direct\n             * .value writes (no events dispatched, no React re-render triggered).\n             * Email field accumulates characters normally.\n             */const handleEmailInput=()=>{if(!emailInput)return;const value=emailInput.value.trim();validateEmailSilent(emailInput,value);applyDerivedFieldsFromEmail(value);// ─── DEBUG ───────────────────────────────────────────────────\nconst domain=value.split(\"@\")[1]??null;const isBlocked=domain?blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase())):false;console.group(`📧 [/onboard] Email input — \"${value}\"`);console.log(\"Raw value (untrimmed)  :\",emailInput.value);console.log(\"Format valid (regex)   :\",emailPattern.test(value));console.log(\"Domain                 :\",domain??\"(no @ yet)\");console.log(\"Domain blocked         :\",isBlocked);console.log(\"Custom validity msg    :\",emailInput.validationMessage||\"(none — valid)\");console.log(\"checkValidity()        :\",emailInput.checkValidity());console.log(\"Name field             :\",nameInput?.value??\"(not found)\");console.log(\"Company field          :\",companyInput?.value??\"(not found)\");console.groupEnd();// ─── END DEBUG ───────────────────────────────────────────────\nsetTimeout(checkFormValidity,100);};/**\n             * ON BLUR: show validation tooltip and save email to store.\n             */const handleEmailBlur=()=>{if(!emailInput)return;const value=emailInput.value.trim();validateEmailSilent(emailInput,value);emailInput.reportValidity();// Reset so applyDerivedFieldsFromEmail re-applies with the final email\nderivedFieldsAppliedForEmail=\"\";applyDerivedFieldsFromEmail(value,true);updateCalendlyURL();// Save to store so /book-a-demo/onboard can read it\nsetStore({email:value});setTimeout(checkFormValidity,100);};// ── Phone handlers ───────────────────────────────────────────────\nconst validatePhoneNumberSilent=()=>{if(!phoneInput)return;const value=phoneInput.value.trim();if(value===\"\"){phoneInput.setCustomValidity(\"\");}else if(/[^\\d+\\s\\-\\(\\)\\.]/g.test(value)){phoneInput.setCustomValidity(\"Invalid format - Only numbers, spaces, +, -, (), and . are allowed.\");}else{phoneInput.setCustomValidity(\"\");}setTimeout(checkFormValidity,100);};const handlePhoneBlur=()=>{validatePhoneNumberSilent();phoneInput?.reportValidity();};// ── Generic field change ─────────────────────────────────────────\nconst handleInputChange=()=>{setTimeout(checkFormValidity,100);};// ── Hidden form fields from URL params ───────────────────────────\nif(formElement){const params=new URLSearchParams(window.location.search);params.forEach((value,key)=>{if(key!==\"email\"){const input=document.createElement(\"input\");input.type=\"hidden\";input.name=key;input.value=value;formElement.appendChild(input);}});}// ── Prefill gclid ────────────────────────────────────────────────\n// TEMPORARILY COMMENTED OUT\n// if (gclidInput) {\n//     const gclidParam = new URLSearchParams(window.location.search).get(\"gclid\")\n//     if (gclidParam) {\n//         setNativeInputValue(gclidInput, gclidParam)\n//         console.log(\"Prefilled gclid:\", gclidParam)\n//     }\n// }\n// ── Prefill email from store ─────────────────────────────────────\n// TEMPORARILY COMMENTED OUT — testing withNextButton form validity\n// if (emailInput && store.email) {\n//     setNativeInputValue(emailInput, store.email)\n//     validateEmailSilent(emailInput, store.email)\n//     applyDerivedFieldsFromEmail(store.email, true)\n//     updateCalendlyURL()\n//     console.log(\"Prefilled email on /onboard from store:\", store.email)\n// }\n// ── Event listeners ──────────────────────────────────────────────\nphoneInput?.addEventListener(\"input\",validatePhoneNumberSilent);phoneInput?.addEventListener(\"blur\",handlePhoneBlur);emailInput?.addEventListener(\"input\",handleEmailInput);emailInput?.addEventListener(\"blur\",handleEmailBlur);nameInput?.addEventListener(\"input\",handleInputChange);nameInput?.addEventListener(\"blur\",handleInputChange);lastNameInput?.addEventListener(\"input\",handleInputChange);lastNameInput?.addEventListener(\"blur\",handleInputChange);companyInput?.addEventListener(\"input\",handleInputChange);companyInput?.addEventListener(\"blur\",handleInputChange);gclidInput?.addEventListener(\"input\",updateCalendlyURL);setTimeout(checkFormValidity,200);// ── Cleanup ──────────────────────────────────────────────────────\nreturn()=>{phoneInput?.removeEventListener(\"input\",validatePhoneNumberSilent);phoneInput?.removeEventListener(\"blur\",handlePhoneBlur);emailInput?.removeEventListener(\"input\",handleEmailInput);emailInput?.removeEventListener(\"blur\",handleEmailBlur);nameInput?.removeEventListener(\"input\",handleInputChange);nameInput?.removeEventListener(\"blur\",handleInputChange);lastNameInput?.removeEventListener(\"input\",handleInputChange);lastNameInput?.removeEventListener(\"blur\",handleInputChange);companyInput?.removeEventListener(\"input\",handleInputChange);companyInput?.removeEventListener(\"blur\",handleInputChange);gclidInput?.removeEventListener(\"input\",updateCalendlyURL);};},[props.className]);return /*#__PURE__*/_jsx(Component,{...props});};}\nexport const __FramerMetadata__ = {\"exports\":{\"withSubmitButton\":{\"type\":\"reactHoc\",\"name\":\"withSubmitButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withEmailCapture\":{\"type\":\"reactHoc\",\"name\":\"withEmailCapture\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withNextButton\":{\"type\":\"reactHoc\",\"name\":\"withNextButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withFormValidation\":{\"type\":\"reactHoc\",\"name\":\"withFormValidation\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCalendlyURL\":{\"type\":\"reactHoc\",\"name\":\"withCalendlyURL\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WithEmailAndDemo.map"],"mappings":"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"}