@rtstic.dev/pulse 0.0.44 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/form/index.js +2 -2
- package/dist/form/index.js.map +2 -2
- package/dist/form/styles.css +1 -1
- package/dist/form/styles.css.map +2 -2
- package/package.json +1 -1
package/dist/form/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
2
|
-
e.g. <script src="https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js"><\/script>`),s)}function h(c,t){try{let e=c.getSelectedCountryData?.();if(!e?.dialCode)return;document.querySelectorAll(t).forEach(r=>{r.value=`+${e.dialCode}`})}catch{}}function q(c){return c.closest("[pulse-form-block]")?.getAttribute("pulse-field-name")??"unknown"}var x={1:[{selector:'[data-action="back"]',property:"display",value:"none"},{selector:'[pricing-form-element="progress-fill"]',property:"width",value:"50%"}],2:[{selector:'[data-action="back"]',property:"display",value:"flex"},{selector:'[pricing-form-element="progress-fill"]',property:"width",value:"100%"}]},E=[{type:"company_type",name:"Record Label / Music Distributor","calender-name":"valeria","embed-url":"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true"},{type:"industry",name:"Financial Services","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Sports","calender-name":"steven","embed-url":"https://meetings.hubspot.com/steven-campos?embed=true"},{type:"industry",name:"Beauty","calender-name":"albany","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Music","calender-name":"steven","embed-url":"https://meetings.hubspot.com/steven-campos?embed=true"},{type:"industry",name:"Customer Packaged Goods","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Other","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"}],v={required:"This field is required",email_invalid:"Please enter a valid email address",email_company:"Please use your company email address",phone_invalid:"Please enter a valid phone number",selection_required:"Please select at least one option",legal_required:"You must accept this to continue"},k={"pulse-demo":["pulse-demo-only","common-fields"],"white-glove-services":["white-glove-only","common-fields"]},C={1:{heading:"Your info",subheading:"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.",counter:"Step 1/2"},2:{heading:"Personalize",subheading:"Help us personalize your demo.",counter:"Step 2/2"}},m=class{constructor(t,e){this.currentStepIndex=0;this.stepHasBeenValidated=!1;this.originalRequired=new WeakMap;this.fieldState=new Map;this.form=t,this.itiInstances=e,this.steps=Array.from(t.querySelectorAll('[data-msf="step"]')),this.bindEvents(),this.cacheOriginalRequiredState(),this.initializeFieldState(),this.showStep(0),this.applyFlowConditions(),this.syncAllFieldState()}bindEvents(){this.form.addEventListener("click",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-action]");if(!r)return;let n=r.dataset.action;n==="next"&&(t.preventDefault(),this.next()),n==="back"&&(t.preventDefault(),this.back())}),this.form.addEventListener("submit",t=>{t.preventDefault()}),this.form.addEventListener("input",t=>{let e=t.target;e&&(!(e instanceof HTMLInputElement)&&!(e instanceof HTMLTextAreaElement)&&!(e instanceof HTMLSelectElement)||this.handleLiveValidation())}),this.itiInstances.forEach((t,e)=>{e.addEventListener("countrychange",()=>{this.stepHasBeenValidated&&this.handleLiveValidation()})}),this.form.addEventListener("change",t=>{let e=t.target;e&&e instanceof HTMLInputElement&&e.type==="radio"&&e.name==="flow-type"&&this.applyFlowConditions()}),this.form.addEventListener("input",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)}),this.form.addEventListener("change",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)})}handleLiveValidation(){if(!this.stepHasBeenValidated)return;let t=this.validateStep(this.currentStepIndex);this.clearErrors(),Object.keys(t).length>0&&this.showErrors(t)}showStep(t){this.steps.forEach((r,n)=>{r.style.display=n===t?"flex":"none"}),this.currentStepIndex=t,this.stepHasBeenValidated=!1,this.clearErrors();let e=t+1;this.updateStepText(e),this.applyStepStyles(e)}next(){this.stepHasBeenValidated=!0;let t=this.validateStep(this.currentStepIndex);if(Object.keys(t).length>0){this.clearErrors(),this.showErrors(t),this.focusFirstError(t);return}this.clearErrors(),this.stepHasBeenValidated=!1;let e=this.currentStepIndex+1;if(e>=this.steps.length){console.log("Validation passed");let n=this.steps[this.currentStepIndex].querySelector('[data-action="next"]');if(n){let s=n.querySelector("[data-action-text]");s&&(s.textContent="Submitting...")}this.mirrorFieldStateToDOM(),this.loadCalendarEmbed();let i=document.getElementById("webflow-form-submit"),a=document.getElementById("hubspot-form-submit");i&&a?(i.click(),a.click()):console.warn("Submit button not found");return}this.showStep(e)}showErrors(t){Object.entries(t).forEach(([e,r])=>{let n=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(n){n.classList.add("has-error");let s=n.querySelector(".field-error");s||(s=document.createElement("div"),s.className="field-error",n.appendChild(s)),s.textContent=v[r],s.setAttribute("data-error-code",r);return}let i=this.form.querySelector(`[name="${e}"]`);if(!i)return;i.classList.add("has-error");let a=i.parentElement?.querySelector(".field-error");a||(a=document.createElement("div"),a.className="field-error",i.parentElement?.appendChild(a)),a.textContent=v[r],a.setAttribute("data-error-code",r)})}clearErrors(){this.form.querySelectorAll(".field-error").forEach(t=>t.remove()),this.form.querySelectorAll(".has-error").forEach(t=>t.classList.remove("has-error"))}back(){let t=this.currentStepIndex-1;t<0||this.showStep(t)}getFieldsForStep(t){let e=this.steps[t];return Array.from(e.querySelectorAll("input, select, textarea"))}validateStep(t){let e={};this.getFieldsForStep(t).forEach(a=>{let s=a.name;if(!s||a.type==="checkbox"||a.type==="radio")return;let l=a.value.trim();if(a.hasAttribute("required")&&!l){e[s]="required";return}if(a.type==="email"&&l){if(!this.isValidEmailFormat(l)){e[s]="email_invalid";return}if(!this.isCompanyEmail(l)){e[s]="email_company";return}}if(a.type==="tel"&&l&&this.validatePhoneField(a)){e[s]="phone_invalid";return}});let n=this.validateRequiredSelectionGroups(t),i=this.validateLegalGroups(t);return{...e,...n,...i}}validateRequiredSelectionGroups(t){let e=this.steps[t],r={};return e.querySelectorAll("[data-required-group]").forEach(i=>{let a=i.dataset.requiredGroup;if(!a)return;let l=Array.from(i.querySelectorAll('input[type="checkbox"], input[type="radio"]')).filter(d=>!d.disabled);if(l.length===0)return;l.some(d=>d.checked)||(r[a]="selection_required")}),r}validateLegalGroups(t){let e=this.steps[t],r={};return e.querySelectorAll("[data-required-legal]").forEach(i=>{let a=i.dataset.requiredLegal;if(!a)return;let s=i.querySelector('input[type="checkbox"]');!s||s.disabled||s.checked||(r[a]="legal_required")}),r}isValidEmailFormat(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}isCompanyEmail(t){let e=["gmail.com","yahoo.com","hotmail.com","outlook.com","icloud.com","aol.com"],r=t.split("@")[1]?.toLowerCase();return r?!e.includes(r):!1}validatePhoneField(t){let e=this.itiInstances.get(t);return!e||!t.value.trim()||e.isValidNumber()?null:"phone_invalid"}focusFirstError(t){let e=Object.keys(t)[0];if(!e)return;let r=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(r){r.querySelector("input, select, textarea")?.focus();return}this.form.querySelector(`[name="${e}"]`)?.focus()}getFlowType(){let t=this.form.querySelector('[data-required-group="flow-type"]');return t?t.querySelector('input[type="radio"]:checked')?.value??null:null}applyFlowConditions(){let t=this.getFlowType();if(!t)return;let e=k[t]||[];this.form.querySelectorAll("[data-conditional]").forEach(n=>{let i=n.dataset.conditional;if(!i)return;let a=e.includes(i),s=n.querySelectorAll("input, select, textarea");if(a)n.style.display="",s.forEach(l=>{l.disabled=!1,this.originalRequired.get(l)&&l.setAttribute("required","true")});else{n.style.display="none",s.forEach(o=>{o.disabled=!0,o.removeAttribute("required"),o instanceof HTMLInputElement?o.type==="checkbox"||o.type==="radio"?o.checked=!1:o.value="":o instanceof HTMLSelectElement?o.selectedIndex=0:o instanceof HTMLTextAreaElement&&(o.value="");let d=o.closest("[data-field-key]");if(!d)return;let u=d.dataset.fieldKey;if(!u)return;let p=this.fieldState.get(u);p&&(p.required=!1,p.valid=!0,p.value="",this.fieldState.set(u,p))});let l=n.dataset.fieldKey;if(l){let o=this.fieldState.get(l);o&&(o.required=!1,o.valid=!0,o.value="",this.fieldState.set(l,o))}this.clearErrorsInBlock(n)}}),this.updateValidityForStep(this.currentStepIndex+1)}cacheOriginalRequiredState(){this.form.querySelectorAll("input, select, textarea").forEach(e=>{this.originalRequired.set(e,e.hasAttribute("required"))})}clearErrorsInBlock(t){t.querySelectorAll(".field-error").forEach(e=>e.remove()),t.querySelectorAll(".has-error").forEach(e=>e.classList.remove("has-error"))}initializeFieldState(){this.form.querySelectorAll("[data-field-key]").forEach(e=>{let r=e.dataset.fieldKey;if(!r)return;let n=e.closest("[data-msf='step']"),i=n?Number(n.dataset.step):this.currentStepIndex+1;this.fieldState.set(r,{"field-name":r,value:"",required:!1,valid:!0,"step-number":i})})}updateFieldState(t){let e=this.form.querySelector(`[data-field-key="${t}"]`);if(!e)return;let r="",n=!1;if(e.hasAttribute("data-group")){let l=Array.from(e.querySelectorAll("input[type='radio'], input[type='checkbox']")).filter(o=>!o.disabled);if(n=e.hasAttribute("data-required-group"),l.some(o=>o.type==="radio")){let o=l.find(d=>d.checked);o?r=o.closest("label")?.querySelector("span")?.textContent?.trim()??o.value??"":r=""}else r=l.filter(d=>d.checked).map(d=>d.closest("label")?.querySelector("span")?.textContent?.trim()??d.value??"").join(",")}else if(e.hasAttribute("data-required-legal")){let l=e.querySelector("input[type='checkbox']");l&&!l.disabled&&(n=!0,r=l.checked?"true":"false")}else(e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement)&&(n=e.hasAttribute("required")&&!e.disabled,e instanceof HTMLInputElement&&e.type==="checkbox"?r=e.checked?"true":"false":r=e.value.trim());let i=e.closest("[data-msf='step']"),a=i?Number(i.dataset.step):this.currentStepIndex+1,s=this.fieldState.get(t);s&&(s.value=r,s.required=n,s["step-number"]=a,this.fieldState.set(t,s),this.updateValidityForStep(a))}updateValidityForStep(t){let e=this.steps.findIndex(i=>Number(i.dataset.step)===t);if(e===-1)return;let r=this.validateStep(e);Array.from(this.fieldState.values()).filter(i=>i["step-number"]===t).forEach(i=>{i.valid=!r[i["field-name"]]})}getFormStateJSON(){return Array.from(this.fieldState.values())}updateStepText(t){let e=C[t];if(e){if(e.heading){let r=this.form.querySelector('[data-dynamic-text="heading"]');r&&(r.textContent=e.heading)}if(e.subheading){let r=this.form.querySelector('[data-dynamic-text="subheading"]');r&&(r.textContent=e.subheading)}if(e.counter){let r=this.form.querySelector('[data-dynamic-text="counter"]');r&&(r.textContent=e.counter)}}}syncAllFieldState(){this.fieldState.forEach((t,e)=>{this.updateFieldState(e)})}mirrorFieldStateToDOM(){let t=this.getFormStateJSON(),e=document.getElementById("form-hubspot-book-a-demo");t.forEach(r=>{let n=e?.querySelector(`[data-mirror="${r["field-name"]}"]`);if(!n){console.warn(`[Mirror] No element found with data-mirror="${r["field-name"]}"`);return}n instanceof HTMLInputElement&&n.disabled||(n instanceof HTMLInputElement?n.type==="checkbox"?n.checked=r.value==="true":n.type==="radio"?n.checked=n.value===r.value:n.value=r.value:n.value=r.value)})}resolveCalendarEntry(){let t=this.fieldState.get("company_type")?.value??"",e=this.fieldState.get("industry")?.value??"",r=E.find(i=>i.type==="company_type"&&i.name===t);return r||(E.find(i=>i.type==="industry"&&i.name===e)??null)}loadCalendarEmbed(){let t=document.querySelector("[hs-calender-block]");if(!t){console.warn("[Calendar] No [hs-calender-block] element found");return}let e=this.resolveCalendarEntry();if(!e){t.setAttribute("hs-calender-block-active","false"),t.innerHTML="",console.warn("[Calendar] No matching calendar entry found");return}t.setAttribute("hs-calender-block-active","true"),t.innerHTML="";let r=document.createElement("div");r.className="meetings-iframe-container",r.setAttribute("data-src",e["embed-url"]),t.appendChild(r);let n="https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js",i=document.querySelector(`script[src="${n}"]`);i&&i.remove();let a=document.createElement("script");a.type="text/javascript",a.src=n,t.appendChild(a),console.log(`[Calendar] Loaded embed for "${e["calender-name"]}" \u2192 ${e["embed-url"]}`)}applyStepStyles(t){let e=x[t];e&&e.forEach(({selector:r,property:n,value:i})=>{document.querySelectorAll(r).forEach(s=>{s.style.setProperty(n,i)})})}};document.addEventListener("DOMContentLoaded",()=>{let c=document.querySelector('[data-msf="form"]');if(!c)return;let t=y({root:c}),e=new m(c,t);window.msf=e});})();
|
|
1
|
+
"use strict";(()=>{var $=Object.create;var S=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var x=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var w=(d,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of I(t))!k.call(d,n)&&n!==e&&S(d,n,{get:()=>t[n],enumerable:!(r=H(t,n))||r.enumerable});return d};var F=(d,t,e)=>(e=d!=null?$(q(d)):{},w(t||!d||!d.__esModule?S(e,"default",{value:d,enumerable:!0}):e,d));function T(d={}){let{root:t=document,initialCountry:e="us",separateDialCode:r=!0,countryCodeSelector:n='input[pulse-form-field="country-code"]',onInit:i,onError:o=p=>console.warn(`[initIntlTelInput] ${p}`)}=d,s=new Map,c=window.intlTelInput;return c?(t.querySelectorAll('input[type="tel"]').forEach(p=>{try{let m=c(p,{initialCountry:e,separateDialCode:r,strictMode:!1,loadUtils:()=>import("https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js")});s.set(p,m),v(m,n),p.addEventListener("countrychange",()=>{v(m,n)}),i?.(p,m)}catch(m){o(`Failed to init on input inside "${C(p)}"`,m)}}),s):(o(`intlTelInput not found on window. Include the script before calling this function.
|
|
2
|
+
e.g. <script src="https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js"><\/script>`),s)}function v(d,t){try{let e=d.getSelectedCountryData?.();if(!e?.dialCode)return;document.querySelectorAll(t).forEach(r=>{r.value=`+${e.dialCode}`})}catch{}}function C(d){return d.closest("[pulse-form-block]")?.getAttribute("pulse-field-name")??"unknown"}var E=window.location.host==="influur-staging.webflow.io";function a(d,...t){E&&console.log(`%c[MSF:${d}]`,"color:#6cf;font-weight:bold",...t)}function u(d,...t){E&&console.warn(`[MSF:${d}]`,...t)}function h(d,...t){E&&console.error(`[MSF:${d}]`,...t)}function g(d){E&&console.group(`%c[MSF] ${d}`,"color:#6cf;font-weight:bold")}function f(){E&&console.groupEnd()}var A={1:[{selector:'[data-action="back"]',property:"display",value:"none"},{selector:'[pricing-form-element="progress-fill"]',property:"width",value:"50%"}],2:[{selector:'[data-action="back"]',property:"display",value:"flex"},{selector:'[pricing-form-element="progress-fill"]',property:"width",value:"100%"}]},M=[{type:"company_type",name:"Record Label / Music Distributor","calender-name":"valeria","embed-url":"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true"},{type:"industry",name:"Financial Services","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Sports","calender-name":"steven","embed-url":"https://meetings.hubspot.com/steven-campos?embed=true"},{type:"industry",name:"Beauty","calender-name":"albany","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Music","calender-name":"steven","embed-url":"https://meetings.hubspot.com/steven-campos?embed=true"},{type:"industry",name:"Customer Packaged Goods","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"},{type:"industry",name:"Other","calender-name":"david","embed-url":"https://meetings.hubspot.com/david-zarate2?embed=true"}],L={required:"This field is required",email_invalid:"Please enter a valid email address",email_company:"Please use your company email address",phone_invalid:"Please enter a valid phone number",selection_required:"Please select at least one option",legal_required:"You must accept this to continue"},N={"pulse-demo":["pulse-demo-only","common-fields"],"white-glove-services":["white-glove-only","common-fields"]},R={1:{heading:"Your info",subheading:"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.",counter:"Step 1/2"},2:{heading:"Personalize",subheading:"Help us personalize your demo.",counter:"Step 2/2"}},b=class{constructor(t,e){this.currentStepIndex=0;this.stepHasBeenValidated=!1;this.originalRequired=new WeakMap;this.fieldState=new Map;this.form=t,this.itiInstances=e,g("Constructor"),this.steps=Array.from(t.querySelectorAll('[data-msf="step"]')),a("init",`Found ${this.steps.length} steps`),this.steps.length===0&&h("init","No steps found! Check [data-msf='step'] selectors in HTML."),this.steps.forEach((r,n)=>{let i=r.dataset.step;i?a("init",`Step ${n}: data-step="${i}"`):u("init",`Step element at index ${n} is missing data-step attribute`)}),a("init",`ITI instances count: ${e.size}`),this.bindEvents(),this.cacheOriginalRequiredState(),this.initializeFieldState(),this.showStep(0),this.applyFlowConditions(),this.syncAllFieldState(),a("init","Field state after full init:",this.getFormStateJSON()),f()}bindEvents(){a("bindEvents","Attaching all event listeners"),this.form.addEventListener("click",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-action]");if(!r)return;let n=r.dataset.action;a("click",`Action button clicked: "${n}"`),n==="next"&&(t.preventDefault(),this.next()),n==="back"&&(t.preventDefault(),this.back())}),this.form.addEventListener("submit",t=>{t.preventDefault(),u("submit","Native form submit intercepted and prevented")}),this.form.addEventListener("input",t=>{let e=t.target;e&&(!(e instanceof HTMLInputElement)&&!(e instanceof HTMLTextAreaElement)&&!(e instanceof HTMLSelectElement)||this.handleLiveValidation())}),this.itiInstances.forEach((t,e)=>{e.addEventListener("countrychange",()=>{a("countrychange",`Country changed on field: "${e.name}"`),this.stepHasBeenValidated&&this.handleLiveValidation()})}),this.form.addEventListener("change",t=>{let e=t.target;e&&e instanceof HTMLInputElement&&e.type==="radio"&&e.name==="flow-type"&&(a("flowChange",`Flow type changed to: "${e.value}"`),this.applyFlowConditions())}),this.form.addEventListener("input",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)}),this.form.addEventListener("change",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)})}handleLiveValidation(){if(!this.stepHasBeenValidated)return;a("liveValidation",`Running on step ${this.currentStepIndex}`);let t=this.validateStep(this.currentStepIndex);this.clearErrors(),Object.keys(t).length>0?(a("liveValidation","Errors still present:",t),this.showErrors(t)):a("liveValidation","All errors cleared")}showStep(t){if(a("showStep",`Transitioning to step ${t}`),t<0||t>=this.steps.length){h("showStep",`Invalid step index: ${t} (total steps: ${this.steps.length})`);return}this.steps.forEach((r,n)=>{r.style.display=n===t?"flex":"none"}),this.currentStepIndex=t,this.stepHasBeenValidated=!1,this.clearErrors();let e=t+1;this.updateStepText(e),this.applyStepStyles(e),a("showStep",`Now on step ${e}, fields in step:`,this.getFieldsForStep(t).map(r=>r.name||"(unnamed)"))}next(){g(`next (from step ${this.currentStepIndex+1})`),this.stepHasBeenValidated=!0;let t=this.validateStep(this.currentStepIndex);if(Object.keys(t).length>0){u("next","Validation failed, cannot proceed:",t),this.clearErrors(),this.showErrors(t),this.focusFirstError(t),f();return}a("next","Validation passed"),this.clearErrors(),this.stepHasBeenValidated=!1;let e=this.currentStepIndex+1;if(e>=this.steps.length){a("next","Last step reached \u2192 submitting form");let n=this.steps[this.currentStepIndex].querySelector('[data-action="next"]');if(n){let s=n.querySelector("[data-action-text]");s?(s.textContent="Submitting...",a("next","Button text set to 'Submitting...'")):u("next","No [data-action-text] element found inside next button")}else u("next","No [data-action='next'] button found in current step");a("next","Final field state before submit:",this.getFormStateJSON()),this.mirrorFieldStateToDOM(),this.loadCalendarEmbed();let i=document.getElementById("webflow-form-submit"),o=document.getElementById("hubspot-form-submit");i||h("submit","Missing #webflow-form-submit button in DOM!"),o||h("submit","Missing #hubspot-form-submit button in DOM!"),i&&o?(a("submit","Clicking both submit buttons (Webflow + HubSpot)"),i.click(),o.click()):h("submit","One or both submit buttons not found \u2014 form NOT submitted"),f();return}a("next",`Moving to step ${e+1}`),this.showStep(e),f()}showErrors(t){a("showErrors",`Displaying ${Object.keys(t).length} errors:`,t),Object.entries(t).forEach(([e,r])=>{let n=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(n){n.classList.add("has-error");let s=n.querySelector(".field-error");s||(s=document.createElement("div"),s.className="field-error",n.appendChild(s)),s.textContent=L[r],s.setAttribute("data-error-code",r),a("showErrors",`Group error: "${e}" \u2192 ${r}`);return}let i=this.form.querySelector(`[name="${e}"]`);if(!i){u("showErrors",`Cannot find field or group for error key: "${e}"`);return}i.classList.add("has-error");let o=i.parentElement?.querySelector(".field-error");o||(o=document.createElement("div"),o.className="field-error",i.parentElement?.appendChild(o)),o.textContent=L[r],o.setAttribute("data-error-code",r),a("showErrors",`Field error: "${e}" \u2192 ${r}`)})}clearErrors(){let t=this.form.querySelectorAll(".field-error"),e=this.form.querySelectorAll(".has-error");(t.length>0||e.length>0)&&a("clearErrors",`Removing ${t.length} error messages and ${e.length} error classes`),t.forEach(r=>r.remove()),e.forEach(r=>r.classList.remove("has-error"))}back(){let t=this.currentStepIndex-1;if(t<0){u("back","Already at first step, cannot go back");return}a("back",`Going back from step ${this.currentStepIndex+1} to step ${t+1}`),this.showStep(t)}getFieldsForStep(t){let e=this.steps[t];if(!e)return h("getFieldsForStep",`Step at index ${t} does not exist`),[];let r=Array.from(e.querySelectorAll("input, select, textarea"));return a("getFieldsForStep",`Step ${t}: found ${r.length} fields`,r.map(n=>`${n.name||"(unnamed)"}[${n.type}]${n.disabled?" DISABLED":""}${n.hasAttribute("required")?" REQ":""}`)),r}validateStep(t){g(`validateStep(${t})`);let e={};this.getFieldsForStep(t).forEach(s=>{let c=s.name;if(!c){u("validate",`Skipping unnamed field (type: ${s.type})`);return}if(s.type==="checkbox"||s.type==="radio")return;let l=s.value.trim();if(s.hasAttribute("required")&&!l){e[c]="required",a("validate",`"${c}" \u2192 REQUIRED but empty`);return}if(s.type==="email"&&l){if(!this.isValidEmailFormat(l)){e[c]="email_invalid",a("validate",`"${c}" \u2192 email format invalid: "${l}"`);return}if(!this.isCompanyEmail(l)){e[c]="email_company",a("validate",`"${c}" \u2192 personal email blocked: "${l}"`);return}}if(s.type==="tel"&&l&&this.validatePhoneField(s)){e[c]="phone_invalid",a("validate",`"${c}" \u2192 phone invalid: "${l}"`);return}});let n=this.validateRequiredSelectionGroups(t),i=this.validateLegalGroups(t),o={...e,...n,...i};return Object.keys(o).length===0?a("validateStep","\u2705 All clear \u2014 no errors"):a("validateStep",`\u274C ${Object.keys(o).length} error(s):`,o),f(),o}validateRequiredSelectionGroups(t){let e=this.steps[t],r={},n=e.querySelectorAll("[data-required-group]");return a("validateGroups",`Step ${t}: found ${n.length} selection groups`),n.forEach(i=>{let o=i.dataset.requiredGroup;if(!o)return;let c=Array.from(i.querySelectorAll('input[type="checkbox"], input[type="radio"]')).filter(p=>!p.disabled);if(c.length===0){a("validateGroups",`Group "${o}": no enabled inputs \u2192 skipping`);return}if(!c.some(p=>p.checked))r[o]="selection_required",a("validateGroups",`Group "${o}": nothing selected (${c.length} enabled inputs)`);else{let p=c.filter(m=>m.checked).map(m=>m.value);a("validateGroups",`Group "${o}": selected \u2192 [${p.join(", ")}]`)}}),r}validateLegalGroups(t){let e=this.steps[t],r={},n=e.querySelectorAll("[data-required-legal]");return a("validateLegal",`Step ${t}: found ${n.length} legal groups`),n.forEach(i=>{let o=i.dataset.requiredLegal;if(!o)return;let s=i.querySelector('input[type="checkbox"]');if(!s||s.disabled){a("validateLegal",`Legal "${o}": checkbox missing or disabled \u2192 skipping`);return}s.checked||(r[o]="legal_required",a("validateLegal",`Legal "${o}": not checked`))}),r}isValidEmailFormat(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}isCompanyEmail(t){let e=["gmail.com","yahoo.com","hotmail.com","outlook.com","icloud.com","aol.com"],r=t.split("@")[1]?.toLowerCase();return r?!e.includes(r):!1}validatePhoneField(t){let e=this.itiInstances.get(t);return e?t.value.trim()?e.isValidNumber()?null:"phone_invalid":null:(u("phoneValidation",`No ITI instance found for field "${t.name}" \u2014 skipping phone validation`),null)}focusFirstError(t){let e=Object.keys(t)[0];if(!e)return;a("focus",`Focusing first error field: "${e}"`);let r=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(r){let i=r.querySelector("input, select, textarea");i?i.focus():u("focus",`Group "${e}" has no focusable input`);return}let n=this.form.querySelector(`[name="${e}"]`);n?n.focus():u("focus",`Could not find any element to focus for "${e}"`)}getFlowType(){let t=this.form.querySelector('[data-required-group="flow-type"]');if(!t)return u("getFlowType",'No [data-required-group="flow-type"] element found'),null;let r=t.querySelector('input[type="radio"]:checked')?.value??null;return a("getFlowType",`Current flow type: "${r}"`),r}applyFlowConditions(){g("applyFlowConditions");let t=this.getFlowType();if(!t){u("flowConditions","No flow type selected \u2014 skipping"),f();return}let e=N[t]||[];e.length===0?u("flowConditions",`No FLOW_CONDITIONS entry for flow type: "${t}"`):a("flowConditions",`Visible conditional blocks: [${e.join(", ")}]`);let r=this.form.querySelectorAll("[data-conditional]");a("flowConditions",`Total conditional blocks in form: ${r.length}`),r.forEach(n=>{let i=n.dataset.conditional;if(!i)return;let o=e.includes(i),s=n.querySelectorAll("input, select, textarea");if(o)n.style.display="",s.forEach(c=>{c.disabled=!1,this.originalRequired.get(c)&&c.setAttribute("required","true")}),a("flowConditions",`SHOW block "${i}" (${s.length} inputs enabled)`);else{n.style.display="none",s.forEach(l=>{l.disabled=!0,l.removeAttribute("required"),l instanceof HTMLInputElement?l.type==="checkbox"||l.type==="radio"?l.checked=!1:l.value="":l instanceof HTMLSelectElement?l.selectedIndex=0:l instanceof HTMLTextAreaElement&&(l.value="");let p=l.closest("[data-field-key]");if(!p)return;let m=p.dataset.fieldKey;if(!m)return;let y=this.fieldState.get(m);y&&(y.required=!1,y.valid=!0,y.value="",this.fieldState.set(m,y))});let c=n.dataset.fieldKey;if(c){let l=this.fieldState.get(c);l&&(l.required=!1,l.valid=!0,l.value="",this.fieldState.set(c,l))}this.clearErrorsInBlock(n),a("flowConditions",`HIDE block "${i}" (${s.length} inputs disabled & cleared)`)}}),this.updateValidityForStep(this.currentStepIndex+1),f()}cacheOriginalRequiredState(){let t=this.form.querySelectorAll("input, select, textarea"),e=0;t.forEach(r=>{let n=r.hasAttribute("required");this.originalRequired.set(r,n),n&&e++}),a("cacheRequired",`Cached ${t.length} inputs, ${e} originally required`)}clearErrorsInBlock(t){t.querySelectorAll(".field-error").forEach(e=>e.remove()),t.querySelectorAll(".has-error").forEach(e=>e.classList.remove("has-error"))}initializeFieldState(){let t=this.form.querySelectorAll("[data-field-key]");a("initFieldState",`Found ${t.length} trackable [data-field-key] elements`),t.forEach(e=>{let r=e.dataset.fieldKey;if(!r)return;let n=e.closest("[data-msf='step']"),i=n?Number(n.dataset.step):this.currentStepIndex+1;n||u("initFieldState",`Field "${r}" is not inside a [data-msf="step"] element \u2014 defaulting to step ${i}`),this.fieldState.set(r,{"field-name":r,value:"",required:!1,valid:!0,"step-number":i})}),a("initFieldState","Initialized keys:",Array.from(this.fieldState.keys()))}updateFieldState(t){let e=this.form.querySelector(`[data-field-key="${t}"]`);if(!e){u("updateFieldState",`No element found for field key: "${t}"`);return}let r="",n=!1;if(e.hasAttribute("data-group")){let l=Array.from(e.querySelectorAll("input[type='radio'], input[type='checkbox']")).filter(p=>!p.disabled);if(n=e.hasAttribute("data-required-group"),l.some(p=>p.type==="radio")){let p=l.find(m=>m.checked);p?r=p.closest("label")?.querySelector("span")?.textContent?.trim()??p.value??"":r=""}else r=l.filter(m=>m.checked).map(m=>m.closest("label")?.querySelector("span")?.textContent?.trim()??m.value??"").join(",")}else if(e.hasAttribute("data-required-legal")){let l=e.querySelector("input[type='checkbox']");l&&!l.disabled&&(n=!0,r=l.checked?"true":"false")}else(e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement)&&(n=e.hasAttribute("required")&&!e.disabled,e instanceof HTMLInputElement&&e.type==="checkbox"?r=e.checked?"true":"false":r=e.value.trim());let i=e.closest("[data-msf='step']"),o=i?Number(i.dataset.step):this.currentStepIndex+1,s=this.fieldState.get(t);if(!s){u("updateFieldState",`No state entry for key "${t}" \u2014 was it initialized?`);return}let c=s.value;s.value=r,s.required=n,s["step-number"]=o,this.fieldState.set(t,s),c!==r&&a("updateFieldState",`"${t}": "${c}" \u2192 "${r}" (required: ${n})`),this.updateValidityForStep(o)}updateValidityForStep(t){let e=this.steps.findIndex(i=>Number(i.dataset.step)===t);if(e===-1){u("updateValidity",`No step element found with data-step="${t}"`);return}let r=this.validateStep(e);Array.from(this.fieldState.values()).filter(i=>i["step-number"]===t).forEach(i=>{let o=i.valid;i.valid=!r[i["field-name"]],o!==i.valid&&a("updateValidity",`"${i["field-name"]}": valid ${o} \u2192 ${i.valid}`)})}getFormStateJSON(){return Array.from(this.fieldState.values())}updateStepText(t){let e=R[t];if(!e){u("updateStepText",`No STEP_TEXT config for step ${t}`);return}if(e.heading){let r=this.form.querySelector('[data-dynamic-text="heading"]');r?r.textContent=e.heading:u("updateStepText",'Missing [data-dynamic-text="heading"] element')}if(e.subheading){let r=this.form.querySelector('[data-dynamic-text="subheading"]');r?r.textContent=e.subheading:u("updateStepText",'Missing [data-dynamic-text="subheading"] element')}if(e.counter){let r=this.form.querySelector('[data-dynamic-text="counter"]');r?r.textContent=e.counter:u("updateStepText",'Missing [data-dynamic-text="counter"] element')}}syncAllFieldState(){a("syncAll","Syncing all field state..."),this.fieldState.forEach((t,e)=>{this.updateFieldState(e)}),a("syncAll","Sync complete. Full state:",this.getFormStateJSON())}mirrorFieldStateToDOM(){g("mirrorFieldStateToDOM");let t=this.getFormStateJSON(),e=document.getElementById("form-hubspot-book-a-demo");if(!e){h("mirror","HubSpot form #form-hubspot-book-a-demo NOT FOUND in DOM!"),f();return}let r=0,n=0;t.forEach(i=>{let o=e?.querySelector(`[data-mirror="${i["field-name"]}"]`);if(!o){u("mirror",`No mirror element for data-mirror="${i["field-name"]}"`),n++;return}if(o instanceof HTMLInputElement&&o.disabled){a("mirror",`Skipping disabled mirror: "${i["field-name"]}"`);return}o instanceof HTMLInputElement?o.type==="checkbox"?o.checked=i.value==="true":o.type==="radio"?o.checked=o.value===i.value:o.value=i.value:o.value=i.value,r++,a("mirror",`"${i["field-name"]}" \u2192 "${i.value}"`)}),a("mirror",`Done: ${r} mirrored, ${n} missing`),f()}resolveCalendarEntry(){let t=this.fieldState.get("company_type")?.value??"",e=this.fieldState.get("industry")?.value??"";a("calendar",`Resolving: companyType="${t}", industry="${e}"`);let r=M.find(i=>i.type==="company_type"&&i.name===t);if(r)return a("calendar",`Matched by company_type \u2192 "${r["calender-name"]}" (${r["embed-url"]})`),r;let n=M.find(i=>i.type==="industry"&&i.name===e);return n?a("calendar",`Matched by industry \u2192 "${n["calender-name"]}" (${n["embed-url"]})`):u("calendar","No matching calendar entry found for current selections"),n??null}loadCalendarEmbed(){g("loadCalendarEmbed");let t=document.querySelector("[hs-calender-block]");if(!t){h("calendar","No [hs-calender-block] element found in DOM!"),f();return}let e=this.resolveCalendarEntry();if(!e){t.setAttribute("hs-calender-block-active","false"),t.innerHTML="",u("calendar","No entry \u2192 embed cleared, block set to inactive"),f();return}t.setAttribute("hs-calender-block-active","true"),t.innerHTML="";let r=document.createElement("div");r.className="meetings-iframe-container",r.setAttribute("data-src",e["embed-url"]),t.appendChild(r);let n="https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js",i=document.querySelector(`script[src="${n}"]`);i&&(a("calendar","Removing existing HubSpot meetings script"),i.remove());let o=document.createElement("script");o.type="text/javascript",o.src=n,o.addEventListener("load",()=>{a("calendar","HubSpot meetings script loaded successfully")}),o.addEventListener("error",s=>{h("calendar","HubSpot meetings script FAILED to load:",s)}),t.appendChild(o),a("calendar",`Embed loaded: "${e["calender-name"]}" \u2192 ${e["embed-url"]}`),f()}applyStepStyles(t){let e=A[t];if(!e){u("applyStepStyles",`No STEP_STYLES config for step ${t}`);return}e.forEach(({selector:r,property:n,value:i})=>{let o=document.querySelectorAll(r);o.length===0&&u("applyStepStyles",`Selector "${r}" matched 0 elements`),o.forEach(s=>{s.style.setProperty(n,i)})}),a("applyStepStyles",`Applied ${e.length} style rules for step ${t}`)}};document.addEventListener("DOMContentLoaded",()=>{E&&console.log("%c[MSF] \u{1F527} STAGING MODE ACTIVE \u2014 debug logging enabled","color:#0f0;font-weight:bold;font-size:14px;background:#222;padding:4px 8px;border-radius:4px");let d=document.querySelector('[data-msf="form"]');if(!d){h("boot",'No form element found with [data-msf="form"] \u2014 MultiStepForm NOT initialized');return}a("boot","Form element found, initializing intl-tel-input...");let t;try{t=T({root:d}),a("boot",`intl-tel-input ready, ${t.size} phone fields initialized`)}catch(e){h("boot","intl-tel-input initialization FAILED:",e),t=new Map}try{let e=new b(d,t);window.msf=e,a("boot","MultiStepForm instance created and exposed as window.msf")}catch(e){h("boot","MultiStepForm constructor THREW:",e)}});})();
|
package/dist/form/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/form/utils/initIntlTelInput.ts", "../../src/form/index.ts"],
|
|
4
|
-
"sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\n\ntype StepEl = HTMLElement;\n\ntype ErrorCode =\n | \"required\"\n | \"email_invalid\"\n | \"email_company\"\n | \"phone_invalid\"\n | \"selection_required\"\n | \"legal_required\";\n\ntype StepStyle = {\n selector: string;\n property: string;\n value: string;\n};\n\nconst STEP_STYLES: Record<number, StepStyle[]> = {\n 1: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"none\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"50%\" },\n ],\n 2: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"flex\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"100%\" },\n ],\n};\n\ntype CalendarEntry = {\n type: \"company_type\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n};\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"company_type\",\n name: \"Record Label / Music Distributor\",\n \"calender-name\": \"valeria\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n required: \"This field is required\",\n email_invalid: \"Please enter a valid email address\",\n email_company: \"Please use your company email address\",\n phone_invalid: \"Please enter a valid phone number\",\n selection_required: \"Please select at least one option\",\n legal_required: \"You must accept this to continue\"\n};\n\ntype FieldState = {\n \"field-name\": string;\n value: string;\n required: boolean;\n valid: boolean;\n \"step-number\": number;\n};\n\nconst FLOW_CONDITIONS: Record<string, string[]> = {\n \"pulse-demo\": [\n \"pulse-demo-only\",\n \"common-fields\"\n ],\n \"white-glove-services\": [\n \"white-glove-only\",\n \"common-fields\"\n ]\n};\n\nconst STEP_TEXT: Record<number, { heading?: string; subheading?: string; counter?: string }> = {\n 1: {\n heading: \"Your info\",\n subheading: \"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.\",\n counter: \"Step 1/2\"\n },\n 2: {\n heading: \"Personalize\",\n subheading: \"Help us personalize your demo.\",\n counter: \"Step 2/2\"\n }\n};\n\nclass MultiStepForm {\n private form: HTMLFormElement;\n private steps: StepEl[];\n private currentStepIndex = 0;\n private itiInstances: Map<HTMLInputElement, any>;\n private stepHasBeenValidated = false;\n private originalRequired = new WeakMap<HTMLElement, boolean>();\n private fieldState = new Map<string, FieldState>();\n\n\n constructor(form: HTMLFormElement, itiInstances: Map<HTMLInputElement, any>) {\n this.form = form;\n this.itiInstances = itiInstances;\n\n this.steps = Array.from(\n form.querySelectorAll<HTMLElement>('[data-msf=\"step\"]')\n );\n\n this.bindEvents();\n this.cacheOriginalRequiredState();\n this.initializeFieldState();\n this.showStep(0);\n this.applyFlowConditions();\n this.syncAllFieldState();\n }\n\n private bindEvents() {\n this.form.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const btn = target.closest<HTMLElement>(\"[data-action]\");\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === \"next\") {\n e.preventDefault();\n this.next();\n }\n\n if (action === \"back\") {\n e.preventDefault();\n this.back();\n }\n });\n\n // Prevent Webflow native submit until you decide\n this.form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n // Only care about fields\n if (\n !(target instanceof HTMLInputElement) &&\n !(target instanceof HTMLTextAreaElement) &&\n !(target instanceof HTMLSelectElement)\n ) return;\n\n this.handleLiveValidation();\n });\n\n this.itiInstances.forEach((_iti, input) => {\n input.addEventListener(\"countrychange\", () => {\n if (!this.stepHasBeenValidated) return;\n this.handleLiveValidation();\n });\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n target instanceof HTMLInputElement &&\n target.type === \"radio\" &&\n target.name === \"flow-type\"\n ) {\n this.applyFlowConditions();\n }\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n }\n\n private handleLiveValidation() {\n if (!this.stepHasBeenValidated) return;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n this.clearErrors();\n\n if (Object.keys(errors).length > 0) {\n this.showErrors(errors);\n }\n }\n private showStep(index: number) {\n this.steps.forEach((step, i) => {\n step.style.display = i === index ? \"flex\" : \"none\";\n });\n\n this.currentStepIndex = index;\n\n this.stepHasBeenValidated = false;\n this.clearErrors();\n\n const stepNumber = index + 1;\n this.updateStepText(stepNumber);\n this.applyStepStyles(stepNumber);\n }\n\n private next() {\n this.stepHasBeenValidated = true;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n if (Object.keys(errors).length > 0) {\n this.clearErrors();\n this.showErrors(errors);\n this.focusFirstError(errors);\n return;\n }\n\n this.clearErrors();\n this.stepHasBeenValidated = false;\n\n const nextIndex = this.currentStepIndex + 1;\n\n // If this is the last step \u2192 treat as submit\n if (nextIndex >= this.steps.length) {\n console.log(\"Validation passed\");\n\n // Find the current step\n const currentStep = this.steps[this.currentStepIndex];\n\n // Find the next button inside this step\n const nextButton = currentStep.querySelector<HTMLElement>('[data-action=\"next\"]');\n\n if (nextButton) {\n const actionTextEl = nextButton.querySelector<HTMLElement>('[data-action-text]');\n if (actionTextEl) {\n actionTextEl.textContent = \"Submitting...\";\n }\n }\n\n this.mirrorFieldStateToDOM();\n this.loadCalendarEmbed();\n\n const webflowSubmitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n\n if (webflowSubmitBtn && hubspotSubmitBtn) {\n webflowSubmitBtn.click();\n hubspotSubmitBtn.click();\n } else {\n console.warn(\"Submit button not found\");\n }\n\n return;\n }\n\n // Otherwise go to next step normally\n this.showStep(nextIndex);\n }\n\n private showErrors(errors: Record<string, ErrorCode>) {\n Object.entries(errors).forEach(([name, message]) => {\n\n // First check for group wrapper\n const groupEl =\n this.form.querySelector<HTMLElement>(`[data-required-group=\"${name}\"]`) ||\n this.form.querySelector<HTMLElement>(`[data-required-legal=\"${name}\"]`);\n\n if (groupEl) {\n groupEl.classList.add(\"has-error\");\n\n let errorEl = groupEl.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n groupEl.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n return;\n }\n\n // Otherwise treat as normal field\n const field = this.form.querySelector<HTMLInputElement>(`[name=\"${name}\"]`);\n if (!field) return;\n\n field.classList.add(\"has-error\");\n\n let errorEl = field.parentElement?.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n field.parentElement?.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n });\n }\n\n private clearErrors() {\n this.form.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n this.form.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private back() {\n const prevIndex = this.currentStepIndex - 1;\n if (prevIndex < 0) return;\n this.showStep(prevIndex);\n }\n\n private getFieldsForStep(index: number): HTMLInputElement[] {\n const step = this.steps[index];\n return Array.from(\n step.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n )\n ) as HTMLInputElement[];\n }\n\n private validateStep(index: number): Record<string, ErrorCode> {\n const errors: Record<string, ErrorCode> = {};\n\n const fields = this.getFieldsForStep(index);\n\n fields.forEach((field) => {\n const name = field.name;\n if (!name) return;\n\n if (field.type === \"checkbox\" || field.type === \"radio\") return;\n\n const value = field.value.trim();\n const isRequired = field.hasAttribute(\"required\");\n\n if (isRequired && !value) {\n errors[name] = \"required\";\n return;\n }\n\n // Custom email validation\n if (field.type === \"email\" && value) {\n if (!this.isValidEmailFormat(value)) {\n errors[name] = \"email_invalid\";\n return;\n }\n\n if (!this.isCompanyEmail(value)) {\n errors[name] = \"email_company\";\n return;\n }\n }\n\n // Custom phone validation\n if (field.type === \"tel\" && value) {\n const phoneError = this.validatePhoneField(field as HTMLInputElement);\n if (phoneError) {\n errors[name] = \"phone_invalid\";\n return;\n }\n }\n });\n\n const selectionGroupErrors = this.validateRequiredSelectionGroups(index);\n const legalErrors = this.validateLegalGroups(index);\n\n return {\n ...errors,\n ...selectionGroupErrors,\n ...legalErrors\n };\n }\n\n private validateRequiredSelectionGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const groups = step.querySelectorAll<HTMLElement>(\"[data-required-group]\");\n\n groups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredGroup;\n if (!groupName) return;\n\n const inputs = Array.from(\n groupEl.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"], input[type=\"radio\"]'\n )\n );\n\n // Only consider enabled inputs\n const enabledInputs = inputs.filter((input) => !input.disabled);\n\n // If no enabled inputs \u2192 group is structurally inactive \u2192 skip validation\n if (enabledInputs.length === 0) return;\n\n const isChecked = enabledInputs.some((input) => input.checked);\n\n if (!isChecked) {\n errors[groupName] = \"selection_required\";\n }\n });\n\n return errors;\n }\n\n private validateLegalGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const legalGroups = step.querySelectorAll<HTMLElement>(\"[data-required-legal]\");\n\n legalGroups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredLegal;\n if (!groupName) return;\n\n const checkbox = groupEl.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n\n // If checkbox doesn't exist or is disabled \u2192 skip validation\n if (!checkbox || checkbox.disabled) return;\n\n if (!checkbox.checked) {\n errors[groupName] = \"legal_required\";\n }\n });\n\n return errors;\n }\n\n private isValidEmailFormat(email: string): boolean {\n const emailRegex =\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private isCompanyEmail(email: string): boolean {\n const publicDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"icloud.com\",\n \"aol.com\"\n ];\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n\n return !publicDomains.includes(domain);\n }\n\n private validatePhoneField(field: HTMLInputElement): ErrorCode | null {\n const iti = this.itiInstances.get(field);\n if (!iti) return null;\n\n const value = field.value.trim();\n if (!value) return null;\n\n if (!iti.isValidNumber()) {\n return \"phone_invalid\";\n }\n\n return null;\n }\n\n private focusFirstError(errors: Record<string, ErrorCode>) {\n const firstErrorName = Object.keys(errors)[0];\n if (!firstErrorName) return;\n\n const groupEl =\n this.form.querySelector<HTMLElement>(\n `[data-required-group=\"${firstErrorName}\"]`\n ) ||\n this.form.querySelector<HTMLElement>(\n `[data-required-legal=\"${firstErrorName}\"]`\n );\n\n if (groupEl) {\n const firstInput = groupEl.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n firstInput?.focus();\n return;\n }\n\n const field = this.form.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(`[name=\"${firstErrorName}\"]`);\n\n field?.focus();\n }\n\n private getFlowType(): string | null {\n const flowWrapper = this.form.querySelector<HTMLElement>(\n '[data-required-group=\"flow-type\"]'\n );\n if (!flowWrapper) return null;\n\n const checked = flowWrapper.querySelector<HTMLInputElement>(\n 'input[type=\"radio\"]:checked'\n );\n\n return checked?.value ?? null;\n }\n\n private applyFlowConditions() {\n const flowType = this.getFlowType();\n if (!flowType) return;\n\n const visibleKeys = FLOW_CONDITIONS[flowType] || [];\n\n const conditionalBlocks = this.form.querySelectorAll<HTMLElement>(\n \"[data-conditional]\"\n );\n\n conditionalBlocks.forEach((block) => {\n const key = block.dataset.conditional;\n if (!key) return;\n\n const shouldShow = visibleKeys.includes(key);\n\n const inputs = block.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (shouldShow) {\n block.style.display = \"\";\n\n inputs.forEach((input) => {\n input.disabled = false;\n\n const wasRequired = this.originalRequired.get(input);\n if (wasRequired) {\n input.setAttribute(\"required\", \"true\");\n }\n });\n } else {\n block.style.display = \"none\";\n\n inputs.forEach((input) => {\n input.disabled = true;\n input.removeAttribute(\"required\");\n\n // Clear DOM values\n if (input instanceof HTMLInputElement) {\n if (input.type === \"checkbox\" || input.type === \"radio\") {\n input.checked = false;\n } else {\n input.value = \"\";\n }\n } else if (input instanceof HTMLSelectElement) {\n input.selectedIndex = 0;\n } else if (input instanceof HTMLTextAreaElement) {\n input.value = \"\";\n }\n\n // Sync fieldState for hidden inputs\n const trackable = input.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const fieldKey = trackable.dataset.fieldKey;\n if (!fieldKey) return;\n\n const state = this.fieldState.get(fieldKey);\n if (!state) return;\n\n state.required = false;\n state.valid = true;\n state.value = \"\";\n\n this.fieldState.set(fieldKey, state);\n });\n\n // Sync wrapper-level fieldState if wrapper itself is tracked\n const wrapperKey = block.dataset.fieldKey;\n if (wrapperKey) {\n const state = this.fieldState.get(wrapperKey);\n if (state) {\n state.required = false;\n state.valid = true;\n state.value = \"\";\n this.fieldState.set(wrapperKey, state);\n }\n }\n\n this.clearErrorsInBlock(block);\n }\n });\n\n // Recalculate validity after structural changes\n this.updateValidityForStep(this.currentStepIndex + 1);\n }\n\n private cacheOriginalRequiredState() {\n const inputs = this.form.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n inputs.forEach((input) => {\n this.originalRequired.set(input, input.hasAttribute(\"required\"));\n });\n }\n\n private clearErrorsInBlock(block: HTMLElement) {\n block.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n block.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private initializeFieldState() {\n const trackables = this.form.querySelectorAll<HTMLElement>(\n \"[data-field-key]\"\n );\n\n trackables.forEach((el) => {\n const key = el.dataset.fieldKey;\n if (!key) return;\n\n const stepWrapper = el.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n this.fieldState.set(key, {\n \"field-name\": key,\n value: \"\",\n required: false,\n valid: true,\n \"step-number\": stepNumber\n });\n });\n }\n\n private updateFieldState(key: string) {\n const element = this.form.querySelector<HTMLElement>(\n `[data-field-key=\"${key}\"]`\n );\n if (!element) return;\n\n let value = \"\";\n let required = false;\n\n // If wrapper group\n if (element.hasAttribute(\"data-group\")) {\n const inputs = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n \"input[type='radio'], input[type='checkbox']\"\n )\n ).filter((i) => !i.disabled);\n\n required = element.hasAttribute(\"data-required-group\");\n\n if (inputs.some((i) => i.type === \"radio\")) {\n const checked = inputs.find((i) => i.checked);\n\n if (checked) {\n const span = checked.closest(\"label\")?.querySelector(\"span\");\n value = span?.textContent?.trim() ?? checked.value ?? \"\";\n } else {\n value = \"\";\n }\n } else {\n const checkedValues = inputs\n .filter((i) => i.checked)\n .map((i) => {\n const span = i.closest(\"label\")?.querySelector(\"span\");\n return span?.textContent?.trim() ?? i.value ?? \"\";\n });\n\n value = checkedValues.join(\",\");\n }\n }\n // Legal wrapper\n else if (element.hasAttribute(\"data-required-legal\")) {\n const checkbox = element.querySelector<HTMLInputElement>(\n \"input[type='checkbox']\"\n );\n\n if (checkbox && !checkbox.disabled) {\n required = true;\n value = checkbox.checked ? \"true\" : \"false\";\n }\n }\n // Normal input\n else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n required = element.hasAttribute(\"required\") && !element.disabled;\n\n if (element instanceof HTMLInputElement && element.type === \"checkbox\") {\n value = element.checked ? \"true\" : \"false\";\n } else {\n value = (element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value.trim();\n }\n }\n\n const stepWrapper = element.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n const state = this.fieldState.get(key);\n if (!state) return;\n\n state.value = value;\n state.required = required;\n state[\"step-number\"] = stepNumber;\n\n this.fieldState.set(key, state);\n\n this.updateValidityForStep(stepNumber);\n }\n\n private updateValidityForStep(stepNumber: number) {\n const stepIndex = this.steps.findIndex(\n (step) => Number(step.dataset.step) === stepNumber\n );\n\n if (stepIndex === -1) return;\n\n const errors = this.validateStep(stepIndex);\n\n const keysInStep = Array.from(this.fieldState.values()).filter(\n (f) => f[\"step-number\"] === stepNumber\n );\n\n keysInStep.forEach((field) => {\n field.valid = !errors[field[\"field-name\"]];\n });\n }\n\n public getFormStateJSON(): FieldState[] {\n return Array.from(this.fieldState.values());\n }\n\n private updateStepText(stepNumber: number) {\n const config = STEP_TEXT[stepNumber];\n if (!config) return;\n\n if (config.heading) {\n const headingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"heading\"]'\n );\n if (headingEl) headingEl.textContent = config.heading;\n }\n\n if (config.subheading) {\n const subheadingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"subheading\"]'\n );\n if (subheadingEl) subheadingEl.textContent = config.subheading;\n }\n\n if (config.counter) {\n const counterEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"counter\"]'\n );\n if (counterEl) counterEl.textContent = config.counter;\n }\n }\n\n private syncAllFieldState() {\n this.fieldState.forEach((_state, key) => {\n this.updateFieldState(key);\n });\n }\n\n private mirrorFieldStateToDOM() {\n const allFields = this.getFormStateJSON();\n const hubspotForm = document.getElementById(\"form-hubspot-book-a-demo\");\n\n allFields.forEach((field) => {\n const mirrorEl = hubspotForm?.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(`[data-mirror=\"${field[\"field-name\"]}\"]`);\n\n if (!mirrorEl) {\n console.warn(\n `[Mirror] No element found with data-mirror=\"${field[\"field-name\"]}\"`\n );\n return;\n }\n\n // Skip disabled mirrors just in case\n if (\n mirrorEl instanceof HTMLInputElement &&\n mirrorEl.disabled\n ) {\n return;\n }\n\n if (mirrorEl instanceof HTMLInputElement) {\n if (mirrorEl.type === \"checkbox\") {\n mirrorEl.checked = field.value === \"true\";\n } else if (mirrorEl.type === \"radio\") {\n mirrorEl.checked = mirrorEl.value === field.value;\n } else {\n mirrorEl.value = field.value;\n }\n } else {\n mirrorEl.value = field.value;\n }\n });\n }\n\n private resolveCalendarEntry(): CalendarEntry | null {\n const companyType = this.fieldState.get(\"company_type\")?.value ?? \"\";\n const industry = this.fieldState.get(\"industry\")?.value ?? \"\";\n\n // Priority: company_type match first\n const byCompanyType = CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"company_type\" && entry.name === companyType\n );\n if (byCompanyType) return byCompanyType;\n\n // Fallback: industry match\n const byIndustry = CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"industry\" && entry.name === industry\n );\n return byIndustry ?? null;\n }\n\n private loadCalendarEmbed() {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n console.warn(\"[Calendar] No [hs-calender-block] element found\");\n return;\n }\n\n const entry = this.resolveCalendarEntry();\n\n if (!entry) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n console.warn(\"[Calendar] No matching calendar entry found\");\n return;\n }\n\n container.setAttribute(\"hs-calender-block-active\", \"true\");\n\n // Clear any previous embed\n container.innerHTML = \"\";\n\n // Inject the HubSpot meetings iframe container\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", entry[\"embed-url\"]);\n container.appendChild(meetingsDiv);\n\n // Load (or re-trigger) the HubSpot embed script\n const scriptSrc =\n \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n `script[src=\"${scriptSrc}\"]`\n );\n if (existingScript) existingScript.remove();\n\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = scriptSrc;\n container.appendChild(script);\n\n console.log(\n `[Calendar] Loaded embed for \"${entry[\"calender-name\"]}\" \u2192 ${entry[\"embed-url\"]}`\n );\n }\n\n private applyStepStyles(stepNumber: number) {\n const styles = STEP_STYLES[stepNumber];\n if (!styles) return;\n\n styles.forEach(({ selector, property, value }) => {\n const els = document.querySelectorAll<HTMLElement>(selector);\n els.forEach((el) => {\n el.style.setProperty(property, value);\n });\n });\n }\n\n}\n\n// Boot\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const form = document.querySelector<HTMLFormElement>('[data-msf=\"form\"]');\n if (!form) return;\n\n const itiInstances = initIntlTelInput({ root: form });\n\n const msf = new MultiStepForm(form, itiInstances);\n\n // expose globally for debugging\n (window as any).msf = msf;\n});"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\n\n// \u2500\u2500\u2500 Debug Helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst IS_STAGING = window.location.host === \"influur-staging.webflow.io\";\n\nfunction dbg(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.log(`%c[MSF:${tag}]`, \"color:#6cf;font-weight:bold\", ...args);\n}\n\nfunction dbgWarn(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.warn(`[MSF:${tag}]`, ...args);\n}\n\nfunction dbgError(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.error(`[MSF:${tag}]`, ...args);\n}\n\nfunction dbgGroup(label: string) {\n if (!IS_STAGING) return;\n console.group(`%c[MSF] ${label}`, \"color:#6cf;font-weight:bold\");\n}\n\nfunction dbgGroupEnd() {\n if (!IS_STAGING) return;\n console.groupEnd();\n}\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ntype StepEl = HTMLElement;\n\ntype ErrorCode =\n | \"required\"\n | \"email_invalid\"\n | \"email_company\"\n | \"phone_invalid\"\n | \"selection_required\"\n | \"legal_required\";\n\ntype StepStyle = {\n selector: string;\n property: string;\n value: string;\n};\n\nconst STEP_STYLES: Record<number, StepStyle[]> = {\n 1: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"none\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"50%\" },\n ],\n 2: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"flex\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"100%\" },\n ],\n};\n\ntype CalendarEntry = {\n type: \"company_type\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n};\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"company_type\",\n name: \"Record Label / Music Distributor\",\n \"calender-name\": \"valeria\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n required: \"This field is required\",\n email_invalid: \"Please enter a valid email address\",\n email_company: \"Please use your company email address\",\n phone_invalid: \"Please enter a valid phone number\",\n selection_required: \"Please select at least one option\",\n legal_required: \"You must accept this to continue\"\n};\n\ntype FieldState = {\n \"field-name\": string;\n value: string;\n required: boolean;\n valid: boolean;\n \"step-number\": number;\n};\n\nconst FLOW_CONDITIONS: Record<string, string[]> = {\n \"pulse-demo\": [\n \"pulse-demo-only\",\n \"common-fields\"\n ],\n \"white-glove-services\": [\n \"white-glove-only\",\n \"common-fields\"\n ]\n};\n\nconst STEP_TEXT: Record<number, { heading?: string; subheading?: string; counter?: string }> = {\n 1: {\n heading: \"Your info\",\n subheading: \"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.\",\n counter: \"Step 1/2\"\n },\n 2: {\n heading: \"Personalize\",\n subheading: \"Help us personalize your demo.\",\n counter: \"Step 2/2\"\n }\n};\n\nclass MultiStepForm {\n private form: HTMLFormElement;\n private steps: StepEl[];\n private currentStepIndex = 0;\n private itiInstances: Map<HTMLInputElement, any>;\n private stepHasBeenValidated = false;\n private originalRequired = new WeakMap<HTMLElement, boolean>();\n private fieldState = new Map<string, FieldState>();\n\n\n constructor(form: HTMLFormElement, itiInstances: Map<HTMLInputElement, any>) {\n this.form = form;\n this.itiInstances = itiInstances;\n\n dbgGroup(\"Constructor\");\n\n this.steps = Array.from(\n form.querySelectorAll<HTMLElement>('[data-msf=\"step\"]')\n );\n\n dbg(\"init\", `Found ${this.steps.length} steps`);\n\n if (this.steps.length === 0) {\n dbgError(\"init\", \"No steps found! Check [data-msf='step'] selectors in HTML.\");\n }\n\n this.steps.forEach((step, i) => {\n const stepNum = step.dataset.step;\n if (!stepNum) {\n dbgWarn(\"init\", `Step element at index ${i} is missing data-step attribute`);\n } else {\n dbg(\"init\", `Step ${i}: data-step=\"${stepNum}\"`);\n }\n });\n\n dbg(\"init\", `ITI instances count: ${itiInstances.size}`);\n\n this.bindEvents();\n this.cacheOriginalRequiredState();\n this.initializeFieldState();\n this.showStep(0);\n this.applyFlowConditions();\n this.syncAllFieldState();\n\n dbg(\"init\", \"Field state after full init:\", this.getFormStateJSON());\n dbgGroupEnd();\n }\n\n private bindEvents() {\n dbg(\"bindEvents\", \"Attaching all event listeners\");\n\n this.form.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const btn = target.closest<HTMLElement>(\"[data-action]\");\n if (!btn) return;\n\n const action = btn.dataset.action;\n dbg(\"click\", `Action button clicked: \"${action}\"`);\n\n if (action === \"next\") {\n e.preventDefault();\n this.next();\n }\n\n if (action === \"back\") {\n e.preventDefault();\n this.back();\n }\n });\n\n this.form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n dbgWarn(\"submit\", \"Native form submit intercepted and prevented\");\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n !(target instanceof HTMLInputElement) &&\n !(target instanceof HTMLTextAreaElement) &&\n !(target instanceof HTMLSelectElement)\n ) return;\n\n this.handleLiveValidation();\n });\n\n this.itiInstances.forEach((_iti, input) => {\n input.addEventListener(\"countrychange\", () => {\n dbg(\"countrychange\", `Country changed on field: \"${input.name}\"`);\n if (!this.stepHasBeenValidated) return;\n this.handleLiveValidation();\n });\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n target instanceof HTMLInputElement &&\n target.type === \"radio\" &&\n target.name === \"flow-type\"\n ) {\n dbg(\"flowChange\", `Flow type changed to: \"${target.value}\"`);\n this.applyFlowConditions();\n }\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n }\n\n private handleLiveValidation() {\n if (!this.stepHasBeenValidated) return;\n\n dbg(\"liveValidation\", `Running on step ${this.currentStepIndex}`);\n\n const errors = this.validateStep(this.currentStepIndex);\n\n this.clearErrors();\n\n if (Object.keys(errors).length > 0) {\n dbg(\"liveValidation\", \"Errors still present:\", errors);\n this.showErrors(errors);\n } else {\n dbg(\"liveValidation\", \"All errors cleared\");\n }\n }\n\n private showStep(index: number) {\n dbg(\"showStep\", `Transitioning to step ${index}`);\n\n if (index < 0 || index >= this.steps.length) {\n dbgError(\"showStep\", `Invalid step index: ${index} (total steps: ${this.steps.length})`);\n return;\n }\n\n this.steps.forEach((step, i) => {\n step.style.display = i === index ? \"flex\" : \"none\";\n });\n\n this.currentStepIndex = index;\n\n this.stepHasBeenValidated = false;\n this.clearErrors();\n\n const stepNumber = index + 1;\n this.updateStepText(stepNumber);\n this.applyStepStyles(stepNumber);\n\n dbg(\"showStep\", `Now on step ${stepNumber}, fields in step:`,\n this.getFieldsForStep(index).map(f => f.name || \"(unnamed)\"));\n }\n\n private next() {\n dbgGroup(`next (from step ${this.currentStepIndex + 1})`);\n\n this.stepHasBeenValidated = true;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n if (Object.keys(errors).length > 0) {\n dbgWarn(\"next\", \"Validation failed, cannot proceed:\", errors);\n this.clearErrors();\n this.showErrors(errors);\n this.focusFirstError(errors);\n dbgGroupEnd();\n return;\n }\n\n dbg(\"next\", \"Validation passed\");\n this.clearErrors();\n this.stepHasBeenValidated = false;\n\n const nextIndex = this.currentStepIndex + 1;\n\n if (nextIndex >= this.steps.length) {\n dbg(\"next\", \"Last step reached \u2192 submitting form\");\n\n const currentStep = this.steps[this.currentStepIndex];\n const nextButton = currentStep.querySelector<HTMLElement>('[data-action=\"next\"]');\n\n if (nextButton) {\n const actionTextEl = nextButton.querySelector<HTMLElement>('[data-action-text]');\n if (actionTextEl) {\n actionTextEl.textContent = \"Submitting...\";\n dbg(\"next\", \"Button text set to 'Submitting...'\");\n } else {\n dbgWarn(\"next\", \"No [data-action-text] element found inside next button\");\n }\n } else {\n dbgWarn(\"next\", \"No [data-action='next'] button found in current step\");\n }\n\n dbg(\"next\", \"Final field state before submit:\", this.getFormStateJSON());\n\n this.mirrorFieldStateToDOM();\n this.loadCalendarEmbed();\n\n const webflowSubmitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n\n if (!webflowSubmitBtn) {\n dbgError(\"submit\", \"Missing #webflow-form-submit button in DOM!\");\n }\n if (!hubspotSubmitBtn) {\n dbgError(\"submit\", \"Missing #hubspot-form-submit button in DOM!\");\n }\n\n if (webflowSubmitBtn && hubspotSubmitBtn) {\n dbg(\"submit\", \"Clicking both submit buttons (Webflow + HubSpot)\");\n webflowSubmitBtn.click();\n hubspotSubmitBtn.click();\n } else {\n dbgError(\"submit\", \"One or both submit buttons not found \u2014 form NOT submitted\");\n }\n\n dbgGroupEnd();\n return;\n }\n\n dbg(\"next\", `Moving to step ${nextIndex + 1}`);\n this.showStep(nextIndex);\n dbgGroupEnd();\n }\n\n private showErrors(errors: Record<string, ErrorCode>) {\n dbg(\"showErrors\", `Displaying ${Object.keys(errors).length} errors:`, errors);\n\n Object.entries(errors).forEach(([name, message]) => {\n\n const groupEl =\n this.form.querySelector<HTMLElement>(`[data-required-group=\"${name}\"]`) ||\n this.form.querySelector<HTMLElement>(`[data-required-legal=\"${name}\"]`);\n\n if (groupEl) {\n groupEl.classList.add(\"has-error\");\n\n let errorEl = groupEl.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n groupEl.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n dbg(\"showErrors\", `Group error: \"${name}\" \u2192 ${message}`);\n return;\n }\n\n const field = this.form.querySelector<HTMLInputElement>(`[name=\"${name}\"]`);\n if (!field) {\n dbgWarn(\"showErrors\", `Cannot find field or group for error key: \"${name}\"`);\n return;\n }\n\n field.classList.add(\"has-error\");\n\n let errorEl = field.parentElement?.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n field.parentElement?.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n dbg(\"showErrors\", `Field error: \"${name}\" \u2192 ${message}`);\n });\n }\n\n private clearErrors() {\n const errorEls = this.form.querySelectorAll(\".field-error\");\n const hasErrorEls = this.form.querySelectorAll(\".has-error\");\n\n if (errorEls.length > 0 || hasErrorEls.length > 0) {\n dbg(\"clearErrors\", `Removing ${errorEls.length} error messages and ${hasErrorEls.length} error classes`);\n }\n\n errorEls.forEach((el) => el.remove());\n hasErrorEls.forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private back() {\n const prevIndex = this.currentStepIndex - 1;\n\n if (prevIndex < 0) {\n dbgWarn(\"back\", \"Already at first step, cannot go back\");\n return;\n }\n\n dbg(\"back\", `Going back from step ${this.currentStepIndex + 1} to step ${prevIndex + 1}`);\n this.showStep(prevIndex);\n }\n\n private getFieldsForStep(index: number): HTMLInputElement[] {\n const step = this.steps[index];\n\n if (!step) {\n dbgError(\"getFieldsForStep\", `Step at index ${index} does not exist`);\n return [];\n }\n\n const fields = Array.from(\n step.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n )\n ) as HTMLInputElement[];\n\n dbg(\"getFieldsForStep\", `Step ${index}: found ${fields.length} fields`,\n fields.map(f => `${f.name || \"(unnamed)\"}[${f.type}]${f.disabled ? \" DISABLED\" : \"\"}${f.hasAttribute(\"required\") ? \" REQ\" : \"\"}`));\n\n return fields;\n }\n\n private validateStep(index: number): Record<string, ErrorCode> {\n dbgGroup(`validateStep(${index})`);\n const errors: Record<string, ErrorCode> = {};\n\n const fields = this.getFieldsForStep(index);\n\n fields.forEach((field) => {\n const name = field.name;\n if (!name) {\n dbgWarn(\"validate\", `Skipping unnamed field (type: ${field.type})`);\n return;\n }\n\n if (field.type === \"checkbox\" || field.type === \"radio\") return;\n\n const value = field.value.trim();\n const isRequired = field.hasAttribute(\"required\");\n\n if (isRequired && !value) {\n errors[name] = \"required\";\n dbg(\"validate\", `\"${name}\" \u2192 REQUIRED but empty`);\n return;\n }\n\n if (field.type === \"email\" && value) {\n if (!this.isValidEmailFormat(value)) {\n errors[name] = \"email_invalid\";\n dbg(\"validate\", `\"${name}\" \u2192 email format invalid: \"${value}\"`);\n return;\n }\n\n if (!this.isCompanyEmail(value)) {\n errors[name] = \"email_company\";\n dbg(\"validate\", `\"${name}\" \u2192 personal email blocked: \"${value}\"`);\n return;\n }\n }\n\n if (field.type === \"tel\" && value) {\n const phoneError = this.validatePhoneField(field as HTMLInputElement);\n if (phoneError) {\n errors[name] = \"phone_invalid\";\n dbg(\"validate\", `\"${name}\" \u2192 phone invalid: \"${value}\"`);\n return;\n }\n }\n });\n\n const selectionGroupErrors = this.validateRequiredSelectionGroups(index);\n const legalErrors = this.validateLegalGroups(index);\n\n const allErrors = {\n ...errors,\n ...selectionGroupErrors,\n ...legalErrors\n };\n\n if (Object.keys(allErrors).length === 0) {\n dbg(\"validateStep\", \"\u2705 All clear \u2014 no errors\");\n } else {\n dbg(\"validateStep\", `\u274C ${Object.keys(allErrors).length} error(s):`, allErrors);\n }\n\n dbgGroupEnd();\n return allErrors;\n }\n\n private validateRequiredSelectionGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const groups = step.querySelectorAll<HTMLElement>(\"[data-required-group]\");\n dbg(\"validateGroups\", `Step ${index}: found ${groups.length} selection groups`);\n\n groups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredGroup;\n if (!groupName) return;\n\n const inputs = Array.from(\n groupEl.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"], input[type=\"radio\"]'\n )\n );\n\n const enabledInputs = inputs.filter((input) => !input.disabled);\n\n if (enabledInputs.length === 0) {\n dbg(\"validateGroups\", `Group \"${groupName}\": no enabled inputs \u2192 skipping`);\n return;\n }\n\n const isChecked = enabledInputs.some((input) => input.checked);\n\n if (!isChecked) {\n errors[groupName] = \"selection_required\";\n dbg(\"validateGroups\", `Group \"${groupName}\": nothing selected (${enabledInputs.length} enabled inputs)`);\n } else {\n const selected = enabledInputs.filter(i => i.checked).map(i => i.value);\n dbg(\"validateGroups\", `Group \"${groupName}\": selected \u2192 [${selected.join(\", \")}]`);\n }\n });\n\n return errors;\n }\n\n private validateLegalGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const legalGroups = step.querySelectorAll<HTMLElement>(\"[data-required-legal]\");\n dbg(\"validateLegal\", `Step ${index}: found ${legalGroups.length} legal groups`);\n\n legalGroups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredLegal;\n if (!groupName) return;\n\n const checkbox = groupEl.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n\n if (!checkbox || checkbox.disabled) {\n dbg(\"validateLegal\", `Legal \"${groupName}\": checkbox missing or disabled \u2192 skipping`);\n return;\n }\n\n if (!checkbox.checked) {\n errors[groupName] = \"legal_required\";\n dbg(\"validateLegal\", `Legal \"${groupName}\": not checked`);\n }\n });\n\n return errors;\n }\n\n private isValidEmailFormat(email: string): boolean {\n const emailRegex =\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private isCompanyEmail(email: string): boolean {\n const publicDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"icloud.com\",\n \"aol.com\"\n ];\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n\n return !publicDomains.includes(domain);\n }\n\n private validatePhoneField(field: HTMLInputElement): ErrorCode | null {\n const iti = this.itiInstances.get(field);\n if (!iti) {\n dbgWarn(\"phoneValidation\", `No ITI instance found for field \"${field.name}\" \u2014 skipping phone validation`);\n return null;\n }\n\n const value = field.value.trim();\n if (!value) return null;\n\n if (!iti.isValidNumber()) {\n return \"phone_invalid\";\n }\n\n return null;\n }\n\n private focusFirstError(errors: Record<string, ErrorCode>) {\n const firstErrorName = Object.keys(errors)[0];\n if (!firstErrorName) return;\n\n dbg(\"focus\", `Focusing first error field: \"${firstErrorName}\"`);\n\n const groupEl =\n this.form.querySelector<HTMLElement>(\n `[data-required-group=\"${firstErrorName}\"]`\n ) ||\n this.form.querySelector<HTMLElement>(\n `[data-required-legal=\"${firstErrorName}\"]`\n );\n\n if (groupEl) {\n const firstInput = groupEl.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (firstInput) {\n firstInput.focus();\n } else {\n dbgWarn(\"focus\", `Group \"${firstErrorName}\" has no focusable input`);\n }\n return;\n }\n\n const field = this.form.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(`[name=\"${firstErrorName}\"]`);\n\n if (field) {\n field.focus();\n } else {\n dbgWarn(\"focus\", `Could not find any element to focus for \"${firstErrorName}\"`);\n }\n }\n\n private getFlowType(): string | null {\n const flowWrapper = this.form.querySelector<HTMLElement>(\n '[data-required-group=\"flow-type\"]'\n );\n if (!flowWrapper) {\n dbgWarn(\"getFlowType\", 'No [data-required-group=\"flow-type\"] element found');\n return null;\n }\n\n const checked = flowWrapper.querySelector<HTMLInputElement>(\n 'input[type=\"radio\"]:checked'\n );\n\n const value = checked?.value ?? null;\n dbg(\"getFlowType\", `Current flow type: \"${value}\"`);\n return value;\n }\n\n private applyFlowConditions() {\n dbgGroup(\"applyFlowConditions\");\n\n const flowType = this.getFlowType();\n if (!flowType) {\n dbgWarn(\"flowConditions\", \"No flow type selected \u2014 skipping\");\n dbgGroupEnd();\n return;\n }\n\n const visibleKeys = FLOW_CONDITIONS[flowType] || [];\n\n if (visibleKeys.length === 0) {\n dbgWarn(\"flowConditions\", `No FLOW_CONDITIONS entry for flow type: \"${flowType}\"`);\n } else {\n dbg(\"flowConditions\", `Visible conditional blocks: [${visibleKeys.join(\", \")}]`);\n }\n\n const conditionalBlocks = this.form.querySelectorAll<HTMLElement>(\n \"[data-conditional]\"\n );\n\n dbg(\"flowConditions\", `Total conditional blocks in form: ${conditionalBlocks.length}`);\n\n conditionalBlocks.forEach((block) => {\n const key = block.dataset.conditional;\n if (!key) return;\n\n const shouldShow = visibleKeys.includes(key);\n\n const inputs = block.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (shouldShow) {\n block.style.display = \"\";\n\n inputs.forEach((input) => {\n input.disabled = false;\n\n const wasRequired = this.originalRequired.get(input);\n if (wasRequired) {\n input.setAttribute(\"required\", \"true\");\n }\n });\n\n dbg(\"flowConditions\", `SHOW block \"${key}\" (${inputs.length} inputs enabled)`);\n } else {\n block.style.display = \"none\";\n\n inputs.forEach((input) => {\n input.disabled = true;\n input.removeAttribute(\"required\");\n\n if (input instanceof HTMLInputElement) {\n if (input.type === \"checkbox\" || input.type === \"radio\") {\n input.checked = false;\n } else {\n input.value = \"\";\n }\n } else if (input instanceof HTMLSelectElement) {\n input.selectedIndex = 0;\n } else if (input instanceof HTMLTextAreaElement) {\n input.value = \"\";\n }\n\n const trackable = input.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const fieldKey = trackable.dataset.fieldKey;\n if (!fieldKey) return;\n\n const state = this.fieldState.get(fieldKey);\n if (!state) return;\n\n state.required = false;\n state.valid = true;\n state.value = \"\";\n\n this.fieldState.set(fieldKey, state);\n });\n\n const wrapperKey = block.dataset.fieldKey;\n if (wrapperKey) {\n const state = this.fieldState.get(wrapperKey);\n if (state) {\n state.required = false;\n state.valid = true;\n state.value = \"\";\n this.fieldState.set(wrapperKey, state);\n }\n }\n\n this.clearErrorsInBlock(block);\n\n dbg(\"flowConditions\", `HIDE block \"${key}\" (${inputs.length} inputs disabled & cleared)`);\n }\n });\n\n this.updateValidityForStep(this.currentStepIndex + 1);\n dbgGroupEnd();\n }\n\n private cacheOriginalRequiredState() {\n const inputs = this.form.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n let reqCount = 0;\n inputs.forEach((input) => {\n const isReq = input.hasAttribute(\"required\");\n this.originalRequired.set(input, isReq);\n if (isReq) reqCount++;\n });\n\n dbg(\"cacheRequired\", `Cached ${inputs.length} inputs, ${reqCount} originally required`);\n }\n\n private clearErrorsInBlock(block: HTMLElement) {\n block.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n block.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private initializeFieldState() {\n const trackables = this.form.querySelectorAll<HTMLElement>(\n \"[data-field-key]\"\n );\n\n dbg(\"initFieldState\", `Found ${trackables.length} trackable [data-field-key] elements`);\n\n trackables.forEach((el) => {\n const key = el.dataset.fieldKey;\n if (!key) return;\n\n const stepWrapper = el.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n if (!stepWrapper) {\n dbgWarn(\"initFieldState\", `Field \"${key}\" is not inside a [data-msf=\"step\"] element \u2014 defaulting to step ${stepNumber}`);\n }\n\n this.fieldState.set(key, {\n \"field-name\": key,\n value: \"\",\n required: false,\n valid: true,\n \"step-number\": stepNumber\n });\n });\n\n dbg(\"initFieldState\", \"Initialized keys:\", Array.from(this.fieldState.keys()));\n }\n\n private updateFieldState(key: string) {\n const element = this.form.querySelector<HTMLElement>(\n `[data-field-key=\"${key}\"]`\n );\n if (!element) {\n dbgWarn(\"updateFieldState\", `No element found for field key: \"${key}\"`);\n return;\n }\n\n let value = \"\";\n let required = false;\n\n if (element.hasAttribute(\"data-group\")) {\n const inputs = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n \"input[type='radio'], input[type='checkbox']\"\n )\n ).filter((i) => !i.disabled);\n\n required = element.hasAttribute(\"data-required-group\");\n\n if (inputs.some((i) => i.type === \"radio\")) {\n const checked = inputs.find((i) => i.checked);\n\n if (checked) {\n const span = checked.closest(\"label\")?.querySelector(\"span\");\n value = span?.textContent?.trim() ?? checked.value ?? \"\";\n } else {\n value = \"\";\n }\n } else {\n const checkedValues = inputs\n .filter((i) => i.checked)\n .map((i) => {\n const span = i.closest(\"label\")?.querySelector(\"span\");\n return span?.textContent?.trim() ?? i.value ?? \"\";\n });\n\n value = checkedValues.join(\",\");\n }\n }\n else if (element.hasAttribute(\"data-required-legal\")) {\n const checkbox = element.querySelector<HTMLInputElement>(\n \"input[type='checkbox']\"\n );\n\n if (checkbox && !checkbox.disabled) {\n required = true;\n value = checkbox.checked ? \"true\" : \"false\";\n }\n }\n else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n required = element.hasAttribute(\"required\") && !element.disabled;\n\n if (element instanceof HTMLInputElement && element.type === \"checkbox\") {\n value = element.checked ? \"true\" : \"false\";\n } else {\n value = (element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value.trim();\n }\n }\n\n const stepWrapper = element.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n const state = this.fieldState.get(key);\n if (!state) {\n dbgWarn(\"updateFieldState\", `No state entry for key \"${key}\" \u2014 was it initialized?`);\n return;\n }\n\n const prevValue = state.value;\n state.value = value;\n state.required = required;\n state[\"step-number\"] = stepNumber;\n\n this.fieldState.set(key, state);\n\n if (prevValue !== value) {\n dbg(\"updateFieldState\", `\"${key}\": \"${prevValue}\" \u2192 \"${value}\" (required: ${required})`);\n }\n\n this.updateValidityForStep(stepNumber);\n }\n\n private updateValidityForStep(stepNumber: number) {\n const stepIndex = this.steps.findIndex(\n (step) => Number(step.dataset.step) === stepNumber\n );\n\n if (stepIndex === -1) {\n dbgWarn(\"updateValidity\", `No step element found with data-step=\"${stepNumber}\"`);\n return;\n }\n\n const errors = this.validateStep(stepIndex);\n\n const keysInStep = Array.from(this.fieldState.values()).filter(\n (f) => f[\"step-number\"] === stepNumber\n );\n\n keysInStep.forEach((field) => {\n const wasValid = field.valid;\n field.valid = !errors[field[\"field-name\"]];\n\n if (wasValid !== field.valid) {\n dbg(\"updateValidity\", `\"${field[\"field-name\"]}\": valid ${wasValid} \u2192 ${field.valid}`);\n }\n });\n }\n\n public getFormStateJSON(): FieldState[] {\n return Array.from(this.fieldState.values());\n }\n\n private updateStepText(stepNumber: number) {\n const config = STEP_TEXT[stepNumber];\n if (!config) {\n dbgWarn(\"updateStepText\", `No STEP_TEXT config for step ${stepNumber}`);\n return;\n }\n\n if (config.heading) {\n const headingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"heading\"]'\n );\n if (headingEl) {\n headingEl.textContent = config.heading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"heading\"] element');\n }\n }\n\n if (config.subheading) {\n const subheadingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"subheading\"]'\n );\n if (subheadingEl) {\n subheadingEl.textContent = config.subheading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"subheading\"] element');\n }\n }\n\n if (config.counter) {\n const counterEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"counter\"]'\n );\n if (counterEl) {\n counterEl.textContent = config.counter;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"counter\"] element');\n }\n }\n }\n\n private syncAllFieldState() {\n dbg(\"syncAll\", \"Syncing all field state...\");\n this.fieldState.forEach((_state, key) => {\n this.updateFieldState(key);\n });\n dbg(\"syncAll\", \"Sync complete. Full state:\", this.getFormStateJSON());\n }\n\n private mirrorFieldStateToDOM() {\n dbgGroup(\"mirrorFieldStateToDOM\");\n\n const allFields = this.getFormStateJSON();\n const hubspotForm = document.getElementById(\"form-hubspot-book-a-demo\");\n\n if (!hubspotForm) {\n dbgError(\"mirror\", \"HubSpot form #form-hubspot-book-a-demo NOT FOUND in DOM!\");\n dbgGroupEnd();\n return;\n }\n\n let mirroredCount = 0;\n let missingCount = 0;\n\n allFields.forEach((field) => {\n const mirrorEl = hubspotForm?.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(`[data-mirror=\"${field[\"field-name\"]}\"]`);\n\n if (!mirrorEl) {\n dbgWarn(\"mirror\", `No mirror element for data-mirror=\"${field[\"field-name\"]}\"`);\n missingCount++;\n return;\n }\n\n if (\n mirrorEl instanceof HTMLInputElement &&\n mirrorEl.disabled\n ) {\n dbg(\"mirror\", `Skipping disabled mirror: \"${field[\"field-name\"]}\"`);\n return;\n }\n\n if (mirrorEl instanceof HTMLInputElement) {\n if (mirrorEl.type === \"checkbox\") {\n mirrorEl.checked = field.value === \"true\";\n } else if (mirrorEl.type === \"radio\") {\n mirrorEl.checked = mirrorEl.value === field.value;\n } else {\n mirrorEl.value = field.value;\n }\n } else {\n mirrorEl.value = field.value;\n }\n\n mirroredCount++;\n dbg(\"mirror\", `\"${field[\"field-name\"]}\" \u2192 \"${field.value}\"`);\n });\n\n dbg(\"mirror\", `Done: ${mirroredCount} mirrored, ${missingCount} missing`);\n dbgGroupEnd();\n }\n\n private resolveCalendarEntry(): CalendarEntry | null {\n const companyType = this.fieldState.get(\"company_type\")?.value ?? \"\";\n const industry = this.fieldState.get(\"industry\")?.value ?? \"\";\n\n dbg(\"calendar\", `Resolving: companyType=\"${companyType}\", industry=\"${industry}\"`);\n\n const byCompanyType = CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"company_type\" && entry.name === companyType\n );\n if (byCompanyType) {\n dbg(\"calendar\", `Matched by company_type \u2192 \"${byCompanyType[\"calender-name\"]}\" (${byCompanyType[\"embed-url\"]})`);\n return byCompanyType;\n }\n\n const byIndustry = CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"industry\" && entry.name === industry\n );\n\n if (byIndustry) {\n dbg(\"calendar\", `Matched by industry \u2192 \"${byIndustry[\"calender-name\"]}\" (${byIndustry[\"embed-url\"]})`);\n } else {\n dbgWarn(\"calendar\", \"No matching calendar entry found for current selections\");\n }\n\n return byIndustry ?? null;\n }\n\n private loadCalendarEmbed() {\n dbgGroup(\"loadCalendarEmbed\");\n\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n dbgError(\"calendar\", \"No [hs-calender-block] element found in DOM!\");\n dbgGroupEnd();\n return;\n }\n\n const entry = this.resolveCalendarEntry();\n\n if (!entry) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n dbgWarn(\"calendar\", \"No entry \u2192 embed cleared, block set to inactive\");\n dbgGroupEnd();\n return;\n }\n\n container.setAttribute(\"hs-calender-block-active\", \"true\");\n container.innerHTML = \"\";\n\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", entry[\"embed-url\"]);\n container.appendChild(meetingsDiv);\n\n const scriptSrc =\n \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n `script[src=\"${scriptSrc}\"]`\n );\n if (existingScript) {\n dbg(\"calendar\", \"Removing existing HubSpot meetings script\");\n existingScript.remove();\n }\n\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = scriptSrc;\n\n script.addEventListener(\"load\", () => {\n dbg(\"calendar\", \"HubSpot meetings script loaded successfully\");\n });\n script.addEventListener(\"error\", (err) => {\n dbgError(\"calendar\", \"HubSpot meetings script FAILED to load:\", err);\n });\n\n container.appendChild(script);\n\n dbg(\"calendar\", `Embed loaded: \"${entry[\"calender-name\"]}\" \u2192 ${entry[\"embed-url\"]}`);\n dbgGroupEnd();\n }\n\n private applyStepStyles(stepNumber: number) {\n const styles = STEP_STYLES[stepNumber];\n if (!styles) {\n dbgWarn(\"applyStepStyles\", `No STEP_STYLES config for step ${stepNumber}`);\n return;\n }\n\n styles.forEach(({ selector, property, value }) => {\n const els = document.querySelectorAll<HTMLElement>(selector);\n if (els.length === 0) {\n dbgWarn(\"applyStepStyles\", `Selector \"${selector}\" matched 0 elements`);\n }\n els.forEach((el) => {\n el.style.setProperty(property, value);\n });\n });\n\n dbg(\"applyStepStyles\", `Applied ${styles.length} style rules for step ${stepNumber}`);\n }\n\n}\n\n// Boot\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n if (IS_STAGING) {\n console.log(\n \"%c[MSF] \uD83D\uDD27 STAGING MODE ACTIVE \u2014 debug logging enabled\",\n \"color:#0f0;font-weight:bold;font-size:14px;background:#222;padding:4px 8px;border-radius:4px\"\n );\n }\n\n const form = document.querySelector<HTMLFormElement>('[data-msf=\"form\"]');\n\n if (!form) {\n dbgError(\"boot\", 'No form element found with [data-msf=\"form\"] \u2014 MultiStepForm NOT initialized');\n return;\n }\n\n dbg(\"boot\", \"Form element found, initializing intl-tel-input...\");\n\n let itiInstances: Map<HTMLInputElement, any>;\n\n try {\n itiInstances = initIntlTelInput({ root: form });\n dbg(\"boot\", `intl-tel-input ready, ${itiInstances.size} phone fields initialized`);\n } catch (err) {\n dbgError(\"boot\", \"intl-tel-input initialization FAILED:\", err);\n itiInstances = new Map();\n }\n\n try {\n const msf = new MultiStepForm(form, itiInstances);\n (window as any).msf = msf;\n dbg(\"boot\", \"MultiStepForm instance created and exposed as window.msf\");\n } catch (err) {\n dbgError(\"boot\", \"MultiStepForm constructor THREW:\", err);\n }\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["errorEl"]
|
|
7
7
|
}
|
package/dist/form/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:none}.radio-checked{display:none}.w-form-formradioinput.w--redirected-checked~.radio-checked{display:flex}.w-checkbox-input--inputType-custom.w--redirected-focus{box-shadow:none}.w-input:focus,.w-select:focus{border-color:transparent;outline:0}.radio-inner-label{color:var(--text-colors--subtext)}input[type=radio]:checked+.radio-inner-label{color:var(--text-colors--title)}.checkbox-label{color:var(--text-colors--subtext)}.w-checkbox-input--inputType-custom.w--redirected-checked{background-color:#f66025;border-color:#f66025}input[type=checkbox]:checked+.checkbox-label{color:var(--text-colors--title)}.checkbox-field:has(input[type=checkbox]:checked){border-color:#f66025}.radio-inner-label,.checkbox-label{transition:color .3s ease}.checkbox-field{transition:border-color .3s ease}.w-checkbox-input--inputType-custom{transition:background-color .3s ease,border-color .3s ease}span.pulse-form-error{color:#e55757;font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}.field-error{color:#e55757;font-size:12px;line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s);position:absolute;bottom:-22px}[data-error-code=legal_required]{bottom:-8px;left:28px}[data-error-code=ERR_LEGAL_REQUIRED]{padding-left:18px}[form-flow-active=false]{display:none}[form-flow-active=true]{display:flex}[fullwidth]{width:100%}[hs-calender-active=true]{display:block;width:100%}[hs-calender-active=false]{display:none}div#iti-0__dropdown-content{background-color:#121212;border-color:#242424}#iti-0__search-input{background:#242424}.iti__search-input-wrapper{border-color:#242424}iframe{border:1px solid transparent!important}.w-form-done{border:1px solid transparent}.hubspot-submitted-form{display:none!important}[hs-calender-block][hs-calender-block-active=false],.step-2,[data-action=back]{display:none}
|
|
1
|
+
.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:none}.radio-checked{display:none}.w-form-formradioinput.w--redirected-checked~.radio-checked{display:flex}.w-checkbox-input--inputType-custom.w--redirected-focus{box-shadow:none}.w-input:focus,.w-select:focus{border-color:transparent;outline:0}.radio-inner-label{color:var(--text-colors--subtext)}input[type=radio]:checked+.radio-inner-label{color:var(--text-colors--title)}.checkbox-label{color:var(--text-colors--subtext)}.w-checkbox-input--inputType-custom.w--redirected-checked{background-color:#f66025;border-color:#f66025}input[type=checkbox]:checked+.checkbox-label{color:var(--text-colors--title)}.checkbox-field:has(input[type=checkbox]:checked){border-color:#f66025}.radio-inner-label,.checkbox-label{transition:color .3s ease}.checkbox-field{transition:border-color .3s ease}.w-checkbox-input--inputType-custom{transition:background-color .3s ease,border-color .3s ease}span.pulse-form-error{color:#e55757;font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}.field-error{color:#e55757;font-size:12px;line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s);position:absolute;bottom:-22px}[data-error-code=legal_required]{bottom:-8px;left:28px}[data-error-code=ERR_LEGAL_REQUIRED]{padding-left:18px}[form-flow-active=false]{display:none}[form-flow-active=true]{display:flex}[fullwidth]{width:100%}[hs-calender-active=true]{display:block;width:100%}[hs-calender-active=false]{display:none}div#iti-0__dropdown-content{background-color:#121212;border-color:#242424}#iti-0__search-input{background:#242424}.iti__search-input-wrapper{border-color:#242424}iframe{border:1px solid transparent!important}.w-form-done{border:1px solid transparent}.hubspot-submitted-form{display:none!important}[hs-calender-block][hs-calender-block-active=false],.step-2,[data-action=back]{display:none}.is-iti-input-wrapper{position:relative;z-index:2}
|
package/dist/form/styles.css.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/form/styles.css"],
|
|
4
|
-
"sourcesContent": [".w-form-formradioinput--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n/* Hide by default */\n.radio-checked {\n display: none;\n}\n\n/* Show when the custom radio is checked */\n.w-form-formradioinput.w--redirected-checked~.radio-checked {\n display: flex;\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n.w-input:focus,\n.w-select:focus {\n border-color: transparent;\n outline: 0;\n}\n\n/* Default state */\n.radio-inner-label {\n color: var(--text-colors--subtext);\n}\n\n/* When radio is checked */\ninput[type=\"radio\"]:checked+.radio-inner-label {\n color: var(--text-colors--title);\n}\n\n/* Default (unchecked) */\n.checkbox-label {\n color: var(--text-colors--subtext);\n}\n\n/* When checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-checked {\n background-color: #F66025;\n border-color: #F66025;\n}\n\n/* Change label color when checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n/* Change parent border when checked */\n.checkbox-field:has(input[type=\"checkbox\"]:checked) {\n border-color: #F66025;\n}\n\n/* Smooth color transition for labels */\n.radio-inner-label,\n.checkbox-label {\n transition: color 300ms ease;\n}\n\n/* Smooth border transition for parent checkbox field */\n.checkbox-field {\n transition: border-color 300ms ease;\n}\n\n/* Smooth background + border transition for custom checkbox input */\n.w-checkbox-input--inputType-custom {\n transition: background-color 300ms ease, border-color 300ms ease;\n}\n\nspan.pulse-form-error {\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n.field-error{\n color: #e55757;\n font-size: 12px;\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n position: absolute;\n bottom: -22px;\n}\n\n[data-error-code=\"legal_required\"]{\n bottom: -8px;\n left: 28px;\n}\n\n[data-error-code=\"ERR_LEGAL_REQUIRED\"] {\n padding-left: 18px;\n}\n\n[form-flow-active=\"false\"] {\n display: none;\n}\n\n[form-flow-active=\"true\"] {\n display: flex;\n}\n\n[fullwidth] {\n width: 100%;\n}\n\n[hs-calender-active=\"true\"] {\n display: block;\n width: 100%;\n}\n\n[hs-calender-active=\"false\"] {\n display: none;\n}\n\ndiv#iti-0__dropdown-content {\n background-color: #121212;\n border-color: #242424;\n}\n\n#iti-0__search-input {\n background: #242424;\n}\n\n.iti__search-input-wrapper {\n border-color: #242424;\n}\n\niframe {\n border: 1px solid transparent !important;\n}\n\n.w-form-done {\n border: 1px solid transparent;\n}\n\n.hubspot-submitted-form {\n display: none !important;\n}\n\n[hs-calender-block][hs-calender-block-active=\"false\"] {\n display: none;\n}\n\n.step-2{\n display: none;\n}\n[data-action=\"back\"]{\n display: none;\n}"],
|
|
5
|
-
"mappings": ";AAAA,CAAC,uCAAuC,CAAC;AACrC,cAAY;AAChB;AAGA,CAAC;AACG,WAAS;AACb;AAGA,CAAC,qBAAqB,CAAC,sBAAqB,EAAC,CAL5C;AAMG,WAAS;AACb;AAEA,CAAC,kCAAkC,CAdM;AAerC,cAAY;AAChB;AAEA,CAAC,OAAO;AACR,CAAC,QAAQ;AACL,gBAAc;AACd,WAAS;AACb;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,WAAa,SAAQ,EAAC,CAL3B;AAMG,SAAO,IAAI;AACf;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAL9B;AAMG,SAAO,IAAI;AACf;AAEA,CA9BC,kCA8BkC,CAlCZ;AAmCnB,oBAAkB;AAClB,gBAAc;AAClB;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAf9B;AAgBG,SAAO,IAAI;AACf;AAGA,CAAC,cAAc,KAAK,KAAK,CAAC,cAAgB;AACtC,gBAAc;AAClB;AAGA,CAnCC;AAoCD,CA1BC;AA2BG,cAAY,MAAM,MAAM;AAC5B;AAGA,CAXC;AAYG,cAAY,aAAa,MAAM;AACnC;AAGA,CAzDC;AA0DG,cAAY,iBAAiB,MAAM,IAAI,EAAE,aAAa,MAAM;AAChE;AAEA,IAAI,CAAC;AACD,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AACA,CAAC;AACG,SAAO;AACP,aAAW;AACX,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACpB,YAAU;AACV,UAAQ;AACZ;AAEA,CAAC;AACG,UAAQ;AACR,QAAM;AACV;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACT,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACb;AAEA,GAAG,CAAC;AACA,oBAAkB;AAClB,gBAAc;AAClB;AAEA,CAAC;AACG,cAAY;AAChB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA;AACI,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC,kBAAkB,CAAC;AAChB,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACb;",
|
|
4
|
+
"sourcesContent": [".w-form-formradioinput--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n/* Hide by default */\n.radio-checked {\n display: none;\n}\n\n/* Show when the custom radio is checked */\n.w-form-formradioinput.w--redirected-checked~.radio-checked {\n display: flex;\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n.w-input:focus,\n.w-select:focus {\n border-color: transparent;\n outline: 0;\n}\n\n/* Default state */\n.radio-inner-label {\n color: var(--text-colors--subtext);\n}\n\n/* When radio is checked */\ninput[type=\"radio\"]:checked+.radio-inner-label {\n color: var(--text-colors--title);\n}\n\n/* Default (unchecked) */\n.checkbox-label {\n color: var(--text-colors--subtext);\n}\n\n/* When checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-checked {\n background-color: #F66025;\n border-color: #F66025;\n}\n\n/* Change label color when checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n/* Change parent border when checked */\n.checkbox-field:has(input[type=\"checkbox\"]:checked) {\n border-color: #F66025;\n}\n\n/* Smooth color transition for labels */\n.radio-inner-label,\n.checkbox-label {\n transition: color 300ms ease;\n}\n\n/* Smooth border transition for parent checkbox field */\n.checkbox-field {\n transition: border-color 300ms ease;\n}\n\n/* Smooth background + border transition for custom checkbox input */\n.w-checkbox-input--inputType-custom {\n transition: background-color 300ms ease, border-color 300ms ease;\n}\n\nspan.pulse-form-error {\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n.field-error{\n color: #e55757;\n font-size: 12px;\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n position: absolute;\n bottom: -22px;\n}\n\n[data-error-code=\"legal_required\"]{\n bottom: -8px;\n left: 28px;\n}\n\n[data-error-code=\"ERR_LEGAL_REQUIRED\"] {\n padding-left: 18px;\n}\n\n[form-flow-active=\"false\"] {\n display: none;\n}\n\n[form-flow-active=\"true\"] {\n display: flex;\n}\n\n[fullwidth] {\n width: 100%;\n}\n\n[hs-calender-active=\"true\"] {\n display: block;\n width: 100%;\n}\n\n[hs-calender-active=\"false\"] {\n display: none;\n}\n\ndiv#iti-0__dropdown-content {\n background-color: #121212;\n border-color: #242424;\n}\n\n#iti-0__search-input {\n background: #242424;\n}\n\n.iti__search-input-wrapper {\n border-color: #242424;\n}\n\niframe {\n border: 1px solid transparent !important;\n}\n\n.w-form-done {\n border: 1px solid transparent;\n}\n\n.hubspot-submitted-form {\n display: none !important;\n}\n\n[hs-calender-block][hs-calender-block-active=\"false\"] {\n display: none;\n}\n\n.step-2{\n display: none;\n}\n[data-action=\"back\"]{\n display: none;\n}\n.is-iti-input-wrapper {\n position: relative;\n z-index: 2;\n}"],
|
|
5
|
+
"mappings": ";AAAA,CAAC,uCAAuC,CAAC;AACrC,cAAY;AAChB;AAGA,CAAC;AACG,WAAS;AACb;AAGA,CAAC,qBAAqB,CAAC,sBAAqB,EAAC,CAL5C;AAMG,WAAS;AACb;AAEA,CAAC,kCAAkC,CAdM;AAerC,cAAY;AAChB;AAEA,CAAC,OAAO;AACR,CAAC,QAAQ;AACL,gBAAc;AACd,WAAS;AACb;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,WAAa,SAAQ,EAAC,CAL3B;AAMG,SAAO,IAAI;AACf;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAL9B;AAMG,SAAO,IAAI;AACf;AAEA,CA9BC,kCA8BkC,CAlCZ;AAmCnB,oBAAkB;AAClB,gBAAc;AAClB;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAf9B;AAgBG,SAAO,IAAI;AACf;AAGA,CAAC,cAAc,KAAK,KAAK,CAAC,cAAgB;AACtC,gBAAc;AAClB;AAGA,CAnCC;AAoCD,CA1BC;AA2BG,cAAY,MAAM,MAAM;AAC5B;AAGA,CAXC;AAYG,cAAY,aAAa,MAAM;AACnC;AAGA,CAzDC;AA0DG,cAAY,iBAAiB,MAAM,IAAI,EAAE,aAAa,MAAM;AAChE;AAEA,IAAI,CAAC;AACD,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AACA,CAAC;AACG,SAAO;AACP,aAAW;AACX,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACpB,YAAU;AACV,UAAQ;AACZ;AAEA,CAAC;AACG,UAAQ;AACR,QAAM;AACV;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACT,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACb;AAEA,GAAG,CAAC;AACA,oBAAkB;AAClB,gBAAc;AAClB;AAEA,CAAC;AACG,cAAY;AAChB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA;AACI,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC,kBAAkB,CAAC;AAChB,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACC,YAAU;AACV,WAAS;AACX;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|