{"version":3,"file":"BrixCaptureSourcePage.yP2kzAFy.mjs","names":["useState","mergeRefs","useRef","useCallback","useRef"],"sources":["https:/framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js","https:/framer.com/m/framer/store.js@^1.0.0","https:/framerusercontent.com/modules/kORGML1RYjpidUsh2auC/RdI8TcW7lKVKTMsR0Aji/BrixBlockNonWorkEmails.js","https:/framerusercontent.com/modules/6InTHrHLQB5FVSEHH7bc/QscCkaM7Ll32I8V8phl9/BrixCaptureSourcePage.js"],"sourcesContent":["import{useState,useEffect}from\"react\";import{Data,useObserveData}from\"framer\";export function createStore(state1){// Use Data so that a Preview reload resets the state\nconst dataStore=Data({state:Object.freeze({...state1})});// Create a set function that updates the state\nconst setDataStore=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(dataStore.state);}dataStore.state=Object.freeze({...dataStore.state,...newState});};// Store the initial state, copy the object if it's an object\nlet storeState=typeof state1===\"object\"?Object.freeze({...state1}):state1;// Keep a list of all the listeners, in the form of React hook setters\nconst storeSetters=new Set();// Create a set function that updates all the listeners / setters\nconst setStoreState=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(storeState);}storeState=typeof newState===\"object\"?Object.freeze({...storeState,...newState}):newState;// Update all the listeners / setters with the new value\nstoreSetters.forEach(setter=>setter(storeState));};// Create the actual hook based on everything above\nfunction useStore(){// Create the hook we are going to use as a listener\nconst[state,setState]=useState(storeState);// If we unmount the component using this hook, we need to remove the listener\n// @ts-ignore\nuseEffect(()=>{// But right now, we need to add the listener\nstoreSetters.add(setState);return()=>storeSetters.delete(setState);},[]);// If Data context exists, use Data, otherwise use vanilla React state\nif(useObserveData()===true){useObserveData();return[dataStore.state,setDataStore];}else{// Return the state and a function to update the central store\nreturn[state,setStoreState];}}return useStore;}\nexport const __FramerMetadata__ = {\"exports\":{\"createStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./createStore.map","/*\n * createStore (framer/store@1.0.1)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js\"\n","// BrixBlockNonWorkEmails.tsx\n//\n// Toloka Work Email Validation for Framer\n// ----------------------------------------------------------------------------\n// Enforces \"work email only\" on native Framer forms. Combines:\n//   1. An exact-match blocklist of well-known consumer email domains\n//   2. A set of regex rules derived from the April 2026 leads dataset\n//      (gmail typo variants, Toloka-branded fakes, placeholder domains, etc.)\n//\n// Catch rate vs. April 2026 leads (11 610 rows): ~84.8%\n// (vs. ~55.7% for the exact-match blocklist alone).\n//\n// Apply these overrides in Framer:\n//   - brixBlockNonWorkEmailsForm    → Form layer (REQUIRED for multi-field forms)\n//   - brixBlockNonWorkEmailsInput   → Email input layer\n//   - brixBlockNonWorkEmailsButton  → Submit button layer\n//   - brixBlockNonWorkEmailsError   → Error message Text layer\n//\n// Version: 2.2.0 — capture-phase guard on the Form blocks submit / Enter\n//                  from ANY field (not just the email input)\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useCallback,useEffect,useRef}from\"react\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";// -----------------------------\n// 1. Shared store across layers\n// -----------------------------\nconst useBrixBlockEmailStore=createStore({email:\"\",blocked:false,message:\"\",ruleName:\"\",touched:false});// -----------------------------\n// 2a. Exact-match blocklist\n// -----------------------------\n// Domains where every address is consumer/free. Matched against the extracted\n// domain part only (after the last \"@\"), so they don't false-positive on\n// substrings like \"mac.com\" inside a longer corporate domain.\nconst BRIX_BLOCKED_DOMAINS=new Set([// Google\n\"gmail.com\",\"googlemail.com\",// Microsoft consumer\n\"outlook.com\",\"hotmail.com\",\"live.com\",\"msn.com\",// Yahoo\n\"yahoo.com\",\"yahoo.co.uk\",\"yahoo.co.in\",\"ymail.com\",// Apple\n\"icloud.com\",\"me.com\",\"mac.com\",// AOL\n\"aol.com\",// German free providers\n\"gmx.com\",\"gmx.de\",\"web.de\",// Privacy-focused\n\"proton.me\",\"protonmail.com\",\"pm.me\",\"tuta.com\",\"tutanota.com\",// Other free providers\n\"zoho.com\",\"mail.com\",\"inbox.com\"]);const BRIX_BLOCK_RULES=[// ── Gmail family ──────────────────────────────────────────────────────\n// gmail.com, gmail.fr, gmail.cm, gmail.com.br, co.gmail.com,\n// toloka.gmail.com, googlemail.com, etc.\n{name:\"gmail_variants\",pattern:/@[^@]*gmail/i},// g.mail.com / g-mail.com — Gmail split with separator\n{name:\"g_mail_com\",pattern:/@g[.-]mail\\./i},// gmai.* — common misspelling that bypasses the gmail check\n{name:\"gmai_typo\",pattern:/@[^@]*gmai\\./i},// 36 .com lookalikes: gamil, gmil, gmal, gnail, gmial, etc.\n{name:\"gmail_typos\",pattern:/^[^@]+@(gamil|gmil|gmal|gnail|gmial|gmali|gmsil|gimal|gamail|hmail|gail|gemail|gemil|gmaol|gimail|gmqil|gmaul|gmeil|gamli|gma|gamel|ail|emai|homail|e-mail|emil|gmaim|gmaio|otmail|gmaiil|gml|gimel|gmakl|gmaik|vmail)\\.com$/i},// ── Yahoo family ──────────────────────────────────────────────────────\n// yahoo.com, myyahoo.com, yhoo.com, tolokaai.yahoo.com\n{name:\"yahoo_variants\",pattern:/@[^@]*(yahoo|myyahoo|yhoo)\\./i},// ── Microsoft consumer ────────────────────────────────────────────────\n// outlook.* (+ typos outloo/outlok/outook), hotmail.*, live.*, msn.*,\n// windowslive.*\n{name:\"microsoft_consumer\",pattern:/@(out(look|loo|lok|ook)|hotmail|live|msn|windowslive)\\./i},// ── Yandex (any TLD) ──────────────────────────────────────────────────\n{name:\"yandex\",pattern:/@yandex\\./i},// ── iCloud + typo variants (icoud, iclod, icould, iclould) ────────────\n{name:\"icloud\",pattern:/^[^@]+@ic(loud?|oud|ould|lod|lould?)\\.[a-z]{2,}$/i},// ── Russian free email ────────────────────────────────────────────────\n{name:\"ru_free_email\",pattern:/@(mail\\.ru|internet\\.ru|bk\\.ru|list\\.ru|inbox\\.ru)$/i},// ── EU regional free email ────────────────────────────────────────────\n{name:\"eu_free_email\",pattern:/@(seznam\\.cz|interia\\.pl|wp\\.pl|op\\.pl|email\\.cz|abv\\.bg|libero\\.it|inbox\\.lv|ukr\\.net)$/i},// ── Asian free email ──────────────────────────────────────────────────\n{name:\"asian_free_email\",pattern:/@(qq\\.com|naver\\.com|163\\.com)$/i},// ── Privacy / anonymous relay ─────────────────────────────────────────\n{name:\"privacy_anonymous_email\",pattern:/@(privaterelay\\.appleid\\.com|proton\\.me|protonmail\\.(com|ch)|tutamail\\.com|tuta\\.io)$/i},// ── Other free providers (email.com, zohomail.*, vk.com, yopmail, …) ──\n{name:\"consumer_email_extended\",pattern:/@(email\\.(com|cz)|zohomail\\.(com|in|eu)|vk\\.com|hi2\\.in|mail\\.(co|com|de)|info\\.com|rediffmail\\.com|yopmail\\.com|laposte\\.net)$/i},// ── Placeholder / test domains ────────────────────────────────────────\n// company.com, yourcompany.com, example.com, bussines.com, empresa.com…\n{name:\"placeholder_domain\",pattern:/^[^@]+@(company|yourcompany|mycompany|yourdomain|domain|school|example|bussines|entreprise|empresa)\\.com$/i},// ── Toloka-branded fakes (incl. misspellings) ─────────────────────────\n// toloka.*, tolok.ai, toloko.ai, taloka.ai, tolaka.ai, tokola.ai,\n// tolola.ai, toloca.ai, tolika.ai, tolona.ai, toroka.ai, toka.ai…\n{name:\"toloka_branded_fake\",pattern:/^[^@]+@([^@]*(tolok[a-z]?|taloka|tolaka|tolika|tokola|tolka|tolko|tolola|toloca|tiloka|tolona|toroka)[^@]*|toka\\.ai)$/i}];// -----------------------------\n// 3. Helper functions\n// -----------------------------\nconst STRUCTURAL_EMAIL_RE=/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;const BLOCKED_MESSAGE=\"Please use a work email address (personal email providers are not accepted).\";function normalizeEmail(value){return(value||\"\").trim().toLowerCase();}function extractDomain(email){const at=email.lastIndexOf(\"@\");if(at===-1)return\"\";return email.slice(at+1).trim().toLowerCase().replace(/\\.$/,\"\");}function looksEmailish(value){return/.+@.+\\..+/.test(value);}function findBlockingRule(normalizedEmail,domain){if(!domain)return null;if(BRIX_BLOCKED_DOMAINS.has(domain)){return{ruleName:\"exact_match\"};}for(const rule of BRIX_BLOCK_RULES){if(rule.pattern.test(normalizedEmail)){return{ruleName:rule.name};}}return null;}function computeValidation(email){const normalized=normalizeEmail(email);const domain=extractDomain(normalized);if(!domain)return{blocked:false,message:\"\",ruleName:\"\"};const hit=findBlockingRule(normalized,domain);if(hit){return{blocked:true,message:BLOCKED_MESSAGE,ruleName:hit.ruleName};}return{blocked:false,message:\"\",ruleName:\"\"};}function setNativeValidity(inputEl,email,blocked,message){if(!inputEl||typeof inputEl.setCustomValidity!==\"function\")return;// Don't pollute :invalid styling while the user is still typing.\nif(!looksEmailish(email)){inputEl.setCustomValidity(\"\");return;}inputEl.setCustomValidity(blocked?message:\"\");}function mergeRefs(a,b){return node=>{b.current=node;if(typeof a===\"function\")a(node);else if(a&&typeof a===\"object\")a.current=node;};}// -----------------------------\n// 4. Overrides\n// -----------------------------\n// EMAIL INPUT\n// Attach to the email input field inside your Framer Form.\nexport function brixBlockNonWorkEmailsInput(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[,setStore]=useBrixBlockEmailStore();const inputRef=useRef(null);const sync=useCallback(nextEmail=>{const{blocked,message,ruleName}=computeValidation(nextEmail);setStore({email:nextEmail,blocked,message,ruleName});setNativeValidity(inputRef.current,nextEmail,blocked,message);},[setStore]);// Initial sync + autofill guard (browser may fill the field\n// asynchronously after mount — poll briefly to catch that).\nuseEffect(()=>{const el=inputRef.current;if(!el)return;const initial=el.value??\"\";sync(initial);if(typeof window===\"undefined\")return;let last=el.value??\"\";const interval=window.setInterval(()=>{const now=el.value??\"\";if(now!==last){last=now;sync(now);}},200);const timeout=window.setTimeout(()=>{window.clearInterval(interval);},2e3);return()=>{window.clearInterval(interval);window.clearTimeout(timeout);};},[sync]);const handleChange=eventOrValue=>{const value=typeof eventOrValue===\"string\"?eventOrValue:eventOrValue?.target?.value??eventOrValue?.currentTarget?.value??\"\";setStore({touched:true});sync(value);if(typeof props.onChange===\"function\"){props.onChange(eventOrValue);}};const handleBlur=eventOrValue=>{setStore({touched:true});const value=typeof eventOrValue===\"string\"?eventOrValue:eventOrValue?.target?.value??eventOrValue?.currentTarget?.value??inputRef.current?.value??\"\";sync(value);if(typeof props.onBlur===\"function\"){props.onBlur(eventOrValue);}};// Guard against implicit form submission via the Enter key.\n// The disabled button only updates on the next React render, so the\n// first Enter press can slip through with a stale `blocked` state.\n// Here we recompute validation synchronously from the live DOM value\n// and cancel the event before the form submits.\nconst handleKeyDown=event=>{const isEnter=event?.key===\"Enter\"||event?.code===\"Enter\"||event?.keyCode===13;if(isEnter){const value=inputRef.current?.value??event?.target?.value??event?.currentTarget?.value??\"\";const{blocked,message}=computeValidation(value);if(blocked){event.preventDefault();event.stopPropagation();setStore({touched:true});sync(value);// Surface the native bubble next to the field.\nconst el=inputRef.current;if(el&&typeof el.reportValidity===\"function\"){el.setCustomValidity(message);el.reportValidity();}return;}}if(typeof props.onKeyDown===\"function\"){props.onKeyDown(event);}};return /*#__PURE__*/_jsx(Component,{...props,ref:mergeRefs(ref,inputRef),onChange:handleChange,onBlur:handleBlur,onKeyDown:handleKeyDown});});}// FORM\n// Attach to the Form layer that wraps the fields and submit button.\n// This is the real backstop: it installs capture-phase listeners on the\n// underlying <form> element, so a blocked email is rejected before Framer's\n// own submit handler runs — no matter which field the Enter key came from.\nexport function brixBlockNonWorkEmailsForm(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store]=useBrixBlockEmailStore();const rootRef=useRef(null);// Keep the latest validation state reachable from the (stable) event\n// listeners below without re-binding them on every render.\nconst stateRef=useRef(store);stateRef.current=store;useEffect(()=>{if(typeof window===\"undefined\")return;const root=rootRef.current;if(!root)return;const formEl=root.tagName===\"FORM\"?root:root.querySelector(\"form\");const target=formEl??root;const cancel=event=>{event.preventDefault();event.stopImmediatePropagation();};const onSubmitCapture=event=>{if(stateRef.current.blocked)cancel(event);};const onKeyDownCapture=event=>{const isEnter=event.key===\"Enter\"||event.keyCode===13;// Don't swallow Enter inside a multi-line text area.\nconst tag=event.target?.tagName;if(isEnter&&tag!==\"TEXTAREA\"&&stateRef.current.blocked){cancel(event);}};target.addEventListener(\"submit\",onSubmitCapture,true);target.addEventListener(\"keydown\",onKeyDownCapture,true);return()=>{target.removeEventListener(\"submit\",onSubmitCapture,true);target.removeEventListener(\"keydown\",onKeyDownCapture,true);};},[]);return /*#__PURE__*/_jsx(Component,{...props,ref:mergeRefs(ref,rootRef)});});}// SUBMIT BUTTON\n// Attach to the submit button inside the same Form.\nexport function brixBlockNonWorkEmailsButton(Component){return props=>{const[store]=useBrixBlockEmailStore();const shouldDisable=store.blocked;return /*#__PURE__*/_jsx(Component,{...props,disabled:shouldDisable||props.disabled,\"aria-disabled\":shouldDisable||props[\"aria-disabled\"],title:shouldDisable?store.message:props.title,style:{...props.style,opacity:shouldDisable?.5:props.style?.opacity,cursor:shouldDisable?\"not-allowed\":props.style?.cursor,pointerEvents:shouldDisable?\"none\":props.style?.pointerEvents}});};}// ERROR MESSAGE TEXT\n// Attach to a Text layer under the button that contains your \"work email only\" message.\nexport function brixBlockNonWorkEmailsError(Component){return props=>{const[store]=useBrixBlockEmailStore();const show=store.blocked&&(store.touched||store.email.length>0);return /*#__PURE__*/_jsx(Component,{...props,text:show?store.message:\"\",style:{...props.style,display:show?props.style?.display??\"block\":\"none\"}});};}\nexport const __FramerMetadata__ = {\"exports\":{\"brixBlockNonWorkEmailsInput\":{\"type\":\"reactHoc\",\"name\":\"brixBlockNonWorkEmailsInput\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"brixBlockNonWorkEmailsButton\":{\"type\":\"reactHoc\",\"name\":\"brixBlockNonWorkEmailsButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"brixBlockNonWorkEmailsForm\":{\"type\":\"reactHoc\",\"name\":\"brixBlockNonWorkEmailsForm\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"brixBlockNonWorkEmailsError\":{\"type\":\"reactHoc\",\"name\":\"brixBlockNonWorkEmailsError\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BrixBlockNonWorkEmails.map","// BrixCaptureSourcePage.tsx\n//\n// Toloka — auto-capture source page into a hidden form field\n// ----------------------------------------------------------------------------\n// Resolution order (first non-empty wins):\n//   1. URL param  ?source_page=<slug>          — explicit override\n//   2. sessionStorage[\"toloka_source_page\"]    — set by site-tracker.html\n//                                                 on every non-form page\n//   3. document.referrer (same-origin pathname) — same-tab fallback\n//   4. \"direct\"                                 — bookmark / external link\n//\n// Setup in Framer:\n//   1. Add a Form Input layer to the form (any text input is fine).\n//   2. Set its `name` to:           source_page\n//   3. Hide it visually (Layout → Hide layer, or width/height = 0).\n//   4. Apply this override:         brixCaptureSourcePage\n//\n// The override sets the input's value on mount using the native value setter\n// + bubbling input/change events, so Framer's Form picks it up the same way\n// it would react to a real user typing.\n//\n// Version: 1.0.0\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect,useRef}from\"react\";const STORAGE_KEY=\"toloka_source_page\";const URL_PARAM=\"source_page\";const FORM_PAGE_RE=/talk-to-us/i;function pathToSlug(pathname){const trimmed=(pathname||\"\").replace(/^\\/+|\\/+$/g,\"\");return trimmed||\"home\";}function readFromUrl(){if(typeof window===\"undefined\")return\"\";try{const params=new URLSearchParams(window.location.search);return(params.get(URL_PARAM)||\"\").trim();}catch{return\"\";}}function readFromSessionStorage(){if(typeof window===\"undefined\")return\"\";try{return(window.sessionStorage.getItem(STORAGE_KEY)||\"\").trim();}catch{return\"\";}}function readFromReferrer(){if(typeof document===\"undefined\")return\"\";const ref=document.referrer;if(!ref)return\"\";try{const url=new URL(ref);// Only trust same-origin referrers — avoids logging google.com etc.\nif(url.origin!==window.location.origin)return\"\";const slug=pathToSlug(url.pathname);// Don't echo the form page back as the source.\nif(FORM_PAGE_RE.test(slug))return\"\";return slug;}catch{return\"\";}}function resolveSourcePage(){return readFromUrl()||readFromSessionStorage()||readFromReferrer()||\"direct\";}// Set value on a (likely React-controlled) input so React/Framer Form sees\n// the change. Plain `el.value = x` doesn't fire React's synthetic events.\nfunction setReactInputValue(input,value){const proto=window.HTMLInputElement?.prototype;const setter=proto?Object.getOwnPropertyDescriptor(proto,\"value\")?.set:undefined;if(setter){setter.call(input,value);}else{input.value=value;}input.dispatchEvent(new Event(\"input\",{bubbles:true}));input.dispatchEvent(new Event(\"change\",{bubbles:true}));}function mergeRefs(a,b){return node=>{b.current=node;if(typeof a===\"function\")a(node);else if(a&&typeof a===\"object\")a.current=node;};}// OVERRIDE\n// Apply on the input layer whose `name` is \"source_page\".\n//\n// We don't rely on forwardRef to reach the underlying <input>: Framer's Form\n// Input may forward ref to a wrapper element, or not at all. Instead, on mount\n// we query the DOM by `name=\"source_page\"` (with a brief retry loop in case\n// Framer mounts the input asynchronously).\nexport function brixCaptureSourcePage(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const wrapperRef=useRef(null);const appliedRef=useRef(false);useEffect(()=>{if(typeof document===\"undefined\")return;const value=resolveSourcePage();const findInput=()=>{const fromRef=wrapperRef.current;if(fromRef instanceof HTMLInputElement)return fromRef;if(fromRef instanceof HTMLElement){const nested=fromRef.querySelector('input[name=\"source_page\"]');if(nested)return nested;}return document.querySelector('input[name=\"source_page\"]');};const tryApply=()=>{if(appliedRef.current)return true;const el=findInput();if(!el)return false;setReactInputValue(el,value);appliedRef.current=true;return true;};if(tryApply())return;// Retry briefly — Framer may mount the input after our first effect.\nconst interval=window.setInterval(()=>{if(tryApply())window.clearInterval(interval);},100);const timeout=window.setTimeout(()=>{window.clearInterval(interval);},5e3);return()=>{window.clearInterval(interval);window.clearTimeout(timeout);};},[]);return /*#__PURE__*/_jsx(Component,{...props,ref:mergeRefs(ref,wrapperRef),\"aria-hidden\":\"true\",tabIndex:-1,autoComplete:\"off\"});});}\nexport const __FramerMetadata__ = {\"exports\":{\"brixCaptureSourcePage\":{\"type\":\"reactHoc\",\"name\":\"brixCaptureSourcePage\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BrixCaptureSourcePage.map"],"mappings":"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"}