@parag.more.withsurface.com/forms-sdk 0.1.5 → 0.1.7

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.
Files changed (107) hide show
  1. package/README.md +12 -6
  2. package/dist/index.cjs +1 -2736
  3. package/dist/index.mjs +1 -2713
  4. package/dist/react/index.cjs +1 -43
  5. package/dist/react/index.mjs +1 -20
  6. package/dist/surface-forms-sdk.min.js +1 -1
  7. package/dist/types/bind/bindForm.d.ts +2 -0
  8. package/dist/types/bind/bookingWidget.d.ts +29 -6
  9. package/dist/types/bind/scheduler/embedUtils.d.ts +51 -0
  10. package/dist/types/bind/scheduler/mountScheduler.d.ts +2 -0
  11. package/dist/types/bind/scheduler/providers/cal.d.ts +3 -0
  12. package/dist/types/bind/scheduler/providers/calendly.d.ts +3 -0
  13. package/dist/types/bind/scheduler/providers/chilical.d.ts +3 -0
  14. package/dist/types/bind/scheduler/providers/clari.d.ts +3 -0
  15. package/dist/types/bind/scheduler/providers/hubspot.d.ts +3 -0
  16. package/dist/types/bind/scheduler/providers/index.d.ts +4 -0
  17. package/dist/types/bind/scheduler/providers/reclaimai.d.ts +3 -0
  18. package/dist/types/bind/scheduler/providers/revenuehero.d.ts +3 -0
  19. package/dist/types/bind/scheduler/providers/savvycal.d.ts +3 -0
  20. package/dist/types/bind/scheduler/providers/surface.d.ts +3 -0
  21. package/dist/types/bind/scheduler/providers/zoom.d.ts +3 -0
  22. package/dist/types/bind/scheduler/styles.d.ts +3 -0
  23. package/dist/types/bind/scheduler/types.d.ts +65 -0
  24. package/dist/types/core/client/emailValidation.d.ts +3 -0
  25. package/dist/types/core/client/responses.d.ts +3 -0
  26. package/dist/types/core/client/runtimeConfig.d.ts +40 -0
  27. package/dist/types/core/client/scheduler.d.ts +4 -0
  28. package/dist/types/core/client/transport.d.ts +4 -0
  29. package/dist/types/core/engine/answerAudit.d.ts +3 -0
  30. package/dist/types/core/engine/answerStates.d.ts +4 -0
  31. package/dist/types/core/engine/formEngine.d.ts +18 -0
  32. package/dist/types/core/engine/redirect.d.ts +1 -0
  33. package/dist/types/core/engine/responsePayload.d.ts +4 -0
  34. package/dist/types/core/engine/schedulerEvents.d.ts +40 -0
  35. package/dist/types/core/engine/urlData.d.ts +2 -0
  36. package/dist/types/core/engine/urlPrefill.d.ts +1 -0
  37. package/dist/types/core/events/dropoffDetection.d.ts +1 -0
  38. package/dist/types/core/events/emitter.d.ts +1 -0
  39. package/dist/types/core/events/formJourneyTracker.d.ts +1 -0
  40. package/dist/types/core/events/pushEvents.d.ts +2 -0
  41. package/dist/types/core/events/startedDetection.d.ts +1 -0
  42. package/dist/types/core/events/viewDetection.d.ts +1 -0
  43. package/dist/types/core/identity/browserFingerprint.d.ts +3 -0
  44. package/dist/types/core/identity/ensureIdentified.d.ts +1 -0
  45. package/dist/types/core/identity/identify.d.ts +1 -0
  46. package/dist/types/core/identity/journey.d.ts +3 -0
  47. package/dist/types/core/identity/leadDataCache.d.ts +1 -0
  48. package/dist/types/enrichment/attachEnrichment.d.ts +1 -0
  49. package/dist/types/index.d.ts +5 -2
  50. package/dist/types/react/useSurfaceForm.d.ts +1 -0
  51. package/dist/types/surfaceForms.d.ts +28 -1
  52. package/dist/types/tracking/attachTracking.d.ts +1 -0
  53. package/dist/types/tracking/conversionRules.d.ts +3 -0
  54. package/dist/types/tracking/vendors.d.ts +3 -0
  55. package/docs/api.md +59 -43
  56. package/docs/reference/binding.md +86 -13
  57. package/docs/reference/clients.md +21 -1
  58. package/docs/reference/engine.md +14 -7
  59. package/docs/reference/events.md +4 -1
  60. package/llms.txt +95 -29
  61. package/package.json +1 -1
  62. package/skills/surface-forms-sdk/SKILL.md +66 -26
  63. package/skills/surface-forms-sdk/debugging.md +21 -19
  64. package/skills/surface-forms-sdk/patterns.md +71 -5
  65. package/dist/types/bind/bindForm.test.d.ts +0 -1
  66. package/dist/types/bind/bookingWidget.test.d.ts +0 -1
  67. package/dist/types/core/client/emailValidation.test.d.ts +0 -1
  68. package/dist/types/core/client/responses.test.d.ts +0 -1
  69. package/dist/types/core/client/runtimeConfig.contract.test.d.ts +0 -1
  70. package/dist/types/core/client/runtimeConfig.test.d.ts +0 -1
  71. package/dist/types/core/client/scheduler.contract.test.d.ts +0 -1
  72. package/dist/types/core/client/scheduler.test.d.ts +0 -1
  73. package/dist/types/core/client/transport.test.d.ts +0 -1
  74. package/dist/types/core/engine/answerAudit.test.d.ts +0 -1
  75. package/dist/types/core/engine/answerStates.contract.test.d.ts +0 -1
  76. package/dist/types/core/engine/formEngine.test.d.ts +0 -1
  77. package/dist/types/core/engine/redirect.test.d.ts +0 -1
  78. package/dist/types/core/engine/responsePayload.contract.test.d.ts +0 -1
  79. package/dist/types/core/engine/responsePayload.test.d.ts +0 -1
  80. package/dist/types/core/engine/urlData.contract.test.d.ts +0 -1
  81. package/dist/types/core/engine/urlData.test.d.ts +0 -1
  82. package/dist/types/core/engine/urlPrefill.test.d.ts +0 -1
  83. package/dist/types/core/events/dropoffDetection.test.d.ts +0 -1
  84. package/dist/types/core/events/emitter.test.d.ts +0 -1
  85. package/dist/types/core/events/formJourneyTracker.contract.test.d.ts +0 -1
  86. package/dist/types/core/events/formJourneyTracker.test.d.ts +0 -1
  87. package/dist/types/core/events/pushEvents.contract.test.d.ts +0 -1
  88. package/dist/types/core/events/pushEvents.test.d.ts +0 -1
  89. package/dist/types/core/events/startedDetection.test.d.ts +0 -1
  90. package/dist/types/core/events/viewDetection.test.d.ts +0 -1
  91. package/dist/types/core/identity/browserFingerprint.test.d.ts +0 -1
  92. package/dist/types/core/identity/ensureIdentified.test.d.ts +0 -1
  93. package/dist/types/core/identity/identify.contract.test.d.ts +0 -1
  94. package/dist/types/core/identity/identify.test.d.ts +0 -1
  95. package/dist/types/core/identity/journey.contract.test.d.ts +0 -1
  96. package/dist/types/core/identity/journey.test.d.ts +0 -1
  97. package/dist/types/core/identity/journey.testStubs.d.ts +0 -3
  98. package/dist/types/core/identity/leadDataCache.test.d.ts +0 -1
  99. package/dist/types/enrichment/attachEnrichment.test.d.ts +0 -1
  100. package/dist/types/react/ssr.test.d.ts +0 -1
  101. package/dist/types/react/useSurfaceForm.test.d.ts +0 -1
  102. package/dist/types/surfaceForms.test.d.ts +0 -1
  103. package/dist/types/tracking/attachTracking.test.d.ts +0 -1
  104. package/dist/types/tracking/conversionRules.contract.test.d.ts +0 -1
  105. package/dist/types/tracking/conversionRules.test.d.ts +0 -1
  106. package/dist/types/tracking/vendors.test.d.ts +0 -1
  107. package/dist/types/validation/attachEmailValidation.test.d.ts +0 -1
@@ -1,43 +1 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/react/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- useSurfaceForm: () => useSurfaceForm
24
- });
25
- module.exports = __toCommonJS(index_exports);
26
-
27
- // src/react/useSurfaceForm.ts
28
- var import_react = require("react");
29
- var useSurfaceForm = (engine) => {
30
- const state = (0, import_react.useSyncExternalStore)(engine.subscribe, engine.state, engine.state);
31
- return {
32
- state,
33
- setAnswer: engine.setAnswer,
34
- next: engine.next,
35
- back: engine.back,
36
- goToStep: engine.goToStep,
37
- submit: engine.submit,
38
- disqualify: engine.disqualify,
39
- savePartial: engine.savePartial,
40
- markViewed: engine.markViewed,
41
- on: engine.on
42
- };
43
- };
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var index_exports={};__export(index_exports,{useSurfaceForm:()=>useSurfaceForm});module.exports=__toCommonJS(index_exports);var import_react=require("react");var useSurfaceForm=engine=>{const state=(0,import_react.useSyncExternalStore)(engine.subscribe,engine.state,engine.state);return{state:state,setAnswer:engine.setAnswer,next:engine.next,back:engine.back,goToStep:engine.goToStep,submit:engine.submit,disqualify:engine.disqualify,savePartial:engine.savePartial,markViewed:engine.markViewed,on:engine.on}};
@@ -1,20 +1 @@
1
- // src/react/useSurfaceForm.ts
2
- import { useSyncExternalStore } from "react";
3
- var useSurfaceForm = (engine) => {
4
- const state = useSyncExternalStore(engine.subscribe, engine.state, engine.state);
5
- return {
6
- state,
7
- setAnswer: engine.setAnswer,
8
- next: engine.next,
9
- back: engine.back,
10
- goToStep: engine.goToStep,
11
- submit: engine.submit,
12
- disqualify: engine.disqualify,
13
- savePartial: engine.savePartial,
14
- markViewed: engine.markViewed,
15
- on: engine.on
16
- };
17
- };
18
- export {
19
- useSurfaceForm
20
- };
1
+ import{useSyncExternalStore}from"react";var useSurfaceForm=engine=>{const state=useSyncExternalStore(engine.subscribe,engine.state,engine.state);return{state:state,setAnswer:engine.setAnswer,next:engine.next,back:engine.back,goToStep:engine.goToStep,submit:engine.submit,disqualify:engine.disqualify,savePartial:engine.savePartial,markViewed:engine.markViewed,on:engine.on}};export{useSurfaceForm};
@@ -1 +1 @@
1
- "use strict";var SurfaceFormsSDK=(()=>{var Re=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var Pt=Object.prototype.hasOwnProperty;var Ft=(e,n)=>{for(var t in n)Re(e,t,{get:n[t],enumerable:!0})},Dt=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Ct(n))!Pt.call(e,o)&&o!==t&&Re(e,o,{get:()=>n[o],enumerable:!(r=_t(n,o))||r.enumerable});return e};var Lt=e=>Dt(Re({},"__esModule",{value:!0}),e);var Ln={};Ft(Ln,{DEFAULT_API_BASE_URL:()=>j,DEFAULT_REDIRECT_TIMEOUT_MS:()=>lt,ENRICHMENT_STATE_ID:()=>Se,IDENTITY_INFO_ANSWER_KEYS:()=>at,JOURNEY_COOKIE_NAME:()=>z,LEAD_DATA_STORAGE_KEY:()=>W,LEAD_DATA_TTL_MS:()=>pt,RECENT_VISIT_COOKIE_NAME:()=>Y,SurfaceForms:()=>At,attachEmailValidation:()=>Te,attachEnrichment:()=>ke,bindForm:()=>X,buildIdentifyPayload:()=>ye,buildRedirectUrl:()=>De,buildResponsesArray:()=>Fe,buildStepTransitionEventBatch:()=>ae,buildUrlData:()=>pe,constructUrlParamsObject:()=>Le,createEmailValidator:()=>Z,createEmitter:()=>ie,createFormEngine:()=>ue,createFormJourneyTracker:()=>fe,createJourneyTracker:()=>be,createPushEventClient:()=>de,createSchedulerClient:()=>ot,createStartedDetector:()=>le,createSubmitResponsePayload:()=>ce,createTransport:()=>se,createUpdateResponsePayload:()=>K,enrichmentSourcesOf:()=>re,ensureIdentified:()=>Q,fetchRuntimeConfig:()=>te,getBrowserFingerprint:()=>ge,getHash:()=>Ne,hasEnabledEnrichmentProvider:()=>oe,identifyLead:()=>he,mountBookingWidget:()=>Ye,observeDropoff:()=>me,observeFormView:()=>G,parseCookiesObject:()=>Oe,parsePrefillParams:()=>ut,parseQuestionId:()=>Me,performRedirect:()=>ct,readLeadData:()=>H,statefulQuestionIdsOf:()=>tt,statefulQuestionsOf:()=>$,stepsOf:()=>ne,submitResponse:()=>ee,toSchedulerAnswerState:()=>st,updateResponse:()=>J,writeLeadData:()=>ve});var G=(e,n)=>{if(typeof IntersectionObserver>"u")return n(),()=>{};let t=!1,r=new IntersectionObserver(o=>{let[i]=o;!i?.isIntersecting||t||(t=!0,r.disconnect(),n())});return r.observe(e),()=>r.disconnect()};var Je="input, select, textarea",Ot=e=>e.matches(Je)?[e]:Array.from(e.querySelectorAll(Je)).filter(n=>n.closest("[data-question-id]")===e),Mt=(e,n,t)=>{let r=e.getAttribute("data-field-name")??n.getAttribute("data-field-name");return r||(t==="Dropdown"&&n instanceof HTMLSelectElement?"selected":n instanceof HTMLInputElement&&n.type==="email"?"email":"input")},We=(e,n)=>{let t=e.getAttribute("data-question-type")??n.getAttribute("data-question-type");return t||(n instanceof HTMLInputElement&&n.type==="email"?"EmailForm":"ShortInput")},Qe=e=>e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")&&e.type==="checkbox"?e.checked:e.value,Nt=e=>e instanceof HTMLInputElement&&(e.type==="radio"||e.type==="checkbox"),ze=e=>{let n=e.findIndex(t=>t.checked);return{value:n===-1?"":e[n].value,index:n}},Ut={MultipleOptionsQuestion:e=>({choices:e.map((n,t)=>({key:n.value,value:n.checked,index:t}))}),MultipleChoiceQuestion:e=>({choices:e.map(n=>({key:n.value,value:n.checked}))}),MMChoiceQuestion:e=>({choices:e.map(n=>({key:n.value,value:n.checked}))}),GraphicOptions:ze,MultipleChoiceSingleAnswer:ze},X=({engine:e,root:n,expectedQuestionIds:t})=>{let r=[],o=new Set,i=(c,f,u)=>{c.addEventListener(f,u),r.push(()=>c.removeEventListener(f,u))};for(let c of Array.from(n.querySelectorAll("[data-question-id]"))){let f=c.getAttribute("data-question-id"),u=Ot(c);if(u.length===0)continue;o.add(f);let T=We(c,u[0]),v=Ut[T],m=u.filter(Nt);if(v&&m.length>0){let h=()=>e.setAnswer(f,{type:T,...v(m)});for(let S of m)i(S,"change",h);m.some(S=>S.checked)&&h();continue}for(let h of u){let S=We(c,h),g=Mt(c,h,S),k=()=>e.setAnswer(f,{type:S,[g]:Qe(h)});i(h,"input",k),i(h,"change",k);let A=Qe(h);A!==""&&A!==!1&&k()}}let a=(t??[]).filter(c=>!o.has(c));a.length>0&&console.warn(`Surface SDK: form record declares questionIds with no bound element: ${a.join(", ")}. Answers for these will never be captured \u2014 check data-question-id attributes (validate_form_html catches this at authoring time).`);let s="[data-surface-goto-step], .surface-disqualify-button, .surface-submit-button, .surface-next-button";for(let c of Array.from(n.querySelectorAll(s))){let f=c.getAttribute("data-surface-goto-step"),u=[f!=null?"goto":null,c.classList.contains("surface-disqualify-button")?"disqualify":null,c.classList.contains("surface-submit-button")?"submit":null,c.classList.contains("surface-next-button")?"next":null].filter(v=>v!=null),T=u[0];u.length>1&&console.warn(`Surface SDK: element carries multiple navigation markers (${u.join(", ")}); only "${T}" is bound.`),i(c,"click",v=>{v.preventDefault(),T==="goto"?e.goToStep(f).catch(m=>console.warn(`Surface SDK: ${String(m)}`)):T==="disqualify"?e.disqualify():T==="submit"?e.submit():e.next()})}n instanceof HTMLFormElement&&i(n,"submit",c=>{c.preventDefault(),e.submit()});let d=Array.from(n.querySelectorAll("[data-step-id]")),l=()=>{let{currentStepId:c}=e.state();for(let f of d)f.hidden=f.getAttribute("data-step-id")!==c};return d.length>0&&(l(),r.push(e.on("stepChanged",l))),r.push(G(n,()=>e.markViewed())),()=>r.forEach(c=>c())};var qt=()=>{let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}`},Vt=e=>{let[n,t]=e.split("-").map(Number);return new Date(n,t-1,1).toLocaleDateString(void 0,{month:"long",year:"numeric"})},Bt=e=>{let[n,t,r]=e.split("-").map(Number);return new Date(n,t-1,r).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"})},$t=(e,n)=>{let[t,r]=e.split("-").map(Number),o=new Date(t,r-1+n,1);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}`},Ye=({container:e,scheduler:n,eventTypeId:t,timezone:r=Intl.DateTimeFormat().resolvedOptions().timeZone,duration:o,prefill:i,identity:a,formatters:s,onComplete:d})=>{let l=s?.month??Vt,c=s?.date??Bt,f=s?.time??(I=>new Date(I.start).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",timeZone:r})),u=document.createElement("div");u.className="surface-booking",e.appendChild(u);let T=qt(),v=[],m=null,h=null,S=!1,g=0,k=(I,C,L)=>{let y=document.createElement(I);return y.className=C,L!=null&&(y.textContent=L),y},A=I=>{S||u.replaceChildren(...I)},O=(I,C)=>{let L=k("p","surface-booking-error",I),y=k("button","surface-booking-retry","Try again");y.type="button",y.addEventListener("click",C),A([L,y])},w=async()=>{let I=T,C=++g;A([k("p","surface-booking-loading","Loading availability\u2026")]);let L=await n.getMonthAvailability({eventTypeId:t,month:I,timezone:r,duration:o});if(S||C!==g)return;if(!L.ok){O("Unable to load availability.",()=>{w()});return}v=L.data.data?.dates??[];let y=k("p","surface-booking-month",l(I));y.dataset.value=I;let E=k("div","surface-booking-month-nav");for(let[M,P]of[["Previous month",-1],["Next month",1]]){let x=k("button","surface-booking-month-button",M);x.type="button",x.addEventListener("click",()=>{T=$t(T,P),w()}),E.appendChild(x)}let _=k("ul","surface-booking-dates");for(let M of v.filter(P=>P.slots&&P.slots.length>0)){let P=k("li","surface-booking-date"),x=k("button","surface-booking-date-button",c(M.date));x.dataset.value=M.date,x.type="button",x.addEventListener("click",()=>{m=M,N()}),P.appendChild(x),_.appendChild(P)}_.childElementCount===0&&_.appendChild(k("li","surface-booking-no-dates","No availability this month.")),A([y,E,_])},N=async()=>{if(!m)return;let I=++g,C=m.slots??[];if(C.length===0){let _=await n.getSlots({eventTypeId:t,date:m.date,timezone:r,duration:o});if(S||I!==g)return;if(!_.ok){O("Unable to load times.",()=>{N()});return}C=_.data.data?.slots??[]}let L=k("p","surface-booking-day",c(m.date));L.dataset.value=m.date;let y=k("button","surface-booking-back","Back");y.type="button",y.addEventListener("click",()=>{w()});let E=k("ul","surface-booking-slots");for(let _ of C){let M=k("li","surface-booking-slot"),P=k("button","surface-booking-slot-button",f(_));P.dataset.value=_.start,P.type="button",P.addEventListener("click",()=>{h=_,R()}),M.appendChild(P),E.appendChild(M)}A([L,y,E])},R=I=>{if(!h)return;let C=k("form","surface-booking-form"),L=k("input","surface-booking-name");L.name="name",L.placeholder="Name",L.value=i?.name??"";let y=k("input","surface-booking-email");y.type="email",y.name="email",y.placeholder="Email",y.value=i?.email??"";let E=k("button","surface-booking-submit","Book");E.type="submit",C.append(L,y,E),I&&C.appendChild(k("p","surface-booking-error",I)),C.addEventListener("submit",_=>{_.preventDefault(),(async()=>{E.disabled=!0;let M=await n.book({eventTypeId:t,startTime:h.start,endTime:h.end,timezone:r,inviteeName:L.value,inviteeEmail:y.value,duration:o,...a});if(!S){if(!M.ok){R("Booking failed. Please try again.");return}A([k("p","surface-booking-booked","Booked!")]),d(M.data)}})()}),A([C])};return w(),()=>{S=!0,u.remove()}};var jt="/api/v1/edge/emailValidation",Ge=e=>({email:e,isValid:!0,status:"unknown",reason:"validation_failed",failed:!0}),Kt=(e,n)=>!n||typeof n.isValid!="boolean"?Ge(e):{email:e,isValid:n.isValid,status:n.status,reason:n.reason,...n.blacklistEntryIds?.length?{blacklistEntryIds:n.blacklistEntryIds}:{},...n.validationSuccessfullyRan===!1?{failed:!0}:{}},Z=({transport:e,environmentId:n,preview:t=!1})=>{let r=new Map,o=i=>{let a=[...new Set(i.map(d=>d.trim()).filter(d=>d!==""))];if(t)for(let d of a)r.has(d)||r.set(d,Promise.resolve({email:d,isValid:!0,status:"preview"}));let s=a.filter(d=>!r.has(d));if(s.length>0){let d=e.post(jt,{emails:s,environmentId:n}).then(l=>l.ok?l.data.data??{}:{}).catch(()=>({}));for(let l of s)r.set(l,d.then(c=>Kt(l,c[l])))}return Promise.all(a.map(d=>r.get(d)))};return{validateBatch:o,validate:async i=>{let[a]=await o([i]);return a??Ge(i.trim())}}};var Ht="/api/v1/responses/",Xe="/api/v1/responses/update",Jt="/api/v1/responses/getResponse",ee=async(e,n)=>{let t=await e.post(Ht,n,{credentials:!0});if(!t.ok)return t;let r=t.data.data?.id;return r?{ok:!0,data:{responseId:r,leadId:t.data.data?.meta?.leadId??null,resumeToken:t.data.data?.resumeToken??null}}:{ok:!1,error:{kind:"http",status:200,body:t.data}}},J=(e,n)=>{e.beacon(Xe,n)},Ze=(e,n)=>e.post(Xe,n,{keepalive:!0,credentials:!0}),Wt=e=>typeof e?.questionId=="string"&&typeof e?.response=="object"&&e.response!==null,et=async(e,{responseId:n,resumeToken:t})=>{let r=await e.get(`${Jt}?rid=${encodeURIComponent(n)}&rt=${encodeURIComponent(t)}`);return r.ok?{ok:!0,data:{answers:(Array.isArray(r.data.data?.data)?r.data.data.data:[]).filter(Wt).filter(i=>i.response.type!=="URL_DATA")}}:r};var te=(e,n,{preview:t=!1,previewToken:r}={})=>e.get(`/api/v1/public/forms/${n}/runtime-config${t?`?preview=1${r?`&pt=${encodeURIComponent(r)}`:""}`:""}`),xe=e=>{let n=e.components;if(Array.isArray(n))return n;let t=n?.layout;return Array.isArray(t)?t.flatMap(r=>{let o=r.row;return Array.isArray(o)?o.map(i=>i.type==="GridLayoutRowItem"?i.component:i):[]}):[]},ne=e=>(e.steps??[]).map(n=>({id:n.id,...n.endStepKind!==void 0&&{endStepKind:n.endStepKind}})),$=e=>(e.steps??[]).flatMap(xe).flatMap(n=>{let t=n;return typeof t?.state?.questionId!="string"?[]:[{questionId:t.state.questionId,...typeof t.type=="string"&&{componentType:t.type}}]}),tt=e=>$(e).map(n=>n.questionId),re=e=>(e.steps??[]).flatMap(xe).flatMap(n=>{let t=n;if(typeof t?.state?.questionId!="string")return[];if(t.type==="IdentityInfo"){let r=typeof t.content?.enrichmentSourceField=="string"?t.content.enrichmentSourceField:"emailAddress";return[{questionId:t.state.questionId,fieldNames:[...new Set([r,"websiteUrl"])]}]}return t.type==="EmailForm"?[{questionId:t.state.questionId,fieldNames:["email"]}]:[]}),nt=e=>(e.steps??[]).flatMap(xe).some(n=>typeof n?.content?.enrichmentSourceField=="string"),oe=e=>{let n=e?.enrichment;return n?.version!==2||!Array.isArray(n.providers)?!1:n.providers.some(t=>t?.enabled===!0&&Array.isArray(t.enabledFields)&&t.enabledFields.length>0)};var rt=e=>new URLSearchParams(Object.fromEntries(Object.entries(e).filter(([,n])=>n!=null))),ot=({transport:e,preview:n=!1})=>{let t=n?"true":void 0,r=o=>{if(!o.ok)return o;let i=o.data.data;return i?.id?{ok:!0,data:i}:{ok:!1,error:{kind:"http",status:200,body:o.data}}};return{getPublicEventType:o=>e.get(`/api/v1/scheduler/event-types/${o}/public`),getAvailabilitySummary:({eventTypeId:o,timezone:i})=>{let a=new URLSearchParams({eventTypeId:o,timezone:i??Intl.DateTimeFormat().resolvedOptions().timeZone});return e.get(`/api/v1/scheduler/availability-summary?${a}`)},getMonthAvailability:({eventTypeId:o,month:i,timezone:a,duration:s,hostId:d,ownerEmail:l})=>{let[c,f]=i.split("-").map(Number),u=rt({eventTypeId:o,month:String(f),year:String(c),timezone:a,duration:s?String(s):void 0,preview:t,hostId:d,ownerEmail:l});return e.get(`/api/v1/scheduler/availability?${u}`)},getSlots:({eventTypeId:o,date:i,timezone:a,duration:s,hostId:d,ownerEmail:l})=>{let c=rt({eventTypeId:o,date:i,timezone:a,duration:s?String(s):void 0,preview:t,hostId:d,ownerEmail:l});return e.get(`/api/v1/scheduler/slots?${c}`)},book:async({eventTypeId:o,startTime:i,endTime:a,timezone:s,inviteeName:d,inviteeEmail:l,duration:c,intakeResponses:f,guestEmails:u,captchaToken:T,responseId:v,leadSessionId:m,fingerprint:h,hostRouting:S})=>{if(n)return{ok:!0,data:{id:"preview-booking-"+Date.now(),startTime:i,endTime:a,timezone:s,inviteeName:d||"Test User",inviteeEmail:l||"test@example.com",meetingJoinLink:null,cancelToken:"preview-cancel-"+Date.now(),rescheduleToken:"preview-reschedule-"+Date.now(),attendees:[{name:"Host",email:"host@example.com",isHost:!0}]}};let g=await e.post("/api/v1/scheduler/book",{eventTypeId:o,startTime:i,timezone:s,inviteeName:d,inviteeEmail:l.trim(),...c?{duration:c}:{},...f&&Object.keys(f).length>0?{intakeResponses:f}:{},...u&&u.length>0?{guestEmails:u}:{},...T?{captchaToken:T}:{},meta:{source:"form",...v?{responseId:v}:{},...m?{leadSessionId:m}:{},...h?{fingerprint:h}:{},...S?{hostRouting:S}:{}}});return r(g)},reschedule:async({bookingId:o,rescheduleToken:i,newStartTime:a,timezone:s})=>{let d=await e.post(`/api/v1/scheduler/bookings/${o}/reschedule`,{rescheduleToken:i,newStartTime:a,timezone:s});return r(d)}}},st=e=>{let n=e.attendees?.find(t=>t.isHost);return{type:"DynamicScheduler",eventScheduled:!0,uri:e.id,meetingTime:e.startTime,meetingEndTime:e.endTime,ownerEmails:n?.email??"",guestEmails:e.inviteeEmail,inviteeName:e.inviteeName,googleMeetLink:e.meetingJoinLink??""}};var j="https://forms.withsurface.com",it="0.1.0",_e=(e={})=>({...e,"X-Surface-Sdk-Version":it}),Qt=e=>`${e}${e.includes("?")?"&":"?"}sdv=${it}`,se=({apiBaseUrl:e=j}={})=>{let n=e.replace(/\/$/,""),t=a=>`${n}${a}`;return{get:async a=>{try{let s=await fetch(t(a),{headers:_e()});if(!s.ok){let d=await s.json().catch(()=>{});return{ok:!1,error:{kind:"http",status:s.status,body:d}}}return{ok:!0,data:await s.json()}}catch(s){return{ok:!1,error:{kind:"network",cause:s}}}},post:async(a,s,d)=>{try{let l=await fetch(t(a),{method:"POST",headers:_e({"Content-Type":"application/json"}),body:JSON.stringify(s),...d?.keepalive?{keepalive:!0}:{},...d?.credentials?{credentials:"include"}:{}});if(!l.ok){let c=await l.json().catch(()=>{});return{ok:!1,error:{kind:"http",status:l.status,body:c}}}return{ok:!0,data:await l.json()}}catch(l){return{ok:!1,error:{kind:"network",cause:l}}}},beacon:(a,s)=>{let d;try{d=JSON.stringify(s)}catch{return!1}let l=Qt(t(a));try{if(typeof navigator<"u"&&typeof navigator.sendBeacon=="function"&&navigator.sendBeacon(l,new Blob([d],{type:"application/json"})))return!0}catch{}try{fetch(l,{method:"POST",keepalive:!0,credentials:"include",headers:_e({"Content-Type":"application/json"}),body:d}).catch(()=>{})}catch{}return!1}}};var at=["firstName","lastName","fullName","emailAddress","workEmailAddress","phoneNumber","companyName","numberOfEmployees","websiteUrl","title","streetAddress","aptSuiteEtc","city","state","country","zipCode","companyRevenue","profilePictureUrl"];var ie=()=>{let e=new Map;return{on:(n,t)=>{let r=e.get(n)??new Set;return r.add(t),e.set(n,r),()=>{r.delete(t)}},emit:(n,t)=>{e.get(n)?.forEach(r=>{try{r(t)}catch(o){console.error(`Surface SDK: "${String(n)}" handler threw`,o)}})}}};var zt="/api/v1/pushEvent",Yt=/bot|crawl|spider|slurp|baidu|bingpreview|googlebot|yandex|duckduck|ahrefs|semrush|facebookexternalhit|embedly|quora link preview|pinterest|twitterbot|linkedinbot|whatsapp|telegram|discord|headless|lighthouse|pagespeed/i,Gt=()=>{let e=navigator.userAgent;return e?Yt.test(e):!1},Xt=e=>!!(e?.type&&e?.entityType&&e?.entityId),ae=({sessionId:e,formId:n,currentStepId:t,nextStepId:r,stepCompletionTime:o})=>({events:[{type:"form_step_submitted",entityType:"form_step",entityId:n,stepId:t,leadSessionId:e,properties:[{key:"stepCompletionTime",value:o}]},{type:"form_step_viewed",entityType:"form_step",entityId:n,stepId:r,leadSessionId:e,properties:[]}]}),de=({transport:e,preview:n=!1})=>({push:t=>{if(n||typeof navigator>"u")return;let r="events"in t?t.events:[t];Gt()||r.some(o=>!Xt(o))||e.beacon(zt,t)}});var le=e=>{let n=Ce(e),t=!1;return r=>t||Pe(n,r)?!1:(t=!0,!0)},Ce=e=>{if(Array.isArray(e))return e.map(Ce);if(e!==null&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=Ce(r);return n}return e},Pe=(e,n)=>{if(Object.is(e,n))return!0;if(Array.isArray(e)||Array.isArray(n))return!Array.isArray(e)||!Array.isArray(n)||e.length!==n.length?!1:e.every((t,r)=>Pe(t,n[r]));if(e!==null&&n!==null&&typeof e=="object"&&typeof n=="object"){let t=Object.keys(e),r=Object.keys(n);return t.length!==r.length?!1:t.every(o=>Pe(e[o],n[o]))}return!1};var Fe=(e,n)=>{let t=[],r={},o;for(let i in e){let a=e[i];for(let s in a){let d=a[s];!o&&d?.eventScheduled===!0&&typeof d.uri=="string"&&d.uri.length>0&&!d.uri.includes("calendly.com")&&!d.uri.includes("cal.com")&&(o=d.uri),t.push({questionId:s,response:{...a[s]}})}}for(let i in n){let a=n[i];a.type!=="SCHEDULER_AVAILABILITY_DATA"&&(t.push({questionId:i,response:{...a}}),a.type==="APOLLO_EMAIL_ENRICHMENT"&&a.processed&&(r=a.data??{}))}return{responses:t,enrichedFields:r,bookingId:o}},dt=({formId:e,answers:n,externalStates:t,submittingOnStepId:r,finished:o,invalidResponse:i,trackCookies:a,meta:s={},personAttributeEnrichedFields:d,fingerprint:l,leadSessionId:c})=>{let{responses:f,enrichedFields:u,bookingId:T}=Fe(n,t),v=a?s:Object.fromEntries(Object.entries(s).filter(([m])=>m!=="cookies"));return{responses:f,enrichedFields:d??u??{},formId:e,finished:o,invalidResponse:i,stepId:r,fingerprint:l,leadSessionId:c,meta:T?{...v,bookingId:T}:v}},ce=e=>({...dt(e),responseShapeVersion:"2.0"}),K=e=>({...dt(e),responseId:e.responseId});var ue=({formId:e,environmentId:n,steps:t,transport:r,resolveNextStep:o,trackPartialResponses:i=!0,trackCookies:a=!1,externalStates:s={},meta:d={},identity:l,pushEvents:c,formJourney:f,preview:u=!1,resume:T})=>{if(t.length===0)throw new Error("createFormEngine requires at least one step");let v=o??(p=>{let b=t.findIndex(V=>V.id===p),U=t[b+1];return U?{stepId:U.id,reason:"linear"}:"END"}),m=ie(),h=new Set,S=!0,g,k=()=>{S=!0,h.forEach(p=>p())},A=()=>l?.()??{},O={},w=t[0].id,N=T?.responseId??null,R=null;if(T?.answers){let p={};for(let[b,U]of Object.entries(T.answers))p[b]={...U};O[w]=p}let I=!1,C=null,L=!1,y=Date.now(),E=[],_=le(O);f?.setFormId(e),N!=null&&f?.setResponseId(N),f?.recordEntry(w);let M=async(p,b,U)=>{if(u)return;let V={formId:e,answers:O,externalStates:s,submittingOnStepId:p,finished:b,invalidResponse:U,trackCookies:a,meta:d,fingerprint:A().fingerprint,leadSessionId:A().leadSessionId};if(N==null){let B=await ee(r,ce(V));if(!B.ok){B.error.kind==="network"&&c?.push({type:"response_submission_error",entityType:"response",entityId:e,stepId:p,leadSessionId:A().leadSessionId,properties:[{key:"error",value:"network"}]}),m.emit("error",{scope:"submit",error:B.error});return}N=B.data.responseId,R=B.data.resumeToken,f?.setResponseId(N),c?.push({type:"response_submission_created",entityType:"response",entityId:e,stepId:p,leadSessionId:A().leadSessionId,properties:[{key:"responseId",value:N}]})}else if(b){let B=await Ze(r,K({...V,responseId:N}));if(!B.ok){J(r,K({...V,responseId:N})),m.emit("error",{scope:"submit",error:B.error});return}}else J(r,K({...V,responseId:N}));k(),m.emit("saved",{responseId:N,finished:b,resumeToken:R})},P=Promise.resolve(),x=p=>{let b=P.then(()=>I?void 0:p());return P=b.catch(()=>{}),b},D=()=>{if(!I||C==null)return;let p=C;P=P.then(()=>{if(N!=null)return M(p.stepId,!0,p.invalid)}).catch(()=>{})},F=null,q=p=>{if(I)return Promise.resolve();if(F)return p?F.then(()=>q(!0)):F;let b=x(()=>xt(p)).finally(()=>{F===b&&(F=null)});return F=b,b},Ae=p=>{let b=w;for(;E.length>0&&w!==p;)w=E.pop();k(),f?.recordTransition({fromStepId:b,toStepId:w,reason:"back_nav"}),m.emit("stepChanged",{fromStepId:b,toStepId:w})},$e=p=>{if(!t.some(U=>U.id===p))return Promise.reject(new Error(`goToStep: no step with id "${p}"`));if(I)return Promise.resolve();if(F)return F.then(()=>$e(p));if(p===w)return Promise.resolve();if(E.includes(p))return Ae(p),Promise.resolve();let b=x(async()=>{p!==w&&(m.emit("stepCompleted",{stepId:w}),await Ke({stepId:p,reason:"conditional_match"}))}).finally(()=>{F===b&&(F=null)});return F=b,b},je=()=>{if(I)return Promise.resolve();if(F)return F.then(()=>je());let p=x(()=>He(!0)).finally(()=>{F===p&&(F=null)});return F=p,p},Ke=async p=>{let b=w;c?.push(ae({sessionId:A().leadSessionId,formId:e,currentStepId:b,nextStepId:p.stepId,stepCompletionTime:(Date.now()-y)/1e3})),f?.recordTransition({fromStepId:b,toStepId:p.stepId,reason:p.reason??"linear"}),i&&await M(b,!1,!1),E.push(b),w=p.stepId,k(),m.emit("stepChanged",{fromStepId:b,toStepId:w})},Rt=p=>{let b=t.find(V=>V.endStepKind===p);if(!b||b.id===w)return;let U=w;E.push(U),w=b.id,k(),m.emit("stepChanged",{fromStepId:U,toStepId:w})},He=async p=>{let b=w;I=!0,C={stepId:b,invalid:p},await M(b,!0,p),Rt(p?"disqualified":"thank_you"),p?(f?.recordTerminal({outcome:"disqualified",disqualification:{reason:"conditional_match",atStepId:b}}),m.emit("disqualified",{stepId:b})):(f?.recordTerminal({outcome:"completed"}),c?.push({type:"form_completed",entityType:"form",entityId:e,stepId:null,leadSessionId:A().leadSessionId,properties:[],environmentId:n,leadId:A().leadId}),m.emit("completed",{formId:e})),k()},xt=async p=>{let b=v(w,O),U=p||b==="END"||b==="INVALID"||b==null;if(m.emit("stepCompleted",{stepId:w}),!U){await Ke(b);return}await He(b==="INVALID")};return{setAnswer:(p,b)=>{let U=O[w]??(O[w]={});U[p]={...U[p],...b},_(O)&&(c?.push({type:"form_started",entityType:"form",entityId:e,stepId:null,leadSessionId:A().leadSessionId,properties:[]}),m.emit("started",{formId:e})),k()},setExternalState:(p,b)=>{s[p]=b,k(),D()},mergeMeta:p=>{Object.assign(d,p),D()},next:()=>q(!1),goToStep:$e,submit:()=>q(!0),disqualify:je,back:()=>{let p=E.pop();if(p==null||I)return;let b=w;w=p,k(),f?.recordTransition({fromStepId:b,toStepId:p,reason:"back_nav"}),m.emit("stepChanged",{fromStepId:b,toStepId:p})},savePartial:()=>{let p=w;return x(()=>M(p,!1,!1))},flush:()=>P.then(()=>{}),markViewed:()=>{L||(L=!0,c?.push({type:"form_viewed",entityType:"form",entityId:e,stepId:null,leadSessionId:A().leadSessionId,properties:[],environmentId:n,leadId:A().leadId}),c?.push({type:"form_step_viewed",entityType:"form_step",entityId:e,stepId:t[0].id,leadSessionId:A().leadSessionId,properties:[]}),m.emit("viewed",{formId:e}))},on:m.on,state:()=>(S&&(g={currentStepId:w,answers:O,externalStates:s,responseId:N,resumeToken:R,finished:I},S=!1),g),subscribe:p=>(h.add(p),()=>h.delete(p))}};var lt=400,Zt=(e,n="https")=>!e||e.startsWith(n)?e:`${n}://${e}`,De=(e,{leadId:n,sessionId:t}={})=>{if(!e||!e.trim())return"";try{let r=new URL(Zt(e));return n&&r.searchParams.set("leadId",n),t&&r.searchParams.set("sessionId",t),r.toString()}catch{return e}},ct=({url:e,redirectType:n="CurrentWindow",leadId:t,sessionId:r,preview:o=!1})=>{if(!e||o||typeof window>"u")return;let i=De(e,{leadId:t,sessionId:r});i&&(n==="CurrentWindow"?window.location.href=i:n==="NewTab"&&window.open(i,"_blank"))};var Le=e=>{let n=new URL(e);if(!n.search)return{};let t={};return new URLSearchParams(n.search).forEach((r,o)=>{t[o]=r}),t},Oe=e=>{let n={};for(let t of e.split(";")){let r=t.trim(),o=r.indexOf("=");if(o<=0)continue;let i=r.substring(o+1);try{n[r.substring(0,o)]=decodeURIComponent(i)}catch{n[r.substring(0,o)]=i}}return n},pe=({defaultUrl:e,trackCookies:n=!1}={})=>{let t=typeof window<"u",r={type:"URL_DATA",fullUrl:e??(t?window.location.href:void 0),referrer:t&&typeof document<"u"?document.referrer||"":void 0};if(r.fullUrl)try{r.params=Le(r.fullUrl)}catch{}return n?r.cookies=t&&typeof document<"u"?Oe(document.cookie):{}:r.cookies={},r};var Me=e=>{let n=e.indexOf("_");return{originalId:e,questionId:n>=0?e.slice(0,n).trim():e,fieldName:n>=0?e.slice(n+1).trim():null}},en=new Set(["url","referrer","cookies"]),ut=e=>{let n=typeof e=="string"?new URLSearchParams(e):e,t=null;for(let r of n.keys()){if(en.has(r))continue;let{originalId:o,questionId:i,fieldName:a}=Me(r);if(a==null)continue;let s={originalId:o,questionId:i,fieldName:a,value:n.get(r)};t??(t=Object.create(null)),t[i]=[...t[i]??[],s]}return t};var me=(e,n)=>{if(typeof window>"u")return()=>{};let t=r=>{let{started:o,formId:i,stepId:a,sessionId:s}=n();!o||r.persisted||e.push({type:"form_step_dropoff",entityType:"form_step",entityId:i,stepId:a,leadSessionId:s,properties:[]})};return window.addEventListener("pagehide",t),()=>window.removeEventListener("pagehide",t)};var tn="/api/v1/form-journey/track";var nn=new Set(["completed","disqualified","dropped_off","partial"]),fe=({transport:e,preview:n=!1})=>{let t={responseId:null,formId:null,nextOrdinal:1,enteredAt:new Map,pendingClose:null,visits:[],truncated:!1,terminal:{},frozen:!1,flushScheduled:!1},r=()=>{t.flushScheduled=!1,!n&&(!t.responseId||!t.formId||t.visits.length===0&&!t.terminal.outcome||(e.beacon(tn,{responseId:t.responseId,formId:t.formId,events:t.visits,...t.terminal}),t.terminal={}))},o=()=>{t.flushScheduled||(t.flushScheduled=!0,queueMicrotask(()=>{t.flushScheduled&&r()}))},i=s=>{if(!t.pendingClose)return;let{ordinal:d,stepId:l}=t.pendingClose,c=t.enteredAt.get(d),f=t.visits.find(T=>T.ordinal===d),u=c?Date.parse(s)-Date.parse(c):null;f?(f.exitedAt=s,f.durationMs=u):t.visits.push({ordinal:d,stepId:l,enteredAt:c??s,exitedAt:s,durationMs:u,fromStepId:null,transitionReason:"initial"}),t.pendingClose=null},a=s=>t.visits.length>=50?(t.truncated=!0,!1):(t.visits.push(s),!0);return{hasRecordedTransition:()=>t.nextOrdinal>1,setResponseId:s=>{t.responseId=s,o()},setFormId:s=>{t.formId=s,o()},recordEntry:s=>{if(t.frozen||t.truncated)return;let d=new Date().toISOString();t.nextOrdinal===1&&(t.enteredAt.set(1,d),t.pendingClose={ordinal:1,stepId:s},t.nextOrdinal=2)},recordTransition:({fromStepId:s,toStepId:d,reason:l,transitionMeta:c})=>{if(t.frozen||t.truncated)return;let f=new Date().toISOString();i(f);let u=t.nextOrdinal++;t.enteredAt.set(u,f);let T=a({ordinal:u,stepId:d,enteredAt:f,exitedAt:null,durationMs:null,fromStepId:s,transitionReason:l,transitionMeta:c??null});t.pendingClose=T?{ordinal:u,stepId:d}:null,o()},recordTerminal:({outcome:s,disqualification:d})=>{if(t.frozen)return;let l=new Date().toISOString();i(l),t.terminal={outcome:s,disqualification:d?{reason:d.reason,matched:d.matched}:void 0,disqualifiedAtStepId:d?.atStepId,disqualifiedTriggerStepId:d?.triggerStepId},nn.has(s)&&(t.frozen=!0),s==="in_progress"?r():o()}}};async function Ne(e){let n=new TextEncoder().encode(e),t=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(t)).map(r=>r.toString(16).padStart(2,"0")).join("")}var ge=async e=>{let n=navigator.userAgentData||{},t={deviceType:/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",screen:{width:screen.width,height:screen.height,colorDepth:screen.colorDepth},userAgent:navigator.userAgent,browser:n.brands||n.uaList||[{brand:"unknown",version:"unknown"}],os:n.platform||"unknown",language:navigator.language,...navigator.plugins!=null?{plugins:Array.from(navigator.plugins).map(r=>r.name)}:{},timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,environmentId:e};return{...t,id:await Ne(JSON.stringify(t))}};var rn="/api/v1/lead/identify",ye=({environmentId:e,fingerprintId:n,pageUrl:t,source:r="sdkForm",formId:o,leadId:i=null,sessionIdFromParams:a=null,referrer:s})=>{let d=new URL(t);return{environmentId:e,source:r,sourceURL:d.href.replace(/\/$/,""),sourceURLDomain:d.hostname,sourceURLPath:d.pathname.replace(/\/$/,""),sourceUrlSearchParams:d.search,fingerprint:n,formId:o,leadId:i,sessionIdFromParams:a,...s!=null?{referrer:s}:{}}},he=async(e,n)=>{let t=await e.post(rn,n,{keepalive:!0,credentials:!0});if(!t.ok)return null;let r=t.data.data?.data;return!r?.leadId||!r?.sessionId?null:{leadId:r.leadId,sessionId:r.sessionId,existing:r.existing,leadHasExistingBookingAttr:r.leadHasExistingBookingAttr,leadHasExistingEmailAttr:r.leadHasExistingEmailAttr}};var W="surfaceLeadData",pt=6e5,H=()=>{if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(W);if(!e)return null;let n=JSON.parse(e);return Date.now()>(n.expiry??0)?(localStorage.removeItem(W),null):{leadId:n.leadId,leadSessionId:n.leadSessionId,fingerprint:n.fingerprint,landingPageUrl:n.landingPageUrl,expiry:n.expiry}}catch{return null}},ve=e=>{if(!(typeof localStorage>"u"))try{localStorage.setItem(W,JSON.stringify({...e,expiry:Date.now()+6e5}))}catch{}};var Q=async({transport:e,environmentId:n,formId:t,pageUrl:r,source:o,preview:i=!1})=>{if(i||typeof window>"u")return null;let a=H();if(a?.leadSessionId&&a?.fingerprint)return a;let s=r??window.location.href,d=await ge(n),l=await he(e,ye({environmentId:n,fingerprintId:d.id,pageUrl:s,formId:t,source:o,leadId:a?.leadId??null,sessionIdFromParams:a?.leadSessionId??null}));if(l==null)return null;let c={leadId:l.leadId,leadSessionId:l.sessionId,fingerprint:d.id,landingPageUrl:s};return ve(c),c};var z="surface_journey_id",Y="surface_recent_visit",on=5184e3,sn=86400,mt="/api/v1/lead/track",ft=e=>{if(typeof document>"u")return null;for(let n of document.cookie.split(";")){let t=n.trim(),r=t.indexOf("=");if(r===-1||t.substring(0,r)!==e)continue;let o=t.substring(r+1);try{return decodeURIComponent(o)}catch{return o}}return null},gt=(e,n,t,r)=>{if(typeof document>"u")return;let o=r?`; domain=${r}`:"";document.cookie=`${e}=${encodeURIComponent(n)}; path=/; max-age=${t}; samesite=lax${o}`},Ue=()=>{let e=typeof window>"u"?"":window.location?.hostname??"";if(!e||!e.includes("."))return;let n=e.split(".");return"."+(n.length===2?e:n.slice(1).join("."))},be=({transport:e,environmentId:n})=>{let t=ft(z),r=()=>{t&&gt(z,t,on,Ue())},o=d=>{let l=H();return{...t?{id:t}:{},data:{type:"page_view",payload:{url:d,timestamp:new Date().toISOString(),referrer:typeof document>"u"?"":document.referrer||""}},metadata:{environmentId:n,...l?{...l.leadId?{leadId:l.leadId}:{},...l.leadSessionId?{leadSessionId:l.leadSessionId}:{},fingerprint:l.fingerprint,...l.landingPageUrl?{landingPageUrl:l.landingPageUrl}:{}}:{}}}},i=async d=>{if(typeof window>"u")return;let l=d??window.location.href;if(ft(Y)===l)return;let c=o(l);if(t&&e.beacon(mt,c))r();else{let f=await e.post(mt,c);f.ok&&f.data.data?.id&&(t=f.data.data.id),r()}gt(Y,l,sn,Ue())};return{trackPageView:i,observeRouteChanges:()=>{if(typeof window>"u")return()=>{};let d=window.location.href,l=()=>{let u=window.location.href;u!==d&&(d=u,i(u))};window.addEventListener("popstate",l);let c=history.pushState,f=history.replaceState;return history.pushState=function(...u){c.apply(history,u),setTimeout(l,0)},history.replaceState=function(...u){f.apply(history,u),setTimeout(l,0)},()=>{window.removeEventListener("popstate",l),history.pushState=c,history.replaceState=f}},clear:()=>{let d=Ue(),l=d?`; domain=${d}`:"";typeof document>"u"||(document.cookie=`${z}=; path=/; max-age=0; samesite=lax${l}`,document.cookie=`${Y}=; path=/; max-age=0; samesite=lax${l}`,t=null)}}};var an="/api/v1/services/enrichment/realtime",Se="selfServeEnrichment";var dn=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,ln=/^(?:https?:\/\/)?(?:www\.)?([a-z0-9-]+(?:\.[a-z0-9-]+)+)/i,yt=e=>{let n=e.trim();if(dn.test(n))return{email:n};let t=n.match(ln)?.[1];return t?{domain:t}:null},ke=({engine:e,transport:n,formId:t,sources:r})=>{let o=new Set,i=new Set,a,s,d=!1,l=async v=>{let m=yt(v);if(!m)return;let h=m.email??m.domain;if(!(o.has(h)||i.has(h))){i.add(h);try{let S=await n.post(an,{formId:t,...m});if(d||!S.ok)return;let g=S.data.data??{};if(Object.keys(g).length===0)return;o.add(h);let k=e.state().externalStates[Se],A=k?.type==="APOLLO_EMAIL_ENRICHMENT"?k.data??{}:{};e.setExternalState(Se,{type:"APOLLO_EMAIL_ENRICHMENT",processed:!0,data:{...g,...A}})}finally{i.delete(h)}}},c=()=>{let v=[],m={};for(let h of Object.values(e.state().answers))Object.assign(m,h);for(let{questionId:h,fieldNames:S}of r){let g=m[h];if(g)for(let k of S){let A=g[k];typeof A=="string"&&A.trim().length>0&&v.push(A)}}return v},f=()=>{let v=c().find(m=>{let h=yt(m);return h!=null&&!o.has(h.email??h.domain)});v===void 0||v===s||(s=v,clearTimeout(a),a=setTimeout(()=>{s=void 0,l(v)},1e3))},u=()=>{if(s===void 0)return;clearTimeout(a);let v=s;s=void 0,l(v)},T=[e.subscribe(f),e.on("stepCompleted",u),e.on("completed",u)];return()=>{d=!0,clearTimeout(a),T.forEach(v=>v())}};var cn=new Set(["MultipleOptionsQuestion","MultipleChoiceQuestion","MMChoiceQuestion"]),un=(e,n)=>typeof e=="object"&&e!==null&&typeof e.key=="string"&&typeof e.value=="boolean"&&(!n||typeof e.index=="number"),ht=({questions:e,questionId:n,merged:t})=>{let r=`Surface SDK [debug]: setAnswer("${n}")`,o=e.size>0?e.get(n):void 0;if(e.size>0&&!o){console.warn(`${r} \u2014 the record has no stateful question with this id; the answer will be dropped.`),console.debug(`Surface SDK [debug]: answer ${n}`,t);return}t.type===void 0?console.warn(`${r} \u2014 state has no "type" discriminator; the wire schema rejects untyped states. Include type: "${o?.componentType??"<ComponentType>"}".`):o?.componentType!==void 0&&t.type!==o.componentType&&console.warn(`${r} \u2014 state type "${String(t.type)}" but the record's component is ${o.componentType}.`);let i=o?.componentType??t.type;if(typeof i=="string"&&cn.has(i)){let a=i==="MultipleOptionsQuestion";(!Array.isArray(t.choices)||t.choices.some(d=>!un(d,a)))&&console.warn(`${r} \u2014 ${i} answers need the ENTIRE option list under "choices" as {key, value${a?", index":""}} objects, not ${JSON.stringify(t.choices??t)}. See get_sdk_binding_map's answerShape.`)}console.debug(`Surface SDK [debug]: answer ${n}`,t)};var pn="Lead",mn="generate_lead",fn="lead_created",St=/^tw-([a-z0-9]+)-([a-z0-9]+)$/i,gn=e=>{let n=e?.trim().match(St);return n?n[1]:null},vt=e=>/^\d+$/.test(e?.trim()??""),yn=e=>{if(e.enabled===!1||(e.trigger??"reached_qualified")==="reached_step"&&!e.triggerStepId?.trim())return!1;switch(e.provider){case"x":return St.test(e.eventId?.trim()??"");case"meta":case"openai":return!!e.pixelId?.trim();case"ga4":return!!e.measurementId?.trim();case"linkedin":return vt(e.partnerId)&&vt(e.conversionId);default:return!1}},hn=(e,n)=>{let t=n.toLowerCase();for(let[r,o]of Object.entries(e))if(r.toLowerCase()===t)return o},bt=(e,n)=>{let t=hn(n,e.param)?.trim()??"",r=e.values??[];switch(e.operator){case"is_present":return t.length>0;case"equals_any":return r.some(o=>o.trim().toLowerCase()===t.toLowerCase());case"contains":return t.length>0&&r.some(o=>t.toLowerCase().includes(o.trim().toLowerCase()));default:return!1}},vn=(e,n,t="and")=>e.length===0?!0:t==="or"?e.some(r=>bt(r,n)):e.every(r=>bt(r,n)),bn=e=>{if(!yn(e))return null;switch(e.provider){case"x":{let n=gn(e.eventId);return n?{provider:"x",event:{event_id:e.eventId.trim(),pixel_id:n}}:null}case"meta":return{provider:"meta",event:{pixel_id:e.pixelId.trim(),event_name:e.eventName?.trim()||pn}};case"openai":return{provider:"openai",event:{pixel_id:e.pixelId.trim(),event_name:e.eventName?.trim()||fn}};case"ga4":return{provider:"ga4",event:{measurement_id:e.measurementId.trim(),event_name:e.eventName?.trim()||mn}};case"linkedin":return{provider:"linkedin",event:{partner_id:e.partnerId.trim(),conversion_id:e.conversionId.trim()}};default:return null}},Ie=(e,n,t,r)=>{let o=[];for(let i of e){if((i.trigger??"reached_qualified")!==n||n==="reached_step"&&(!r||i.triggerStepId!==r)||!vn(i.conditions??[],t,i.conditionsOperator??"and"))continue;let a=bn(i);a&&o.push({rule:i,conversion:a})}return o},Sn=(e,n)=>{if(!e.twq){let t=e.twq=function(...o){t.exe?t.exe.apply(t,o):t.queue.push(o)};t.version="1.1",t.queue=[];let r=e.document.createElement("script");r.async=!0,r.src="https://static.ads-twitter.com/uwt.js",e.document.head.appendChild(r)}e.twq("config",n)},kn=(e,n)=>{if(!e.fbq){let t=e.fbq=function(...o){t.callMethod?t.callMethod.apply(t,o):t.queue.push(o)};e._fbq||(e._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[];let r=e.document.createElement("script");r.async=!0,r.src="https://connect.facebook.net/en_US/fbevents.js",e.document.head.appendChild(r)}e.fbq("init",n)},In=(e,n)=>{if(!e.oaiq){let t=e.oaiq=function(...o){t.q.push(o)};t.q=[];let r=e.document.createElement("script");r.async=!0,r.src="https://bzrcdn.openai.com/sdk/oaiq.min.js",e.document.head.appendChild(r)}e.oaiq("init",{pixelId:n})},wn=(e,n)=>{if(!e.gtag){e.dataLayer=e.dataLayer||[],e.gtag=function(...r){e.dataLayer.push(r)};let t=e.document.createElement("script");t.async=!0,t.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(n)}`,e.document.head.appendChild(t),e.gtag("js",new Date)}e.gtag("config",n,{send_page_view:!1})},En=(e,n)=>{if(!e.lintrk){e._linkedin_partner_id=n;let t=e.lintrk=function(o,i){t.q.push([o,i])};t.q=[];let r=e.document.createElement("script");r.async=!0,r.src="https://snap.licdn.com/li.lms-analytics/insight.min.js",e.document.head.appendChild(r)}e._linkedin_data_partner_ids=e._linkedin_data_partner_ids||[],e._linkedin_data_partner_ids.includes(n)||e._linkedin_data_partner_ids.push(n)},kt=(e,n,t)=>{let r=e;try{switch(n.provider){case"x":return Sn(r,n.event.pixel_id),r.twq("event",n.event.event_id,{conversion_id:t.responseId,...t.twclid?{twclid:t.twclid}:{},...t.email?{email_address:t.email}:{}}),!0;case"meta":return kn(r,n.event.pixel_id),r.fbq("track",n.event.event_name,{},{eventID:t.responseId}),!0;case"openai":return In(r,n.event.pixel_id),r.oaiq("measure",n.event.event_name,{type:"customer_action"},{event_id:t.responseId}),!0;case"ga4":return wn(r,n.event.measurement_id),r.gtag("event",n.event.event_name,{transaction_id:t.responseId,send_to:n.event.measurement_id}),!0;case"linkedin":return En(r,n.event.partner_id),r.lintrk("track",{conversion_id:n.event.conversion_id}),!0;default:return!1}}catch{return!1}};var qe=(e,n)=>e.document.querySelector(`script[src="${n}"]`)!=null,we=(e,n,t,r)=>{if(qe(e,n))return;let o=e.document.createElement("script");o.async=!0,o.src=n,r&&(o.id=r),e.document[t].appendChild(o)},Tn=(e,n)=>{let t=`https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(n)}`;qe(e,t)||(e.dataLayer=e.dataLayer||[],e.dataLayer.push({"gtm.start":new Date().getTime(),event:"gtm.js"}),we(e,t,"head"))},An=(e,n)=>{let t=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(n)}`;if(qe(e,t))return;e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)},e.gtag("js",new Date)),we(e,t,"head");let r=e.self!==e.top;e.gtag("config",n,{...r&&{cookie_flags:"SameSite=None;Secure;Partitioned"}})},Rn=(e,n)=>{if(!e.fbq){let t=e.fbq=function(...r){t.callMethod?t.callMethod.apply(t,r):t.queue.push(r)};e._fbq||(e._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[],we(e,"https://connect.facebook.net/en_US/fbevents.js","head")}e.fbq("init",n)},xn=(e,n)=>{we(e,`https://js.hs-scripts.com/${n}.js`,"body","hs-script-loader")},It=(e,n)=>{let t=e;n.gtmId&&Tn(t,n.gtmId),n.gaMeasurementId&&An(t,n.gaMeasurementId),n.metaPixelId&&Rn(t,n.metaPixelId),n.hubspotTracking?.trackingId&&xn(t,n.hubspotTracking.trackingId);let r=a=>{n.gtmId&&(t.dataLayer=t.dataLayer||[],t.dataLayer.push(a))},o=(a,s)=>{n.gaMeasurementId&&t.gtag?.("event",a,s)},i=(a,s)=>{n.metaPixelId&&t.fbq?.("trackCustom",a,s)};return{formStarted:(a,s)=>{r({event:"SurfaceFormStarted",formId:a,...s}),i("SurfaceFormStarted",{formId:a,...s}),o("SurfaceFormStarted",{formId:a,...s})},stepSubmitted:a=>{r({event:"SurfaceFormStepSubmitted",...a}),i("SurfaceFormStepSubmitted",a),o("SurfaceFormStepSubmitted",a)},formCompleted:(a,s)=>{r({event:"SurfaceFormSubmitEvent",formId:a,...s}),i("SurfaceFormCompleted",{formId:a,...s}),o("SurfaceFormCompleted",{formId:a,...s})}}};var _n=e=>{try{return Object.fromEntries(new URLSearchParams(e.location.search).entries())}catch{return{}}},Ee=(e,n)=>{let t=n.toLowerCase();for(let[r,o]of Object.entries(e))if(r.toLowerCase()===t)return o?.trim()||void 0},Cn=e=>({twclid:Ee(e,"twclid"),fbclid:Ee(e,"fbclid"),gclid:Ee(e,"gclid"),li_fat_id:Ee(e,"li_fat_id")}),Pn=["email","emailAddress","workEmailAddress"],Ve=e=>{for(let n of Object.values(e))for(let t of Pn){let r=n[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}},wt=e=>Object.values(e).some(n=>n.eventScheduled===!0),Be=e=>{let n={};for(let t of Object.values(e.state().answers))Object.assign(n,t);return n},Et=({engine:e,formId:n,settings:t,win:r})=>{let o=r??window,i=It(o,t),a=t.adsConversions??[],s=_n(o),d={url:o.location.href,urlParams:s},l=new Set,c=new Set,f=new Set,u=new Set,T=!1,v=!1,m=!1,h=!1,S=!1,g=e.state().responseId==null,k=!g,A=(y,E)=>{let _=y.filter(({rule:P})=>!l.has(P.id));if(_.length===0)return;_.forEach(({rule:P})=>l.add(P.id));let M={responseId:E,email:Ve(Be(e)),...Cn(s)};_.forEach(({conversion:P})=>kt(o,P,M))},O=(y,E)=>{if(!E){u.add(y);return}A(Ie(a,y,s),E)},w=(y,E)=>{if(!E){f.add(y);return}A(Ie(a,"reached_step",s,y),E)},N=y=>{if(!y){T=!0;return}v=!0,T=!1;let E=new Map;for(let _ of["reached_qualified","form_submitted"])for(let M of Ie(a,_,s))E.set(M.rule.id,M);A(Array.from(E.values()),y)},R=()=>{let y=Be(e);!h&&g&&Ve(y)!==void 0&&(h=!0,O("email_provided",e.state().responseId)),!S&&g&&wt(y)&&(S=!0,O("meeting_booked",e.state().responseId))},I=[];I.push(e.on("started",()=>{i.formStarted(n,d)}));let C;I.push(e.on("stepCompleted",({stepId:y})=>{let E=Be(e);C={stepId:y,formId:n,emailProvided:Ve(E)!==void 0,meetingBooked:wt(E),...d},!m&&g&&(m=!0,O("step_submitted",e.state().responseId))})),I.push(e.on("stepChanged",({toStepId:y})=>{C&&(e.state().finished||i.stepSubmitted(C),C=void 0),!c.has(y)&&(c.add(y),w(y,e.state().responseId))})),I.push(e.on("completed",()=>{C=void 0,i.formCompleted(n,d),v||N(e.state().responseId)})),I.push(e.on("saved",({responseId:y})=>{if(k||(k=!0,O("form_started",y)),T&&N(y),f.size>0){let E=Array.from(f);f.clear(),E.forEach(_=>w(_,y))}if(u.size>0){let E=Array.from(u);u.clear(),E.forEach(_=>O(_,y))}})),I.push(e.subscribe(R));let L=e.state().currentStepId;return c.add(L),w(L,e.state().responseId),R(),()=>I.forEach(y=>y())};var Fn=["email","emailAddress","workEmailAddress"],Dn=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,Te=({engine:e,validator:n})=>{let t=new Set,r=new Map,o,i=!1,a,s=!1,d=()=>{let v=[];for(let m of Object.values(e.state().answers))for(let h of Object.values(m))for(let S of Fn){let g=h[S];typeof g=="string"&&Dn.test(g.trim())&&v.push(g.trim())}return v},l=()=>{let v=new Set(d()),m=[...r.values()].filter(g=>v.has(g.email));if(m.length===0)return;let h=JSON.stringify(m.map(g=>[g.email,g.isValid,g.failed===!0]));if(h===a)return;a=h;let S=m.find(g=>g.status&&g.reason);e.mergeMeta({isEmailValid:m.some(g=>g.isValid),emailValidation:S?{status:S.status,reason:S.reason,...S.blacklistEntryIds?.length&&{blacklistEntryIds:S.blacklistEntryIds}}:void 0,emailValidationFailed:m.some(g=>g.failed===!0)})},c=async()=>{let v=d().filter(h=>!t.has(h));if(v.length===0)return;v.forEach(h=>t.add(h));let m=await n.validateBatch(v);s||(m.forEach(h=>r.set(h.email,h)),l())},f=()=>{if(!d().some(v=>!t.has(v))){l();return}i=!0,clearTimeout(o),o=setTimeout(()=>{i=!1,c()},300)},u=()=>{i&&(i=!1,clearTimeout(o),c())},T=[e.subscribe(f),e.on("stepCompleted",u),e.on("completed",u)];return()=>{s=!0,clearTimeout(o),T.forEach(v=>v())}};var Tt=new Set(["surfaceTagStatus","isEmailValid","emailValidation","emailValidationFailed"]),At={init:async({environmentId:e,formId:n,steps:t,settings:r={},apiBaseUrl:o,container:i,expectedQuestionIds:a,resolveNextStep:s,urlDataStateId:d,source:l,journey:c=!1,emailValidation:f=!1,preview:u=!1,previewToken:T,debug:v=!1,resume:m,meta:h})=>{let S=se({apiBaseUrl:o}),g;if(!t){let x=await te(S,n,{preview:u,previewToken:T});if(!x.ok||!x.data.data){let F=(o??j).replace(/\/$/,""),q=x.ok?"empty response":x.error.kind==="http"?`HTTP ${x.error.status}`:"network error";throw new Error(`SurfaceForms.init: could not fetch runtime config for form "${n}" (${q} from ${F}/api/v1/public/forms/${n}/runtime-config). If this environment is not served from ${j}, pass apiBaseUrl \u2014 the get_sdk_binding_map MCP tool returns the correct value.`)}g=x.data.data,t=ne(g.config),a=a??$(g.config).map(F=>F.questionId);let D=g.settings??{};r={trackPartialResponses:D.trackPartialResponses,trackCookies:D.trackCookie,gtmId:D.gtmId,gaMeasurementId:D.gaMeasurementId,metaPixelId:D.metaPixelId,hubspotTracking:D.hubspotTracking,adsConversions:D.adsConversions,...r}}let k=r.trackCookies??!1,A;if(m&&!u){let x=await et(S,m);x.ok?A={responseId:m.responseId,answers:Object.fromEntries(x.data.answers.map(D=>[D.questionId,D.response]))}:console.warn(`Surface SDK: resume fetch for response "${m.responseId}" failed \u2014 starting a fresh session.`)}let O=await Q({transport:S,environmentId:e,formId:n,source:l,preview:u}),w=de({transport:S,preview:u}),N=fe({transport:S,preview:u}),R=ue({formId:n,environmentId:e,steps:t,transport:S,resolveNextStep:s,trackPartialResponses:r.trackPartialResponses??!0,trackCookies:k,externalStates:d?{[d]:pe({trackCookies:k})}:{},meta:{...h,surfaceTagStatus:"sdk"},identity:()=>({fingerprint:O?.fingerprint,leadSessionId:O?.leadSessionId??void 0,leadId:O?.leadId??void 0}),pushEvents:w,formJourney:N,preview:u,resume:A}),I=[],C=R;if(v){let x=new Map((g?$(g.config):[]).map(D=>[D.questionId,D]));C={...R,setAnswer:(D,F)=>{let q=R.state().currentStepId;R.setAnswer(D,F);let Ae=R.state().answers[q]?.[D]??F;ht({questions:x,questionId:D,merged:Ae})}};for(let D of["viewed","started","stepChanged","stepCompleted","completed","disqualified","saved","error"])I.push(R.on(D,F=>console.debug(`Surface SDK [debug]: ${D}`,F)))}let L=!1;I.push(R.on("started",()=>{L=!0})),I.push(me(w,()=>({started:L,formId:n,stepId:R.state().currentStepId,sessionId:O?.leadSessionId??void 0}))),i&&I.push(X({engine:C,root:i,expectedQuestionIds:a}));let y=!!r.gtmId||!!r.gaMeasurementId||!!r.metaPixelId||!!r.hubspotTracking?.trackingId||(r.adsConversions?.length??0)>0;y&&!u&&typeof window<"u"&&I.push(Et({engine:R,formId:n,settings:r}));let E=g?re(g.config):[],_=g!=null&&E.length>0&&oe(g.settings);_&&!u?I.push(ke({engine:R,transport:S,formId:n,sources:E})):v&&g&&!_&&nt(g.config)&&console.warn("Surface SDK: the record declares an enrichmentSourceField, but this environment has no enabled enrichment provider \u2014 no enrichment will run (capabilities.enrichment is false).");let M=Z({transport:S,environmentId:e,preview:u});f&&!u&&I.push(Te({engine:R,validator:M}));let P;return c&&!u&&(P=be({transport:S,environmentId:e}),P.trackPageView(),I.push(P.observeRouteChanges())),{setAnswer:C.setAnswer,setExternalState:R.setExternalState,next:R.next,back:R.back,goToStep:R.goToStep,submit:R.submit,disqualify:R.disqualify,savePartial:R.savePartial,flush:R.flush,markViewed:R.markViewed,mergeMeta:x=>{let D=Object.entries(x),F=D.filter(([q])=>Tt.has(q));F.length>0&&console.warn(`Surface SDK: mergeMeta dropped reserved key(s) ${F.map(([q])=>q).join(", ")} \u2014 these are SDK-owned response markers.`),R.mergeMeta(Object.fromEntries(D.filter(([q])=>!Tt.has(q))))},capabilities:{enrichment:_,emailValidation:f,tracking:y},on:R.on,state:R.state,subscribe:R.subscribe,identify:async()=>{let x=await Q({transport:S,environmentId:e,formId:n,source:l,preview:u});return x&&(O=x),x},validateEmail:M.validate,runtimeConfig:g,destroy:()=>I.forEach(x=>x())}}};return Lt(Ln);})();
1
+ "use strict";var SurfaceFormsSDK=(()=>{var $e=Object.defineProperty;var en=Object.getOwnPropertyDescriptor;var tn=Object.getOwnPropertyNames;var nn=Object.prototype.hasOwnProperty;var rn=(e,n)=>{for(var t in n)$e(e,t,{get:n[t],enumerable:!0})},on=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of tn(n))!nn.call(e,o)&&o!==t&&$e(e,o,{get:()=>n[o],enumerable:!(r=en(n,o))||r.enumerable});return e};var sn=e=>on($e({},"__esModule",{value:!0}),e);var yr={};rn(yr,{DEFAULT_API_BASE_URL:()=>z,DEFAULT_REDIRECT_TIMEOUT_MS:()=>Mt,ENRICHMENT_STATE_ID:()=>Le,IDENTITY_INFO_ANSWER_KEYS:()=>xt,JOURNEY_COOKIE_NAME:()=>re,LEAD_DATA_STORAGE_KEY:()=>te,LEAD_DATA_TTL_MS:()=>Ft,RECENT_VISIT_COOKIE_NAME:()=>oe,SurfaceForms:()=>zt,attachEmailValidation:()=>qe,attachEnrichment:()=>Oe,bindForm:()=>ie,buildIdentifyPayload:()=>Ce,buildRedirectUrl:()=>We,buildResponsesArray:()=>Ke,buildStepTransitionEventBatch:()=>Se,buildUrlData:()=>Te,constructUrlParamsObject:()=>Je,createEmailValidator:()=>ye,createEmitter:()=>be,createFormEngine:()=>Ee,createFormJourneyTracker:()=>Ae,createJourneyTracker:()=>Me,createPushEventClient:()=>ke,createSchedulerClient:()=>fe,createStartedDetector:()=>we,createSubmitResponsePayload:()=>Ie,createTransport:()=>ve,createUpdateResponsePayload:()=>Y,enrichmentSourcesOf:()=>ce,ensureIdentified:()=>ne,fetchRuntimeConfig:()=>de,getBrowserFingerprint:()=>_e,getHash:()=>Ye,hasEnabledEnrichmentProvider:()=>me,identifyLead:()=>xe,mountBookingWidget:()=>ae,mountScheduler:()=>Et,observeDropoff:()=>Re,observeFormView:()=>se,parseCookiesObject:()=>Qe,parsePrefillParams:()=>Ot,parseQuestionId:()=>ze,performRedirect:()=>Lt,readLeadData:()=>G,schedulerQuestionsOf:()=>pe,statefulQuestionIdsOf:()=>it,statefulQuestionsOf:()=>Q,stepsOf:()=>ue,submitResponse:()=>he,toSchedulerAnswerState:()=>vt,updateResponse:()=>ee,writeLeadData:()=>Pe});var se=(e,n)=>{if(typeof IntersectionObserver>"u")return n(),()=>{};let t=!1,r=new IntersectionObserver(o=>{let[a]=o;!a?.isIntersecting||t||(t=!0,r.disconnect(),n())});return r.observe(e),()=>r.disconnect()};var nt="input, select, textarea",an=e=>e.matches(nt)?[e]:Array.from(e.querySelectorAll(nt)).filter(n=>n.closest("[data-question-id]")===e),dn=(e,n,t)=>{let r=e.getAttribute("data-field-name")??n.getAttribute("data-field-name");return r||(t==="Dropdown"&&n instanceof HTMLSelectElement?"selected":n instanceof HTMLInputElement&&n.type==="email"?"email":"input")},rt=(e,n)=>{let t=e.getAttribute("data-question-type")??n.getAttribute("data-question-type");return t||(n instanceof HTMLInputElement&&n.type==="email"?"EmailForm":"ShortInput")},ot=e=>e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")&&e.type==="checkbox"?e.checked:e.value,ln=e=>e instanceof HTMLInputElement&&(e.type==="radio"||e.type==="checkbox"),st=e=>{let n=e.findIndex(t=>t.checked);return{value:n===-1?"":e[n].value,index:n}},un={MultipleOptionsQuestion:e=>({choices:e.map((n,t)=>({key:n.value,value:n.checked,index:t}))}),MultipleChoiceQuestion:e=>({choices:e.map(n=>({key:n.value,value:n.checked}))}),MMChoiceQuestion:e=>({choices:e.map(n=>({key:n.value,value:n.checked}))}),GraphicOptions:st,MultipleChoiceSingleAnswer:st},ie=({engine:e,root:n,expectedQuestionIds:t})=>{let r=[],o=new Set,a=(u,c,p)=>{u.addEventListener(c,p),r.push(()=>u.removeEventListener(c,p))};for(let u of Array.from(n.querySelectorAll("[data-question-id]"))){let c=u.getAttribute("data-question-id"),p=an(u);if(p.length===0)continue;o.add(c);let C=rt(u,p[0]),y=un[C],m=p.filter(ln);if(y&&m.length>0){let h=()=>e.setAnswer(c,{type:C,...y(m)});for(let v of m)a(v,"change",h);m.some(v=>v.checked)&&h();continue}for(let h of p){let v=rt(u,h),g=dn(u,h,v),L=()=>e.setAnswer(c,{type:v,[g]:ot(h)});a(h,"input",L),a(h,"change",L);let P=ot(h);P!==""&&P!==!1&&L()}}let i=(t??[]).filter(u=>!o.has(u));i.length>0&&console.warn(`Surface SDK: form record declares questionIds with no bound element: ${i.join(", ")}. Answers for these will never be captured — check data-question-id attributes (validate_form_html catches this at authoring time).`);let s="[data-surface-goto-step], .surface-disqualify-button, .surface-submit-button, .surface-next-button";for(let u of Array.from(n.querySelectorAll(s))){let c=u.getAttribute("data-surface-goto-step"),p=[c!=null?"goto":null,u.classList.contains("surface-disqualify-button")?"disqualify":null,u.classList.contains("surface-submit-button")?"submit":null,u.classList.contains("surface-next-button")?"next":null].filter(y=>y!=null),C=p[0];p.length>1&&console.warn(`Surface SDK: element carries multiple navigation markers (${p.join(", ")}); only "${C}" is bound.`),a(u,"click",y=>{y.preventDefault(),C==="goto"?e.goToStep(c).catch(m=>console.warn(`Surface SDK: ${String(m)}`)):C==="disqualify"?e.disqualify():C==="submit"?e.submit():e.next()})}n instanceof HTMLFormElement&&a(n,"submit",u=>{u.preventDefault(),e.submit()});let d=Array.from(n.querySelectorAll("[data-step-id]")),l=()=>{let{currentStepId:u}=e.state();for(let c of d)c.hidden=c.getAttribute("data-step-id")!==u};return d.length>0&&(l(),r.push(e.on("stepChanged",l))),r.push(se(n,()=>e.markViewed())),()=>r.forEach(u=>u())};var cn=()=>{let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}`},pn=e=>{let[n,t]=e.split("-").map(Number);return new Date(n,t-1,1).toLocaleDateString(void 0,{month:"long",year:"numeric"})},mn=e=>{let[n,t,r]=e.split("-").map(Number);return new Date(n,t-1,r).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"})},fn=(e,n)=>{let[t,r]=e.split("-").map(Number),o=new Date(t,r-1+n,1);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}`},ae=({container:e,scheduler:n,eventTypeId:t,timezone:r=Intl.DateTimeFormat().resolvedOptions().timeZone,duration:o,prefill:a,identity:i,formatters:s,onEvent:d,onComplete:l})=>{let u=s?.month??pn,c=s?.date??mn,p=s?.time??(O=>new Date(O.start).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",timeZone:r})),C=document.createElement("div");C.className="surface-booking",e.appendChild(C);let y=cn(),m=!0,h=[],v=null,g=null,L=!1,P=0,k=(O,S,w)=>{let _=document.createElement(O);return _.className=S,w!=null&&(_.textContent=w),_},T=O=>{L||C.replaceChildren(...O)},U=(O,S)=>{let w=k("p","surface-booking-error",O),_=k("button","surface-booking-retry","Try again");_.type="button",_.addEventListener("click",S),T([w,_])},b=async()=>{let O=y,S=++P;T([k("p","surface-booking-loading","Loading availability…")]);let w=await n.getMonthAvailability({eventTypeId:t,month:O,timezone:r,duration:o});if(L||S!==P)return;if(!w.ok){U("Unable to load availability.",()=>{b()});return}h=w.data.data?.dates??[];let _=h.filter(E=>E.slots&&E.slots.length>0);if(m&&(m=!1,_.length===0&&o==null)){let E=await n.getAvailabilitySummary({eventTypeId:t,timezone:r});if(L||S!==P)return;let R=E.ok?E.data.data?.next_available_date:null;if(R&&!R.startsWith(O)){y=R.slice(0,7),b();return}}let q=k("p","surface-booking-month",u(O));q.dataset.value=O;let F=k("div","surface-booking-month-nav");for(let[E,R]of[["Previous month",-1],["Next month",1]]){let D=k("button","surface-booking-month-button",E);D.type="button",D.addEventListener("click",()=>{y=fn(y,R),b()}),F.appendChild(D)}let M=k("ul","surface-booking-dates");for(let E of _){let R=k("li","surface-booking-date"),D=k("button","surface-booking-date-button",c(E.date));D.dataset.value=E.date,D.type="button",D.addEventListener("click",()=>{v=E,d?.({type:"date_selected",date:E.date}),A()}),R.appendChild(D),M.appendChild(R)}M.childElementCount===0&&M.appendChild(k("li","surface-booking-no-dates","No availability this month.")),T([q,F,M])},A=async()=>{if(!v)return;let O=++P,S=v.slots??[];if(S.length===0){let F=await n.getSlots({eventTypeId:t,date:v.date,timezone:r,duration:o});if(L||O!==P)return;if(!F.ok){U("Unable to load times.",()=>{A()});return}S=F.data.data?.slots??[]}let w=k("p","surface-booking-day",c(v.date));w.dataset.value=v.date;let _=k("button","surface-booking-back","Back");_.type="button",_.addEventListener("click",()=>{b()});let q=k("ul","surface-booking-slots");for(let F of S){let M=k("li","surface-booking-slot"),E=k("button","surface-booking-slot-button",p(F));E.dataset.value=F.start,E.type="button",E.addEventListener("click",()=>{g=F,d?.({type:"slot_selected",slot:F}),x()}),M.appendChild(E),q.appendChild(M)}T([w,_,q])},x=O=>{if(!g)return;O==null&&d?.({type:"form_opened"});let S=k("form","surface-booking-form"),w=k("input","surface-booking-name");w.name="name",w.placeholder="Name",w.value=a?.name??"";let _=k("input","surface-booking-email");_.type="email",_.name="email",_.placeholder="Email",_.value=a?.email??"";let q=k("button","surface-booking-submit","Book");q.type="submit",S.append(w,_,q),O&&S.appendChild(k("p","surface-booking-error",O)),S.addEventListener("submit",F=>{F.preventDefault(),(async()=>{q.disabled=!0;let M=typeof i=="function"?await i():i,E=await n.book({eventTypeId:t,startTime:g.start,endTime:g.end,timezone:r,inviteeName:w.value,inviteeEmail:_.value,duration:o,...M});if(!L){if(!E.ok){x("Booking failed. Please try again.");return}T([k("p","surface-booking-booked","Booked!")]),d?.({type:"booking_confirmed",booking:E.data}),l(E.data)}})()}),T([S])};return d?.({type:"viewed"}),b(),()=>{L=!0,C.remove()}};var de=(e,n,{preview:t=!1,previewToken:r}={})=>e.get(`/api/v1/public/forms/${n}/runtime-config${t?`?preview=1${r?`&pt=${encodeURIComponent(r)}`:""}`:""}`),le=e=>{let n=e.components;if(Array.isArray(n))return n;let t=n?.layout;return Array.isArray(t)?t.flatMap(r=>{let o=r.row;return Array.isArray(o)?o.map(a=>a.type==="GridLayoutRowItem"?a.component:a):[]}):[]},ue=e=>(e.steps??[]).map(n=>({id:n.id,...n.endStepKind!==void 0&&{endStepKind:n.endStepKind}})),Q=e=>(e.steps??[]).flatMap(le).flatMap(n=>{let t=n;return typeof t?.state?.questionId!="string"?[]:[{questionId:t.state.questionId,...typeof t.type=="string"&&{componentType:t.type}}]}),it=e=>Q(e).map(n=>n.questionId),ce=e=>(e.steps??[]).flatMap(le).flatMap(n=>{let t=n;if(typeof t?.state?.questionId!="string")return[];if(t.type==="IdentityInfo"){let r=typeof t.content?.enrichmentSourceField=="string"?t.content.enrichmentSourceField:"emailAddress";return[{questionId:t.state.questionId,fieldNames:[...new Set([r,"websiteUrl"])]}]}return t.type==="EmailForm"?[{questionId:t.state.questionId,fieldNames:["email"]}]:[]}),at=e=>{let n=e;return typeof n?.stepId=="string"&&typeof n?.questionId=="string"?{stepId:n.stepId,questionId:n.questionId}:void 0},gn=e=>{let n=at(e),t=e?.variable;return n&&typeof t=="string"?{...n,variable:t}:void 0},pe=e=>(e.steps??[]).flatMap(n=>le(n).flatMap(t=>{let r=t;if(r?.type!=="CalendlyScreen"&&r?.type!=="DynamicScheduler")return[];if(typeof r.state?.questionId!="string")return[];let o=r.content??{},a={};for(let s of["dataUrl","eventTypeId","savvyCalLinkId","revenueHeroRouterId"])typeof o[s]=="string"&&(a[s]=o[s]);for(let s of["addSchedulerQueryParams","skipFormIfPrefilled"])typeof o[s]=="boolean"&&(a[s]=o[s]);for(let s of["linkNameToStep","linkLastNameToStep","linkEmailToStep"]){let d=at(o[s]);d&&(a[s]=d)}let i=Object.entries(o.dataUrlParams??{}).flatMap(([s,d])=>{let l=gn(d);return l?[[s,l]]:[]});return i.length>0&&(a.dataUrlParams=Object.fromEntries(i)),Array.isArray(o.calendars)&&(a.calendars=o.calendars),o.defaultCalendar!=null&&(a.defaultCalendar=o.defaultCalendar),[{questionId:r.state.questionId,stepId:n.id,componentType:r.type,calendarType:typeof o.calendarType=="string"?o.calendarType:"Calendly",content:a}]})),dt=e=>(e.steps??[]).flatMap(le).some(n=>typeof n?.content?.enrichmentSourceField=="string"),me=e=>{let n=e?.enrichment;return n?.version!==2||!Array.isArray(n.providers)?!1:n.providers.some(t=>t?.enabled===!0&&Array.isArray(t.enabledFields)&&t.enabledFields.length>0)};var X=e=>/^[a-z][a-z0-9+.-]*:\/\//i.test(e)?e:`https://${e}`,B=(e,n)=>{let t;try{t=new URL(X(e))}catch{return null}for(let[r,o]of Object.entries(n))o!=null&&!t.searchParams.has(r)&&t.searchParams.set(r,o);return t.toString()},yn=(e,n)=>{let t=document.createElement("iframe");return t.className="surface-scheduler-frame",t.src=n,t.style.width="100%",t.style.height="100%",t.style.border="0",e.appendChild(t),t},W=e=>new Promise((n,t)=>{let r=document.querySelector(`script[src="${e}"]`);if(r){if(r.dataset.surfaceLoaded==="true")return n();r.addEventListener("load",()=>n()),r.addEventListener("error",()=>t(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.addEventListener("load",()=>{o.dataset.surfaceLoaded="true",n()}),o.addEventListener("error",()=>{o.remove(),t(new Error(`Failed to load ${e}`))}),document.head.appendChild(o)}),hn=(e,n)=>{let t;try{t=new URL(e)}catch{return!1}return n.some(r=>"exact"in r?e===r.exact:t.protocol!=="https:"?!1:"hostRegex"in r?r.hostRegex.test(t.hostname):t.hostname===r.hostSuffix||t.hostname.endsWith(`.${r.hostSuffix}`))},N=(e,n)=>(console.warn(`Surface SDK: scheduler question "${e.questionId}" is missing ${n} on the record.`),()=>{}),j=e=>{let n=!1,t;return e().then(r=>{n?r?.():t=r}).catch(r=>console.warn("Surface SDK: scheduler embed failed",r)),()=>{n=!0,t?.()}},Z=(e,n)=>{let t=r=>{if(hn(r.origin,e))try{n(r.data)}catch(o){console.warn("Surface SDK: scheduler message handler failed",o)}};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},V=(e,{needsResponseId:n=!1,build:t})=>j(async()=>{let r=n?await e.ensureResponseId():null,o=t(r);if(o.src==null)return;let a=yn(e.container,o.src),i=o.origins&&o.onMessage?Z(o.origins,o.onMessage):void 0,s=o.poll&&r!=null?vn({transport:e.form.transport,...o.poll}):void 0;return()=>{i?.(),s?.(),a.remove()}}),vn=({transport:e,path:n,onResult:t,intervalMs:r=2e3,timeoutMs:o=3e5})=>{let a=Date.now(),i=!1,s=null,d=()=>{i=!0,s!=null&&clearInterval(s),s=null},l=async()=>{if(i)return;if(Date.now()-a>o)return d();let u=await e.get(n);i||!u.ok||t(u.data)==="stop"&&d()};return l(),s=setInterval(()=>{l()},r),d};var lt=e=>{let n=e.content.dataUrl;if(!n)return N(e.question,"dataUrl");let t=X(n),r=t.split("/").pop()?.split("?")[0]??"surface",o=t.replace(/^https?:\/\/(app\.)?cal\.com\//,""),a=`surface-cal-${e.question.questionId}`,i=document.createElement("div");i.id=a,e.container.appendChild(i);let s=l=>{let u=l.detail?.data?.booking?.uid;e.confirmBooking({uri:u?`https://app.cal.com/booking/${u}`:"",raw:l.detail})};window.addEventListener(`CAL:${r}:bookingSuccessful`,s);let d=j(async()=>{await W("https://app.cal.com/embed/embed.js");let l=window.Cal;l&&(l("init",r,{origin:"https://cal.com"}),l.ns?.[r]?.("inline",{elementOrSelector:`#${a}`,calLink:o,config:{...e.prefill.name&&{name:e.prefill.name},...e.prefill.email&&{email:e.prefill.email}}}))});return()=>{window.removeEventListener(`CAL:${r}:bookingSuccessful`,s),d(),i.remove()}};var ut=e=>{let n=e.content.dataUrl;if(!n)return N(e.question,"dataUrl");let t=!1,r=(a,i)=>{t||(t=!0,e.confirmBooking({uri:a,raw:i}))},o=e.content.addSchedulerQueryParams!==!1;return V(e,{needsResponseId:!0,build:a=>({src:B(n,{embed_domain:"1",embed_type:"Inline",...o&&{hide_event_type_details:"1",hide_gdpr_banner:"1"},...Object.keys(e.urlParams).length>0?e.urlParams:{name:e.prefill.name,email:e.prefill.email},...a!=null&&{utm_source:`surface-${a}`}}),origins:[{exact:"https://calendly.com"}],onMessage:i=>{let s=i;typeof s?.event!="string"||!s.event.startsWith("calendly.")||(s.event==="calendly.event_type_viewed"&&e.emit({type:"viewed"}),s.event==="calendly.date_and_time_selected"&&e.emit({type:"slot_selected"}),s.event==="calendly.event_scheduled"&&r(s.payload?.invitee?.uri??"",i))},poll:{path:`/api/v1/calendly/check-event/${a}`,onResult:i=>i.status==="pending"?"continue":i.status==="canceled"?(t&&e.cancelBooking(),"stop"):typeof i.url=="string"&&i.url&&i.responseId===a?(r(i.url,i),"stop"):t?"stop":"continue"}})})};var ct=e=>{let n=e.content.dataUrl;return n?V(e,{build:()=>({src:B(n,{embed:"true",...e.urlParams}),origins:[{hostSuffix:"chilipiper.com"}],onMessage:t=>{let r=t;r?.action==="booking-confirmed"&&e.confirmBooking({uri:r.args?.eventId??"",raw:t})}})}):N(e.question,"dataUrl")};var pt=e=>{let n=e.content.dataUrl;return n?V(e,{build:()=>({src:B(n,{embed:"true",...e.urlParams})})}):N(e.question,"dataUrl")};var mt=e=>{let n=e.content.dataUrl;if(!n)return N(e.question,"dataUrl");let t=B(n,{embed:"true",...e.urlParams});if(t==null)return()=>{};let r=`surface-hubspot-${e.question.questionId}`,o=document.createElement("div");o.id=r,o.className="meetings-iframe-container",o.dataset.src=t,e.container.appendChild(o);let a=Z([{exact:"https://meetings.hubspot.com"},{hostRegex:/^meetings-[a-z0-9]+\.hubspot\.com$/}],s=>{s?.meetingBookSucceeded===!0&&e.confirmBooking({uri:" ",raw:s})}),i=j(async()=>{await W("https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js"),window.MeetingsEmbedCode?.createMeetingsIframe(`#${r}`)});return()=>{a(),i(),o.remove()}};var bn=["reclaim.ai","reclaim.com","reclaimai.com"],ft=e=>{let n=e.content.dataUrl,t=(()=>{try{return new URL(X(n??"")).hostname}catch{return null}})(),r=t!=null&&bn.some(o=>t===o||t.endsWith(`.${o}`));return!n||!r?N(e.question,"a valid reclaim.ai dataUrl"):V(e,{needsResponseId:!0,build:o=>({src:B(n,{...o!=null&&{"data-responseId":o},...e.urlParams}),poll:{path:`/api/v1/reclaimai/check-event/${o}`,onResult:a=>{if(a.status==="pending")return"continue";if(a.meetingId!=null&&a.responseId===o){let i=[a.schedulingLinkId,a.meetingId].find(s=>typeof s=="string"&&s.length>0);return e.confirmBooking({uri:i??"",raw:a}),"stop"}return"continue"}}})})};var gt=e=>{let n=e.content.revenueHeroRouterId;if(!n)return N(e.question,"revenueHeroRouterId");let t=`surface-revenuehero-${e.question.questionId}`,r=document.createElement("div");r.id=t,e.container.appendChild(r);let o=Z([{hostSuffix:"revenuehero.io"}],i=>{let s=i;s?.type!=="MEETING_BOOKED"||s.meeting==null||e.confirmBooking({uri:s.meeting.id??"",...s.meeting.attributes?.meeting_time!=null&&{meetingTime:s.meeting.attributes.meeting_time},raw:i})}),a=j(async()=>{await W("https://assets.revenuehero.io/scheduler.min.js");let i=window.RevenueHero;if(!i)return;let s=new i({routerId:n,showLoader:!1}),d={...e.urlParams,...e.prefill.email&&{email:e.prefill.email},...e.prefill.name&&{name:e.prefill.name}},l=await s.submit(d);s.dialog.setEmbedTarget(`#${t}`),s.dialog.open(l)});return()=>{o(),a(),r.remove()}};var yt=e=>{let n=e.content.savvyCalLinkId;if(!n)return N(e.question,"savvyCalLinkId");let t=`surface-savvycal-${e.question.questionId}`,r=document.createElement("div");r.id=t,e.container.appendChild(r);let o=i=>{let s=i.detail;s&&e.confirmBooking({uri:s.url??"",raw:s})};window.addEventListener("savvycal.scheduled",o);let a=j(async()=>{await W("https://embed.savvycal.com/v1/embed.js");let i=window.SavvyCal;if(!i)return;i("init");let s=[e.prefill.name,e.prefill.lastName].filter(Boolean).join(" ");i("inline",{link:n,selector:`#${t}`,...s&&{displayName:s},...e.prefill.email&&{email:e.prefill.email}})});return()=>{window.removeEventListener("savvycal.scheduled",o),a(),r.remove()}};var ht=e=>new URLSearchParams(Object.fromEntries(Object.entries(e).filter(([,n])=>n!=null))),fe=({transport:e,preview:n=!1})=>{let t=n?"true":void 0,r=o=>{if(!o.ok)return o;let a=o.data.data;return a?.id?{ok:!0,data:a}:{ok:!1,error:{kind:"http",status:200,body:o.data}}};return{getPublicEventType:o=>e.get(`/api/v1/scheduler/event-types/${o}/public`),getAvailabilitySummary:({eventTypeId:o,timezone:a})=>{let i=new URLSearchParams({eventTypeId:o,timezone:a??Intl.DateTimeFormat().resolvedOptions().timeZone});return e.get(`/api/v1/scheduler/availability-summary?${i}`)},getMonthAvailability:({eventTypeId:o,month:a,timezone:i,duration:s,hostId:d,ownerEmail:l})=>{let[u,c]=a.split("-").map(Number),p=ht({eventTypeId:o,month:String(c),year:String(u),timezone:i,duration:s?String(s):void 0,preview:t,hostId:d,ownerEmail:l});return e.get(`/api/v1/scheduler/availability?${p}`)},getSlots:({eventTypeId:o,date:a,timezone:i,duration:s,hostId:d,ownerEmail:l})=>{let u=ht({eventTypeId:o,date:a,timezone:i,duration:s?String(s):void 0,preview:t,hostId:d,ownerEmail:l});return e.get(`/api/v1/scheduler/slots?${u}`)},book:async({eventTypeId:o,startTime:a,endTime:i,timezone:s,inviteeName:d,inviteeEmail:l,duration:u,intakeResponses:c,guestEmails:p,captchaToken:C,responseId:y,leadSessionId:m,fingerprint:h,hostRouting:v})=>{if(n)return{ok:!0,data:{id:"preview-booking-"+Date.now(),startTime:a,endTime:i,timezone:s,inviteeName:d||"Test User",inviteeEmail:l||"test@example.com",meetingJoinLink:null,cancelToken:"preview-cancel-"+Date.now(),rescheduleToken:"preview-reschedule-"+Date.now(),attendees:[{name:"Host",email:"host@example.com",isHost:!0}]}};let g=await e.post("/api/v1/scheduler/book",{eventTypeId:o,startTime:a,timezone:s,inviteeName:d,inviteeEmail:l.trim(),...u?{duration:u}:{},...c&&Object.keys(c).length>0?{intakeResponses:c}:{},...p&&p.length>0?{guestEmails:p}:{},...C?{captchaToken:C}:{},meta:{source:"form",...y?{responseId:y}:{},...m?{leadSessionId:m}:{},...h?{fingerprint:h}:{},...v?{hostRouting:v}:{}}});return r(g)},reschedule:async({bookingId:o,rescheduleToken:a,newStartTime:i,timezone:s})=>{let d=await e.post(`/api/v1/scheduler/bookings/${o}/reschedule`,{rescheduleToken:a,newStartTime:i,timezone:s});return r(d)}}},vt=e=>{let n=e.attendees?.find(t=>t.isHost);return{type:"DynamicScheduler",eventScheduled:!0,uri:e.id,meetingTime:e.startTime,meetingEndTime:e.endTime,ownerEmails:n?.email??"",guestEmails:e.inviteeEmail,inviteeName:e.inviteeName,googleMeetLink:e.meetingJoinLink??""}};var bt=e=>{let n=e.content.eventTypeId;if(!n)throw new Error(`mountScheduler: Surface scheduler question "${e.question.questionId}" has no eventTypeId on the record.`);let t=fe({transport:e.form.transport,preview:e.form.preview}),r=[e.prefill.name,e.prefill.lastName].filter(Boolean).join(" ");return e.mergeAnswer({eventScheduled:!1,uri:"",schedulerSubStep:"date"}),ae({container:e.container,scheduler:t,eventTypeId:n,prefill:{...r&&{name:r},...e.prefill.email&&{email:e.prefill.email}},formatters:e.formatters,identity:async()=>{let o=await e.ensureResponseId(),a=e.form.identity();return{...o!=null&&{responseId:o},...a.leadSessionId!=null&&{leadSessionId:a.leadSessionId},...a.fingerprint!=null&&{fingerprint:a.fingerprint}}},onEvent:o=>{if(o.type==="booking_confirmed"){let{booking:i}=o,s=i.attendees?.find(d=>d.isHost);e.confirmBooking({uri:i.id,meetingTime:i.startTime,meetingEndTime:i.endTime,inviteeName:i.inviteeName,guestEmails:i.inviteeEmail,ownerEmails:s?.email??"",joinLink:i.meetingJoinLink??"",raw:i},{schedulerSubStep:"booked"});return}let a={date_selected:"time",form_opened:"form"}[o.type];a&&e.mergeAnswer({schedulerSubStep:a}),e.emit(o)},onComplete:()=>{}})};var Sn={hostEmail:"ownerEmails",startTime:"meetingTime",endTime:"meetingEndTime",joinUrl:"googleMeetLink",duration:"durationMinutes",timezone:"hostTimezone"},St=e=>{let n=e.content.dataUrl;if(!n)return N(e.question,"dataUrl");let[t,...r]=(e.prefill.name??"").split(/\s+/),o=e.prefill.lastName??(r.length>0?r.join(" "):void 0);return V(e,{needsResponseId:!0,build:a=>({src:B(n,{embed:"true",origin:window.location.origin,...t&&{firstname:t},...o&&{lastname:o},...e.prefill.email&&{email:e.prefill.email},...a!=null&&{utm_source:`surface-${a}`},...e.urlParams}),origins:[{exact:"https://scheduler.zoom.us"}],onMessage:i=>{let s=i;if(s?.type!=="bookingForm")return;let d=s.payload??{},l=[d.bookerFirstName,d.bookerLastName].filter(Boolean).join(" ");e.confirmBooking({uri:d.scheduledEventId??"",guestEmails:d.bookerEmail??"",...l&&{inviteeName:l},raw:i})},poll:{path:`/api/v1/zoom/check-event/${a}`,onResult:i=>{if(i.status==="pending"||i.hostEmail==null&&i.startTime==null)return"continue";let s={};for(let[d,l]of Object.entries(Sn))typeof i[d]=="string"&&(s[l]=i[d]);return e.mergeAnswer(s,{save:!0}),"stop"}}})})};var kt={Surface:bt,Calendly:ut,Cal:lt,SavvyCal:yt,ChiliCal:ct,Hubspot:mt,RevenueHero:gt,Zoom:St,ReclaimAI:ft,Clari:pt};var wt="surface-scheduler-styles",kn=`\n\${--surface-scheduler-accent:#2563eb;--surface-scheduler-border:#e2e8f0;--surface-scheduler-text:#0f172a;--surface-scheduler-muted:#64748b;--surface-scheduler-radius:8px;font-family:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;color:var(--surface-scheduler-text)}\n%{display:flex;flex-direction:column;gap:12px;max-width:26rem;padding:16px;border:1px solid var(--surface-scheduler-border);border-radius:var(--surface-scheduler-radius)}\n%-month,%-day{margin:0;font-size:1rem;font-weight:600}\n%-month-nav{display:flex;gap:8px}\n$ button{font:inherit;cursor:pointer;border-radius:calc(var(--surface-scheduler-radius) - 2px)}\n%-month-button,%-back,%-retry{padding:4px 10px;border:1px solid var(--surface-scheduler-border);background:transparent;color:var(--surface-scheduler-muted)}\n%-month-button:hover,%-back:hover{color:var(--surface-scheduler-text)}\n%-dates,%-slots{display:grid;grid-template-columns:repeat(auto-fill,minmax(7.5rem,1fr));gap:8px;margin:0;padding:0;list-style:none}\n%-date-button,%-slot-button{width:100%;padding:8px 6px;border:1px solid var(--surface-scheduler-border);background:transparent;color:var(--surface-scheduler-text)}\n%-date-button:hover,%-slot-button:hover{border-color:var(--surface-scheduler-accent);color:var(--surface-scheduler-accent)}\n%-form{display:flex;flex-direction:column;gap:8px}\n%-name,%-email{font:inherit;padding:8px 10px;border:1px solid var(--surface-scheduler-border);border-radius:calc(var(--surface-scheduler-radius) - 2px)}\n%-name:focus,%-email:focus{outline:2px solid var(--surface-scheduler-accent);outline-offset:-1px}\n%-submit{padding:8px 14px;border:0;background:var(--surface-scheduler-accent);color:#fff}\n%-submit:disabled{opacity:.6;cursor:default}\n%-loading,%-no-dates{color:var(--surface-scheduler-muted)}\n%-error{color:#b91c1c;margin:0}\n%-booked{font-weight:600;color:var(--surface-scheduler-accent)}\n.surface-scheduler-frame{display:block;min-height:640px}\n`,It=()=>{if(document.getElementById(wt))return;let e=document.createElement("style");e.id=wt,e.textContent=kn.replace(/%/g,"$ .surface-booking").replace(/\$/g,".surface-scheduler"),document.head.appendChild(e)};var ge=(e,n)=>{for(let t of Object.values(e.state().answers))if(t[n]!=null)return t[n]},Be=(e,n)=>{for(let t of n){let r=e?.[t];if(typeof r=="string"&&r.length>0)return r}},wn=(e,n,t)=>({name:t?.name??Be(n.linkNameToStep&&ge(e,n.linkNameToStep.questionId),["fullName","firstName","input"]),lastName:t?.lastName??Be(n.linkLastNameToStep&&ge(e,n.linkLastNameToStep.questionId),["lastName","input"]),email:t?.email??Be(n.linkEmailToStep&&ge(e,n.linkEmailToStep.questionId),["email","emailAddress","workEmailAddress","input"])}),In=(e,n)=>{let{content:t}=e;if(e.componentType!=="DynamicScheduler")return t;let r=t.calendars??[],o;if(n!=null){if(o=r.find(s=>s.name===n),!o){let s=r.map(d=>String(d.name)).join(", ")||"(none)";throw new Error(`mountScheduler: no calendar named "${n}" on question "${e.questionId}" — available: ${s}.`)}}else if(o=t.defaultCalendar??void 0,!o&&r.length===1&&(o=r[0]),!o)throw new Error(`mountScheduler: question "${e.questionId}" routes between ${r.length} calendars with no default — pass calendarId to choose one (condition evaluation is the caller's own routing).`);let a={...t},i=[o.dataUrl,o.url].find(s=>typeof s=="string"&&s.length>0);i!=null&&(a.dataUrl=i);for(let s of["eventTypeId","savvyCalLinkId","revenueHeroRouterId"])typeof o[s]=="string"&&(a[s]=o[s]);return a},En=(e,{questionId:n,stepId:t})=>{if(!e.runtimeConfig)throw new Error("mountScheduler: no record to read scheduler config from (the form was booted with caller-provided steps) — init without `steps`, or mount the widget manually.");let r=pe(e.runtimeConfig.config),o=r.filter(i=>(n==null||i.questionId===n)&&(t==null||i.stepId===t));if(o.length===1)return o[0];let a=r.map(i=>`"${i.questionId}" (${i.calendarType}, step "${i.stepId}")`).join(", ");throw new Error(o.length===0?`mountScheduler: no scheduler question${n?` "${n}"`:""}${t?` on step "${t}"`:""} — the record has: ${a||"none"}.`:`mountScheduler: ${o.length} scheduler questions match — pass questionId. Candidates: ${a}.`)},Et=({form:e,container:n,questionId:t,stepId:r,styled:o=!0,persist:a=!0,prefill:i,formatters:s,calendarId:d,onEvent:l,onComplete:u})=>{let c=En(e,{questionId:t,stepId:r}),p=c.calendarType,C=kt[p];if(!C)throw new Error(`mountScheduler: unsupported provider "${c.calendarType}" on question "${c.questionId}".`);let y=In(c,d),m=!1,h=!1,v=b=>{if(m)return;if(b.type==="viewed"){if(h)return;h=!0}let A={...b,questionId:c.questionId,stepId:c.stepId,provider:p};e.notifyScheduler(A);try{l?.(A)}catch(x){console.warn("Surface SDK: mountScheduler onEvent handler failed",x)}},g=(b,A)=>{a&&(e.setAnswer(c.questionId,{type:c.componentType,...b}),A?.save&&!e.state().finished&&e.savePartial())},L=(b,A)=>{let x={...b,provider:p},O={eventScheduled:!0,uri:x.uri},S={meetingTime:x.meetingTime,meetingEndTime:x.meetingEndTime,ownerEmails:x.ownerEmails,guestEmails:x.guestEmails,inviteeName:x.inviteeName,googleMeetLink:x.joinLink};for(let[w,_]of Object.entries(S))_!==void 0&&(O[w]=_);g({...O,...A},{save:!0}),v({type:"booking_confirmed",booking:x});try{u?.(x)}catch(w){console.warn("Surface SDK: mountScheduler onComplete handler failed",w)}},P=b=>{g({eventScheduled:!1,eventCancelled:!0,...b!=null&&{cancelReason:b}},{save:!0}),v({type:"booking_cancelled",...b!=null&&{reason:b}})},k=async()=>e.preview?null:(e.state().responseId==null&&a&&await e.savePartial(),e.state().responseId);o&&(It(),n.classList.add("surface-scheduler"));let T=Object.fromEntries(Object.entries(y.dataUrlParams??{}).flatMap(([b,A])=>{let x=ge(e,A.questionId)?.[A.variable];return typeof x=="string"&&x.length>0?[[b,x]]:[]})),U=C({form:e,container:n,question:c,content:y,prefill:wn(e,y,i),urlParams:T,formatters:s,styled:o,emit:v,confirmBooking:L,cancelBooking:P,mergeAnswer:g,ensureResponseId:k});return v({type:"viewed"}),()=>{m||(m=!0,o&&n.classList.remove("surface-scheduler"),U())}};var Tn="/api/v1/edge/emailValidation",Tt=e=>({email:e,isValid:!0,status:"unknown",reason:"validation_failed",failed:!0}),Rn=(e,n)=>!n||typeof n.isValid!="boolean"?Tt(e):{email:e,isValid:n.isValid,status:n.status,reason:n.reason,...n.blacklistEntryIds?.length?{blacklistEntryIds:n.blacklistEntryIds}:{},...n.validationSuccessfullyRan===!1?{failed:!0}:{}},ye=({transport:e,environmentId:n,preview:t=!1})=>{let r=new Map,o=a=>{let i=[...new Set(a.map(d=>d.trim()).filter(d=>d!==""))];if(t)for(let d of i)r.has(d)||r.set(d,Promise.resolve({email:d,isValid:!0,status:"preview"}));let s=i.filter(d=>!r.has(d));if(s.length>0){let d=e.post(Tn,{emails:s,environmentId:n}).then(l=>l.ok?l.data.data??{}:{}).catch(()=>({}));for(let l of s)r.set(l,d.then(u=>Rn(l,u[l])))}return Promise.all(i.map(d=>r.get(d)))};return{validateBatch:o,validate:async a=>{let[i]=await o([a]);return i??Tt(a.trim())}}};var An="/api/v1/responses/",Rt="/api/v1/responses/update",_n="/api/v1/responses/getResponse",he=async(e,n)=>{let t=await e.post(An,n,{credentials:!0});if(!t.ok)return t;let r=t.data.data?.id;return r?{ok:!0,data:{responseId:r,leadId:t.data.data?.meta?.leadId??null,resumeToken:t.data.data?.resumeToken??null}}:{ok:!1,error:{kind:"http",status:200,body:t.data}}},ee=(e,n)=>{e.beacon(Rt,n)},At=(e,n)=>e.post(Rt,n,{keepalive:!0,credentials:!0}),Cn=e=>typeof e?.questionId=="string"&&typeof e?.response=="object"&&e.response!==null,_t=async(e,{responseId:n,resumeToken:t})=>{let r=await e.get(`${_n}?rid=${encodeURIComponent(n)}&rt=${encodeURIComponent(t)}`);return r.ok?{ok:!0,data:{answers:(Array.isArray(r.data.data?.data)?r.data.data.data:[]).filter(Cn).filter(a=>a.response.type!=="URL_DATA")}}:r};var z="https://forms.withsurface.com",Ct="0.1.0",Ve=(e={})=>({...e,"X-Surface-Sdk-Version":Ct}),xn=e=>`${e}${e.includes("?")?"&":"?"}sdv=${Ct}`,ve=({apiBaseUrl:e=z}={})=>{let n=e.replace(/\/$/,""),t=i=>`${n}${i}`;return{get:async i=>{try{let s=await fetch(t(i),{headers:Ve()});if(!s.ok){let d=await s.json().catch(()=>{});return{ok:!1,error:{kind:"http",status:s.status,body:d}}}return{ok:!0,data:await s.json()}}catch(s){return{ok:!1,error:{kind:"network",cause:s}}}},post:async(i,s,d)=>{try{let l=await fetch(t(i),{method:"POST",headers:Ve({"Content-Type":"application/json"}),body:JSON.stringify(s),...d?.keepalive?{keepalive:!0}:{},...d?.credentials?{credentials:"include"}:{}});if(!l.ok){let u=await l.json().catch(()=>{});return{ok:!1,error:{kind:"http",status:l.status,body:u}}}return{ok:!0,data:await l.json()}}catch(l){return{ok:!1,error:{kind:"network",cause:l}}}},beacon:(i,s)=>{let d;try{d=JSON.stringify(s)}catch{return!1}let l=xn(t(i));try{if(typeof navigator<"u"&&typeof navigator.sendBeacon=="function"&&navigator.sendBeacon(l,new Blob([d],{type:"application/json"})))return!0}catch{}try{fetch(l,{method:"POST",keepalive:!0,credentials:"include",headers:Ve({"Content-Type":"application/json"}),body:d}).catch(()=>{})}catch{}return!1}}};var xt=["firstName","lastName","fullName","emailAddress","workEmailAddress","phoneNumber","companyName","numberOfEmployees","websiteUrl","title","streetAddress","aptSuiteEtc","city","state","country","zipCode","companyRevenue","profilePictureUrl"];var be=()=>{let e=new Map;return{on:(n,t)=>{let r=e.get(n)??new Set;return r.add(t),e.set(n,r),()=>{r.delete(t)}},emit:(n,t)=>{e.get(n)?.forEach(r=>{try{r(t)}catch(o){console.error(`Surface SDK: "${String(n)}" handler threw`,o)}})}}};var Pn="/api/v1/pushEvent",Mn=/bot|crawl|spider|slurp|baidu|bingpreview|googlebot|yandex|duckduck|ahrefs|semrush|facebookexternalhit|embedly|quora link preview|pinterest|twitterbot|linkedinbot|whatsapp|telegram|discord|headless|lighthouse|pagespeed/i,Ln=()=>{let e=navigator.userAgent;return e?Mn.test(e):!1},On=e=>!!(e?.type&&e?.entityType&&e?.entityId),Se=({sessionId:e,formId:n,currentStepId:t,nextStepId:r,stepCompletionTime:o})=>({events:[{type:"form_step_submitted",entityType:"form_step",entityId:n,stepId:t,leadSessionId:e,properties:[{key:"stepCompletionTime",value:o}]},{type:"form_step_viewed",entityType:"form_step",entityId:n,stepId:r,leadSessionId:e,properties:[]}]}),ke=({transport:e,preview:n=!1})=>({push:t=>{if(n||typeof navigator>"u")return;let r="events"in t?t.events:[t];Ln()||r.some(o=>!On(o))||e.beacon(Pn,t)}});var we=e=>{let n=je(e),t=!1;return r=>t||He(n,r)?!1:(t=!0,!0)},je=e=>{if(Array.isArray(e))return e.map(je);if(e!==null&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=je(r);return n}return e},He=(e,n)=>{if(Object.is(e,n))return!0;if(Array.isArray(e)||Array.isArray(n))return!Array.isArray(e)||!Array.isArray(n)||e.length!==n.length?!1:e.every((t,r)=>He(t,n[r]));if(e!==null&&n!==null&&typeof e=="object"&&typeof n=="object"){let t=Object.keys(e),r=Object.keys(n);return t.length!==r.length?!1:t.every(o=>He(e[o],n[o]))}return!1};var Ke=(e,n)=>{let t=[],r={},o;for(let a in e){let i=e[a];for(let s in i){let d=i[s];!o&&d?.eventScheduled===!0&&typeof d.uri=="string"&&d.uri.length>0&&!d.uri.includes("calendly.com")&&!d.uri.includes("cal.com")&&(o=d.uri),t.push({questionId:s,response:{...i[s]}})}}for(let a in n){let i=n[a];i.type!=="SCHEDULER_AVAILABILITY_DATA"&&(t.push({questionId:a,response:{...i}}),i.type==="APOLLO_EMAIL_ENRICHMENT"&&i.processed&&(r=i.data??{}))}return{responses:t,enrichedFields:r,bookingId:o}},Pt=({formId:e,answers:n,externalStates:t,submittingOnStepId:r,finished:o,invalidResponse:a,trackCookies:i,meta:s={},personAttributeEnrichedFields:d,fingerprint:l,leadSessionId:u})=>{let{responses:c,enrichedFields:p,bookingId:C}=Ke(n,t),y=i?s:Object.fromEntries(Object.entries(s).filter(([m])=>m!=="cookies"));return{responses:c,enrichedFields:d??p??{},formId:e,finished:o,invalidResponse:a,stepId:r,fingerprint:l,leadSessionId:u,meta:C?{...y,bookingId:C}:y}},Ie=e=>({...Pt(e),responseShapeVersion:"2.0"}),Y=e=>({...Pt(e),responseId:e.responseId});var Ee=({formId:e,environmentId:n,steps:t,transport:r,resolveNextStep:o,trackPartialResponses:a=!0,trackCookies:i=!1,externalStates:s={},meta:d={},identity:l,pushEvents:u,formJourney:c,preview:p=!1,resume:C})=>{if(t.length===0)throw new Error("createFormEngine requires at least one step");let y=o??(f=>{let I=t.findIndex(H=>H.id===f),$=t[I+1];return $?{stepId:$.id,reason:"linear"}:"END"}),m=be(),h=new Set,v=!0,g,L=()=>{v=!0,h.forEach(f=>f())},P=()=>l?.()??{},k={},T=t[0].id,U=C?.responseId??null,b=null;if(C?.answers){let f={};for(let[I,$]of Object.entries(C.answers))f[I]={...$};k[T]=f}let A=!1,x=null,O=!1,S=Date.now(),w=[],_=we(k);c?.setFormId(e),U!=null&&c?.setResponseId(U),c?.recordEntry(T);let q=async(f,I,$)=>{if(p)return;let H={formId:e,answers:k,externalStates:s,submittingOnStepId:f,finished:I,invalidResponse:$,trackCookies:i,meta:d,fingerprint:P().fingerprint,leadSessionId:P().leadSessionId};if(U==null){let K=await he(r,Ie(H));if(!K.ok){K.error.kind==="network"&&u?.push({type:"response_submission_error",entityType:"response",entityId:e,stepId:f,leadSessionId:P().leadSessionId,properties:[{key:"error",value:"network"}]}),m.emit("error",{scope:"submit",error:K.error});return}U=K.data.responseId,b=K.data.resumeToken,c?.setResponseId(U),u?.push({type:"response_submission_created",entityType:"response",entityId:e,stepId:f,leadSessionId:P().leadSessionId,properties:[{key:"responseId",value:U}]})}else if(I){let K=await At(r,Y({...H,responseId:U}));if(!K.ok){ee(r,Y({...H,responseId:U})),m.emit("error",{scope:"submit",error:K.error});return}}else ee(r,Y({...H,responseId:U}));L(),m.emit("saved",{responseId:U,finished:I,resumeToken:b})},F=Promise.resolve(),M=f=>{let I=F.then(()=>A?void 0:f());return F=I.catch(()=>{}),I},E=()=>{if(!A||x==null)return;let f=x;F=F.then(()=>{if(U!=null)return q(f.stepId,!0,f.invalid)}).catch(()=>{})},R=null,D=f=>{if(A)return Promise.resolve();if(R)return R;let I=M(()=>Zt(f)).finally(()=>{R===I&&(R=null)});return R=I,I},J=f=>{if(A||R)return R??Promise.resolve();let I=y(T,k),$=f||I==="END"||I==="INVALID"||I==null;return m.emit("stepCompleted",{stepId:T}),$?D(I==="INVALID"):(tt(I),Promise.resolve())},Ne=f=>{let I=T;for(;w.length>0&&T!==f;)T=w.pop();L(),c?.recordTransition({fromStepId:I,toStepId:T,reason:"back_nav"}),m.emit("stepChanged",{fromStepId:I,toStepId:T})},Yt=f=>t.some(I=>I.id===f)?A||R?R??Promise.resolve():f===T?Promise.resolve():w.includes(f)?(Ne(f),Promise.resolve()):(m.emit("stepCompleted",{stepId:T}),tt({stepId:f,reason:"conditional_match"}),Promise.resolve()):Promise.reject(new Error(`goToStep: no step with id "${f}"`)),Gt=()=>A||R?R??Promise.resolve():(m.emit("stepCompleted",{stepId:T}),D(!0)),tt=f=>{let I=T;u?.push(Se({sessionId:P().leadSessionId,formId:e,currentStepId:I,nextStepId:f.stepId,stepCompletionTime:(Date.now()-S)/1e3})),c?.recordTransition({fromStepId:I,toStepId:f.stepId,reason:f.reason??"linear"}),w.push(I),T=f.stepId,L(),m.emit("stepChanged",{fromStepId:I,toStepId:T}),a&&M(()=>q(I,!1,!1))},Xt=f=>{let I=t.find(H=>H.endStepKind===f);if(!I||I.id===T)return;let $=T;w.push($),T=I.id,L(),m.emit("stepChanged",{fromStepId:$,toStepId:T})},Zt=async f=>{let I=T;A=!0,x={stepId:I,invalid:f},await q(I,!0,f),Xt(f?"disqualified":"thank_you"),f?(c?.recordTerminal({outcome:"disqualified",disqualification:{reason:"conditional_match",atStepId:I}}),m.emit("disqualified",{stepId:I})):(c?.recordTerminal({outcome:"completed"}),u?.push({type:"form_completed",entityType:"form",entityId:e,stepId:null,leadSessionId:P().leadSessionId,properties:[],environmentId:n,leadId:P().leadId}),m.emit("completed",{formId:e})),L()};return{setAnswer:(f,I)=>{let $=k[T]??(k[T]={});$[f]={...$[f],...I},_(k)&&(u?.push({type:"form_started",entityType:"form",entityId:e,stepId:null,leadSessionId:P().leadSessionId,properties:[]}),m.emit("started",{formId:e})),L(),E()},setExternalState:(f,I)=>{s[f]=I,L(),E()},mergeMeta:f=>{Object.assign(d,f),E()},next:()=>J(!1),goToStep:Yt,submit:()=>J(!0),disqualify:Gt,back:()=>{if(A||R)return;let f=w.pop();if(f==null)return;let I=T;T=f,L(),c?.recordTransition({fromStepId:I,toStepId:f,reason:"back_nav"}),m.emit("stepChanged",{fromStepId:I,toStepId:f})},savePartial:()=>{let f=T;return M(()=>q(f,!1,!1))},notifyScheduler:f=>m.emit("scheduler",f),flush:()=>F.then(()=>{}),markViewed:()=>{O||(O=!0,u?.push({type:"form_viewed",entityType:"form",entityId:e,stepId:null,leadSessionId:P().leadSessionId,properties:[],environmentId:n,leadId:P().leadId}),u?.push({type:"form_step_viewed",entityType:"form_step",entityId:e,stepId:t[0].id,leadSessionId:P().leadSessionId,properties:[]}),m.emit("viewed",{formId:e}))},on:m.on,state:()=>(v&&(g={currentStepId:T,answers:k,externalStates:s,responseId:U,resumeToken:b,finished:A},v=!1),g),subscribe:f=>(h.add(f),()=>h.delete(f))}};var Mt=400,Fn=(e,n="https")=>!e||e.startsWith(n)?e:`${n}://${e}`,We=(e,{leadId:n,sessionId:t}={})=>{if(!e||!e.trim())return"";try{let r=new URL(Fn(e));return n&&r.searchParams.set("leadId",n),t&&r.searchParams.set("sessionId",t),r.toString()}catch{return e}},Lt=({url:e,redirectType:n="CurrentWindow",leadId:t,sessionId:r,preview:o=!1})=>{if(!e||o||typeof window>"u")return;let a=We(e,{leadId:t,sessionId:r});a&&(n==="CurrentWindow"?window.location.href=a:n==="NewTab"&&window.open(a,"_blank"))};var Je=e=>{let n=new URL(e);if(!n.search)return{};let t={};return new URLSearchParams(n.search).forEach((r,o)=>{t[o]=r}),t},Qe=e=>{let n={};for(let t of e.split(";")){let r=t.trim(),o=r.indexOf("=");if(o<=0)continue;let a=r.substring(o+1);try{n[r.substring(0,o)]=decodeURIComponent(a)}catch{n[r.substring(0,o)]=a}}return n},Te=({defaultUrl:e,trackCookies:n=!1}={})=>{let t=typeof window<"u",r={type:"URL_DATA",fullUrl:e??(t?window.location.href:void 0),referrer:t&&typeof document<"u"?document.referrer||"":void 0};if(r.fullUrl)try{r.params=Je(r.fullUrl)}catch{}return n?r.cookies=t&&typeof document<"u"?Qe(document.cookie):{}:r.cookies={},r};var ze=e=>{let n=e.indexOf("_");return{originalId:e,questionId:n>=0?e.slice(0,n).trim():e,fieldName:n>=0?e.slice(n+1).trim():null}},Dn=new Set(["url","referrer","cookies"]),Ot=e=>{let n=typeof e=="string"?new URLSearchParams(e):e,t=null;for(let r of n.keys()){if(Dn.has(r))continue;let{originalId:o,questionId:a,fieldName:i}=ze(r);if(i==null)continue;let s={originalId:o,questionId:a,fieldName:i,value:n.get(r)};t??(t=Object.create(null)),t[a]=[...t[a]??[],s]}return t};var Re=(e,n)=>{if(typeof window>"u")return()=>{};let t=r=>{let{started:o,formId:a,stepId:i,sessionId:s}=n();!o||r.persisted||e.push({type:"form_step_dropoff",entityType:"form_step",entityId:a,stepId:i,leadSessionId:s,properties:[]})};return window.addEventListener("pagehide",t),()=>window.removeEventListener("pagehide",t)};var Un="/api/v1/form-journey/track";var qn=new Set(["completed","disqualified","dropped_off","partial"]),Ae=({transport:e,preview:n=!1})=>{let t={responseId:null,formId:null,nextOrdinal:1,enteredAt:new Map,pendingClose:null,visits:[],truncated:!1,terminal:{},frozen:!1,flushScheduled:!1},r=()=>{t.flushScheduled=!1,!n&&(!t.responseId||!t.formId||t.visits.length===0&&!t.terminal.outcome||(e.beacon(Un,{responseId:t.responseId,formId:t.formId,events:t.visits,...t.terminal}),t.terminal={}))},o=()=>{t.flushScheduled||(t.flushScheduled=!0,queueMicrotask(()=>{t.flushScheduled&&r()}))},a=s=>{if(!t.pendingClose)return;let{ordinal:d,stepId:l}=t.pendingClose,u=t.enteredAt.get(d),c=t.visits.find(C=>C.ordinal===d),p=u?Date.parse(s)-Date.parse(u):null;c?(c.exitedAt=s,c.durationMs=p):t.visits.push({ordinal:d,stepId:l,enteredAt:u??s,exitedAt:s,durationMs:p,fromStepId:null,transitionReason:"initial"}),t.pendingClose=null},i=s=>t.visits.length>=50?(t.truncated=!0,!1):(t.visits.push(s),!0);return{hasRecordedTransition:()=>t.nextOrdinal>1,setResponseId:s=>{t.responseId=s,o()},setFormId:s=>{t.formId=s,o()},recordEntry:s=>{if(t.frozen||t.truncated)return;let d=(new Date).toISOString();t.nextOrdinal===1&&(t.enteredAt.set(1,d),t.pendingClose={ordinal:1,stepId:s},t.nextOrdinal=2)},recordTransition:({fromStepId:s,toStepId:d,reason:l,transitionMeta:u})=>{if(t.frozen||t.truncated)return;let c=(new Date).toISOString();a(c);let p=t.nextOrdinal++;t.enteredAt.set(p,c);let C=i({ordinal:p,stepId:d,enteredAt:c,exitedAt:null,durationMs:null,fromStepId:s,transitionReason:l,transitionMeta:u??null});t.pendingClose=C?{ordinal:p,stepId:d}:null,o()},recordTerminal:({outcome:s,disqualification:d})=>{if(t.frozen)return;let l=(new Date).toISOString();a(l),t.terminal={outcome:s,disqualification:d?{reason:d.reason,matched:d.matched}:void 0,disqualifiedAtStepId:d?.atStepId,disqualifiedTriggerStepId:d?.triggerStepId},qn.has(s)&&(t.frozen=!0),s==="in_progress"?r():o()}}};async function Ye(e){let n=(new TextEncoder).encode(e),t=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(t)).map(r=>r.toString(16).padStart(2,"0")).join("")}var _e=async e=>{let n=navigator.userAgentData||{},t={deviceType:/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",screen:{width:screen.width,height:screen.height,colorDepth:screen.colorDepth},userAgent:navigator.userAgent,browser:n.brands||n.uaList||[{brand:"unknown",version:"unknown"}],os:n.platform||"unknown",language:navigator.language,...navigator.plugins!=null?{plugins:Array.from(navigator.plugins).map(r=>r.name)}:{},timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,environmentId:e};return{...t,id:await Ye(JSON.stringify(t))}};var Nn="/api/v1/lead/identify",Ce=({environmentId:e,fingerprintId:n,pageUrl:t,source:r="sdkForm",formId:o,leadId:a=null,sessionIdFromParams:i=null,referrer:s})=>{let d=new URL(t);return{environmentId:e,source:r,sourceURL:d.href.replace(/\/$/,""),sourceURLDomain:d.hostname,sourceURLPath:d.pathname.replace(/\/$/,""),sourceUrlSearchParams:d.search,fingerprint:n,formId:o,leadId:a,sessionIdFromParams:i,...s!=null?{referrer:s}:{}}},xe=async(e,n)=>{let t=await e.post(Nn,n,{keepalive:!0,credentials:!0});if(!t.ok)return null;let r=t.data.data?.data;return!r?.leadId||!r?.sessionId?null:{leadId:r.leadId,sessionId:r.sessionId,existing:r.existing,leadHasExistingBookingAttr:r.leadHasExistingBookingAttr,leadHasExistingEmailAttr:r.leadHasExistingEmailAttr}};var te="surfaceLeadData",Ft=6e5,G=()=>{if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(te);if(!e)return null;let n=JSON.parse(e);return Date.now()>(n.expiry??0)?(localStorage.removeItem(te),null):{leadId:n.leadId,leadSessionId:n.leadSessionId,fingerprint:n.fingerprint,landingPageUrl:n.landingPageUrl,expiry:n.expiry}}catch{return null}},Pe=e=>{if(!(typeof localStorage>"u"))try{localStorage.setItem(te,JSON.stringify({...e,expiry:Date.now()+6e5}))}catch{}};var ne=async({transport:e,environmentId:n,formId:t,pageUrl:r,source:o,preview:a=!1})=>{if(a||typeof window>"u")return null;let i=G();if(i?.leadSessionId&&i?.fingerprint)return i;let s=r??window.location.href,d=await _e(n),l=await xe(e,Ce({environmentId:n,fingerprintId:d.id,pageUrl:s,formId:t,source:o,leadId:i?.leadId??null,sessionIdFromParams:i?.leadSessionId??null}));if(l==null)return null;let u={leadId:l.leadId,leadSessionId:l.sessionId,fingerprint:d.id,landingPageUrl:s};return Pe(u),u};var re="surface_journey_id",oe="surface_recent_visit",$n=5184e3,Bn=86400,Dt="/api/v1/lead/track",Ut=e=>{if(typeof document>"u")return null;for(let n of document.cookie.split(";")){let t=n.trim(),r=t.indexOf("=");if(r===-1||t.substring(0,r)!==e)continue;let o=t.substring(r+1);try{return decodeURIComponent(o)}catch{return o}}return null},qt=(e,n,t,r)=>{if(typeof document>"u")return;let o=r?`; domain=${r}`:"";document.cookie=`${e}=${encodeURIComponent(n)}; path=/; max-age=${t}; samesite=lax${o}`},Ge=()=>{let e=typeof window>"u"?"":window.location?.hostname??"";if(!e||!e.includes("."))return;let n=e.split(".");return"."+(n.length===2?e:n.slice(1).join("."))},Me=({transport:e,environmentId:n})=>{let t=Ut(re),r=()=>{t&&qt(re,t,$n,Ge())},o=d=>{let l=G();return{...t?{id:t}:{},data:{type:"page_view",payload:{url:d,timestamp:(new Date).toISOString(),referrer:typeof document>"u"?"":document.referrer||""}},metadata:{environmentId:n,...l?{...l.leadId?{leadId:l.leadId}:{},...l.leadSessionId?{leadSessionId:l.leadSessionId}:{},fingerprint:l.fingerprint,...l.landingPageUrl?{landingPageUrl:l.landingPageUrl}:{}}:{}}}},a=async d=>{if(typeof window>"u")return;let l=d??window.location.href;if(Ut(oe)===l)return;let u=o(l);if(t&&e.beacon(Dt,u))r();else{let c=await e.post(Dt,u);c.ok&&c.data.data?.id&&(t=c.data.data.id),r()}qt(oe,l,Bn,Ge())};return{trackPageView:a,observeRouteChanges:()=>{if(typeof window>"u")return()=>{};let d=window.location.href,l=()=>{let p=window.location.href;p!==d&&(d=p,a(p))};window.addEventListener("popstate",l);let u=history.pushState,c=history.replaceState;return history.pushState=function(...p){u.apply(history,p),setTimeout(l,0)},history.replaceState=function(...p){c.apply(history,p),setTimeout(l,0)},()=>{window.removeEventListener("popstate",l),history.pushState=u,history.replaceState=c}},clear:()=>{let d=Ge(),l=d?`; domain=${d}`:"";typeof document>"u"||(document.cookie=`${re}=; path=/; max-age=0; samesite=lax${l}`,document.cookie=`${oe}=; path=/; max-age=0; samesite=lax${l}`,t=null)}}};var Vn="/api/v1/services/enrichment/realtime",Le="selfServeEnrichment";var jn=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,Hn=/^(?:https?:\/\/)?(?:www\.)?([a-z0-9-]+(?:\.[a-z0-9-]+)+)/i,Nt=e=>{let n=e.trim();if(jn.test(n))return{email:n};let t=n.match(Hn)?.[1];return t?{domain:t}:null},Oe=({engine:e,transport:n,formId:t,sources:r})=>{let o=new Set,a=new Set,i,s,d=!1,l=async y=>{let m=Nt(y);if(!m)return;let h=m.email??m.domain;if(!(o.has(h)||a.has(h))){a.add(h);try{let v=await n.post(Vn,{formId:t,...m});if(d||!v.ok)return;let g=v.data.data??{};if(Object.keys(g).length===0)return;o.add(h);let L=e.state().externalStates[Le],P=L?.type==="APOLLO_EMAIL_ENRICHMENT"?L.data??{}:{};e.setExternalState(Le,{type:"APOLLO_EMAIL_ENRICHMENT",processed:!0,data:{...g,...P}})}finally{a.delete(h)}}},u=()=>{let y=[],m={};for(let h of Object.values(e.state().answers))Object.assign(m,h);for(let{questionId:h,fieldNames:v}of r){let g=m[h];if(g)for(let L of v){let P=g[L];typeof P=="string"&&P.trim().length>0&&y.push(P)}}return y},c=()=>{let y=u().find(m=>{let h=Nt(m);return h!=null&&!o.has(h.email??h.domain)});y===void 0||y===s||(s=y,clearTimeout(i),i=setTimeout(()=>{s=void 0,l(y)},1e3))},p=()=>{if(s===void 0)return;clearTimeout(i);let y=s;s=void 0,l(y)},C=[e.subscribe(c),e.on("stepCompleted",p),e.on("completed",p)];return()=>{d=!0,clearTimeout(i),C.forEach(y=>y())}};var Kn=new Set(["MultipleOptionsQuestion","MultipleChoiceQuestion","MMChoiceQuestion"]),Wn=(e,n)=>typeof e=="object"&&e!==null&&typeof e.key=="string"&&typeof e.value=="boolean"&&(!n||typeof e.index=="number"),$t=({questions:e,questionId:n,merged:t})=>{let r=`Surface SDK [debug]: setAnswer("${n}")`,o=e.size>0?e.get(n):void 0;if(e.size>0&&!o){console.warn(`${r} — the record has no stateful question with this id; the answer will be dropped.`),console.debug(`Surface SDK [debug]: answer ${n}`,t);return}t.type===void 0?console.warn(`${r} — state has no "type" discriminator; the wire schema rejects untyped states. Include type: "${o?.componentType??"<ComponentType>"}".`):o?.componentType!==void 0&&t.type!==o.componentType&&console.warn(`${r} — state type "${String(t.type)}" but the record's component is ${o.componentType}.`);let a=o?.componentType??t.type;if(typeof a=="string"&&Kn.has(a)){let i=a==="MultipleOptionsQuestion";(!Array.isArray(t.choices)||t.choices.some(d=>!Wn(d,i)))&&console.warn(`${r} — ${a} answers need the ENTIRE option list under "choices" as {key, value${i?", index":""}} objects, not ${JSON.stringify(t.choices??t)}. See get_sdk_binding_map's answerShape.`)}console.debug(`Surface SDK [debug]: answer ${n}`,t)};var Jn="Lead",Qn="generate_lead",zn="lead_created",jt=/^tw-([a-z0-9]+)-([a-z0-9]+)$/i,Yn=e=>{let n=e?.trim().match(jt);return n?n[1]:null},Bt=e=>/^\d+$/.test(e?.trim()??""),Gn=e=>{if(e.enabled===!1||(e.trigger??"reached_qualified")==="reached_step"&&!e.triggerStepId?.trim())return!1;switch(e.provider){case"x":return jt.test(e.eventId?.trim()??"");case"meta":case"openai":return!!e.pixelId?.trim();case"ga4":return!!e.measurementId?.trim();case"linkedin":return Bt(e.partnerId)&&Bt(e.conversionId);default:return!1}},Xn=(e,n)=>{let t=n.toLowerCase();for(let[r,o]of Object.entries(e))if(r.toLowerCase()===t)return o},Vt=(e,n)=>{let t=Xn(n,e.param)?.trim()??"",r=e.values??[];switch(e.operator){case"is_present":return t.length>0;case"equals_any":return r.some(o=>o.trim().toLowerCase()===t.toLowerCase());case"contains":return t.length>0&&r.some(o=>t.toLowerCase().includes(o.trim().toLowerCase()));default:return!1}},Zn=(e,n,t="and")=>e.length===0?!0:t==="or"?e.some(r=>Vt(r,n)):e.every(r=>Vt(r,n)),er=e=>{if(!Gn(e))return null;switch(e.provider){case"x":{let n=Yn(e.eventId);return n?{provider:"x",event:{event_id:e.eventId.trim(),pixel_id:n}}:null}case"meta":return{provider:"meta",event:{pixel_id:e.pixelId.trim(),event_name:e.eventName?.trim()||Jn}};case"openai":return{provider:"openai",event:{pixel_id:e.pixelId.trim(),event_name:e.eventName?.trim()||zn}};case"ga4":return{provider:"ga4",event:{measurement_id:e.measurementId.trim(),event_name:e.eventName?.trim()||Qn}};case"linkedin":return{provider:"linkedin",event:{partner_id:e.partnerId.trim(),conversion_id:e.conversionId.trim()}};default:return null}},Fe=(e,n,t,r)=>{let o=[];for(let a of e){if((a.trigger??"reached_qualified")!==n||n==="reached_step"&&(!r||a.triggerStepId!==r)||!Zn(a.conditions??[],t,a.conditionsOperator??"and"))continue;let i=er(a);i&&o.push({rule:a,conversion:i})}return o},tr=(e,n)=>{if(!e.twq){let t=e.twq=function(...o){t.exe?t.exe.apply(t,o):t.queue.push(o)};t.version="1.1",t.queue=[];let r=e.document.createElement("script");r.async=!0,r.src="https://static.ads-twitter.com/uwt.js",e.document.head.appendChild(r)}e.twq("config",n)},nr=(e,n)=>{if(!e.fbq){let t=e.fbq=function(...o){t.callMethod?t.callMethod.apply(t,o):t.queue.push(o)};e._fbq||(e._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[];let r=e.document.createElement("script");r.async=!0,r.src="https://connect.facebook.net/en_US/fbevents.js",e.document.head.appendChild(r)}e.fbq("init",n)},rr=(e,n)=>{if(!e.oaiq){let t=e.oaiq=function(...o){t.q.push(o)};t.q=[];let r=e.document.createElement("script");r.async=!0,r.src="https://bzrcdn.openai.com/sdk/oaiq.min.js",e.document.head.appendChild(r)}e.oaiq("init",{pixelId:n})},or=(e,n)=>{if(!e.gtag){e.dataLayer=e.dataLayer||[],e.gtag=function(...r){e.dataLayer.push(r)};let t=e.document.createElement("script");t.async=!0,t.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(n)}`,e.document.head.appendChild(t),e.gtag("js",new Date)}e.gtag("config",n,{send_page_view:!1})},sr=(e,n)=>{if(!e.lintrk){e._linkedin_partner_id=n;let t=e.lintrk=function(o,a){t.q.push([o,a])};t.q=[];let r=e.document.createElement("script");r.async=!0,r.src="https://snap.licdn.com/li.lms-analytics/insight.min.js",e.document.head.appendChild(r)}e._linkedin_data_partner_ids=e._linkedin_data_partner_ids||[],e._linkedin_data_partner_ids.includes(n)||e._linkedin_data_partner_ids.push(n)},Ht=(e,n,t)=>{let r=e;try{switch(n.provider){case"x":return tr(r,n.event.pixel_id),r.twq("event",n.event.event_id,{conversion_id:t.responseId,...t.twclid?{twclid:t.twclid}:{},...t.email?{email_address:t.email}:{}}),!0;case"meta":return nr(r,n.event.pixel_id),r.fbq("track",n.event.event_name,{},{eventID:t.responseId}),!0;case"openai":return rr(r,n.event.pixel_id),r.oaiq("measure",n.event.event_name,{type:"customer_action"},{event_id:t.responseId}),!0;case"ga4":return or(r,n.event.measurement_id),r.gtag("event",n.event.event_name,{transaction_id:t.responseId,send_to:n.event.measurement_id}),!0;case"linkedin":return sr(r,n.event.partner_id),r.lintrk("track",{conversion_id:n.event.conversion_id}),!0;default:return!1}}catch{return!1}};var Xe=(e,n)=>e.document.querySelector(`script[src="${n}"]`)!=null,De=(e,n,t,r)=>{if(Xe(e,n))return;let o=e.document.createElement("script");o.async=!0,o.src=n,r&&(o.id=r),e.document[t].appendChild(o)},ir=(e,n)=>{let t=`https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(n)}`;Xe(e,t)||(e.dataLayer=e.dataLayer||[],e.dataLayer.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),De(e,t,"head"))},ar=(e,n)=>{let t=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(n)}`;if(Xe(e,t))return;e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)},e.gtag("js",new Date)),De(e,t,"head");let r=e.self!==e.top;e.gtag("config",n,{...r&&{cookie_flags:"SameSite=None;Secure;Partitioned"}})},dr=(e,n)=>{if(!e.fbq){let t=e.fbq=function(...r){t.callMethod?t.callMethod.apply(t,r):t.queue.push(r)};e._fbq||(e._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[],De(e,"https://connect.facebook.net/en_US/fbevents.js","head")}e.fbq("init",n)},lr=(e,n)=>{De(e,`https://js.hs-scripts.com/${n}.js`,"body","hs-script-loader")},Kt=(e,n)=>{let t=e;n.gtmId&&ir(t,n.gtmId),n.gaMeasurementId&&ar(t,n.gaMeasurementId),n.metaPixelId&&dr(t,n.metaPixelId),n.hubspotTracking?.trackingId&&lr(t,n.hubspotTracking.trackingId);let r=i=>{n.gtmId&&(t.dataLayer=t.dataLayer||[],t.dataLayer.push(i))},o=(i,s)=>{n.gaMeasurementId&&t.gtag?.("event",i,s)},a=(i,s)=>{n.metaPixelId&&t.fbq?.("trackCustom",i,s)};return{formStarted:(i,s)=>{r({event:"SurfaceFormStarted",formId:i,...s}),a("SurfaceFormStarted",{formId:i,...s}),o("SurfaceFormStarted",{formId:i,...s})},stepSubmitted:i=>{r({event:"SurfaceFormStepSubmitted",...i}),a("SurfaceFormStepSubmitted",i),o("SurfaceFormStepSubmitted",i)},formCompleted:(i,s)=>{r({event:"SurfaceFormSubmitEvent",formId:i,...s}),a("SurfaceFormCompleted",{formId:i,...s}),o("SurfaceFormCompleted",{formId:i,...s})}}};var ur=e=>{try{return Object.fromEntries(new URLSearchParams(e.location.search).entries())}catch{return{}}},Ue=(e,n)=>{let t=n.toLowerCase();for(let[r,o]of Object.entries(e))if(r.toLowerCase()===t)return o?.trim()||void 0},cr=e=>({twclid:Ue(e,"twclid"),fbclid:Ue(e,"fbclid"),gclid:Ue(e,"gclid"),li_fat_id:Ue(e,"li_fat_id")}),pr=["email","emailAddress","workEmailAddress"],Ze=e=>{for(let n of Object.values(e))for(let t of pr){let r=n[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}},Wt=e=>Object.values(e).some(n=>n.eventScheduled===!0),et=e=>{let n={};for(let t of Object.values(e.state().answers))Object.assign(n,t);return n},Jt=({engine:e,formId:n,settings:t,win:r})=>{let o=r??window,a=Kt(o,t),i=t.adsConversions??[],s=ur(o),d={url:o.location.href,urlParams:s},l=new Set,u=new Set,c=new Set,p=new Set,C=!1,y=!1,m=!1,h=!1,v=!1,g=e.state().responseId==null,L=!g,P=(S,w)=>{let _=S.filter(({rule:F})=>!l.has(F.id));if(_.length===0)return;_.forEach(({rule:F})=>l.add(F.id));let q={responseId:w,email:Ze(et(e)),...cr(s)};_.forEach(({conversion:F})=>Ht(o,F,q))},k=(S,w)=>{if(!w){p.add(S);return}P(Fe(i,S,s),w)},T=(S,w)=>{if(!w){c.add(S);return}P(Fe(i,"reached_step",s,S),w)},U=S=>{if(!S){C=!0;return}y=!0,C=!1;let w=new Map;for(let _ of["reached_qualified","form_submitted"])for(let q of Fe(i,_,s))w.set(q.rule.id,q);P(Array.from(w.values()),S)},b=()=>{let S=et(e);!h&&g&&Ze(S)!==void 0&&(h=!0,k("email_provided",e.state().responseId)),!v&&g&&Wt(S)&&(v=!0,k("meeting_booked",e.state().responseId))},A=[];A.push(e.on("started",()=>{a.formStarted(n,d)}));let x;A.push(e.on("stepCompleted",({stepId:S})=>{let w=et(e);x={stepId:S,formId:n,emailProvided:Ze(w)!==void 0,meetingBooked:Wt(w),...d},!m&&g&&(m=!0,k("step_submitted",e.state().responseId))})),A.push(e.on("stepChanged",({toStepId:S})=>{x&&(e.state().finished||a.stepSubmitted(x),x=void 0),!u.has(S)&&(u.add(S),T(S,e.state().responseId))})),A.push(e.on("completed",()=>{x=void 0,a.formCompleted(n,d),y||U(e.state().responseId)})),A.push(e.on("saved",({responseId:S})=>{if(L||(L=!0,k("form_started",S)),C&&U(S),c.size>0){let w=Array.from(c);c.clear(),w.forEach(_=>T(_,S))}if(p.size>0){let w=Array.from(p);p.clear(),w.forEach(_=>k(_,S))}})),A.push(e.subscribe(b));let O=e.state().currentStepId;return u.add(O),T(O,e.state().responseId),b(),()=>A.forEach(S=>S())};var mr=["email","emailAddress","workEmailAddress"],fr=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,qe=({engine:e,validator:n})=>{let t=new Set,r=new Map,o,a=!1,i,s=!1,d=()=>{let y=[];for(let m of Object.values(e.state().answers))for(let h of Object.values(m))for(let v of mr){let g=h[v];typeof g=="string"&&fr.test(g.trim())&&y.push(g.trim())}return y},l=()=>{let y=new Set(d()),m=[...r.values()].filter(g=>y.has(g.email));if(m.length===0)return;let h=JSON.stringify(m.map(g=>[g.email,g.isValid,g.failed===!0]));if(h===i)return;i=h;let v=m.find(g=>g.status&&g.reason);e.mergeMeta({isEmailValid:m.some(g=>g.isValid),emailValidation:v?{status:v.status,reason:v.reason,...v.blacklistEntryIds?.length&&{blacklistEntryIds:v.blacklistEntryIds}}:void 0,emailValidationFailed:m.some(g=>g.failed===!0)})},u=async()=>{let y=d().filter(h=>!t.has(h));if(y.length===0)return;y.forEach(h=>t.add(h));let m=await n.validateBatch(y);s||(m.forEach(h=>r.set(h.email,h)),l())},c=()=>{if(!d().some(y=>!t.has(y))){l();return}a=!0,clearTimeout(o),o=setTimeout(()=>{a=!1,u()},300)},p=()=>{a&&(a=!1,clearTimeout(o),u())},C=[e.subscribe(c),e.on("stepCompleted",p),e.on("completed",p)];return()=>{s=!0,clearTimeout(o),C.forEach(y=>y())}};var Qt=new Set(["surfaceTagStatus","isEmailValid","emailValidation","emailValidationFailed"]),gr=new Set(["CalendlyScreen","DynamicScheduler","FileUploader"]),zt={init:async({environmentId:e,formId:n,steps:t,settings:r={},apiBaseUrl:o,container:a,expectedQuestionIds:i,resolveNextStep:s,urlDataStateId:d,source:l,journey:u=!1,emailValidation:c=!1,preview:p=!1,previewToken:C,debug:y=!1,resume:m,meta:h})=>{let v=ve({apiBaseUrl:o}),g;if(!t){let M=await de(v,n,{preview:p,previewToken:C});if(!M.ok||!M.data.data){let R=(o??z).replace(/\/$/,""),D=M.ok?"empty response":M.error.kind==="http"?`HTTP ${M.error.status}`:"network error";throw new Error(`SurfaceForms.init: could not fetch runtime config for form "${n}" (${D} from ${R}/api/v1/public/forms/${n}/runtime-config). If this environment is not served from ${z}, pass apiBaseUrl — the get_sdk_binding_map MCP tool returns the correct value.`)}g=M.data.data,t=ue(g.config),i=i??Q(g.config).filter(R=>!gr.has(R.componentType??"")).map(R=>R.questionId);let E=g.settings??{};r={trackPartialResponses:E.trackPartialResponses,trackCookies:E.trackCookie,gtmId:E.gtmId,gaMeasurementId:E.gaMeasurementId,metaPixelId:E.metaPixelId,hubspotTracking:E.hubspotTracking,adsConversions:E.adsConversions,...r}}let L=r.trackCookies??!1,P;if(m&&!p){let M=await _t(v,m);M.ok?P={responseId:m.responseId,answers:Object.fromEntries(M.data.answers.map(E=>[E.questionId,E.response]))}:console.warn(`Surface SDK: resume fetch for response "${m.responseId}" failed — starting a fresh session.`)}let k=await ne({transport:v,environmentId:e,formId:n,source:l,preview:p}),T=ke({transport:v,preview:p}),U=Ae({transport:v,preview:p}),b=Ee({formId:n,environmentId:e,steps:t,transport:v,resolveNextStep:s,trackPartialResponses:r.trackPartialResponses??!0,trackCookies:L,externalStates:d?{[d]:Te({trackCookies:L})}:{},meta:{...h,surfaceTagStatus:"sdk"},identity:()=>({fingerprint:k?.fingerprint,leadSessionId:k?.leadSessionId??void 0,leadId:k?.leadId??void 0}),pushEvents:T,formJourney:U,preview:p,resume:P}),A=[],x=b;if(y){let M=new Map((g?Q(g.config):[]).map(R=>[R.questionId,R])),E=(R,D)=>(...J)=>(console.debug(`Surface SDK [debug]: ${R} requested from step ${b.state().currentStepId}`),D(...J));x={...b,setAnswer:(R,D)=>{let J=b.state().currentStepId;b.setAnswer(R,D);let Ne=b.state().answers[J]?.[R]??D;$t({questions:M,questionId:R,merged:Ne})},next:E("next",b.next),back:E("back",b.back),goToStep:E("goToStep",b.goToStep),submit:E("submit",b.submit),disqualify:E("disqualify",b.disqualify)};for(let R of["viewed","started","stepChanged","stepCompleted","completed","disqualified","saved","error","scheduler"])A.push(b.on(R,D=>console.debug(`Surface SDK [debug]: ${R}`,D)))}let O=!1;A.push(b.on("started",()=>{O=!0})),A.push(Re(T,()=>({started:O,formId:n,stepId:b.state().currentStepId,sessionId:k?.leadSessionId??void 0}))),a&&A.push(ie({engine:x,root:a,expectedQuestionIds:i}));let S=!!r.gtmId||!!r.gaMeasurementId||!!r.metaPixelId||!!r.hubspotTracking?.trackingId||(r.adsConversions?.length??0)>0;S&&!p&&typeof window<"u"&&A.push(Jt({engine:b,formId:n,settings:r}));let w=g?ce(g.config):[],_=g!=null&&w.length>0&&me(g.settings);_&&!p?A.push(Oe({engine:b,transport:v,formId:n,sources:w})):y&&g&&!_&&dt(g.config)&&console.warn("Surface SDK: the record declares an enrichmentSourceField, but this environment has no enabled enrichment provider — no enrichment will run (capabilities.enrichment is false).");let q=ye({transport:v,environmentId:e,preview:p});c&&!p&&A.push(qe({engine:b,validator:q}));let F;return u&&!p&&(F=Me({transport:v,environmentId:e}),F.trackPageView(),A.push(F.observeRouteChanges())),{setAnswer:x.setAnswer,setExternalState:b.setExternalState,next:x.next,back:x.back,goToStep:x.goToStep,submit:x.submit,disqualify:x.disqualify,savePartial:b.savePartial,notifyScheduler:b.notifyScheduler,flush:b.flush,markViewed:b.markViewed,mergeMeta:M=>{let E=Object.entries(M),R=E.filter(([D])=>Qt.has(D));R.length>0&&console.warn(`Surface SDK: mergeMeta dropped reserved key(s) ${R.map(([D])=>D).join(", ")} — these are SDK-owned response markers.`),b.mergeMeta(Object.fromEntries(E.filter(([D])=>!Qt.has(D))))},capabilities:{enrichment:_,emailValidation:c,tracking:S},on:b.on,state:b.state,subscribe:b.subscribe,identify:async()=>{let M=await ne({transport:v,environmentId:e,formId:n,source:l,preview:p});return M&&(k=M),M},validateEmail:q.validate,runtimeConfig:g,transport:v,identity:()=>({fingerprint:k?.fingerprint,leadSessionId:k?.leadSessionId??void 0,leadId:k?.leadId??void 0}),preview:p,destroy:()=>A.forEach(M=>M())}}};return sn(yr)})();
@@ -1,7 +1,9 @@
1
1
  import type { FormEngine } from "../core/engine/formEngine";
2
+
2
3
  export type BindFormOptions = {
3
4
  engine: FormEngine;
4
5
  root: Element;
6
+
5
7
  expectedQuestionIds?: string[];
6
8
  };
7
9
  export declare const bindForm: ({ engine, root, expectedQuestionIds }: BindFormOptions) => (() => void);
@@ -1,4 +1,24 @@
1
1
  import type { Booking, SchedulerClient, TimeSlot } from "../core/client/scheduler";
2
+ export type BookingIdentity = {
3
+ responseId?: string;
4
+ leadSessionId?: string;
5
+ fingerprint?: string;
6
+ };
7
+
8
+ export type BookingWidgetEvent = {
9
+ type: "viewed";
10
+ } | {
11
+ type: "date_selected";
12
+ date: string;
13
+ } | {
14
+ type: "slot_selected";
15
+ slot: TimeSlot;
16
+ } | {
17
+ type: "form_opened";
18
+ } | {
19
+ type: "booking_confirmed";
20
+ booking: Booking;
21
+ };
2
22
  export type BookingWidgetOptions = {
3
23
  container: Element;
4
24
  scheduler: SchedulerClient;
@@ -9,16 +29,19 @@ export type BookingWidgetOptions = {
9
29
  name?: string;
10
30
  email?: string;
11
31
  };
12
- identity?: {
13
- responseId?: string;
14
- leadSessionId?: string;
15
- fingerprint?: string;
16
- };
32
+
33
+ identity?: BookingIdentity | (() => BookingIdentity | Promise<BookingIdentity>);
34
+
35
+ onEvent?: (event: BookingWidgetEvent) => void;
36
+
17
37
  formatters?: {
38
+
18
39
  month?: (month: string) => string;
40
+
19
41
  date?: (date: string) => string;
42
+
20
43
  time?: (slot: TimeSlot) => string;
21
44
  };
22
45
  onComplete: (booking: Booking) => void;
23
46
  };
24
- export declare const mountBookingWidget: ({ container, scheduler, eventTypeId, timezone, duration, prefill, identity, formatters, onComplete, }: BookingWidgetOptions) => (() => void);
47
+ export declare const mountBookingWidget: ({ container, scheduler, eventTypeId, timezone, duration, prefill, identity, formatters, onEvent, onComplete, }: BookingWidgetOptions) => (() => void);
@@ -0,0 +1,51 @@
1
+ import type { Transport } from "../../core/client/transport";
2
+ import type { ProviderContext } from "./types";
3
+
4
+
5
+ export declare const withProtocol: (url: string) => string;
6
+
7
+ export declare const buildEmbedUrl: (dataUrl: string, params: Record<string, string | undefined>) => string | null;
8
+ export declare const createEmbedIframe: (container: Element, src: string) => HTMLIFrameElement;
9
+
10
+ export declare const loadScriptOnce: (src: string) => Promise<void>;
11
+
12
+ export type OriginRule = {
13
+ exact: string;
14
+ } | {
15
+ hostSuffix: string;
16
+ } | {
17
+ hostRegex: RegExp;
18
+ };
19
+
20
+ export declare const originAllowed: (origin: string, rules: OriginRule[]) => boolean;
21
+
22
+ export declare const skipMissingConfig: (question: {
23
+ questionId: string;
24
+ }, field: string) => (() => void);
25
+
26
+ export declare const deferredMount: (mount: () => Promise<(() => void) | void>) => (() => void);
27
+
28
+ export declare const listenMessages: (rules: OriginRule[], onMessage: (data: unknown) => void) => (() => void);
29
+
30
+ export declare const mountIframeEmbed: (ctx: ProviderContext, { needsResponseId, build, }: {
31
+
32
+ needsResponseId?: boolean;
33
+ build: (responseId: string | null) => {
34
+ src: string | null;
35
+ origins?: OriginRule[];
36
+ onMessage?: (data: unknown) => void;
37
+ poll?: {
38
+ path: string;
39
+ onResult: (data: Record<string, unknown>) => "stop" | "continue";
40
+ };
41
+ };
42
+ }) => (() => void);
43
+
44
+ export declare const pollCheckEvent: ({ transport, path, onResult, intervalMs, timeoutMs, }: {
45
+ transport: Transport;
46
+ path: string;
47
+
48
+ onResult: (data: Record<string, unknown>) => "stop" | "continue";
49
+ intervalMs?: number;
50
+ timeoutMs?: number;
51
+ }) => (() => void);
@@ -0,0 +1,2 @@
1
+ import type { MountSchedulerOptions } from "./types";
2
+ export declare const mountScheduler: ({ form, container, questionId, stepId, styled, persist, prefill, formatters, calendarId, onEvent, onComplete, }: MountSchedulerOptions) => (() => void);
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountCal: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountCalendly: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountChiliCal: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountClari: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountHubspot: ProviderMount;
@@ -0,0 +1,4 @@
1
+ import type { SchedulerProvider } from "../../../core/engine/schedulerEvents";
2
+ import type { ProviderMount } from "../types";
3
+
4
+ export declare const providerMounts: Partial<Record<SchedulerProvider, ProviderMount>>;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountReclaimAI: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountRevenueHero: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountSavvyCal: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountSurface: ProviderMount;
@@ -0,0 +1,3 @@
1
+ import type { ProviderMount } from "../types";
2
+
3
+ export declare const mountZoom: ProviderMount;
@@ -0,0 +1,3 @@
1
+
2
+
3
+ export declare const injectSchedulerStyles: () => void;
@@ -0,0 +1,65 @@
1
+ import type { SchedulerQuestion } from "../../core/client/runtimeConfig";
2
+ import type { SchedulerBookingSummary, SchedulerLifecycleEvent } from "../../core/engine/schedulerEvents";
3
+ import type { SurfaceForm } from "../../surfaceForms";
4
+ import type { BookingWidgetOptions } from "../bookingWidget";
5
+ export type MountSchedulerOptions = {
6
+ form: SurfaceForm;
7
+ container: Element;
8
+
9
+ questionId?: string;
10
+
11
+ stepId?: string;
12
+
13
+ styled?: boolean;
14
+
15
+ persist?: boolean;
16
+
17
+ prefill?: {
18
+ name?: string;
19
+ lastName?: string;
20
+ email?: string;
21
+ };
22
+
23
+ formatters?: BookingWidgetOptions["formatters"];
24
+
25
+ calendarId?: string;
26
+ onEvent?: (event: SchedulerLifecycleEvent) => void;
27
+
28
+ onComplete?: (booking: SchedulerBookingSummary) => void;
29
+ };
30
+
31
+ export type ProviderEvent = SchedulerLifecycleEvent extends infer T ? T extends {
32
+ questionId: string;
33
+ stepId: string;
34
+ provider: unknown;
35
+ } ? Omit<T, "questionId" | "stepId" | "provider"> : never : never;
36
+
37
+ export type ProviderContext = {
38
+ form: SurfaceForm;
39
+ container: Element;
40
+ question: SchedulerQuestion;
41
+
42
+ content: SchedulerQuestion["content"];
43
+ prefill: {
44
+ name?: string;
45
+ lastName?: string;
46
+ email?: string;
47
+ };
48
+
49
+ urlParams: Record<string, string>;
50
+ formatters?: BookingWidgetOptions["formatters"];
51
+ styled: boolean;
52
+ emit: (event: ProviderEvent) => void;
53
+
54
+ confirmBooking: (booking: Omit<SchedulerBookingSummary, "provider">, extraAnswer?: Record<string, unknown>) => void;
55
+
56
+ cancelBooking: (reason?: string) => void;
57
+
58
+ mergeAnswer: (partial: Record<string, unknown>, opts?: {
59
+ save?: boolean;
60
+ }) => void;
61
+
62
+ ensureResponseId: () => Promise<string | null>;
63
+ };
64
+
65
+ export type ProviderMount = (ctx: ProviderContext) => () => void;