{"id":5276,"date":"2025-12-12T14:05:01","date_gmt":"2025-12-12T13:05:01","guid":{"rendered":"https:\/\/nect.com\/prueba-de-formulario\/"},"modified":"2025-12-17T17:01:04","modified_gmt":"2025-12-17T16:01:04","slug":"prueba-de-formulario","status":"publish","type":"page","link":"https:\/\/nect.com\/es\/prueba-de-formulario\/","title":{"rendered":"Prueba de formulario"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5276\" class=\"elementor elementor-5276 elementor-5115\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-782ba81 e-flex e-con-boxed e-con e-parent\" data-id=\"782ba81\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5b24bee elementor-widget elementor-widget-global elementor-global-5242 elementor-global-5203 elementor-widget-html\" data-id=\"5b24bee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Charset & reCAPTCHA script -->\n<meta http-equiv=\"Content-type\" content=\"text\/html; charset=UTF-8\">\n<script src=\"https:\/\/www.google.com\/recaptcha\/api.js?hl=de\" async=\"\" defer><\/script>\n\n<script>\n(function () {\n  \/************************************************************\n   * A. reCAPTCHA Timestamp Injection (Salesforce Requirement)\n   ************************************************************\/\n  function updateRecaptchaTimestamp() {\n    \/\/ Support multiple forms\/widgets: update ts for each form that has an empty reCAPTCHA response\n    var responses = document.querySelectorAll('textarea[name=\"g-recaptcha-response\"]');\n    if (!responses || !responses.length) return;\n\n    responses.forEach(function (r) {\n      if (!r || (r.value || \"\").trim() !== \"\") return;\n\n      \/\/ Find the owning form of this response textarea\n      var form = r.closest(\"form\");\n      if (!form) return;\n\n      var el = form.querySelector('[name=\"captcha_settings\"]');\n      if (!el) return;\n\n      try {\n        var cfg = JSON.parse(el.value);\n        cfg.ts = String(Date.now());\n        el.value = JSON.stringify(cfg);\n      } catch (e) {\n        console.warn(\"[nect-form] Failed parsing captcha settings\", e);\n      }\n    });\n  }\n  setInterval(updateRecaptchaTimestamp, 500);\n\n  \/************************************************************\n   * B. Validation messages (German only; translated by WPML)\n   ************************************************************\/\n  var UI_STRINGS = {\n    required: \"Bitte dieses Feld ausf\u00fcllen.\",\n    requiredSelect: \"Bitte w\u00e4hle eine Option aus.\",\n    requiredCheckbox: \"Bitte dieses K\u00e4stchen aktivieren, um fortzufahren.\",\n    emailFormat: \"Bitte eine g\u00fcltige E-Mail-Adresse eingeben.\",\n    phoneFormat: \"Bitte eine g\u00fcltige Telefonnummer eingeben.\",\n    denyDomain: \"Bitte verwenden Sie eine gesch\u00e4ftliche E-Mail-Adresse.\",\n    allowDomain: \"Bitte verwenden Sie eine freigegebene Unternehmensdomain.\",\n    recaptcha: \"Bitte best\u00e4tigen Sie, dass Sie kein Roboter sind.\"\n  };\n\n  \/************************************************************\n   * DEBUG CONFIG\n   ************************************************************\/\n  var DEBUG_MODE = false; \/\/ master switch (set to true while debugging)\n  var DEBUG_ENABLED = DEBUG_MODE; \/\/ runtime toggle (changed via overlay button)\n\n  function debugLog() {\n    if (!DEBUG_ENABLED) return;\n    var args = Array.prototype.slice.call(arguments);\n    args.unshift(\"[nect-form][debug]\");\n    console.log.apply(console, args);\n  }\n\n  \/\/ Debug overlay DOM references (only used when DEBUG_MODE === true)\n  var debugOverlay = null;\n  var debugOverlayEngagementEl = null;\n  var debugOverlayToggleEl = null;\n  var debugOverlayLogButtonEl = null;\n  var debugOverlayCopyButtonEl = null;\n  var debugOverlayPayloadEl = null;\n\n  \/************************************************************\n   * C. B2B email validation config\n   ************************************************************\/\n  var USE_ALLOWLIST = false;\n\n  var ALLOWED_DOMAINS = [\"nect.com\", \"partner-a.de\", \"kunde-b.com\"];\n\n  var BLOCKED_DOMAINS = [\n    \/\/ German freemail\n    \"gmail.com\",\"googlemail.com\",\"gmx.de\",\"gmx.net\",\"web.de\",\n    \"t-online.de\",\"freenet.de\",\"online.de\",\"gmx.com\",\"gmx.us\",\n    \/\/ Microsoft freemail\n    \"hotmail.com\",\"hotmail.de\",\"outlook.com\",\"outlook.de\",\n    \"live.com\",\"msn.com\",\n    \/\/ Apple\n    \"icloud.com\",\"me.com\",\"mac.com\",\n    \/\/ Yahoo\n    \"yahoo.com\",\"yahoo.de\",\"ymail.com\",\n    \/\/ Mail.com family\n    \"mail.com\",\"email.com\",\"inbox.com\",\"europe.com\",\"asia.com\",\"usa.com\",\n    \/\/ European freemail\n    \"orange.fr\",\"laposte.net\",\"libero.it\",\n    \"virgilio.it\",\"alice.it\",\"bluewin.ch\",\n    \"mail.ru\",\"rambler.ru\",\"seznam.cz\",\n    \/\/ ISP \/ Mobile carrier\n    \"vodafone.de\",\"o2online.de\",\"versatel.de\",\"aon.at\",\n    \/\/ AT \/ CH\n    \"gmx.at\",\"bluewin.ch\",\"hotmail.at\",\n    \/\/ Privacy \/ alt mail\n    \"protonmail.com\",\"pm.me\",\"tutanota.com\",\"tuta.io\",\n    \"hushmail.com\",\"countermail.com\",\n    \"yandex.com\",\"yandex.ru\",\"zoho.com\",\n    \/\/ Poland\n    \"wp.pl\",\"onet.pl\",\"o2.pl\",\"tlen.pl\",\"interia.pl\",\n    \"gazeta.pl\",\"poczta.fm\",\"poczta.onet.pl\",\"autograf.pl\",\"vp.pl\",\n    \/\/ Spain\n    \"terra.es\",\"telefonica.net\",\"correo.es\",\"wanadoo.es\",\"orange.es\",\n    \"movistar.es\",\"hotmail.es\",\"yahoo.es\",\"live.es\",\"msn.es\",\n    \/\/ Sandbox \/ temp \/ disposable\n    \"test.com\",\"test.de\",\"example.com\",\"example.org\",\"example.net\",\n    \"invalid.com\",\"fake.com\",\"noreply.com\",\"noreply.net\",\"donotreply.com\",\n    \"mailinator.com\",\"tempmail.com\",\"tmpmail.com\",\"trashmail.com\",\n    \"10minutemail.com\",\"dispostable.com\",\"guerrillamail.com\",\n    \"sharklasers.com\",\"getnada.com\",\"yopmail.com\",\"anonaddy.me\"\n  ];\n\n  var MSG_DENYLIST  = UI_STRINGS.denyDomain;\n  var MSG_ALLOWLIST = UI_STRINGS.allowDomain;\n\n  \/************************************************************\n   * D. Engagement (time on page + scroll depth)\n   *    \u2013 active tab time only\n   ************************************************************\/\n  var sessionStart = Date.now();       \/\/ kept for reference \/ potential future use\n  var maxScrollPercent = 0;\n\n  var activeTime = 0;\n  var lastVisibleTimestamp = Date.now();\n\n  document.addEventListener(\"visibilitychange\", function () {\n    if (document.visibilityState === \"hidden\") {\n      activeTime += Date.now() - lastVisibleTimestamp;\n    } else {\n      lastVisibleTimestamp = Date.now();\n    }\n  });\n\n  function updateScrollDepth() {\n    var doc = document.documentElement || document.body;\n    var scrollTop = window.pageYOffset || doc.scrollTop || 0;\n    var scrollHeight = doc.scrollHeight || 0;\n    var viewportHeight = window.innerHeight || doc.clientHeight || 0;\n    var maxScrollable = scrollHeight - viewportHeight;\n    if (maxScrollable <= 0) return;\n    var current = (scrollTop \/ maxScrollable) * 100;\n    if (current > maxScrollPercent) maxScrollPercent = current;\n  }\n\n  window.addEventListener(\"scroll\", updateScrollDepth, { passive: true });\n\n  function computeEngagementString() {\n    var visibleMs = activeTime;\n    if (document.visibilityState === \"visible\") {\n      visibleMs += (Date.now() - lastVisibleTimestamp);\n    }\n\n    var seconds = Math.round(visibleMs \/ 1000);\n    var scroll = Math.round(maxScrollPercent);\n    var level = \"low\";\n    if (seconds >= 60 && scroll >= 75) {\n      level = \"high\";\n    } else if (seconds >= 30 && scroll >= 40) {\n      level = \"medium\";\n    }\n\n    var result =\n      \"time=\" + seconds + \"s; scroll=\" + scroll + \"%; engagement_level=\" + level;\n\n    debugLog(\"Engagement updated:\", result);\n\n    return result;\n  }\n\n  \/************************************************************\n   * E. Device type + Browser language\n   ************************************************************\/\n  function getDeviceType() {\n    var ua = navigator.userAgent || \"\";\n    if (\/mobi|android\/i.test(ua)) return \"Mobile\";\n\n    var width = window.innerWidth || document.documentElement.clientWidth || 0;\n    if (width <= 1024) return \"Tablet\";\n    return \"Desktop\";\n  }\n\n  function getBrowserLanguage() {\n    var lang = (navigator.language || navigator.userLanguage || \"\").trim();\n    return lang || \"unknown\";\n  }\n\n  \/************************************************************\n   * F. Generic helpers (errors, tracking, spam)\n   ************************************************************\/\n  function domainMatches(d, list) {\n    return list.some(function (x) {\n      return d === x || d.endsWith(\".\" + x);\n    });\n  }\n\n  function isDomainAllowed(d) {\n    if (!d) return true;\n    return USE_ALLOWLIST\n      ? domainMatches(d, ALLOWED_DOMAINS)\n      : !domainMatches(d, BLOCKED_DOMAINS);\n  }\n\n  function setInvalidActive(el, on) {\n    if (!el) return;\n    if (on) {\n      el.classList.add(\"invalid-active\");\n    } else {\n      el.classList.remove(\"invalid-active\");\n    }\n  }\n\n  \/\/ Find or create the inline error node directly below the field\n  function ensureErrorNode(field) {\n    if (!field) return null;\n\n    var container;\n    \/\/ For checkboxes: show the message below the entire row\n    if (field.type === \"checkbox\") {\n      container =\n        field.closest(\".checkbox-row\") ||\n        field.parentElement;\n    } else {\n      \/\/ Inputs \/ selects \/ textareas: message directly below the field\n      container = field.parentElement;\n    }\n\n    if (!container) return null;\n\n    var msgEl = container.querySelector(\".sf-error\");\n    if (!msgEl) {\n      msgEl = document.createElement(\"div\");\n      msgEl.className = \"sf-error\";\n      container.appendChild(msgEl);\n    }\n    return msgEl;\n  }\n\n  function showFieldError(field, message) {\n    if (!field) return;\n    setInvalidActive(field, true);\n    var msgEl = ensureErrorNode(field);\n    if (msgEl) msgEl.textContent = message || \"\";\n  }\n\n  function clearFieldError(field) {\n    if (!field) return;\n    setInvalidActive(field, false);\n\n    var container = null;\n    if (field.type === \"checkbox\") {\n      container = field.closest(\".checkbox-row\") || field.parentElement;\n    } else {\n      container = field.parentElement;\n    }\n\n    if (!container) return;\n    var msgEl = container.querySelector(\".sf-error\");\n    if (msgEl) msgEl.textContent = \"\";\n  }\n\n  function clearAllErrors(form) {\n    form.querySelectorAll(\".invalid-active\").forEach(function (f) {\n      f.classList.remove(\"invalid-active\");\n    });\n    form.querySelectorAll(\".sf-error\").forEach(function (el) {\n      el.textContent = \"\";\n    });\n    var recErr = form.querySelector('.recaptcha-error');\n    if (recErr) recErr.textContent = \"\";\n  }\n\n  function setIfExists(form, id, val) {\n    if (!form) return;\n    var el = form.querySelector('#' + id);\n    if (el && typeof val === \"string\") el.value = val;\n  }\n\n  \/\/ Build a snapshot object for debugging (visible + hidden fields, with human-readable labels)\n  function collectFormSnapshot(form) {\n    var snapshot = {\n      visible_fields: {},\n      hidden_fields: {},\n      meta: {}\n    };\n    if (!form) return snapshot;\n\n    \/\/ Human-readable labels for visible fields (including Salesforce IDs)\n    var fieldLabelMap = {\n      salutation: \"Salutation\",\n      first_name: \"First name\",\n      last_name: \"Last name\",\n      email: \"Email\",\n      phone: \"Phone number\",\n      company: \"Company\",\n      title: \"Department\",\n      \"00N7Q00000F4M1Z\": \"Subject\",\n      \"00N7Q00000IGsDp\": \"Message\",\n      \"00Naa000003Nuiv\": \"Privacy consent\",\n      \"00Naa000004H13p\": \"Newsletter consent\"\n    };\n\n    \/\/ Fields the user can see \/ interact with\n    var visibleFieldNames = [\n      \"salutation\",\n      \"first_name\",\n      \"last_name\",\n      \"email\",\n      \"phone\",\n      \"company\",\n      \"title\",             \/\/ department\n      \"00N7Q00000F4M1Z\",   \/\/ subject\n      \"00N7Q00000IGsDp\",   \/\/ message\n      \"00Naa000003Nuiv\",   \/\/ privacy checkbox\n      \"00Naa000004H13p\"    \/\/ newsletter checkbox (if present)\n    ];\n\n    visibleFieldNames.forEach(function (name) {\n      var el = form.querySelector('[name=\"' + name + '\"]');\n      if (!el) return;\n\n      var label = fieldLabelMap[name] || name;\n      if (el.type === \"checkbox\") {\n        var isChecked = !!el.checked;\n        \/\/ Store both the raw value and a human readable state\n        snapshot.visible_fields[label] = isChecked ? \"1 (checked)\" : \"0 (not checked)\";\n      } else {\n        snapshot.visible_fields[label] = (el.value || \"\").trim();\n      }\n    });\n\n    \/\/ Hidden fields with nicer labels\n    var hiddenMap = {\n      sf_page_url:   \"Page URL\",\n      sf_page_path:  \"Page Path\",\n      sf_page_title: \"Page Title\",\n      sf_referrer:   \"Referrer\",\n      sf_engagement: \"Engagement (field)\",\n      sf_device_type:\"Device Type\",\n      sf_browser_lang:\"Browser Language\"\n    };\n\n    Object.keys(hiddenMap).forEach(function (id) {\n      var el = document.getElementById(id);\n      if (el) {\n        snapshot.hidden_fields[hiddenMap[id]] = el.value || \"\";\n      }\n    });\n\n    \/\/ Meta information that is computed on the fly\n    snapshot.meta[\"Engagement (computed)\"] = computeEngagementString();\n\n    return snapshot;\n  }\n\n  function checkHoneypot(form) {\n    var hp = form.querySelector('input[name=\"website\"]');\n    return !(hp && hp.value && hp.value.trim() !== \"\");\n  }\n\n  function showRecaptchaError(form, message) {\n    if (!form) return;\n    var el = form.querySelector('.recaptcha-error');\n    if (!el) return;\n    el.textContent = message || \"\";\n  }\n\n  \/\/ Global callback for reCAPTCHA \"data-callback\"\n  window._nectRecaptchaSuccess = function () {\n    document.querySelectorAll('form.nect-webtolead').forEach(function (f) {\n      showRecaptchaError(f, \"\");\n    });\n  };\n\n  function checkRecaptcha(form) {\n    if (!form) return true;\n\n    \/\/ When multiple widgets exist, grecaptcha.getResponse() without an id is unreliable.\n    \/\/ Instead, check the hidden textarea created by reCAPTCHA inside THIS form.\n    var r = form.querySelector('textarea[name=\"g-recaptcha-response\"]');\n    var ok = !!(r && (r.value || \"\").trim());\n\n    if (!ok) {\n      showRecaptchaError(form, UI_STRINGS.recaptcha);\n    } else {\n      showRecaptchaError(form, \"\");\n    }\n\n    return ok;\n  }\n\n  \/************************************************************\n   * G. Email validation (B2B only)\n   ************************************************************\/\n  function validateEmailB2B(emailInput) {\n    if (!emailInput) return true;\n\n    var raw = (emailInput.value || \"\").trim().toLowerCase();\n\n    \/\/ 1) Empty field \u2192 handled by generic \"required\" logic\n    if (!raw) {\n      clearFieldError(emailInput);\n      return true;\n    }\n\n    \/\/ 2) Format check (simple but robust)\n    var emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/;\n    if (!emailRegex.test(raw)) {\n      showFieldError(emailInput, UI_STRINGS.emailFormat);\n      return false;\n    }\n\n    \/\/ 3) Domain check for B2B use case\n    var at = raw.lastIndexOf(\"@\");\n    var domain = at === -1 ? \"\" : raw.slice(at + 1);\n\n    if (!isDomainAllowed(domain)) {\n      showFieldError(emailInput, USE_ALLOWLIST ? MSG_ALLOWLIST : MSG_DENYLIST);\n      return false;\n    }\n\n    \/\/ All good \u2192 clear any previous errors\n    clearFieldError(emailInput);\n    return true;\n  }\n\n  \/************************************************************\n   * H. Initialization & submit handling\n   ************************************************************\/\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    var forms = document.querySelectorAll('form.nect-webtolead');\n    if (!forms || !forms.length) return;\n\n    forms.forEach(function (form) {\n\n    \/************************************************************\n     * I. Auto-contrast (detect dark background behind the form)\n     *    Works for solid colors AND gradients (Elementor)\n     ************************************************************\/\n    function _nectLum(r, g, b) {\n      var a = [r, g, b].map(function (v) {\n        v = v \/ 255;\n        return v <= 0.03928 ? v \/ 12.92 : Math.pow((v + 0.055) \/ 1.055, 2.4);\n      });\n      return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n    }\n\n    function _nectHexToRgb(hex) {\n      var h = (hex || \"\").replace(\"#\", \"\").trim();\n      if (h.length === 3) {\n        return [\n          parseInt(h[0] + h[0], 16),\n          parseInt(h[1] + h[1], 16),\n          parseInt(h[2] + h[2], 16)\n        ];\n      }\n      if (h.length === 6) {\n        return [\n          parseInt(h.slice(0, 2), 16),\n          parseInt(h.slice(2, 4), 16),\n          parseInt(h.slice(4, 6), 16)\n        ];\n      }\n      return null;\n    }\n\n    function _nectExtractColors(bgImage) {\n      if (!bgImage || bgImage === \"none\") return [];\n      var colors = [];\n\n      \/\/ rgb()\/rgba()\n      var rgbRegex = \/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\/gi;\n      var m;\n      while ((m = rgbRegex.exec(bgImage)) !== null) {\n        colors.push([parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)]);\n      }\n\n      \/\/ hex (#fff \/ #ffffff)\n      var hexRegex = \/#([0-9a-f]{3}|[0-9a-f]{6})\\b\/gi;\n      while ((m = hexRegex.exec(bgImage)) !== null) {\n        var rgb = _nectHexToRgb(m[0]);\n        if (rgb) colors.push(rgb);\n      }\n\n      return colors;\n    }\n\n    function _nectParseRgb(bgColor) {\n      var m = bgColor && bgColor.match(\/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\/i);\n      return m ? [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)] : null;\n    }\n\n    function _nectFindBgInfo(startEl) {\n      var cur = startEl;\n      while (cur && cur !== document.documentElement) {\n        var cs = window.getComputedStyle(cur);\n        var bgColor = cs.backgroundColor;\n        var bgImage = cs.backgroundImage;\n\n        var hasColor = bgColor && bgColor !== \"transparent\" && bgColor !== \"rgba(0, 0, 0, 0)\";\n        var hasImage = bgImage && bgImage !== \"none\";\n\n        if (hasImage || hasColor) {\n          return { bgColor: bgColor, bgImage: bgImage, el: cur };\n        }\n        cur = cur.parentElement;\n      }\n      return { bgColor: \"rgb(255,255,255)\", bgImage: \"none\", el: null };\n    }\n\n    function _nectIsDark(bgInfo) {\n      \/\/ Prefer gradient\/image analysis\n      if (bgInfo.bgImage && bgInfo.bgImage !== \"none\") {\n        var colors = _nectExtractColors(bgInfo.bgImage);\n        if (colors.length) {\n          var sum = 0;\n          for (var i = 0; i < colors.length; i++) {\n            sum += _nectLum(colors[i][0], colors[i][1], colors[i][2]);\n          }\n          var avg = sum \/ colors.length;\n          return avg  0.35;\n        }\n\n        \/\/ If it's a gradient but we can't parse it, assume dark (Nect gradients are dark)\n        if (String(bgInfo.bgImage).indexOf(\"gradient\") !== -1) {\n          return true;\n        }\n      }\n\n      \/\/ Solid background fallback\n      var rgb = _nectParseRgb(bgInfo.bgColor);\n      if (rgb) {\n        return _nectLum(rgb[0], rgb[1], rgb[2])  0.35;\n      }\n\n      return false;\n    }\n\n    function _nectApplyAutoContrast() {\n      \/\/ In Elementor the real background often sits on a wrapping container\n      var anchor = form.closest(\".elementor-element\") || form.parentElement || form;\n      var bgInfo = _nectFindBgInfo(anchor);\n      var dark = _nectIsDark(bgInfo);\n\n      form.classList.toggle(\"is-dark-bg\", !!dark);\n\n      \/\/ Useful for debugging\n      debugLog(\"Auto-contrast:\", { dark: dark, bgColor: bgInfo.bgColor, bgImage: bgInfo.bgImage, el: bgInfo.el });\n    }\n\n    \/\/ Initial + responsive\n    _nectApplyAutoContrast();\n    window.addEventListener(\"resize\", function () {\n      _nectApplyAutoContrast();\n    });\n\n    debugLog(\"Form initialized on\", window.location.href);\n\n    \/\/ Create lightweight debug overlay when debug mode is active\n    if (DEBUG_MODE) {\n      debugOverlay = document.createElement(\"div\");\n      debugOverlay.id = \"nect-debug-overlay\";\n      debugOverlay.innerHTML =\n        'div class=\"nect-debug-header\">' +\n          '<div class=\"nect-debug-title-row\">' +\n            '<span class=\"nect-debug-label\">DEBUG<\/span>' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-toggle>On<\/button>' +\n          '<\/div>' +\n          '<div class=\"nect-debug-controls\">' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-log>Log snapshot<\/button>' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-copy>Copy JSON<\/button>' +\n          '<\/div>' +\n          '<div class=\"nect-debug-engagement-block\">' +\n            '<div class=\"nect-debug-engagement-label\">Engagement<\/div>' +\n            '<div class=\"nect-debug-engagement-value\" data-debug-engagement>\u2013<\/div>' +\n          '<\/div>' +\n        '<\/div>' +\n        '<pre class=\"nect-debug-payload\" data-debug-payload><\/pre>';\n\n      document.body.appendChild(debugOverlay);\n\n      debugOverlayEngagementEl = debugOverlay.querySelector(\"[data-debug-engagement]\");\n      debugOverlayToggleEl = debugOverlay.querySelector(\"[data-debug-toggle]\");\n      debugOverlayLogButtonEl = debugOverlay.querySelector(\"[data-debug-log]\");\n      debugOverlayCopyButtonEl = debugOverlay.querySelector(\"[data-debug-copy]\");\n      debugOverlayPayloadEl = debugOverlay.querySelector(\"[data-debug-payload]\");\n\n      if (debugOverlayToggleEl) {\n        debugOverlayToggleEl.addEventListener(\"click\", function () {\n          DEBUG_ENABLED = !DEBUG_ENABLED;\n          debugOverlayToggleEl.textContent = DEBUG_ENABLED ? \"On\" : \"Off\";\n          debugOverlay.classList.toggle(\"nect-debug-muted\", !DEBUG_ENABLED);\n        });\n      }\n\n      if (debugOverlayLogButtonEl) {\n        debugOverlayLogButtonEl.addEventListener(\"click\", function () {\n          debugLog(\"Snapshot (overlay button):\", collectFormSnapshot(form));\n        });\n      }\n\n      if (debugOverlayCopyButtonEl) {\n        debugOverlayCopyButtonEl.addEventListener(\"click\", function () {\n          var snapshot = collectFormSnapshot(form);\n          var json = \"\";\n          try {\n            json = JSON.stringify(snapshot, null, 2);\n          } catch (err) {\n            debugLog(\"Failed to stringify snapshot for copy\", err);\n          }\n          if (!json) return;\n\n          if (navigator.clipboard && navigator.clipboard.writeText) {\n            navigator.clipboard.writeText(json).then(function () {\n              debugLog(\"Snapshot copied to clipboard.\");\n            }).catch(function (err) {\n              debugLog(\"Clipboard write failed\", err);\n            });\n          } else {\n            debugLog(\"Clipboard API not available; snapshot:\", snapshot);\n          }\n        });\n      }\n\n      \/\/ Update engagement string and payload in overlay every 1 second, but only if DEBUG_ENABLED\n      setInterval(function () {\n        if (!DEBUG_ENABLED) return;\n\n        var engagement = computeEngagementString();\n        if (debugOverlayEngagementEl) {\n          debugOverlayEngagementEl.textContent = engagement;\n        }\n\n        if (debugOverlayPayloadEl) {\n          var snapshot = collectFormSnapshot(form);\n          try {\n            debugOverlayPayloadEl.textContent = JSON.stringify(snapshot, null, 2);\n          } catch (err) {\n            debugOverlayPayloadEl.textContent = \"[snapshot error]\";\n            debugLog(\"Failed to stringify snapshot\", err);\n          }\n        }\n      }, 1000);\n    }\n\n    if (DEBUG_MODE) {\n      debugLog(\"Initial snapshot:\", collectFormSnapshot(form));\n      setInterval(function () {\n        debugLog(\"Snapshot (interval):\", collectFormSnapshot(form));\n      }, 10000); \/\/ every 10 seconds while DEBUG_ENABLED\n    }\n\n    \/\/ Disable native browser tooltips\n    form.setAttribute(\"novalidate\", \"novalidate\");\n\n    var emailInput = form.querySelector('input[name=\"email\"]');\n\n    \/\/ Prefill tracking fields\n    setIfExists(form, \"sf_page_url\",   window.location.href);\n    setIfExists(form, \"sf_page_path\",  window.location.pathname + window.location.search);\n    setIfExists(form, \"sf_page_title\", document.title || \"\");\n    setIfExists(form, \"sf_referrer\",   document.referrer || \"\");\n\n    \/\/ Live clean-up of errors\n    form.addEventListener(\"input\", function (e) {\n      var target = e.target;\n      if (!(target instanceof HTMLElement)) return;\n\n      if (target.matches(\"input, select, textarea\")) {\n        if (target.checkValidity()) {\n          clearFieldError(target);\n        }\n      }\n\n      if (emailInput && e.target === emailInput) {\n        clearFieldError(emailInput);\n      }\n    });\n\n    if (emailInput) {\n      emailInput.addEventListener(\"blur\", function () {\n        validateEmailB2B(emailInput);\n      });\n    }\n\n    form.addEventListener(\"submit\", function (e) {\n      e.preventDefault();\n      clearAllErrors(form);\n\n      var canSubmit = true;\n\n      \/\/ 1) B2B email check\n      if (!validateEmailB2B(emailInput)) {\n        canSubmit = false;\n      }\n\n      \/\/ 2) HTML5 rules (required, pattern, type) \u2013 custom messages\n      var fields = form.querySelectorAll(\"input, select, textarea\");\n      fields.forEach(function (field) {\n        if (!field.willValidate) return;\n\n        var v = field.validity;\n        if (!v.valid) {\n          canSubmit = false;\n\n          var msg;\n          if (field.type === \"checkbox\" && v.valueMissing) {\n            msg = UI_STRINGS.requiredCheckbox;\n          } else if (field.tagName === \"SELECT\" && v.valueMissing) {\n            msg = UI_STRINGS.requiredSelect;\n          } else if (field.type === \"email\" && v.valueMissing) {\n            \/\/ email format & domain errors are handled in validateEmailB2B\n            msg = UI_STRINGS.required;\n          } else if (field.type === \"tel\" && v.patternMismatch) {\n            msg = UI_STRINGS.phoneFormat;\n          } else if (v.valueMissing) {\n            msg = UI_STRINGS.required;\n          } else {\n            msg = UI_STRINGS.required; \/\/ generic fallback\n          }\n\n          showFieldError(field, msg);\n        }\n      });\n\n      \/\/ 3) Honeypot & reCAPTCHA validation\n      if (!checkHoneypot(form) || !checkRecaptcha(form)) {\n        canSubmit = false;\n      }\n\n      if (!canSubmit) {\n        var firstInvalid = form.querySelector(\".invalid-active\");\n        if (firstInvalid) {\n          firstInvalid.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n          try {\n            firstInvalid.focus({ preventScroll: true });\n          } catch (err) {\n            firstInvalid.focus();\n          }\n        }\n        return;\n      }\n\n      \/\/ 4) Fill engagement + device + language fields\n      setIfExists(form, \"sf_engagement\",   computeEngagementString());\n      setIfExists(form, \"sf_device_type\",  getDeviceType());\n      setIfExists(form, \"sf_browser_lang\", getBrowserLanguage());\n\n      debugLog(\"Final form snapshot before submit:\", collectFormSnapshot(form));\n\n      \/\/ 5) Prevent double submission\n      var btn = form.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n      if (btn) {\n        btn.disabled = true;\n        btn.style.opacity = \"0.6\";\n        btn.style.cursor = \"not-allowed\";\n      }\n\n      \/\/ 6) Submit without native browser tooltips (call native submit explicitly)\n      HTMLFormElement.prototype.submit.call(form);\n    });\n    });\n  });\n})();\n<\/script>\n\n\n<!-- STYLES -->\n<style>\n\n\/* ---------- FORM BASE STYLES ---------- *\/\n\n .nect-webtolead {\n  box-sizing: border-box;\n  font-family: Inter, sans-serif;\n\n  \/* Auto-contrast token (default: dark text on light bg) *\/\n  --sf-on-bg: #111827;\n  --sf-on-bg-muted: rgba(17, 24, 39, 0.9);\n  --sf-link-on-bg: #111827;\n\n  \/* Brand accent *\/\n  --sf-accent: #50ffba;\n\n  \/* Error token *\/\n  --sf-error: #ff4b4b;\n\n  \/* Submit button tokens (default: for light backgrounds) *\/\n  --sf-btn-bg: #0A0C1B;\n  --sf-btn-fg: #ffffff;\n  --sf-btn-hover-bg: #50ffba;\n  --sf-btn-hover-fg: #0A0C1B;\n\n  \/* Checkbox tokens (default: for light backgrounds) *\/\n  --sf-checkbox-border: #D1D5DB;\n  --sf-checkbox-bg: #ffffff;\n  --sf-checkbox-checked-bg: #0A0C1B;\n  --sf-checkbox-checked-border: #0A0C1B;\n  --sf-checkbox-tick: #ffffff;\n}\n\n .nect-webtolead.is-dark-bg {\n  \/* Light text on dark bg *\/\n  --sf-on-bg: #F9FAFB;\n  --sf-on-bg-muted: rgba(249, 250, 251, 0.88);\n  --sf-link-on-bg: #F9FAFB;\n  \/* On dark backgrounds we want a bright primary and a dark hover *\/\n  --sf-btn-bg: #50ffba;\n  --sf-btn-fg: #0A0C1B;\n  --sf-btn-hover-bg: #ffffff;\n  --sf-btn-hover-fg: #0A0C1B;\n\n  \/* Checkbox tokens (for dark backgrounds) *\/\n  --sf-checkbox-border: rgba(249, 250, 251, 0.55);\n  --sf-checkbox-bg: transparent;\n  --sf-checkbox-checked-bg: var(--sf-accent);\n  --sf-checkbox-checked-border: var(--sf-accent);\n  --sf-checkbox-tick: #0A0C1B;\n\n  \/* Brighter error on dark backgrounds (iOS-style) *\/\n  --sf-error: #ff453a;\n}\n\n .nect-webtolead * {\n  box-sizing: border-box;\n  font-family: Inter, sans-serif;\n}\n\n\n\/* ROW & COLUMN LAYOUT FOR MAIN FIELDS *\/\n .nect-webtolead .row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n}\n\n\/* ---------- INPUTS \/ SELECTS \/ TEXTAREA ---------- *\/\n\n .nect-webtolead input[type=\"text\"],\n .nect-webtolead input[type=\"email\"],\n .nect-webtolead input[type=\"tel\"],\n .nect-webtolead select,\n .nect-webtolead textarea {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n\n  width: 100%;\n  font-size: 16px;\n  line-height: 1.15;\n  padding: 14px;\n  border: 1px solid #E5E7EB;\n  background-color: #F9FAFB;\n  border-radius: 8px;\n  color: #111827;\n}\n\n\/* uniform heights for inputs + selects *\/\n .nect-webtolead input[type=\"text\"],\n .nect-webtolead input[type=\"email\"],\n .nect-webtolead input[type=\"tel\"],\n .nect-webtolead select {\n  height: 48px;\n}\n\n\/* Textarea sizing *\/\n .nect-webtolead textarea {\n  min-height: 130px;\n  resize: vertical;\n}\n\n\/* ---------- CUSTOM CARET \/ CHEVRON FOR SELECT ---------- *\/\n\n .nect-webtolead select {\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='14' height='14' viewBox='0 0 20 20' fill='none' stroke='%236B7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 8 10 12 14 8'%3E%3C\/polyline%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 14px center;\n  background-size: 14px;\n  padding-right: 44px !important;\n}\n\n .nect-webtolead.is-dark-bg select {\n  \/* On dark sections, our selects are still light, so the chevron should be dark (midnight) *\/\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='14' height='14' viewBox='0 0 20 20' fill='none' stroke='%230A0C1B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 8 10 12 14 8'%3E%3C\/polyline%3E%3C\/svg%3E\");\n}\n\n\/* ---------- CHECKBOX ---------- *\/\n\n .nect-webtolead input[type=\"checkbox\"] {\n  -webkit-appearance: none;\n  appearance: none;\n  margin-right: 0;\n  width: 18px;\n  height: 18px;\n  border-radius: 4px;\n  border: 2px solid var(--sf-checkbox-border);\n  background-color: var(--sf-checkbox-bg);\n  display: inline-block;\n  position: relative;\n  cursor: pointer;\n  outline: none;\n  box-shadow: none;\n  color: var(--sf-checkbox-tick);\n}\n\n .nect-webtolead input[type=\"checkbox\"]:checked {\n  background-color: var(--sf-checkbox-checked-bg) !important;\n  border-color: var(--sf-checkbox-checked-border) !important;\n}\n\n .nect-webtolead input[type=\"checkbox\"]:checked::after {\n  content: \"\";\n  position: absolute;\n  left: 5px;\n  top: 1px;\n  width: 4px;\n  height: 9px;\n  border: 2px solid currentColor;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg);\n}\n\n\n .nect-webtolead.is-dark-bg input[type=\"checkbox\"] {\n  border-color: var(--sf-checkbox-border);\n  background-color: var(--sf-checkbox-bg);\n}\n\n .nect-webtolead input[type=\"checkbox\"]:focus-visible {\n  box-shadow: 0 0 0 3px rgba(80, 255, 186, 0.35);\n}\n\n\/* ---------- BUTTON ---------- *\/\n\n .nect-webtolead button[type=\"submit\"] {\n  width: 50% !important;\n  min-width: 240px;\n  max-width: 520px;\n  display: inline-block;\n  margin: 0; \/* left-aligned *\/\n  background-color: var(--sf-btn-bg) !important;\n  color: var(--sf-btn-fg) !important;\n  padding: 14px;\n  font-size: 16px;\n  font-weight: 700;\n  border-radius: 8px;\n  border: none;\n  cursor: pointer;\n  transition: background-color .15s ease, color .15s ease, opacity .15s ease;\n}\n\n .nect-webtolead button[type=\"submit\"]:hover,\n .nect-webtolead button[type=\"submit\"]:focus-visible,\n .nect-webtolead button[type=\"submit\"]:active {\n  background-color: var(--sf-btn-hover-bg) !important;\n  color: var(--sf-btn-hover-fg) !important;\n}\n\n .nect-webtolead button[type=\"submit\"]:disabled {\n  opacity: .5;\n  cursor: not-allowed;\n}\n\n\/* ---------- ERROR STATES ---------- *\/\n\n .nect-webtolead .invalid-active:not(:focus):not(.focused) {\n  border-color: #FF5A5A !important;\n  background-color: #FFF5F5 !important;\n}\n\n\/* ---------- RECAPTCHA ---------- *\/\n\n .nect-webtolead .g-recaptcha {\n  transform: scale(0.9);\n  transform-origin: 0 0;\n}\n\n\/* Honeypot field (hidden from real users) *\/\n .nect-webtolead input[name=\"website\"] {\n  display: none !important;\n}\n\n\/* Inline error text below fields *\/\n.sf-error {\n  margin-top: 4px;\n  font-size: 12px;\n  line-height: 1.4;\n  color: var(--sf-error);\n  font-weight: 600;\n}\n\n\/* Red outline for invalid text fields, selects and textareas *\/\n .nect-webtolead input[type=\"text\"].invalid-active,\n .nect-webtolead input[type=\"email\"].invalid-active,\n .nect-webtolead input[type=\"tel\"].invalid-active,\n .nect-webtolead select.invalid-active,\n .nect-webtolead textarea.invalid-active {\n  border-color: var(--sf-error) !important;\n  box-shadow: 0 0 0 1px var(--sf-error) inset;\n}\n\n\/* Checkbox: single red border, no double outline *\/\n .nect-webtolead input[type=\"checkbox\"].invalid-active {\n  border-color: var(--sf-error) !important;\n  background-color: #FFF5F5;\n}\n\n .nect-webtolead.is-dark-bg input[type=\"checkbox\"].invalid-active {\n  background-color: rgba(255, 69, 58, 0.12);\n}\n\n .nect-webtolead .checkbox-row {\n  display: flex !important;\n  align-items: center !important; \n  gap: 8px;\n  flex-wrap: wrap; \n }\n\n .nect-webtolead .checkbox-row > input[type=\"checkbox\"] {\n  flex: 0 0 18px;\n  display: inline-block !important;\n }\n\n .nect-webtolead .checkbox-row span {\n  flex: 1 1 auto;\n  min-width: 0; \n  display: block;\n }\n\n .nect-webtolead .checkbox-row .sf-error {\n  flex-basis: 100%;\n  margin-left: 26px;\n}\n\n\/* ---------- CONSENT TEXT AUTO-CONTRAST ---------- *\/\n .nect-webtolead .checkbox-row {\n  color: var(--sf-on-bg);\n}\n\n .nect-webtolead .checkbox-row span {\n  color: var(--sf-on-bg);\n}\n\n .nect-webtolead .checkbox-row a {\n  color: var(--sf-link-on-bg);\n  text-decoration: underline;\n  font-size: inherit;\n  font-weight: 500;\n  transition: color .15s ease, opacity .15s ease;\n}\n\n\/* Hover \/ focus behavior: light bg = Apple blue, dark bg = Nect neon *\/\n .nect-webtolead .checkbox-row a:hover,\n .nect-webtolead .checkbox-row a:focus-visible {\n  color: #007AFF;\n}\n\n .nect-webtolead.is-dark-bg .checkbox-row a {\n  opacity: 0.95;\n}\n\n .nect-webtolead.is-dark-bg .checkbox-row a:hover,\n .nect-webtolead.is-dark-bg .checkbox-row a:focus-visible {\n  color: var(--sf-accent);\n}\n\n\/* ---------- FLEX COLUMN UTILITIES FOR RESPONSIVE FORM ---------- *\/\n .nect-webtolead .col-100 {\n  flex: 1 1 100px;\n  min-width: 100px;\n}\n\n .nect-webtolead .col-125 {\n  flex: 1 1 125px;\n  min-width: 125px;\n}\n\n .nect-webtolead .col-150 {\n  flex: 1 1 150px;\n  min-width: 150px;\n}\n\n .nect-webtolead .col-225 {\n  flex: 1 1 225px;\n  min-width: 225px;\n}\n\n .nect-webtolead .col-250 {\n  flex: 1 1 250px;\n  min-width: 250px;\n}\n\n .nect-webtolead .col-300 {\n  flex: 1 1 300px;\n  min-width: 300px;\n}\n\n .nect-webtolead .col-full {\n  flex: 1 1 100%;\n  min-width: 100%;\n}\n\n@media (max-width: 640px) {\n  .nect-webtolead .row {\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  .nect-webtolead .col-100,\n  .nect-webtolead .col-125,\n  .nect-webtolead .col-150,\n  .nect-webtolead .col-225,\n  .nect-webtolead .col-250,\n  .nect-webtolead .col-300,\n  .nect-webtolead .col-full {\n    flex: 1 1 100%;\n    min-width: 100%;\n  }\n\n  .nect-webtolead button[type=\"submit\"] {\n    width: 100% !important;\n    min-width: 0;\n    max-width: none;\n    display: block;\n  }\n\n  \/* Mobile: ensure checkbox + text start on the same row *\/\n  .nect-webtolead .checkbox-row {\n    display: grid !important;\n    grid-template-columns: 18px 1fr;\n    column-gap: 12px;\n    align-items: center !important;\n  }\n\n  .nect-webtolead .checkbox-row > input[type=\"checkbox\"] {\n    margin: 0;\n    justify-self: start;\n    align-self: center;\n    width: 18px;\n    height: 18px;\n    display: inline-block !important;\n  }\n\n  .nect-webtolead .checkbox-row span {\n    display: block;\n  }\n\n  \/* Error message should align under the text column *\/\n  .nect-webtolead .checkbox-row .sf-error {\n    grid-column: 2;\n    margin-left: 0;\n  }\n}\n\n\/* ---------- DEBUG OVERLAY (VISIBLE ONLY WHEN DEBUG_MODE = true) ---------- *\/\n#nect-debug-overlay {\n  position: fixed;\n  bottom: 16px;\n  left: 16px;\n  z-index: 9999;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  gap: 4px;\n  padding: 8px 12px;\n  border-radius: 8px;\n  background: rgba(17, 24, 39, 0.94);\n  color: #F9FAFB;\n  font-size: 12px;\n  line-height: 1.35;\n  font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);\n  pointer-events: auto;\n  max-width: 360px;\n}\n\n#nect-debug-overlay.nect-debug-muted {\n  opacity: 0.6;\n}\n\n#nect-debug-overlay .nect-debug-header {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  margin-bottom: 2px;\n}\n\n#nect-debug-overlay .nect-debug-title-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n}\n\n#nect-debug-overlay .nect-debug-controls {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 4px;\n}\n\n#nect-debug-overlay .nect-debug-engagement-block {\n  margin-top: 2px;\n}\n\n#nect-debug-overlay .nect-debug-engagement-label {\n  font-size: 10px;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  opacity: 0.8;\n}\n\n#nect-debug-overlay .nect-debug-engagement-value {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 11px;\n}\n\n#nect-debug-overlay .nect-debug-label {\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n  font-size: 11px;\n  opacity: 0.9;\n}\n\n#nect-debug-overlay .nect-debug-engagement {\n  white-space: nowrap;\n  max-width: 220px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n#nect-debug-overlay .nect-debug-button {\n  border: 0;\n  border-radius: 6px;\n  padding: 4px 8px;\n  font-size: 10px;\n  font-weight: 500;\n  background: #F9FAFB;\n  color: #111827;\n  cursor: pointer;\n  transition: background 0.15s ease, color 0.15s ease, transform 0.08s ease;\n}\n\n#nect-debug-overlay .nect-debug-button:hover {\n  background: #50ffba;\n  color: #0A0C1B;\n  transform: translateY(-1px);\n}\n\n#nect-debug-overlay .nect-debug-payload {\n  margin: 0;\n  padding: 4px 6px;\n  border-radius: 4px;\n  background: rgba(31, 41, 55, 0.9);\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 10px;\n  max-height: 140px;\n  overflow: auto;\n  white-space: pre;\n}\n\n@media (max-width: 640px) {\n  #nect-debug-overlay {\n    bottom: 8px;\n    left: 8px;\n    right: 8px;\n    padding: 6px 8px;\n    max-width: none;\n  }\n\n  #nect-debug-overlay .nect-debug-engagement {\n    max-width: 140px;\n  }\n\n  #nect-debug-overlay .nect-debug-payload {\n    max-height: 120px;\n  }\n}\n<\/style>\n\n<form id=\"nect-webtolead\" class=\"nect-webtolead\" action=\"https:\/\/webto.salesforce.com\/servlet\/servlet.WebToLead?encoding=UTF-8&amp;orgId=00D7Q000008LEWX\" method=\"POST\" style=\"font-family: 'Inter', sans-serif; max-width: 900px; margin: 0 auto;\">\n\n  <!-- reCAPTCHA configuration -->\n  <input type=\"hidden\" name=\"captcha_settings\" value=\"{\"keyname\":\"Salesforce\",\"fallback\":\"true\",\"orgId\":\"00D7Q000008LEWX\",\"ts\":\"\"}\">\n\n  <input type=\"hidden\" name=\"oid\" value=\"00D7Q000008LEWX\">\n  <input type=\"hidden\" name=\"retURL\" value=\"https:\/\/nect.com\/thankyou\/\">\n  <input type=\"hidden\" name=\"lead_source\" value=\"Website\">\n\n\n<!-- Tracking: Form Context & Page Meta -->\n\n  <!-- Form Context. Possible values: Standard | Case Studies | White Paper | Trade Fair | Webinars | Google Ads -->\n  <input type=\"hidden\" name=\"00Naa000004Cgqn\" value=\"Events\">\n\n  <!-- Page URL (full URL of the page, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChA9\" id=\"sf_page_url\" value=\"\">\n\n  <!-- Page Path (path including query string, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChJp\" id=\"sf_page_path\" value=\"\">\n\n  <!-- Page Title (filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChLR\" id=\"sf_page_title\" value=\"\">\n\n  <!-- Referrer (e.g. https:\/\/www.google.com\/, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChN3\" id=\"sf_referrer\" value=\"\">\n\n  <!-- Engagement Level -->\n  <input type=\"hidden\" name=\"00Naa000004Gzhy\" id=\"sf_engagement\" value=\"\">\n\n  <!-- Device Type (Desktop \/ Mobile \/ Tablet) -->\n  <input type=\"hidden\" name=\"00Naa000004H0hF\" id=\"sf_device_type\" value=\"\">\n\n  <!-- Browser Language (navigator.language) -->\n  <input type=\"hidden\" name=\"00Naa000004H0m5\" id=\"sf_browser_lang\" value=\"\">\n\n  <!-- Grid Container -->\n  <div class=\"row\">\n\n    <!-- Salutation -->\n    <div class=\"col-300\">\n      <select name=\"salutation\" required=\"\" autocomplete=\"honorific-prefix\">\n        <option value=\"\" disabled selected>Tratamiento<\/option>\n        <option value=\"Herr\">Sr.<\/option>\n        <option value=\"Frau\">Sra.<\/option>\n        <option value=\"k.A.\">N.D.<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- First name -->\n    <div class=\"col-300\">\n      <input name=\"first_name\" type=\"text\" maxlength=\"40\" placeholder=\"Nombre\" required=\"\" autocomplete=\"given-name\">\n    <\/div>\n\n    <!-- Surname -->\n    <div class=\"col-300\">\n      <input name=\"last_name\" type=\"text\" maxlength=\"80\" placeholder=\"Apellido\" required=\"\" autocomplete=\"family-name\">\n    <\/div>\n\n    <!-- Email -->\n    <div class=\"col-300\">\n      <input name=\"email\" type=\"email\" maxlength=\"80\" placeholder=\"Su correo electr\u00f3nico\" required=\"\" autocomplete=\"email\">\n    <\/div>\n\n    <!-- Telephone -->\n    <div class=\"col-300\">\n      <input name=\"phone\" type=\"tel\" pattern=\"^\\+?(?:49|43|41|1|33|34|44|39|31|32|420|352|46|48|371|372|373|374|375|376|377|378|380|381|382|385|386|387|389|90|91|92|93|94|95|98|99|0)?[\\s\\d]{6,20}$\" maxlength=\"40\" placeholder=\"N\u00famero de tel\u00e9fono\" required=\"\" autocomplete=\"tel\">\n    <\/div>\n\n    <!-- Company -->\n    <div class=\"col-300\">\n      <input name=\"company\" type=\"text\" maxlength=\"40\" placeholder=\"Empresa\" required=\"\" autocomplete=\"organization\">\n    <\/div>\n<\/div>\n\n\n  <!-- Honeypot -->\n  <div style=\"position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;\">\n    <label>Por favor, rellene:<\/label>\n    <input type=\"text\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\">\n  <\/div>\n\n  <!-- Privacy Consent -->\n<div class=\"checkbox-row\" style=\"margin: 20px 0 8px; line-height: 20px; font-size: 14px;\">\n  <input id=\"00Naa000003Nuiv\" name=\"00Naa000003Nuiv\" type=\"checkbox\" required=\"\" value=\"1\">\n  <span>Por la presente, acepto la \n <a href=\"https:\/\/nect.com\/es\/legal\/politica-de-privacidad-del-sitio-web\/\" target=\"_blank\">pol\u00edtica de privacidad<\/a> y los \n <a href=\"https:\/\/nect.com\/es\/legal\/terminos-y-condiciones-generales\/\" target=\"_blank\">t\u00e9rminos y condiciones<\/a>.\n  <\/span>\n<\/div>\n\n  <!-- Newsletter opt-in (optional) -->\n  <div class=\"checkbox-row\" style=\"margin: 8px 0 20px 0; line-height: 20px; font-size: 14px;\">\n  <input id=\"00Naa000004H13p\" name=\"00Naa000004H13p\" type=\"checkbox\" value=\"1\">\n  <span>Me gustar\u00eda recibir el bolet\u00edn de Nect en el futuro.<\/span>\n<\/div>\n  \n  <!-- reCAPTCHA v2 -->\n  <div class=\"g-recaptcha\" required=\"\" data-sitekey=\"6Lfg5Y0rAAAAAKSHnYizfxa0UpccDk_rabNym_rd\" data-callback=\"_nectRecaptchaSuccess\"><\/div>\n  <div class=\"sf-error recaptcha-error\"><\/div>\n  <br>\n  <!-- Button -->\n  <button type=\"submit\"> \n Enviar solicitud\n  <\/button>\n<\/form>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9a37e3e e-flex e-con-boxed e-con e-parent\" data-id=\"9a37e3e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a1e6ba8 elementor-widget elementor-widget-global elementor-global-5260 elementor-global-5102 elementor-widget-html\" data-id=\"a1e6ba8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Charset & reCAPTCHA script -->\n<meta http-equiv=\"Content-type\" content=\"text\/html; charset=UTF-8\">\n<script src=\"https:\/\/www.google.com\/recaptcha\/api.js?hl=de\" async=\"\" defer><\/script>\n\n<script>\n(function () {\n  \/************************************************************\n   * A. reCAPTCHA Timestamp Injection (Salesforce Requirement)\n   ************************************************************\/\n  function updateRecaptchaTimestamp() {\n    \/\/ Support multiple forms\/widgets: update ts for each form that has an empty reCAPTCHA response\n    var responses = document.querySelectorAll('textarea[name=\"g-recaptcha-response\"]');\n    if (!responses || !responses.length) return;\n\n    responses.forEach(function (r) {\n      if (!r || (r.value || \"\").trim() !== \"\") return;\n\n      \/\/ Find the owning form of this response textarea\n      var form = r.closest(\"form\");\n      if (!form) return;\n\n      var el = form.querySelector('[name=\"captcha_settings\"]');\n      if (!el) return;\n\n      try {\n        var cfg = JSON.parse(el.value);\n        cfg.ts = String(Date.now());\n        el.value = JSON.stringify(cfg);\n      } catch (e) {\n        console.warn(\"[nect-form] Failed parsing captcha settings\", e);\n      }\n    });\n  }\n  setInterval(updateRecaptchaTimestamp, 500);\n\n  \/************************************************************\n   * B. Validation messages (German only; translated by WPML)\n   ************************************************************\/\n  var UI_STRINGS = {\n    required: \"Bitte dieses Feld ausf\u00fcllen.\",\n    requiredSelect: \"Bitte w\u00e4hle eine Option aus.\",\n    requiredCheckbox: \"Bitte dieses K\u00e4stchen aktivieren, um fortzufahren.\",\n    emailFormat: \"Bitte eine g\u00fcltige E-Mail-Adresse eingeben.\",\n    phoneFormat: \"Bitte eine g\u00fcltige Telefonnummer eingeben.\",\n    denyDomain: \"Bitte verwenden Sie eine gesch\u00e4ftliche E-Mail-Adresse.\",\n    allowDomain: \"Bitte verwenden Sie eine freigegebene Unternehmensdomain.\",\n    recaptcha: \"Bitte best\u00e4tigen Sie, dass Sie kein Roboter sind.\"\n  };\n\n  \/************************************************************\n   * DEBUG CONFIG\n   ************************************************************\/\n  var DEBUG_MODE = false; \/\/ master switch (set to true while debugging)\n  var DEBUG_ENABLED = DEBUG_MODE; \/\/ runtime toggle (changed via overlay button)\n\n  function debugLog() {\n    if (!DEBUG_ENABLED) return;\n    var args = Array.prototype.slice.call(arguments);\n    args.unshift(\"[nect-form][debug]\");\n    console.log.apply(console, args);\n  }\n\n  \/\/ Debug overlay DOM references (only used when DEBUG_MODE === true)\n  var debugOverlay = null;\n  var debugOverlayEngagementEl = null;\n  var debugOverlayToggleEl = null;\n  var debugOverlayLogButtonEl = null;\n  var debugOverlayCopyButtonEl = null;\n  var debugOverlayPayloadEl = null;\n\n  \/************************************************************\n   * C. B2B email validation config\n   ************************************************************\/\n  var USE_ALLOWLIST = false;\n\n  var ALLOWED_DOMAINS = [\"nect.com\", \"partner-a.de\", \"kunde-b.com\"];\n\n  var BLOCKED_DOMAINS = [\n    \/\/ German freemail\n    \"gmail.com\",\"googlemail.com\",\"gmx.de\",\"gmx.net\",\"web.de\",\n    \"t-online.de\",\"freenet.de\",\"online.de\",\"gmx.com\",\"gmx.us\",\n    \/\/ Microsoft freemail\n    \"hotmail.com\",\"hotmail.de\",\"outlook.com\",\"outlook.de\",\n    \"live.com\",\"msn.com\",\n    \/\/ Apple\n    \"icloud.com\",\"me.com\",\"mac.com\",\n    \/\/ Yahoo\n    \"yahoo.com\",\"yahoo.de\",\"ymail.com\",\n    \/\/ Mail.com family\n    \"mail.com\",\"email.com\",\"inbox.com\",\"europe.com\",\"asia.com\",\"usa.com\",\n    \/\/ European freemail\n    \"orange.fr\",\"laposte.net\",\"libero.it\",\n    \"virgilio.it\",\"alice.it\",\"bluewin.ch\",\n    \"mail.ru\",\"rambler.ru\",\"seznam.cz\",\n    \/\/ ISP \/ Mobile carrier\n    \"vodafone.de\",\"o2online.de\",\"versatel.de\",\"aon.at\",\n    \/\/ AT \/ CH\n    \"gmx.at\",\"bluewin.ch\",\"hotmail.at\",\n    \/\/ Privacy \/ alt mail\n    \"protonmail.com\",\"pm.me\",\"tutanota.com\",\"tuta.io\",\n    \"hushmail.com\",\"countermail.com\",\n    \"yandex.com\",\"yandex.ru\",\"zoho.com\",\n    \/\/ Poland\n    \"wp.pl\",\"onet.pl\",\"o2.pl\",\"tlen.pl\",\"interia.pl\",\n    \"gazeta.pl\",\"poczta.fm\",\"poczta.onet.pl\",\"autograf.pl\",\"vp.pl\",\n    \/\/ Spain\n    \"terra.es\",\"telefonica.net\",\"correo.es\",\"wanadoo.es\",\"orange.es\",\n    \"movistar.es\",\"hotmail.es\",\"yahoo.es\",\"live.es\",\"msn.es\",\n    \/\/ Sandbox \/ temp \/ disposable\n    \"test.com\",\"test.de\",\"example.com\",\"example.org\",\"example.net\",\n    \"invalid.com\",\"fake.com\",\"noreply.com\",\"noreply.net\",\"donotreply.com\",\n    \"mailinator.com\",\"tempmail.com\",\"tmpmail.com\",\"trashmail.com\",\n    \"10minutemail.com\",\"dispostable.com\",\"guerrillamail.com\",\n    \"sharklasers.com\",\"getnada.com\",\"yopmail.com\",\"anonaddy.me\"\n  ];\n\n  var MSG_DENYLIST  = UI_STRINGS.denyDomain;\n  var MSG_ALLOWLIST = UI_STRINGS.allowDomain;\n\n  \/************************************************************\n   * D. Engagement (time on page + scroll depth)\n   *    \u2013 active tab time only\n   ************************************************************\/\n  var sessionStart = Date.now();       \/\/ kept for reference \/ potential future use\n  var maxScrollPercent = 0;\n\n  var activeTime = 0;\n  var lastVisibleTimestamp = Date.now();\n\n  document.addEventListener(\"visibilitychange\", function () {\n    if (document.visibilityState === \"hidden\") {\n      activeTime += Date.now() - lastVisibleTimestamp;\n    } else {\n      lastVisibleTimestamp = Date.now();\n    }\n  });\n\n  function updateScrollDepth() {\n    var doc = document.documentElement || document.body;\n    var scrollTop = window.pageYOffset || doc.scrollTop || 0;\n    var scrollHeight = doc.scrollHeight || 0;\n    var viewportHeight = window.innerHeight || doc.clientHeight || 0;\n    var maxScrollable = scrollHeight - viewportHeight;\n    if (maxScrollable <= 0) return;\n    var current = (scrollTop \/ maxScrollable) * 100;\n    if (current > maxScrollPercent) maxScrollPercent = current;\n  }\n\n  window.addEventListener(\"scroll\", updateScrollDepth, { passive: true });\n\n  function computeEngagementString() {\n    var visibleMs = activeTime;\n    if (document.visibilityState === \"visible\") {\n      visibleMs += (Date.now() - lastVisibleTimestamp);\n    }\n\n    var seconds = Math.round(visibleMs \/ 1000);\n    var scroll = Math.round(maxScrollPercent);\n    var level = \"low\";\n    if (seconds >= 60 && scroll >= 75) {\n      level = \"high\";\n    } else if (seconds >= 30 && scroll >= 40) {\n      level = \"medium\";\n    }\n\n    var result =\n      \"time=\" + seconds + \"s; scroll=\" + scroll + \"%; engagement_level=\" + level;\n\n    debugLog(\"Engagement updated:\", result);\n\n    return result;\n  }\n\n  \/************************************************************\n   * E. Device type + Browser language\n   ************************************************************\/\n  function getDeviceType() {\n    var ua = navigator.userAgent || \"\";\n    if (\/mobi|android\/i.test(ua)) return \"Mobile\";\n\n    var width = window.innerWidth || document.documentElement.clientWidth || 0;\n    if (width <= 1024) return \"Tablet\";\n    return \"Desktop\";\n  }\n\n  function getBrowserLanguage() {\n    var lang = (navigator.language || navigator.userLanguage || \"\").trim();\n    return lang || \"unknown\";\n  }\n\n  \/************************************************************\n   * F. Generic helpers (errors, tracking, spam)\n   ************************************************************\/\n  function domainMatches(d, list) {\n    return list.some(function (x) {\n      return d === x || d.endsWith(\".\" + x);\n    });\n  }\n\n  function isDomainAllowed(d) {\n    if (!d) return true;\n    return USE_ALLOWLIST\n      ? domainMatches(d, ALLOWED_DOMAINS)\n      : !domainMatches(d, BLOCKED_DOMAINS);\n  }\n\n  function setInvalidActive(el, on) {\n    if (!el) return;\n    if (on) {\n      el.classList.add(\"invalid-active\");\n    } else {\n      el.classList.remove(\"invalid-active\");\n    }\n  }\n\n  \/\/ Find or create the inline error node directly below the field\n  function ensureErrorNode(field) {\n    if (!field) return null;\n\n    var container;\n    \/\/ For checkboxes: show the message below the entire row\n    if (field.type === \"checkbox\") {\n      container =\n        field.closest(\".checkbox-row\") ||\n        field.parentElement;\n    } else {\n      \/\/ Inputs \/ selects \/ textareas: message directly below the field\n      container = field.parentElement;\n    }\n\n    if (!container) return null;\n\n    var msgEl = container.querySelector(\".sf-error\");\n    if (!msgEl) {\n      msgEl = document.createElement(\"div\");\n      msgEl.className = \"sf-error\";\n      container.appendChild(msgEl);\n    }\n    return msgEl;\n  }\n\n  function showFieldError(field, message) {\n    if (!field) return;\n    setInvalidActive(field, true);\n    var msgEl = ensureErrorNode(field);\n    if (msgEl) msgEl.textContent = message || \"\";\n  }\n\n  function clearFieldError(field) {\n    if (!field) return;\n    setInvalidActive(field, false);\n\n    var container = null;\n    if (field.type === \"checkbox\") {\n      container = field.closest(\".checkbox-row\") || field.parentElement;\n    } else {\n      container = field.parentElement;\n    }\n\n    if (!container) return;\n    var msgEl = container.querySelector(\".sf-error\");\n    if (msgEl) msgEl.textContent = \"\";\n  }\n\n  function clearAllErrors(form) {\n    form.querySelectorAll(\".invalid-active\").forEach(function (f) {\n      f.classList.remove(\"invalid-active\");\n    });\n    form.querySelectorAll(\".sf-error\").forEach(function (el) {\n      el.textContent = \"\";\n    });\n    var recErr = form.querySelector('.recaptcha-error');\n    if (recErr) recErr.textContent = \"\";\n  }\n\n  function setIfExists(form, id, val) {\n    if (!form) return;\n    var el = form.querySelector('#' + id);\n    if (el && typeof val === \"string\") el.value = val;\n  }\n\n  \/\/ Build a snapshot object for debugging (visible + hidden fields, with human-readable labels)\n  function collectFormSnapshot(form) {\n    var snapshot = {\n      visible_fields: {},\n      hidden_fields: {},\n      meta: {}\n    };\n    if (!form) return snapshot;\n\n    \/\/ Human-readable labels for visible fields (including Salesforce IDs)\n    var fieldLabelMap = {\n      salutation: \"Salutation\",\n      first_name: \"First name\",\n      last_name: \"Last name\",\n      email: \"Email\",\n      phone: \"Phone number\",\n      company: \"Company\",\n      title: \"Department\",\n      \"00N7Q00000F4M1Z\": \"Subject\",\n      \"00N7Q00000IGsDp\": \"Message\",\n      \"00Naa000003Nuiv\": \"Privacy consent\",\n      \"00Naa000004H13p\": \"Newsletter consent\"\n    };\n\n    \/\/ Fields the user can see \/ interact with\n    var visibleFieldNames = [\n      \"salutation\",\n      \"first_name\",\n      \"last_name\",\n      \"email\",\n      \"phone\",\n      \"company\",\n      \"title\",             \/\/ department\n      \"00N7Q00000F4M1Z\",   \/\/ subject\n      \"00N7Q00000IGsDp\",   \/\/ message\n      \"00Naa000003Nuiv\",   \/\/ privacy checkbox\n      \"00Naa000004H13p\"    \/\/ newsletter checkbox (if present)\n    ];\n\n    visibleFieldNames.forEach(function (name) {\n      var el = form.querySelector('[name=\"' + name + '\"]');\n      if (!el) return;\n\n      var label = fieldLabelMap[name] || name;\n      if (el.type === \"checkbox\") {\n        var isChecked = !!el.checked;\n        \/\/ Store both the raw value and a human readable state\n        snapshot.visible_fields[label] = isChecked ? \"1 (checked)\" : \"0 (not checked)\";\n      } else {\n        snapshot.visible_fields[label] = (el.value || \"\").trim();\n      }\n    });\n\n    \/\/ Hidden fields with nicer labels\n    var hiddenMap = {\n      sf_page_url:   \"Page URL\",\n      sf_page_path:  \"Page Path\",\n      sf_page_title: \"Page Title\",\n      sf_referrer:   \"Referrer\",\n      sf_engagement: \"Engagement (field)\",\n      sf_device_type:\"Device Type\",\n      sf_browser_lang:\"Browser Language\"\n    };\n\n    Object.keys(hiddenMap).forEach(function (id) {\n      var el = document.getElementById(id);\n      if (el) {\n        snapshot.hidden_fields[hiddenMap[id]] = el.value || \"\";\n      }\n    });\n\n    \/\/ Meta information that is computed on the fly\n    snapshot.meta[\"Engagement (computed)\"] = computeEngagementString();\n\n    return snapshot;\n  }\n\n  function checkHoneypot(form) {\n    var hp = form.querySelector('input[name=\"website\"]');\n    return !(hp && hp.value && hp.value.trim() !== \"\");\n  }\n\n  function showRecaptchaError(form, message) {\n    if (!form) return;\n    var el = form.querySelector('.recaptcha-error');\n    if (!el) return;\n    el.textContent = message || \"\";\n  }\n\n  \/\/ Global callback for reCAPTCHA \"data-callback\"\n  window._nectRecaptchaSuccess = function () {\n    document.querySelectorAll('form.nect-webtolead').forEach(function (f) {\n      showRecaptchaError(f, \"\");\n    });\n  };\n\n  function checkRecaptcha(form) {\n    if (!form) return true;\n\n    \/\/ When multiple widgets exist, grecaptcha.getResponse() without an id is unreliable.\n    \/\/ Instead, check the hidden textarea created by reCAPTCHA inside THIS form.\n    var r = form.querySelector('textarea[name=\"g-recaptcha-response\"]');\n    var ok = !!(r && (r.value || \"\").trim());\n\n    if (!ok) {\n      showRecaptchaError(form, UI_STRINGS.recaptcha);\n    } else {\n      showRecaptchaError(form, \"\");\n    }\n\n    return ok;\n  }\n\n  \/************************************************************\n   * G. Email validation (B2B only)\n   ************************************************************\/\n  function validateEmailB2B(emailInput) {\n    if (!emailInput) return true;\n\n    var raw = (emailInput.value || \"\").trim().toLowerCase();\n\n    \/\/ 1) Empty field \u2192 handled by generic \"required\" logic\n    if (!raw) {\n      clearFieldError(emailInput);\n      return true;\n    }\n\n    \/\/ 2) Format check (simple but robust)\n    var emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/;\n    if (!emailRegex.test(raw)) {\n      showFieldError(emailInput, UI_STRINGS.emailFormat);\n      return false;\n    }\n\n    \/\/ 3) Domain check for B2B use case\n    var at = raw.lastIndexOf(\"@\");\n    var domain = at === -1 ? \"\" : raw.slice(at + 1);\n\n    if (!isDomainAllowed(domain)) {\n      showFieldError(emailInput, USE_ALLOWLIST ? MSG_ALLOWLIST : MSG_DENYLIST);\n      return false;\n    }\n\n    \/\/ All good \u2192 clear any previous errors\n    clearFieldError(emailInput);\n    return true;\n  }\n\n  \/************************************************************\n   * H. Initialization & submit handling\n   ************************************************************\/\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    var forms = document.querySelectorAll('form.nect-webtolead');\n    if (!forms || !forms.length) return;\n\n    forms.forEach(function (form) {\n\n    \/************************************************************\n     * I. Auto-contrast (detect dark background behind the form)\n     *    Works for solid colors AND gradients (Elementor)\n     ************************************************************\/\n    function _nectLum(r, g, b) {\n      var a = [r, g, b].map(function (v) {\n        v = v \/ 255;\n        return v <= 0.03928 ? v \/ 12.92 : Math.pow((v + 0.055) \/ 1.055, 2.4);\n      });\n      return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n    }\n\n    function _nectHexToRgb(hex) {\n      var h = (hex || \"\").replace(\"#\", \"\").trim();\n      if (h.length === 3) {\n        return [\n          parseInt(h[0] + h[0], 16),\n          parseInt(h[1] + h[1], 16),\n          parseInt(h[2] + h[2], 16)\n        ];\n      }\n      if (h.length === 6) {\n        return [\n          parseInt(h.slice(0, 2), 16),\n          parseInt(h.slice(2, 4), 16),\n          parseInt(h.slice(4, 6), 16)\n        ];\n      }\n      return null;\n    }\n\n    function _nectExtractColors(bgImage) {\n      if (!bgImage || bgImage === \"none\") return [];\n      var colors = [];\n\n      \/\/ rgb()\/rgba()\n      var rgbRegex = \/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\/gi;\n      var m;\n      while ((m = rgbRegex.exec(bgImage)) !== null) {\n        colors.push([parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)]);\n      }\n\n      \/\/ hex (#fff \/ #ffffff)\n      var hexRegex = \/#([0-9a-f]{3}|[0-9a-f]{6})\\b\/gi;\n      while ((m = hexRegex.exec(bgImage)) !== null) {\n        var rgb = _nectHexToRgb(m[0]);\n        if (rgb) colors.push(rgb);\n      }\n\n      return colors;\n    }\n\n    function _nectParseRgb(bgColor) {\n      var m = bgColor && bgColor.match(\/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\/i);\n      return m ? [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)] : null;\n    }\n\n    function _nectFindBgInfo(startEl) {\n      var cur = startEl;\n      while (cur && cur !== document.documentElement) {\n        var cs = window.getComputedStyle(cur);\n        var bgColor = cs.backgroundColor;\n        var bgImage = cs.backgroundImage;\n\n        var hasColor = bgColor && bgColor !== \"transparent\" && bgColor !== \"rgba(0, 0, 0, 0)\";\n        var hasImage = bgImage && bgImage !== \"none\";\n\n        if (hasImage || hasColor) {\n          return { bgColor: bgColor, bgImage: bgImage, el: cur };\n        }\n        cur = cur.parentElement;\n      }\n      return { bgColor: \"rgb(255,255,255)\", bgImage: \"none\", el: null };\n    }\n\n    function _nectIsDark(bgInfo) {\n      \/\/ Prefer gradient\/image analysis\n      if (bgInfo.bgImage && bgInfo.bgImage !== \"none\") {\n        var colors = _nectExtractColors(bgInfo.bgImage);\n        if (colors.length) {\n          var sum = 0;\n          for (var i = 0; i < colors.length; i++) {\n            sum += _nectLum(colors[i][0], colors[i][1], colors[i][2]);\n          }\n          var avg = sum \/ colors.length;\n          return avg  0.35;\n        }\n\n        \/\/ If it's a gradient but we can't parse it, assume dark (Nect gradients are dark)\n        if (String(bgInfo.bgImage).indexOf(\"gradient\") !== -1) {\n          return true;\n        }\n      }\n\n      \/\/ Solid background fallback\n      var rgb = _nectParseRgb(bgInfo.bgColor);\n      if (rgb) {\n        return _nectLum(rgb[0], rgb[1], rgb[2])  0.35;\n      }\n\n      return false;\n    }\n\n    function _nectApplyAutoContrast() {\n      \/\/ In Elementor the real background often sits on a wrapping container\n      var anchor = form.closest(\".elementor-element\") || form.parentElement || form;\n      var bgInfo = _nectFindBgInfo(anchor);\n      var dark = _nectIsDark(bgInfo);\n\n      form.classList.toggle(\"is-dark-bg\", !!dark);\n\n      \/\/ Useful for debugging\n      debugLog(\"Auto-contrast:\", { dark: dark, bgColor: bgInfo.bgColor, bgImage: bgInfo.bgImage, el: bgInfo.el });\n    }\n\n    \/\/ Initial + responsive\n    _nectApplyAutoContrast();\n    window.addEventListener(\"resize\", function () {\n      _nectApplyAutoContrast();\n    });\n\n    debugLog(\"Form initialized on\", window.location.href);\n\n    \/\/ Create lightweight debug overlay when debug mode is active\n    if (DEBUG_MODE) {\n      debugOverlay = document.createElement(\"div\");\n      debugOverlay.id = \"nect-debug-overlay\";\n      debugOverlay.innerHTML =\n        'div class=\"nect-debug-header\">' +\n          '<div class=\"nect-debug-title-row\">' +\n            '<span class=\"nect-debug-label\">DEBUG<\/span>' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-toggle>On<\/button>' +\n          '<\/div>' +\n          '<div class=\"nect-debug-controls\">' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-log>Log snapshot<\/button>' +\n            '<button type=\"button\" class=\"nect-debug-button\" data-debug-copy>Copy JSON<\/button>' +\n          '<\/div>' +\n          '<div class=\"nect-debug-engagement-block\">' +\n            '<div class=\"nect-debug-engagement-label\">Engagement<\/div>' +\n            '<div class=\"nect-debug-engagement-value\" data-debug-engagement>\u2013<\/div>' +\n          '<\/div>' +\n        '<\/div>' +\n        '<pre class=\"nect-debug-payload\" data-debug-payload><\/pre>';\n\n      document.body.appendChild(debugOverlay);\n\n      debugOverlayEngagementEl = debugOverlay.querySelector(\"[data-debug-engagement]\");\n      debugOverlayToggleEl = debugOverlay.querySelector(\"[data-debug-toggle]\");\n      debugOverlayLogButtonEl = debugOverlay.querySelector(\"[data-debug-log]\");\n      debugOverlayCopyButtonEl = debugOverlay.querySelector(\"[data-debug-copy]\");\n      debugOverlayPayloadEl = debugOverlay.querySelector(\"[data-debug-payload]\");\n\n      if (debugOverlayToggleEl) {\n        debugOverlayToggleEl.addEventListener(\"click\", function () {\n          DEBUG_ENABLED = !DEBUG_ENABLED;\n          debugOverlayToggleEl.textContent = DEBUG_ENABLED ? \"On\" : \"Off\";\n          debugOverlay.classList.toggle(\"nect-debug-muted\", !DEBUG_ENABLED);\n        });\n      }\n\n      if (debugOverlayLogButtonEl) {\n        debugOverlayLogButtonEl.addEventListener(\"click\", function () {\n          debugLog(\"Snapshot (overlay button):\", collectFormSnapshot(form));\n        });\n      }\n\n      if (debugOverlayCopyButtonEl) {\n        debugOverlayCopyButtonEl.addEventListener(\"click\", function () {\n          var snapshot = collectFormSnapshot(form);\n          var json = \"\";\n          try {\n            json = JSON.stringify(snapshot, null, 2);\n          } catch (err) {\n            debugLog(\"Failed to stringify snapshot for copy\", err);\n          }\n          if (!json) return;\n\n          if (navigator.clipboard && navigator.clipboard.writeText) {\n            navigator.clipboard.writeText(json).then(function () {\n              debugLog(\"Snapshot copied to clipboard.\");\n            }).catch(function (err) {\n              debugLog(\"Clipboard write failed\", err);\n            });\n          } else {\n            debugLog(\"Clipboard API not available; snapshot:\", snapshot);\n          }\n        });\n      }\n\n      \/\/ Update engagement string and payload in overlay every 1 second, but only if DEBUG_ENABLED\n      setInterval(function () {\n        if (!DEBUG_ENABLED) return;\n\n        var engagement = computeEngagementString();\n        if (debugOverlayEngagementEl) {\n          debugOverlayEngagementEl.textContent = engagement;\n        }\n\n        if (debugOverlayPayloadEl) {\n          var snapshot = collectFormSnapshot(form);\n          try {\n            debugOverlayPayloadEl.textContent = JSON.stringify(snapshot, null, 2);\n          } catch (err) {\n            debugOverlayPayloadEl.textContent = \"[snapshot error]\";\n            debugLog(\"Failed to stringify snapshot\", err);\n          }\n        }\n      }, 1000);\n    }\n\n    if (DEBUG_MODE) {\n      debugLog(\"Initial snapshot:\", collectFormSnapshot(form));\n      setInterval(function () {\n        debugLog(\"Snapshot (interval):\", collectFormSnapshot(form));\n      }, 10000); \/\/ every 10 seconds while DEBUG_ENABLED\n    }\n\n    \/\/ Disable native browser tooltips\n    form.setAttribute(\"novalidate\", \"novalidate\");\n\n    var emailInput = form.querySelector('input[name=\"email\"]');\n\n    \/\/ Prefill tracking fields\n    setIfExists(form, \"sf_page_url\",   window.location.href);\n    setIfExists(form, \"sf_page_path\",  window.location.pathname + window.location.search);\n    setIfExists(form, \"sf_page_title\", document.title || \"\");\n    setIfExists(form, \"sf_referrer\",   document.referrer || \"\");\n\n    \/\/ Live clean-up of errors\n    form.addEventListener(\"input\", function (e) {\n      var target = e.target;\n      if (!(target instanceof HTMLElement)) return;\n\n      if (target.matches(\"input, select, textarea\")) {\n        if (target.checkValidity()) {\n          clearFieldError(target);\n        }\n      }\n\n      if (emailInput && e.target === emailInput) {\n        clearFieldError(emailInput);\n      }\n    });\n\n    if (emailInput) {\n      emailInput.addEventListener(\"blur\", function () {\n        validateEmailB2B(emailInput);\n      });\n    }\n\n    form.addEventListener(\"submit\", function (e) {\n      e.preventDefault();\n      clearAllErrors(form);\n\n      var canSubmit = true;\n\n      \/\/ 1) B2B email check\n      if (!validateEmailB2B(emailInput)) {\n        canSubmit = false;\n      }\n\n      \/\/ 2) HTML5 rules (required, pattern, type) \u2013 custom messages\n      var fields = form.querySelectorAll(\"input, select, textarea\");\n      fields.forEach(function (field) {\n        if (!field.willValidate) return;\n\n        var v = field.validity;\n        if (!v.valid) {\n          canSubmit = false;\n\n          var msg;\n          if (field.type === \"checkbox\" && v.valueMissing) {\n            msg = UI_STRINGS.requiredCheckbox;\n          } else if (field.tagName === \"SELECT\" && v.valueMissing) {\n            msg = UI_STRINGS.requiredSelect;\n          } else if (field.type === \"email\" && v.valueMissing) {\n            \/\/ email format & domain errors are handled in validateEmailB2B\n            msg = UI_STRINGS.required;\n          } else if (field.type === \"tel\" && v.patternMismatch) {\n            msg = UI_STRINGS.phoneFormat;\n          } else if (v.valueMissing) {\n            msg = UI_STRINGS.required;\n          } else {\n            msg = UI_STRINGS.required; \/\/ generic fallback\n          }\n\n          showFieldError(field, msg);\n        }\n      });\n\n      \/\/ 3) Honeypot & reCAPTCHA validation\n      if (!checkHoneypot(form) || !checkRecaptcha(form)) {\n        canSubmit = false;\n      }\n\n      if (!canSubmit) {\n        var firstInvalid = form.querySelector(\".invalid-active\");\n        if (firstInvalid) {\n          firstInvalid.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n          try {\n            firstInvalid.focus({ preventScroll: true });\n          } catch (err) {\n            firstInvalid.focus();\n          }\n        }\n        return;\n      }\n\n      \/\/ 4) Fill engagement + device + language fields\n      setIfExists(form, \"sf_engagement\",   computeEngagementString());\n      setIfExists(form, \"sf_device_type\",  getDeviceType());\n      setIfExists(form, \"sf_browser_lang\", getBrowserLanguage());\n\n      debugLog(\"Final form snapshot before submit:\", collectFormSnapshot(form));\n\n      \/\/ 5) Prevent double submission\n      var btn = form.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n      if (btn) {\n        btn.disabled = true;\n        btn.style.opacity = \"0.6\";\n        btn.style.cursor = \"not-allowed\";\n      }\n\n      \/\/ 6) Submit without native browser tooltips (call native submit explicitly)\n      HTMLFormElement.prototype.submit.call(form);\n    });\n    });\n  });\n})();\n<\/script>\n\n\n<!-- STYLES -->\n<style>\n\n\/* ---------- FORM BASE STYLES ---------- *\/\n\n .nect-webtolead {\n  box-sizing: border-box;\n  font-family: Inter, sans-serif;\n\n  \/* Auto-contrast token (default: dark text on light bg) *\/\n  --sf-on-bg: #111827;\n  --sf-on-bg-muted: rgba(17, 24, 39, 0.9);\n  --sf-link-on-bg: #111827;\n\n  \/* Brand accent *\/\n  --sf-accent: #50ffba;\n\n  \/* Error token *\/\n  --sf-error: #ff4b4b;\n\n  \/* Submit button tokens (default: for light backgrounds) *\/\n  --sf-btn-bg: #0A0C1B;\n  --sf-btn-fg: #ffffff;\n  --sf-btn-hover-bg: #50ffba;\n  --sf-btn-hover-fg: #0A0C1B;\n\n  \/* Checkbox tokens (default: for light backgrounds) *\/\n  --sf-checkbox-border: #D1D5DB;\n  --sf-checkbox-bg: #ffffff;\n  --sf-checkbox-checked-bg: #0A0C1B;\n  --sf-checkbox-checked-border: #0A0C1B;\n  --sf-checkbox-tick: #ffffff;\n}\n\n .nect-webtolead.is-dark-bg {\n  \/* Light text on dark bg *\/\n  --sf-on-bg: #F9FAFB;\n  --sf-on-bg-muted: rgba(249, 250, 251, 0.88);\n  --sf-link-on-bg: #F9FAFB;\n  \/* On dark backgrounds we want a bright primary and a dark hover *\/\n  --sf-btn-bg: #50ffba;\n  --sf-btn-fg: #0A0C1B;\n  --sf-btn-hover-bg: #ffffff;\n  --sf-btn-hover-fg: #0A0C1B;\n\n  \/* Checkbox tokens (for dark backgrounds) *\/\n  --sf-checkbox-border: rgba(249, 250, 251, 0.55);\n  --sf-checkbox-bg: transparent;\n  --sf-checkbox-checked-bg: var(--sf-accent);\n  --sf-checkbox-checked-border: var(--sf-accent);\n  --sf-checkbox-tick: #0A0C1B;\n\n  \/* Brighter error on dark backgrounds (iOS-style) *\/\n  --sf-error: #ff453a;\n}\n\n .nect-webtolead * {\n  box-sizing: border-box;\n  font-family: Inter, sans-serif;\n}\n\n\n\/* ROW & COLUMN LAYOUT FOR MAIN FIELDS *\/\n .nect-webtolead .row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n}\n\n\/* ---------- INPUTS \/ SELECTS \/ TEXTAREA ---------- *\/\n\n .nect-webtolead input[type=\"text\"],\n .nect-webtolead input[type=\"email\"],\n .nect-webtolead input[type=\"tel\"],\n .nect-webtolead select,\n .nect-webtolead textarea {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n\n  width: 100%;\n  font-size: 16px;\n  line-height: 1.15;\n  padding: 14px;\n  border: 1px solid #E5E7EB;\n  background-color: #F9FAFB;\n  border-radius: 8px;\n  color: #111827;\n}\n\n\/* uniform heights for inputs + selects *\/\n .nect-webtolead input[type=\"text\"],\n .nect-webtolead input[type=\"email\"],\n .nect-webtolead input[type=\"tel\"],\n .nect-webtolead select {\n  height: 48px;\n}\n\n\/* Textarea sizing *\/\n .nect-webtolead textarea {\n  min-height: 130px;\n  resize: vertical;\n}\n\n\/* ---------- CUSTOM CARET \/ CHEVRON FOR SELECT ---------- *\/\n\n .nect-webtolead select {\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='14' height='14' viewBox='0 0 20 20' fill='none' stroke='%236B7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 8 10 12 14 8'%3E%3C\/polyline%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 14px center;\n  background-size: 14px;\n  padding-right: 44px !important;\n}\n\n .nect-webtolead.is-dark-bg select {\n  \/* On dark sections, our selects are still light, so the chevron should be dark (midnight) *\/\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='14' height='14' viewBox='0 0 20 20' fill='none' stroke='%230A0C1B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 8 10 12 14 8'%3E%3C\/polyline%3E%3C\/svg%3E\");\n}\n\n\/* ---------- CHECKBOX ---------- *\/\n\n .nect-webtolead input[type=\"checkbox\"] {\n  -webkit-appearance: none;\n  appearance: none;\n  margin-right: 0;\n  width: 18px;\n  height: 18px;\n  border-radius: 4px;\n  border: 2px solid var(--sf-checkbox-border);\n  background-color: var(--sf-checkbox-bg);\n  display: inline-block;\n  position: relative;\n  cursor: pointer;\n  outline: none;\n  box-shadow: none;\n  color: var(--sf-checkbox-tick);\n}\n\n .nect-webtolead input[type=\"checkbox\"]:checked {\n  background-color: var(--sf-checkbox-checked-bg) !important;\n  border-color: var(--sf-checkbox-checked-border) !important;\n}\n\n .nect-webtolead input[type=\"checkbox\"]:checked::after {\n  content: \"\";\n  position: absolute;\n  left: 5px;\n  top: 1px;\n  width: 4px;\n  height: 9px;\n  border: 2px solid currentColor;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg);\n}\n\n\n .nect-webtolead.is-dark-bg input[type=\"checkbox\"] {\n  border-color: var(--sf-checkbox-border);\n  background-color: var(--sf-checkbox-bg);\n}\n\n .nect-webtolead input[type=\"checkbox\"]:focus-visible {\n  box-shadow: 0 0 0 3px rgba(80, 255, 186, 0.35);\n}\n\n\/* ---------- BUTTON ---------- *\/\n\n .nect-webtolead button[type=\"submit\"] {\n  width: 50% !important;\n  min-width: 240px;\n  max-width: 520px;\n  display: inline-block;\n  margin: 0; \/* left-aligned *\/\n  background-color: var(--sf-btn-bg) !important;\n  color: var(--sf-btn-fg) !important;\n  padding: 14px;\n  font-size: 16px;\n  font-weight: 700;\n  border-radius: 8px;\n  border: none;\n  cursor: pointer;\n  transition: background-color .15s ease, color .15s ease, opacity .15s ease;\n}\n\n .nect-webtolead button[type=\"submit\"]:hover,\n .nect-webtolead button[type=\"submit\"]:focus-visible,\n .nect-webtolead button[type=\"submit\"]:active {\n  background-color: var(--sf-btn-hover-bg) !important;\n  color: var(--sf-btn-hover-fg) !important;\n}\n\n .nect-webtolead button[type=\"submit\"]:disabled {\n  opacity: .5;\n  cursor: not-allowed;\n}\n\n\/* ---------- ERROR STATES ---------- *\/\n\n .nect-webtolead .invalid-active:not(:focus):not(.focused) {\n  border-color: #FF5A5A !important;\n  background-color: #FFF5F5 !important;\n}\n\n\/* ---------- RECAPTCHA ---------- *\/\n\n .nect-webtolead .g-recaptcha {\n  transform: scale(0.9);\n  transform-origin: 0 0;\n}\n\n\/* Honeypot field (hidden from real users) *\/\n .nect-webtolead input[name=\"website\"] {\n  display: none !important;\n}\n\n\/* Inline error text below fields *\/\n.sf-error {\n  margin-top: 4px;\n  font-size: 12px;\n  line-height: 1.4;\n  color: var(--sf-error);\n  font-weight: 600;\n}\n\n\/* Red outline for invalid text fields, selects and textareas *\/\n .nect-webtolead input[type=\"text\"].invalid-active,\n .nect-webtolead input[type=\"email\"].invalid-active,\n .nect-webtolead input[type=\"tel\"].invalid-active,\n .nect-webtolead select.invalid-active,\n .nect-webtolead textarea.invalid-active {\n  border-color: var(--sf-error) !important;\n  box-shadow: 0 0 0 1px var(--sf-error) inset;\n}\n\n\/* Checkbox: single red border, no double outline *\/\n .nect-webtolead input[type=\"checkbox\"].invalid-active {\n  border-color: var(--sf-error) !important;\n  background-color: #FFF5F5;\n}\n\n .nect-webtolead.is-dark-bg input[type=\"checkbox\"].invalid-active {\n  background-color: rgba(255, 69, 58, 0.12);\n}\n\n .nect-webtolead .checkbox-row {\n  display: flex !important;\n  align-items: center !important; \n  gap: 8px;\n  flex-wrap: wrap; \n }\n\n .nect-webtolead .checkbox-row > input[type=\"checkbox\"] {\n  flex: 0 0 18px;\n  display: inline-block !important;\n }\n\n .nect-webtolead .checkbox-row span {\n  flex: 1 1 auto;\n  min-width: 0; \n  display: block;\n }\n\n .nect-webtolead .checkbox-row .sf-error {\n  flex-basis: 100%;\n  margin-left: 26px;\n}\n\n\/* ---------- CONSENT TEXT AUTO-CONTRAST ---------- *\/\n .nect-webtolead .checkbox-row {\n  color: var(--sf-on-bg);\n}\n\n .nect-webtolead .checkbox-row span {\n  color: var(--sf-on-bg);\n}\n\n .nect-webtolead .checkbox-row a {\n  color: var(--sf-link-on-bg);\n  text-decoration: underline;\n  font-size: inherit;\n  font-weight: 500;\n  transition: color .15s ease, opacity .15s ease;\n}\n\n\/* Hover \/ focus behavior: light bg = Apple blue, dark bg = Nect neon *\/\n .nect-webtolead .checkbox-row a:hover,\n .nect-webtolead .checkbox-row a:focus-visible {\n  color: #007AFF;\n}\n\n .nect-webtolead.is-dark-bg .checkbox-row a {\n  opacity: 0.95;\n}\n\n .nect-webtolead.is-dark-bg .checkbox-row a:hover,\n .nect-webtolead.is-dark-bg .checkbox-row a:focus-visible {\n  color: var(--sf-accent);\n}\n\n\/* ---------- FLEX COLUMN UTILITIES FOR RESPONSIVE FORM ---------- *\/\n .nect-webtolead .col-100 {\n  flex: 1 1 100px;\n  min-width: 100px;\n}\n\n .nect-webtolead .col-125 {\n  flex: 1 1 125px;\n  min-width: 125px;\n}\n\n .nect-webtolead .col-150 {\n  flex: 1 1 150px;\n  min-width: 150px;\n}\n\n .nect-webtolead .col-225 {\n  flex: 1 1 225px;\n  min-width: 225px;\n}\n\n .nect-webtolead .col-250 {\n  flex: 1 1 250px;\n  min-width: 250px;\n}\n\n .nect-webtolead .col-300 {\n  flex: 1 1 300px;\n  min-width: 300px;\n}\n\n .nect-webtolead .col-full {\n  flex: 1 1 100%;\n  min-width: 100%;\n}\n\n@media (max-width: 640px) {\n  .nect-webtolead .row {\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  .nect-webtolead .col-100,\n  .nect-webtolead .col-125,\n  .nect-webtolead .col-150,\n  .nect-webtolead .col-225,\n  .nect-webtolead .col-250,\n  .nect-webtolead .col-300,\n  .nect-webtolead .col-full {\n    flex: 1 1 100%;\n    min-width: 100%;\n  }\n\n  .nect-webtolead button[type=\"submit\"] {\n    width: 100% !important;\n    min-width: 0;\n    max-width: none;\n    display: block;\n  }\n\n  \/* Mobile: ensure checkbox + text start on the same row *\/\n  .nect-webtolead .checkbox-row {\n    display: grid !important;\n    grid-template-columns: 18px 1fr;\n    column-gap: 12px;\n    align-items: center !important;\n  }\n\n  .nect-webtolead .checkbox-row > input[type=\"checkbox\"] {\n    margin: 0;\n    justify-self: start;\n    align-self: center;\n    width: 18px;\n    height: 18px;\n    display: inline-block !important;\n  }\n\n  .nect-webtolead .checkbox-row span {\n    display: block;\n  }\n\n  \/* Error message should align under the text column *\/\n  .nect-webtolead .checkbox-row .sf-error {\n    grid-column: 2;\n    margin-left: 0;\n  }\n}\n\n\/* ---------- DEBUG OVERLAY (VISIBLE ONLY WHEN DEBUG_MODE = true) ---------- *\/\n#nect-debug-overlay {\n  position: fixed;\n  bottom: 16px;\n  left: 16px;\n  z-index: 9999;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  gap: 4px;\n  padding: 8px 12px;\n  border-radius: 8px;\n  background: rgba(17, 24, 39, 0.94);\n  color: #F9FAFB;\n  font-size: 12px;\n  line-height: 1.35;\n  font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);\n  pointer-events: auto;\n  max-width: 360px;\n}\n\n#nect-debug-overlay.nect-debug-muted {\n  opacity: 0.6;\n}\n\n#nect-debug-overlay .nect-debug-header {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  margin-bottom: 2px;\n}\n\n#nect-debug-overlay .nect-debug-title-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n}\n\n#nect-debug-overlay .nect-debug-controls {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 4px;\n}\n\n#nect-debug-overlay .nect-debug-engagement-block {\n  margin-top: 2px;\n}\n\n#nect-debug-overlay .nect-debug-engagement-label {\n  font-size: 10px;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  opacity: 0.8;\n}\n\n#nect-debug-overlay .nect-debug-engagement-value {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 11px;\n}\n\n#nect-debug-overlay .nect-debug-label {\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n  font-size: 11px;\n  opacity: 0.9;\n}\n\n#nect-debug-overlay .nect-debug-engagement {\n  white-space: nowrap;\n  max-width: 220px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n#nect-debug-overlay .nect-debug-button {\n  border: 0;\n  border-radius: 6px;\n  padding: 4px 8px;\n  font-size: 10px;\n  font-weight: 500;\n  background: #F9FAFB;\n  color: #111827;\n  cursor: pointer;\n  transition: background 0.15s ease, color 0.15s ease, transform 0.08s ease;\n}\n\n#nect-debug-overlay .nect-debug-button:hover {\n  background: #50ffba;\n  color: #0A0C1B;\n  transform: translateY(-1px);\n}\n\n#nect-debug-overlay .nect-debug-payload {\n  margin: 0;\n  padding: 4px 6px;\n  border-radius: 4px;\n  background: rgba(31, 41, 55, 0.9);\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 10px;\n  max-height: 140px;\n  overflow: auto;\n  white-space: pre;\n}\n\n@media (max-width: 640px) {\n  #nect-debug-overlay {\n    bottom: 8px;\n    left: 8px;\n    right: 8px;\n    padding: 6px 8px;\n    max-width: none;\n  }\n\n  #nect-debug-overlay .nect-debug-engagement {\n    max-width: 140px;\n  }\n\n  #nect-debug-overlay .nect-debug-payload {\n    max-height: 120px;\n  }\n}\n<\/style>\n\n<form id=\"nect-webtolead\" class=\"nect-webtolead\" action=\"https:\/\/webto.salesforce.com\/servlet\/servlet.WebToLead?encoding=UTF-8&amp;orgId=00D7Q000008LEWX\" method=\"POST\" style=\"font-family: 'Inter', sans-serif; max-width: 900px; margin: 0 auto;\">\n\n  <!-- reCAPTCHA configuration -->\n  <input type=\"hidden\" name=\"captcha_settings\" value=\"{\"keyname\":\"Salesforce\",\"fallback\":\"true\",\"orgId\":\"00D7Q000008LEWX\",\"ts\":\"\"}\">\n\n  <input type=\"hidden\" name=\"oid\" value=\"00D7Q000008LEWX\">\n  <input type=\"hidden\" name=\"retURL\" value=\"https:\/\/nect.com\/thankyou\/\">\n  <input type=\"hidden\" name=\"lead_source\" value=\"Website\">\n\n\n<!-- Tracking: Form Context & Page Meta -->\n\n  <!-- Form Context. Possible values: Standard | Case Studies | White Paper | Trade Fair | Webinars | Google Ads -->\n  <input type=\"hidden\" name=\"00Naa000004Cgqn\" value=\"Standard\">\n\n  <!-- Page URL (full URL of the page, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChA9\" id=\"sf_page_url\" value=\"\">\n\n  <!-- Page Path (path including query string, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChJp\" id=\"sf_page_path\" value=\"\">\n\n  <!-- Page Title (filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChLR\" id=\"sf_page_title\" value=\"\">\n\n  <!-- Referrer (e.g. https:\/\/www.google.com\/, filled via JS) -->\n  <input type=\"hidden\" name=\"00Naa000004ChN3\" id=\"sf_referrer\" value=\"\">\n\n  <!-- Engagement Level -->\n  <input type=\"hidden\" name=\"00Naa000004Gzhy\" id=\"sf_engagement\" value=\"\">\n\n  <!-- Device Type (Desktop \/ Mobile \/ Tablet) -->\n  <input type=\"hidden\" name=\"00Naa000004H0hF\" id=\"sf_device_type\" value=\"\">\n\n  <!-- Browser Language (navigator.language) -->\n  <input type=\"hidden\" name=\"00Naa000004H0m5\" id=\"sf_browser_lang\" value=\"\">\n\n  <!-- Grid Container -->\n  <div class=\"row\">\n\n    <!-- Salutation -->\n    <div class=\"col-125\">\n      <select name=\"salutation\" required=\"\" autocomplete=\"honorific-prefix\">\n        <option value=\"\" disabled selected>Tratamiento<\/option>\n        <option value=\"Herr\">Sr.<\/option>\n        <option value=\"Frau\">Sra.<\/option>\n        <option value=\"k.A.\">N.D.<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- First name -->\n    <div class=\"col-225\">\n      <input name=\"first_name\" type=\"text\" maxlength=\"40\" placeholder=\"Nombre\" required=\"\" autocomplete=\"given-name\">\n    <\/div>\n\n    <!-- Surname -->\n    <div class=\"col-225\">\n      <input name=\"last_name\" type=\"text\" maxlength=\"80\" placeholder=\"Apellido\" required=\"\" autocomplete=\"family-name\">\n    <\/div>\n\n    <!-- Email -->\n    <div class=\"col-300\">\n      <input name=\"email\" type=\"email\" maxlength=\"80\" placeholder=\"Su correo electr\u00f3nico\" required=\"\" autocomplete=\"email\">\n    <\/div>\n\n    <!-- Telephone -->\n    <div class=\"col-300\">\n      <input name=\"phone\" type=\"tel\" pattern=\"^\\+?(?:49|43|41|1|33|34|44|39|31|32|420|352|46|48|371|372|373|374|375|376|377|378|380|381|382|385|386|387|389|90|91|92|93|94|95|98|99|0)?[\\s\\d]{6,20}$\" maxlength=\"40\" placeholder=\"N\u00famero de tel\u00e9fono\" required=\"\" autocomplete=\"tel\">\n    <\/div>\n\n    <!-- Company -->\n    <div class=\"col-300\">\n      <input name=\"company\" type=\"text\" maxlength=\"40\" placeholder=\"Empresa\" required=\"\" autocomplete=\"organization\">\n    <\/div>\n\n    <!-- Department -->\n    <div class=\"col-300\">\n      <select name=\"title\" required=\"\">\n        <option value=\"\" disabled selected>Seleccionar departamento<\/option>\n        <option value=\"C-Level \/ Management\">C-Level \/ Administraci\u00f3n<\/option>\n        <option value=\"Rechtsabteilung \/ Compliance\">Departamento Legal \/ Cumplimiento<\/option>\n        <option value=\"IT \/ Technik\">IT \/ T\u00e9cnica<\/option>\n        <option value=\"KYC\/ Betrugsabteilung\/ Risk\">KYC\/ Departamento de Fraude\/ Riesgo<\/option>\n        <option value=\"Digitalisierung\/ Prozessoptimierung\">Digitalizaci\u00f3n\/ Optimizaci\u00f3n de procesos<\/option>\n        <option value=\"Andere\">Otro<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Subject -->\n    <div class=\"col-full\">\n      <select name=\"00N7Q00000F4M1Z\" required=\"\">\n        <option value=\"\" disabled selected>Seleccionar asunto<\/option>\n        <option value=\"Allgemeines Interesse an Nect\">General<\/option>\n        <option value=\"Interesse an Nect Ident\">Nect Ident<\/option>\n        <option value=\"Interesse an Nect Sign\">Nect Sign<\/option>\n        <option value=\"Interesse an Nect Business Sign\">Nect Sign para empresas<\/option>\n        <option value=\"Interesse an KYC\/KYB\">KYC\/KYB<\/option>\n        <option value=\"Interesse an Nect Box\">Nect Box<\/option>\n        <option value=\"Interesse an EUDI\">EUDI Wallet<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Message -->\n    <div class=\"col-full\">\n      <textarea name=\"00N7Q00000IGsDp\" rows=\"4\" placeholder=\"Su mensaje para nosotros\" required=\"\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <!-- Honeypot -->\n  <div style=\"position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;\">\n    <label>Por favor, rellene:<\/label>\n    <input type=\"text\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\">\n  <\/div>\n\n  <!-- Privacy Consent -->\n<div class=\"checkbox-row\" style=\"margin: 20px 0 8px; line-height: 20px; font-size: 14px;\">\n  <input id=\"00Naa000003Nuiv\" name=\"00Naa000003Nuiv\" type=\"checkbox\" required=\"\" value=\"1\">\n  <span>Por la presente, acepto la \n <a href=\"https:\/\/nect.com\/es\/legal\/politica-de-privacidad-del-sitio-web\/\" target=\"_blank\">pol\u00edtica de privacidad<\/a> y los \n <a href=\"https:\/\/nect.com\/es\/legal\/terminos-y-condiciones-generales\/\" target=\"_blank\">t\u00e9rminos y condiciones<\/a>.\n  <\/span>\n<\/div>\n\n  <!-- Newsletter opt-in (optional) -->\n  <div class=\"checkbox-row\" style=\"margin: 8px 0 20px 0; line-height: 20px; font-size: 14px;\">\n  <input id=\"00Naa000004H13p\" name=\"00Naa000004H13p\" type=\"checkbox\" value=\"1\">\n  <span>Me gustar\u00eda recibir el bolet\u00edn de Nect en el futuro.<\/span>\n<\/div>\n  \n  <!-- reCAPTCHA v2 -->\n  <div class=\"g-recaptcha\" required=\"\" data-sitekey=\"6Lfg5Y0rAAAAAKSHnYizfxa0UpccDk_rabNym_rd\" data-callback=\"_nectRecaptchaSuccess\"><\/div>\n  <div class=\"sf-error recaptcha-error\"><\/div>\n  <br>\n  <!-- Button -->\n  <button type=\"submit\"> \n Enviar solicitud\n  <\/button>\n<\/form>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>AnredeHerrFrauk.A. Bitte ausf\u00fcllen: Hiermit akzeptiere ich die Datenschutzbestimmungen und die AGB. Ich m\u00f6chte k\u00fcnftig den Nect Newsletter erhalten. Anfrage senden AnredeHerrFrauk.A. Abteilung ausw\u00e4hlenC-Level \/ ManagementRechtsabteilung \/ ComplianceIT \/ TechnikKYC\/ Betrugsabteilung\/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5276","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Prueba de formulario - Nect<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nect.com\/es\/prueba-de-formulario\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Prueba de formulario - Nect\" \/>\n<meta property=\"og:description\" content=\"AnredeHerrFrauk.A. Bitte ausf\u00fcllen: Hiermit akzeptiere ich die Datenschutzbestimmungen und die AGB. Ich m\u00f6chte k\u00fcnftig den Nect Newsletter erhalten. Anfrage senden AnredeHerrFrauk.A. Abteilung ausw\u00e4hlenC-Level \/ ManagementRechtsabteilung \/ ComplianceIT \/ TechnikKYC\/ Betrugsabteilung\/ [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nect.com\/es\/prueba-de-formulario\/\" \/>\n<meta property=\"og:site_name\" content=\"Nect\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/NiceToNectYou\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-17T16:01:04+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@nicetonectyou\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/prueba-de-formulario\\\/\",\"url\":\"https:\\\/\\\/nect.com\\\/es\\\/prueba-de-formulario\\\/\",\"name\":\"Prueba de formulario - Nect\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#website\"},\"datePublished\":\"2025-12-12T13:05:01+00:00\",\"dateModified\":\"2025-12-17T16:01:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/prueba-de-formulario\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nect.com\\\/es\\\/prueba-de-formulario\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/prueba-de-formulario\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/nect.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Prueba de formulario\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/nect.com\\\/es\\\/\",\"name\":\"Nect\",\"description\":\"Built for the future of digital identity.\",\"publisher\":{\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nect.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#organization\",\"name\":\"Nect\",\"url\":\"https:\\\/\\\/nect.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/nect.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Nect_favicon_App.svg\",\"contentUrl\":\"https:\\\/\\\/nect.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Nect_favicon_App.svg\",\"width\":512,\"height\":512,\"caption\":\"Nect\"},\"image\":{\"@id\":\"https:\\\/\\\/nect.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/NiceToNectYou\\\/\",\"https:\\\/\\\/x.com\\\/nicetonectyou\",\"https:\\\/\\\/www.instagram.com\\\/nect\\\/\",\"https:\\\/\\\/vimeo.com\\\/nect\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nect.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Prueba de formulario - Nect","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nect.com\/es\/prueba-de-formulario\/","og_locale":"es_ES","og_type":"article","og_title":"Prueba de formulario - Nect","og_description":"AnredeHerrFrauk.A. Bitte ausf\u00fcllen: Hiermit akzeptiere ich die Datenschutzbestimmungen und die AGB. Ich m\u00f6chte k\u00fcnftig den Nect Newsletter erhalten. Anfrage senden AnredeHerrFrauk.A. Abteilung ausw\u00e4hlenC-Level \/ ManagementRechtsabteilung \/ ComplianceIT \/ TechnikKYC\/ Betrugsabteilung\/ [&hellip;]","og_url":"https:\/\/nect.com\/es\/prueba-de-formulario\/","og_site_name":"Nect","article_publisher":"https:\/\/www.facebook.com\/NiceToNectYou\/","article_modified_time":"2025-12-17T16:01:04+00:00","twitter_card":"summary_large_image","twitter_site":"@nicetonectyou","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/nect.com\/es\/prueba-de-formulario\/","url":"https:\/\/nect.com\/es\/prueba-de-formulario\/","name":"Prueba de formulario - Nect","isPartOf":{"@id":"https:\/\/nect.com\/es\/#website"},"datePublished":"2025-12-12T13:05:01+00:00","dateModified":"2025-12-17T16:01:04+00:00","breadcrumb":{"@id":"https:\/\/nect.com\/es\/prueba-de-formulario\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nect.com\/es\/prueba-de-formulario\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nect.com\/es\/prueba-de-formulario\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/nect.com\/es\/"},{"@type":"ListItem","position":2,"name":"Prueba de formulario"}]},{"@type":"WebSite","@id":"https:\/\/nect.com\/es\/#website","url":"https:\/\/nect.com\/es\/","name":"Nect","description":"Built for the future of digital identity.","publisher":{"@id":"https:\/\/nect.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nect.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/nect.com\/es\/#organization","name":"Nect","url":"https:\/\/nect.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/nect.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/nect.com\/wp-content\/uploads\/2025\/05\/Nect_favicon_App.svg","contentUrl":"https:\/\/nect.com\/wp-content\/uploads\/2025\/05\/Nect_favicon_App.svg","width":512,"height":512,"caption":"Nect"},"image":{"@id":"https:\/\/nect.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/NiceToNectYou\/","https:\/\/x.com\/nicetonectyou","https:\/\/www.instagram.com\/nect\/","https:\/\/vimeo.com\/nect\/","https:\/\/www.linkedin.com\/company\/nect.com"]}]}},"_links":{"self":[{"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/pages\/5276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/comments?post=5276"}],"version-history":[{"count":1,"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/pages\/5276\/revisions"}],"predecessor-version":[{"id":5277,"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/pages\/5276\/revisions\/5277"}],"wp:attachment":[{"href":"https:\/\/nect.com\/es\/wp-json\/wp\/v2\/media?parent=5276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}