{"version":3,"file":"WebhookLeadForward.CC4A3mio.mjs","names":["useCallback"],"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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"}