{"version":3,"file":"WebhookLeadForward.B5JebvhP.mjs","names":["useCallback","__esmMin","init_ssg_sandbox_shims","init_npm_react_18_3_1","init_jsx_runtime","ne","J","c","window","emailDomain","at","email","normalizeWorkEmail","value","editDistance","m","a","n","b","d","i","j","cost","isProviderLookalike","domain","labels","PROVIDER_BRAND_SET","PROVIDER_BRANDS","brand","isPersonalEmail","PERSONAL_EMAIL_DOMAINS","domainAcceptsMail","cached","domainVerdicts","controller","timer","DNS_TIMEOUT_MS","response","data","accepts","answer","mx","record","workEmailMessage","WORK_EMAIL_MESSAGE","applyWorkEmailValidity","message","input","revalidateEmailDomain","findEmailInput","byType","form","byName","blockPersonalEmailSubmit","event","postToSheetsBackup","SHEETS_BACKUP_URL","payload","withWebhookLeadForward","emailTarget","target","revalidateEmail","revalidateEmailOnBlur","forwardLead","key","mapped","FIELD_ALIASES","WEBHOOK_URL","Component","props","init_WebhookLeadForward"],"sources":["https:/framerusercontent.com/modules/hQqVamBajRvrVAMWMbwm/2qj2bA258uLclYtDZXhG/WebhookLeadForward.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useCallback}from\"react\";/* ────────────────────────────────────────────────────────────────────────────\n * SILIA — WEBHOOK LEAD FORWARD\n *\n * Side-channel override for native embedded Framer forms (contact pages,\n * onboarding forms, the footer newsletter). It does NOT replace Framer's own\n * form submission — that keeps running exactly as before, including whatever\n * success/pending/error variant it already drives. This override just also\n * reads the submitted fields and POSTs them to the same n8n webhook the Silia\n * Lead Modal component uses, so every real lead lands in the same Notion\n * database regardless of whether it came from a popup or an embedded form.\n *\n *   Framer native form (unchanged) ─┐\n *                                    ├─→ same n8n webhook → Notion\n *   This override (side channel) ───┘\n *\n * Since 2026-09-09 it ALSO enforces the work-email policy shared with the\n * Silia Lead Modal (source of truth: `EmailPolicy.tsx`): a personal or disposable domain\n * marks the email field invalid, blocks Framer's own submit, and is never\n * forwarded. This is the one override the three lead forms carry, so the\n * policy has to live here — a Framer node accepts a single override.\n * ──────────────────────────────────────────────────────────────────────────── */const WEBHOOK_URL=\"https://n8n.app.silia.com/webhook/cb60fc30-b06e-4732-85d4-f984732d46ae\";const SHEETS_BACKUP_URL=\"https://script.google.com/macros/s/AKfycbwHS18jr4__waLZ5C_nZf_ESc9217_NbUvSc-_lnXOh19ul1CGH1V9lsKQoii0-2u87/exec\";/* ────────────────────────────────────────────────────────────────────────────\n * POLÍTICA DE CORREO DE TRABAJO — copia generada\n *\n * Los code files de Framer no pueden importarse entre sí, así que este bloque\n * está duplicado en `EmailPolicy.tsx` (la fuente) y en `SiliaLeadModal.tsx`.\n * No lo edites a mano: cambiá `EmailPolicy.tsx` y regenerá.\n * ──────────────────────────────────────────────────────────────────────────── */const PERSONAL_EMAIL_DOMAINS=new Set([// ── Gratuitos globales ──────────────────────────────────────────────────\n\"gmail.com\",\"googlemail.com\",\"hotmail.com\",\"hotmail.es\",\"hotmail.com.mx\",\"hotmail.com.ar\",\"hotmail.com.br\",\"hotmail.co.uk\",\"hotmail.fr\",\"hotmail.it\",\"hotmail.cl\",\"outlook.com\",\"outlook.es\",\"outlook.com.br\",\"outlook.com.ar\",\"outlook.fr\",\"live.com\",\"live.com.mx\",\"live.com.ar\",\"live.com.br\",\"live.co.uk\",\"live.fr\",\"msn.com\",\"yahoo.com\",\"yahoo.com.mx\",\"yahoo.com.ar\",\"yahoo.com.br\",\"yahoo.es\",\"yahoo.co.uk\",\"yahoo.fr\",\"yahoo.ca\",\"ymail.com\",\"rocketmail.com\",\"icloud.com\",\"me.com\",\"mac.com\",\"aol.com\",\"proton.me\",\"protonmail.com\",\"pm.me\",\"gmx.com\",\"gmx.net\",\"gmx.de\",\"mail.com\",\"email.com\",\"usa.com\",\"yandex.com\",\"yandex.ru\",\"mail.ru\",\"zoho.com\",\"hey.com\",\"fastmail.com\",\"tutanota.com\",\"tuta.io\",\"inbox.com\",\"web.de\",\"libero.it\",\"orange.fr\",\"wanadoo.fr\",\"laposte.net\",\"free.fr\",\"sfr.fr\",\"qq.com\",\"163.com\",\"126.com\",\"sina.com\",\"naver.com\",\"daum.net\",// ── Gratuitos de LATAM ──────────────────────────────────────────────────\n\"prodigy.net.mx\",\"terra.com\",\"terra.com.mx\",\"terra.com.br\",\"uol.com.br\",\"bol.com.br\",\"ig.com.br\",\"globo.com\",\"globomail.com\",\"r7.com\",\"vtr.net\",// ── Desechables / temporales ────────────────────────────────────────────\n\"mailinator.com\",\"10minutemail.com\",\"10minutemail.net\",\"20minutemail.com\",\"minuteinbox.com\",\"guerrillamail.com\",\"guerrillamail.net\",\"guerrillamail.org\",\"guerrillamail.biz\",\"guerrillamail.de\",\"guerrillamailblock.com\",\"sharklasers.com\",\"grr.la\",\"spam4.me\",\"temp-mail.org\",\"tempmail.com\",\"tempmail.net\",\"tempmail.plus\",\"tempmailo.com\",\"tempmailaddress.com\",\"tempr.email\",\"tempinbox.com\",\"throwawaymail.com\",\"yopmail.com\",\"yopmail.fr\",\"yopmail.net\",\"trashmail.com\",\"trashmail.de\",\"mytrashmail.com\",\"dispostable.com\",\"fakeinbox.com\",\"emailfake.com\",\"generator.email\",\"mailnesia.com\",\"maildrop.cc\",\"getnada.com\",\"nada.email\",\"emailondeck.com\",\"mohmal.com\",\"mailcatch.com\",\"spamgourmet.com\",\"jetable.org\",\"discard.email\",\"spambog.com\",\"mailexpire.com\",\"incognitomail.com\",\"anonbox.net\",\"harakirimail.com\",\"moakt.com\",\"disbox.net\",\"burnermail.io\",\"spamex.com\",\"deadaddress.com\",\"mailquack.com\",\"mail-temporaire.fr\",\"1secmail.com\",\"1secmail.net\",\"1secmail.org\",\"dropmail.me\",\"crazymailing.com\",\"mailpoof.com\",\"mail.tm\",\"linshiyouxiang.net\",\"cock.li\"]);/** Lo que está después del último `@`. Vacío si no hay `@`. */function emailDomain(email){const at=email.lastIndexOf(\"@\");return at===-1?\"\":email.slice(at+1);}function normalizeWorkEmail(value){return value.trim().toLowerCase().replace(/\\.$/,\"\").slice(0,254);}/**\n * Marcas de proveedores personales, para las reglas anti-evasión.\n *\n * Curada a mano y **no derivada** de `PERSONAL_EMAIL_DOMAINS`: los tokens\n * cortos o genéricos de esa lista (`mail`, `live`, `free`, `web`, `inbox`,\n * `me`, `pm`, `ig`) romperían dominios corporativos reales.\n */const PROVIDER_BRANDS=[\"gmail\",\"googlemail\",\"hotmail\",\"outlook\",\"yahoo\",\"ymail\",\"rocketmail\",\"icloud\",\"protonmail\",\"yandex\",\"fastmail\",\"tutanota\",\"mailinator\",\"yopmail\",\"guerrillamail\"];const PROVIDER_BRAND_SET=new Set(PROVIDER_BRANDS);/**\n * Distancia de Damerau-Levenshtein: cuenta una transposición de dos caracteres\n * contiguos como **un** error. Hace falta la variante con transposición porque\n * `gmial` y `hotmial` son swaps y con Levenshtein a secas miden 2.\n */function editDistance(a,b){const m=a.length;const n=b.length;const d=[];for(let i=0;i<=m;i++){d[i]=[];for(let j=0;j<=n;j++)d[i][j]=i===0?j:j===0?i:0;}for(let i=1;i<=m;i++){for(let j=1;j<=n;j++){const cost=a.charAt(i-1)===b.charAt(j-1)?0:1;d[i][j]=Math.min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+cost);if(i>1&&j>1&&a.charAt(i-1)===b.charAt(j-2)&&a.charAt(i-2)===b.charAt(j-1)){d[i][j]=Math.min(d[i][j],d[i-2][j-2]+1);}}}return d[m][n];}/**\n * `true` si el dominio es una variante de un proveedor personal escrita para\n * esquivar la lista exacta: la marca como etiqueta con cualquier TLD\n * (`gmail.co`, `gmail.com.mx`), o un typo de la marca en un dominio de dos\n * etiquetas (`gmil.com`, `yaho.com`).\n *\n * La segunda regla se limita a dos etiquetas porque ahí la primera **es** el\n * nombre registrable; sobre cualquier dominio, `mail.silia.com` daría falso\n * positivo — `mail` está a un carácter de `gmail`.\n */function isProviderLookalike(domain){if(!domain)return false;const labels=domain.split(\".\");for(let i=0;i<labels.length;i++){if(PROVIDER_BRAND_SET.has(labels[i]))return true;}if(labels.length!==2)return false;for(let i=0;i<PROVIDER_BRANDS.length;i++){const brand=PROVIDER_BRANDS[i];if(brand.length>=5&&editDistance(labels[0],brand)===1)return true;}return false;}function isPersonalEmail(value){const domain=emailDomain(normalizeWorkEmail(value));if(!domain)return false;if(PERSONAL_EMAIL_DOMAINS.has(domain))return true;const labels=domain.split(\".\");for(let i=1;i<labels.length-1;i++){if(PERSONAL_EMAIL_DOMAINS.has(labels.slice(i).join(\".\")))return true;}return isProviderLookalike(domain);}const WORK_EMAIL_MESSAGE=\"A corporate email is required.\";/* ── Capa de dominio (DNS) ───────────────────────────────────────────────────\n * La lista y las reglas de arriba no ven el bypass más simple: inventar un\n * dominio. Se resuelve preguntándole al DNS si existe, desde el navegador\n * contra `dns.google` — responde CORS `*` y no pide headers custom, así que no\n * hay preflight ni servidor de por medio. Solo viaja el dominio.\n * ──────────────────────────────────────────────────────────────────────────── */const DNS_TIMEOUT_MS=2e3;/** Veredictos definitivos por dominio, mientras dure la página. */const domainVerdicts=new Map;/**\n * `false` **solo** cuando el dominio no existe o declara que no recibe correo.\n *\n * Acepta un dominio con registro `A` y sin `MX`: el RFC 5321 permite entrega\n * por MX implícito, así que exigir MX tiraría dominios corporativos legítimos.\n * No cambiar esto a \"tiene que tener MX\".\n *\n * Ante fallo de red, timeout o respuesta ilegible devuelve `true` y **no\n * cachea**: un problema de DNS no puede costar un lead bueno ni quedar pegado\n * al dominio por el resto de la sesión.\n */async function domainAcceptsMail(domain){if(!domain)return true;const cached=domainVerdicts.get(domain);if(cached!==undefined)return cached;const controller=new AbortController;const timer=setTimeout(function abort(){controller.abort();},DNS_TIMEOUT_MS);try{const response=await fetch(\"https://dns.google/resolve?type=MX&name=\"+encodeURIComponent(domain),{signal:controller.signal});if(!response.ok)return true;const data=await response.json();let accepts=true;if(data&&data.Status===3){// NXDOMAIN: el dominio no existe.\naccepts=false;}else{const answer=data&&data.Answer||[];const mx=[];for(let i=0;i<answer.length;i++){const record=answer[i];if(record&&record.type===15){mx.push(String(record.data||\"\").trim());}}// NULL MX (RFC 7505): \"este dominio no recibe correo\".\nif(mx.length===1&&/^0\\s+\\.?$/.test(mx[0]))accepts=false;}domainVerdicts.set(domain,accepts);return accepts;}catch(error){return true;}finally{clearTimeout(timer);}}/**\n * El mensaje de validez del correo actual con lo que ya se sabe **sin esperar\n * red**: reglas síncronas más el veredicto de dominio si ya está cacheado. Un\n * dominio sin veredicto todavía no bloquea.\n */function workEmailMessage(value){const email=normalizeWorkEmail(value);if(isPersonalEmail(email))return WORK_EMAIL_MESSAGE;return domainVerdicts.get(emailDomain(email))===false?WORK_EMAIL_MESSAGE:\"\";}/** Marca el campo inválido si el dominio es personal. `true` si lo bloqueó. */function applyWorkEmailValidity(input){const message=workEmailMessage(input.value);input.setCustomValidity(message);return message!==\"\";}/**\n * Dispara el chequeo de dominio y reaplica la validez cuando vuelve.\n *\n * No devuelve promesa a propósito: nadie la espera. Si el visitante envía antes\n * de que resuelva, el envío pasa — es la regla de fail-open. El veredicto queda\n * cacheado, así que el segundo intento sí lo ve.\n */function revalidateEmailDomain(input){const email=normalizeWorkEmail(input.value);const domain=emailDomain(email);if(!domain||domain.indexOf(\".\")===-1)return;if(isPersonalEmail(email))return;void domainAcceptsMail(domain).then(function apply(){if(emailDomain(normalizeWorkEmail(input.value))!==domain)return;applyWorkEmailValidity(input);});}/** El input de correo del formulario, por tipo y con respaldo por nombre. */function findEmailInput(form){const byType=form.querySelector('input[type=\"email\"]');if(byType instanceof HTMLInputElement)return byType;const byName=form.querySelector('input[name=\"Email\" i]');return byName instanceof HTMLInputElement?byName:null;}/**\n * Corta el envío si el correo es personal. Devuelve `true` si lo bloqueó.\n *\n * Se detiene la propagación además de `preventDefault` porque el submit propio\n * de Framer es un handler de React sobre el mismo formulario: sin cortarla,\n * seguiría corriendo y mostraría un estado de éxito falso.\n */function blockPersonalEmailSubmit(event){const form=event.currentTarget;if(!(form instanceof HTMLFormElement))return false;const input=findEmailInput(form);if(!input)return false;if(!applyWorkEmailValidity(input))return false;event.preventDefault();event.stopPropagation();const native=event.nativeEvent;native?.stopImmediatePropagation?.();form.reportValidity();return true;}/** Framer form field names on this project -> the payload keys n8n/Notion expect. */const FIELD_ALIASES={Name:\"name\",Email:\"email\",\"Phone Number\":\"phone\",Message:\"message\",utm_source:\"utm_source\",utm_medium:\"utm_medium\",utm_campaign:\"utm_campaign\",utm_content:\"utm_content\",utm_term:\"utm_term\",gclid:\"gclid\",fbclid:\"fbclid\",utm_source_platform:\"utm_source_platform\"};/**\n * Respaldo best-effort a Google Sheets (mismo Apps Script/Sheet que usa\n * SiliaLeadModal), independiente del webhook de n8n. Nunca debe bloquear ni\n * afectar el submit nativo de Framer: si falla, no se ve reflejado en la UI.\n */function postToSheetsBackup(payload){if(!SHEETS_BACKUP_URL)return;try{fetch(SHEETS_BACKUP_URL,{method:\"POST\",mode:\"no-cors\",headers:{\"Content-Type\":\"text/plain;charset=UTF-8\"},body:JSON.stringify(payload),keepalive:true}).catch(()=>{/* best-effort: nunca debe romper el submit nativo de Framer */});}catch{/* best-effort: nunca debe romper el submit nativo de Framer */}}export function withWebhookLeadForward(Component){return /*#__PURE__*/forwardRef(function WithWebhookLeadForward(props,ref){function emailTarget(event){const target=event?.target;if(!(target instanceof HTMLInputElement))return null;return target.type===\"email\"?target:null;}function revalidateEmail(event){const target=emailTarget(event);if(target)applyWorkEmailValidity(target);}// El chequeo de dominio va solo en el blur: en cada tecla dispararía una\n// consulta por cada carácter del dominio.\nfunction revalidateEmailOnBlur(event){const target=emailTarget(event);if(!target)return;applyWorkEmailValidity(target);revalidateEmailDomain(target);}const forwardLead=useCallback(event=>{const form=event.currentTarget;if(!(form instanceof HTMLFormElement))return;const data=new FormData(form);const payload={name:\"\",email:\"\",phone:\"\",message:\"\",utm_source:\"\",utm_medium:\"\",utm_campaign:\"\",utm_content:\"\",utm_term:\"\",gclid:\"\",fbclid:\"\",utm_source_platform:\"\",landing_url:typeof window!==\"undefined\"?window.location.href:\"\"};for(const[key,value]of data.entries()){const mapped=FIELD_ALIASES[key];if(mapped&&typeof value===\"string\"){payload[mapped]=value;}}// Nada que mandar (por ejemplo un submit vacío o abortado antes de validar).\nif(!payload.name&&!payload.email)return;postToSheetsBackup(payload);try{fetch(WEBHOOK_URL,{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(payload),mode:\"cors\",credentials:\"omit\",cache:\"no-store\",keepalive:true}).catch(()=>{/* mejor-esfuerzo: nunca debe romper el submit nativo de Framer */});}catch{/* mejor-esfuerzo: nunca debe romper el submit nativo de Framer */}},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onInputCapture:event=>{revalidateEmail(event);props.onInputCapture?.(event);},onBlurCapture:event=>{revalidateEmailOnBlur(event);props.onBlurCapture?.(event);},onSubmitCapture:event=>{// Correo personal: no se reenvía nada y el submit propio\n// de Framer tampoco corre, así que no hay éxito falso.\nif(blockPersonalEmailSubmit(event))return;forwardLead(event);props.onSubmitCapture?.(event);}});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withWebhookLeadForward\":{\"type\":\"reactHoc\",\"name\":\"withWebhookLeadForward\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WebhookLeadForward.map"],"mappings":"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"}