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

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 (166) hide show
  1. package/dist/index.cjs +2 -3
  2. package/dist/index.mjs +2 -3
  3. package/dist/react/index.cjs +0 -1
  4. package/dist/react/index.mjs +0 -1
  5. package/dist/surface-forms-sdk.min.js +0 -1
  6. package/dist/types/bind/bindForm.d.ts +0 -36
  7. package/dist/types/bind/bindForm.test.d.ts +0 -1
  8. package/dist/types/bind/bookingWidget.d.ts +0 -11
  9. package/dist/types/bind/bookingWidget.test.d.ts +0 -1
  10. package/dist/types/core/client/emailValidation.d.ts +0 -4
  11. package/dist/types/core/client/emailValidation.test.d.ts +0 -1
  12. package/dist/types/core/client/responses.d.ts +0 -15
  13. package/dist/types/core/client/responses.test.d.ts +0 -1
  14. package/dist/types/core/client/runtimeConfig.contract.test.d.ts +0 -1
  15. package/dist/types/core/client/runtimeConfig.d.ts +0 -32
  16. package/dist/types/core/client/runtimeConfig.test.d.ts +0 -1
  17. package/dist/types/core/client/scheduler.contract.test.d.ts +0 -1
  18. package/dist/types/core/client/scheduler.d.ts +0 -27
  19. package/dist/types/core/client/scheduler.test.d.ts +0 -1
  20. package/dist/types/core/client/transport.d.ts +0 -28
  21. package/dist/types/core/client/transport.test.d.ts +0 -1
  22. package/dist/types/core/engine/answerAudit.d.ts +0 -12
  23. package/dist/types/core/engine/answerAudit.test.d.ts +0 -1
  24. package/dist/types/core/engine/answerStates.contract.test.d.ts +0 -1
  25. package/dist/types/core/engine/answerStates.d.ts +0 -17
  26. package/dist/types/core/engine/formEngine.d.ts +0 -53
  27. package/dist/types/core/engine/formEngine.test.d.ts +0 -1
  28. package/dist/types/core/engine/redirect.d.ts +0 -23
  29. package/dist/types/core/engine/redirect.test.d.ts +0 -1
  30. package/dist/types/core/engine/responsePayload.contract.test.d.ts +0 -1
  31. package/dist/types/core/engine/responsePayload.d.ts +0 -28
  32. package/dist/types/core/engine/responsePayload.test.d.ts +0 -1
  33. package/dist/types/core/engine/urlData.contract.test.d.ts +0 -1
  34. package/dist/types/core/engine/urlData.d.ts +0 -17
  35. package/dist/types/core/engine/urlData.test.d.ts +0 -1
  36. package/dist/types/core/engine/urlPrefill.d.ts +0 -9
  37. package/dist/types/core/engine/urlPrefill.test.d.ts +0 -1
  38. package/dist/types/core/events/dropoffDetection.d.ts +0 -14
  39. package/dist/types/core/events/dropoffDetection.test.d.ts +0 -1
  40. package/dist/types/core/events/emitter.d.ts +0 -17
  41. package/dist/types/core/events/emitter.test.d.ts +0 -1
  42. package/dist/types/core/events/formJourneyTracker.contract.test.d.ts +0 -1
  43. package/dist/types/core/events/formJourneyTracker.d.ts +0 -19
  44. package/dist/types/core/events/formJourneyTracker.test.d.ts +0 -1
  45. package/dist/types/core/events/pushEvents.contract.test.d.ts +0 -1
  46. package/dist/types/core/events/pushEvents.d.ts +0 -16
  47. package/dist/types/core/events/pushEvents.test.d.ts +0 -1
  48. package/dist/types/core/events/startedDetection.d.ts +0 -10
  49. package/dist/types/core/events/startedDetection.test.d.ts +0 -1
  50. package/dist/types/core/events/viewDetection.d.ts +0 -14
  51. package/dist/types/core/events/viewDetection.test.d.ts +0 -1
  52. package/dist/types/core/identity/browserFingerprint.d.ts +0 -19
  53. package/dist/types/core/identity/browserFingerprint.test.d.ts +0 -1
  54. package/dist/types/core/identity/ensureIdentified.d.ts +0 -16
  55. package/dist/types/core/identity/ensureIdentified.test.d.ts +0 -1
  56. package/dist/types/core/identity/identify.contract.test.d.ts +0 -1
  57. package/dist/types/core/identity/identify.d.ts +0 -15
  58. package/dist/types/core/identity/identify.test.d.ts +0 -1
  59. package/dist/types/core/identity/journey.contract.test.d.ts +0 -1
  60. package/dist/types/core/identity/journey.d.ts +0 -16
  61. package/dist/types/core/identity/journey.test.d.ts +0 -1
  62. package/dist/types/core/identity/journey.testStubs.d.ts +0 -2
  63. package/dist/types/core/identity/leadDataCache.d.ts +0 -16
  64. package/dist/types/core/identity/leadDataCache.test.d.ts +0 -1
  65. package/dist/types/enrichment/attachEnrichment.d.ts +0 -21
  66. package/dist/types/enrichment/attachEnrichment.test.d.ts +0 -1
  67. package/dist/types/index.d.ts +0 -1
  68. package/dist/types/react/index.d.ts +0 -1
  69. package/dist/types/react/ssr.test.d.ts +0 -1
  70. package/dist/types/react/useSurfaceForm.d.ts +0 -11
  71. package/dist/types/react/useSurfaceForm.test.d.ts +0 -1
  72. package/dist/types/surfaceForms.d.ts +0 -72
  73. package/dist/types/surfaceForms.test.d.ts +0 -1
  74. package/dist/types/tracking/attachTracking.d.ts +0 -22
  75. package/dist/types/tracking/attachTracking.test.d.ts +0 -1
  76. package/dist/types/tracking/conversionRules.contract.test.d.ts +0 -1
  77. package/dist/types/tracking/conversionRules.d.ts +0 -12
  78. package/dist/types/tracking/conversionRules.test.d.ts +0 -1
  79. package/dist/types/tracking/vendors.d.ts +0 -22
  80. package/dist/types/tracking/vendors.test.d.ts +0 -1
  81. package/dist/types/validation/attachEmailValidation.d.ts +0 -1
  82. package/dist/types/validation/attachEmailValidation.test.d.ts +0 -1
  83. package/docs/reference/identity.md +2 -3
  84. package/package.json +1 -1
  85. package/dist/index.cjs.map +0 -7
  86. package/dist/index.mjs.map +0 -7
  87. package/dist/react/index.cjs.map +0 -7
  88. package/dist/react/index.mjs.map +0 -7
  89. package/dist/surface-forms-sdk.min.js.map +0 -7
  90. package/dist/types/bind/bindForm.d.ts.map +0 -1
  91. package/dist/types/bind/bindForm.test.d.ts.map +0 -1
  92. package/dist/types/bind/bookingWidget.d.ts.map +0 -1
  93. package/dist/types/bind/bookingWidget.test.d.ts.map +0 -1
  94. package/dist/types/core/client/emailValidation.d.ts.map +0 -1
  95. package/dist/types/core/client/emailValidation.test.d.ts.map +0 -1
  96. package/dist/types/core/client/responses.d.ts.map +0 -1
  97. package/dist/types/core/client/responses.test.d.ts.map +0 -1
  98. package/dist/types/core/client/runtimeConfig.contract.test.d.ts.map +0 -1
  99. package/dist/types/core/client/runtimeConfig.d.ts.map +0 -1
  100. package/dist/types/core/client/runtimeConfig.test.d.ts.map +0 -1
  101. package/dist/types/core/client/scheduler.contract.test.d.ts.map +0 -1
  102. package/dist/types/core/client/scheduler.d.ts.map +0 -1
  103. package/dist/types/core/client/scheduler.test.d.ts.map +0 -1
  104. package/dist/types/core/client/transport.d.ts.map +0 -1
  105. package/dist/types/core/client/transport.test.d.ts.map +0 -1
  106. package/dist/types/core/engine/answerAudit.d.ts.map +0 -1
  107. package/dist/types/core/engine/answerAudit.test.d.ts.map +0 -1
  108. package/dist/types/core/engine/answerStates.contract.test.d.ts.map +0 -1
  109. package/dist/types/core/engine/answerStates.d.ts.map +0 -1
  110. package/dist/types/core/engine/formEngine.d.ts.map +0 -1
  111. package/dist/types/core/engine/formEngine.test.d.ts.map +0 -1
  112. package/dist/types/core/engine/redirect.d.ts.map +0 -1
  113. package/dist/types/core/engine/redirect.test.d.ts.map +0 -1
  114. package/dist/types/core/engine/responsePayload.contract.test.d.ts.map +0 -1
  115. package/dist/types/core/engine/responsePayload.d.ts.map +0 -1
  116. package/dist/types/core/engine/responsePayload.test.d.ts.map +0 -1
  117. package/dist/types/core/engine/urlData.contract.test.d.ts.map +0 -1
  118. package/dist/types/core/engine/urlData.d.ts.map +0 -1
  119. package/dist/types/core/engine/urlData.test.d.ts.map +0 -1
  120. package/dist/types/core/engine/urlPrefill.d.ts.map +0 -1
  121. package/dist/types/core/engine/urlPrefill.test.d.ts.map +0 -1
  122. package/dist/types/core/events/dropoffDetection.d.ts.map +0 -1
  123. package/dist/types/core/events/dropoffDetection.test.d.ts.map +0 -1
  124. package/dist/types/core/events/emitter.d.ts.map +0 -1
  125. package/dist/types/core/events/emitter.test.d.ts.map +0 -1
  126. package/dist/types/core/events/formJourneyTracker.contract.test.d.ts.map +0 -1
  127. package/dist/types/core/events/formJourneyTracker.d.ts.map +0 -1
  128. package/dist/types/core/events/formJourneyTracker.test.d.ts.map +0 -1
  129. package/dist/types/core/events/pushEvents.contract.test.d.ts.map +0 -1
  130. package/dist/types/core/events/pushEvents.d.ts.map +0 -1
  131. package/dist/types/core/events/pushEvents.test.d.ts.map +0 -1
  132. package/dist/types/core/events/startedDetection.d.ts.map +0 -1
  133. package/dist/types/core/events/startedDetection.test.d.ts.map +0 -1
  134. package/dist/types/core/events/viewDetection.d.ts.map +0 -1
  135. package/dist/types/core/events/viewDetection.test.d.ts.map +0 -1
  136. package/dist/types/core/identity/browserFingerprint.d.ts.map +0 -1
  137. package/dist/types/core/identity/browserFingerprint.test.d.ts.map +0 -1
  138. package/dist/types/core/identity/ensureIdentified.d.ts.map +0 -1
  139. package/dist/types/core/identity/ensureIdentified.test.d.ts.map +0 -1
  140. package/dist/types/core/identity/identify.contract.test.d.ts.map +0 -1
  141. package/dist/types/core/identity/identify.d.ts.map +0 -1
  142. package/dist/types/core/identity/identify.test.d.ts.map +0 -1
  143. package/dist/types/core/identity/journey.contract.test.d.ts.map +0 -1
  144. package/dist/types/core/identity/journey.d.ts.map +0 -1
  145. package/dist/types/core/identity/journey.test.d.ts.map +0 -1
  146. package/dist/types/core/identity/journey.testStubs.d.ts.map +0 -1
  147. package/dist/types/core/identity/leadDataCache.d.ts.map +0 -1
  148. package/dist/types/core/identity/leadDataCache.test.d.ts.map +0 -1
  149. package/dist/types/enrichment/attachEnrichment.d.ts.map +0 -1
  150. package/dist/types/enrichment/attachEnrichment.test.d.ts.map +0 -1
  151. package/dist/types/index.d.ts.map +0 -1
  152. package/dist/types/react/index.d.ts.map +0 -1
  153. package/dist/types/react/ssr.test.d.ts.map +0 -1
  154. package/dist/types/react/useSurfaceForm.d.ts.map +0 -1
  155. package/dist/types/react/useSurfaceForm.test.d.ts.map +0 -1
  156. package/dist/types/surfaceForms.d.ts.map +0 -1
  157. package/dist/types/surfaceForms.test.d.ts.map +0 -1
  158. package/dist/types/tracking/attachTracking.d.ts.map +0 -1
  159. package/dist/types/tracking/attachTracking.test.d.ts.map +0 -1
  160. package/dist/types/tracking/conversionRules.contract.test.d.ts.map +0 -1
  161. package/dist/types/tracking/conversionRules.d.ts.map +0 -1
  162. package/dist/types/tracking/conversionRules.test.d.ts.map +0 -1
  163. package/dist/types/tracking/vendors.d.ts.map +0 -1
  164. package/dist/types/tracking/vendors.test.d.ts.map +0 -1
  165. package/dist/types/validation/attachEmailValidation.d.ts.map +0 -1
  166. package/dist/types/validation/attachEmailValidation.test.d.ts.map +0 -1
package/dist/index.cjs CHANGED
@@ -738,7 +738,7 @@ var createTransport = ({
738
738
  ...opts?.keepalive ? { keepalive: true } : {},
739
739
  // The `${formId}_pa` person-attributes cookie (repeat-visitor signals)
740
740
  // lives on the API origin; only credentialed requests carry it from a
741
- // customer-hosted page (Decisions #12 — the endpoints echo the origin).
741
+ // customer-hosted page.
742
742
  ...opts?.credentials ? { credentials: "include" } : {}
743
743
  });
744
744
  if (!response.ok) {
@@ -2612,7 +2612,7 @@ var SurfaceForms = {
2612
2612
  externalStates: urlDataStateId ? { [urlDataStateId]: buildUrlData({ trackCookies }) } : {},
2613
2613
  // Native forms report tag detection here; for the SDK the answer is static —
2614
2614
  // the SDK IS the runtime — and it keys the responses-table "SDK" badge, so
2615
- // callers cannot override it (Decisions #8).
2615
+ // callers cannot override it.
2616
2616
  meta: { ...meta, surfaceTagStatus: "sdk" },
2617
2617
  identity: () => ({
2618
2618
  fingerprint: identity?.fingerprint,
@@ -2734,4 +2734,3 @@ var SurfaceForms = {
2734
2734
  };
2735
2735
  }
2736
2736
  };
2737
- //# sourceMappingURL=index.cjs.map
package/dist/index.mjs CHANGED
@@ -662,7 +662,7 @@ var createTransport = ({
662
662
  ...opts?.keepalive ? { keepalive: true } : {},
663
663
  // The `${formId}_pa` person-attributes cookie (repeat-visitor signals)
664
664
  // lives on the API origin; only credentialed requests carry it from a
665
- // customer-hosted page (Decisions #12 — the endpoints echo the origin).
665
+ // customer-hosted page.
666
666
  ...opts?.credentials ? { credentials: "include" } : {}
667
667
  });
668
668
  if (!response.ok) {
@@ -2536,7 +2536,7 @@ var SurfaceForms = {
2536
2536
  externalStates: urlDataStateId ? { [urlDataStateId]: buildUrlData({ trackCookies }) } : {},
2537
2537
  // Native forms report tag detection here; for the SDK the answer is static —
2538
2538
  // the SDK IS the runtime — and it keys the responses-table "SDK" badge, so
2539
- // callers cannot override it (Decisions #8).
2539
+ // callers cannot override it.
2540
2540
  meta: { ...meta, surfaceTagStatus: "sdk" },
2541
2541
  identity: () => ({
2542
2542
  fingerprint: identity?.fingerprint,
@@ -2711,4 +2711,3 @@ export {
2711
2711
  updateResponse,
2712
2712
  writeLeadData
2713
2713
  };
2714
- //# sourceMappingURL=index.mjs.map
@@ -41,4 +41,3 @@ var useSurfaceForm = (engine) => {
41
41
  on: engine.on
42
42
  };
43
43
  };
44
- //# sourceMappingURL=index.cjs.map
@@ -18,4 +18,3 @@ var useSurfaceForm = (engine) => {
18
18
  export {
19
19
  useSurfaceForm
20
20
  };
21
- //# sourceMappingURL=index.mjs.map
@@ -1,2 +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);})();
2
- //# sourceMappingURL=surface-forms-sdk.min.js.map
@@ -1,43 +1,7 @@
1
1
  import type { FormEngine } from "../core/engine/formEngine";
2
- /**
3
- * The `data-*` binding layer (forms-sdk-plan.md §2.1/§5.2): makes plain
4
- * agent-authored HTML drive the headless engine with zero authored JS. The
5
- * attribute contract is a superset of the conventions the public tag's
6
- * external-form path already uses (`data-question-id` / `data-field-name`
7
- * discovery, `input[type=email]` → `emailAddress` inference,
8
- * `surface-next-button` / `surface-submit-button` classes), plus
9
- * customer-owned routing affordances (`data-surface-goto-step` branch buttons,
10
- * `surface-disqualify-button` — Decisions #6) and the
11
- * stepped-only rule: `data-step-id` containers matching the record's steps,
12
- * which the SDK shows/hides itself — a multi-step record presents one step at
13
- * a time (§2.9). A single-step record may omit containers entirely.
14
- *
15
- * Fields merge into one component state per question (`{ [fieldName]: value }`
16
- * accumulates firstName/lastName style groups); `data-field-name` defaults to
17
- * `"input"` — ShortInput's state key — and email inputs without it default to
18
- * `"email"`, EmailForm's; a `<select>` on a Dropdown defaults to `"selected"`,
19
- * its state key. Every state carries its `type` discriminator
20
- * (`data-question-type`, inferred for the two text states) because the wire
21
- * schema validates states as a discriminated union.
22
- *
23
- * Choice questions are captured per GROUP, not per control: their wire states
24
- * are structural (`MultipleOptionsQuestion` wants the ENTIRE option list as
25
- * `{key, index, value}` entries, `GraphicOptions` wants `{value, index}`),
26
- * which no single radio's string value can express — the 2026-08 field run
27
- * shipped exactly that and ingest rejected it. Every change rebuilds the full
28
- * answer from all radios/checkboxes under the binding (key = the control's
29
- * `value` attribute, index = DOM order, so author options in record order).
30
- *
31
- * Runtime drift guard (§4.3): Surface never sees the customer's HTML, so on
32
- * bind the record's stateful questionIds are compared against what the DOM
33
- * actually bound — unbound ids get a console warning, the publish-gate-less
34
- * counterpart of `validate_form_html`.
35
- */
36
2
  export type BindFormOptions = {
37
3
  engine: FormEngine;
38
4
  root: Element;
39
- /** Stateful questionIds from the form record; unbound ones are warned about. */
40
5
  expectedQuestionIds?: string[];
41
6
  };
42
7
  export declare const bindForm: ({ engine, root, expectedQuestionIds }: BindFormOptions) => (() => void);
43
- //# sourceMappingURL=bindForm.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=bindForm.test.d.ts.map
@@ -9,27 +9,16 @@ export type BookingWidgetOptions = {
9
9
  name?: string;
10
10
  email?: string;
11
11
  };
12
- /** Threads booking↔response linkage into the booking meta block. */
13
12
  identity?: {
14
13
  responseId?: string;
15
14
  leadSessionId?: string;
16
15
  fingerprint?: string;
17
16
  };
18
- /**
19
- * Overrides for the widget's human-readable copy. Defaults use
20
- * `Intl.DateTimeFormat` in the visitor's locale; every button also carries
21
- * the raw value in `data-value` (`YYYY-MM` months, `YYYY-MM-DD` dates, ISO
22
- * instants for slots), so relabeling never needs to parse the text back.
23
- */
24
17
  formatters?: {
25
- /** `month` is `YYYY-MM`. */
26
18
  month?: (month: string) => string;
27
- /** `date` is `YYYY-MM-DD`. */
28
19
  date?: (date: string) => string;
29
- /** `slot.start`/`slot.end` are ISO instants; format in the widget's timezone. */
30
20
  time?: (slot: TimeSlot) => string;
31
21
  };
32
22
  onComplete: (booking: Booking) => void;
33
23
  };
34
24
  export declare const mountBookingWidget: ({ container, scheduler, eventTypeId, timezone, duration, prefill, identity, formatters, onComplete, }: BookingWidgetOptions) => (() => void);
35
- //# sourceMappingURL=bookingWidget.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=bookingWidget.test.d.ts.map
@@ -1,12 +1,10 @@
1
1
  import type { Transport } from "./transport";
2
2
  export type EmailValidationResult = {
3
3
  email: string;
4
- /** Deliverable per the waterfall + blacklist; fail-open true when validation could not run. */
5
4
  isValid: boolean;
6
5
  status?: string;
7
6
  reason?: string;
8
7
  blacklistEntryIds?: string[];
9
- /** Validation did not actually run (network/server failure) — `isValid` is the fail-open default. */
10
8
  failed?: boolean;
11
9
  };
12
10
  export type EmailValidator = {
@@ -16,8 +14,6 @@ export type EmailValidator = {
16
14
  export type CreateEmailValidatorOptions = {
17
15
  transport: Transport;
18
16
  environmentId: string;
19
- /** Preview never spends validator quota: every email reports a synthetic valid result. */
20
17
  preview?: boolean;
21
18
  };
22
19
  export declare const createEmailValidator: ({ transport, environmentId, preview, }: CreateEmailValidatorOptions) => EmailValidator;
23
- //# sourceMappingURL=emailValidation.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=emailValidation.test.d.ts.map
@@ -3,33 +3,18 @@ import type { Transport, TransportResult } from "./transport";
3
3
  export type CreateResponseResult = {
4
4
  responseId: string;
5
5
  leadId: string | null;
6
- /** Authorizes the token-gated read-back (resume); persist alongside the responseId. */
7
6
  resumeToken: string | null;
8
7
  };
9
8
  export declare const submitResponse: (transport: Transport, payload: FormResponsePayload) => Promise<TransportResult<CreateResponseResult>>;
10
9
  export declare const updateResponse: (transport: Transport, payload: FormUpdateResponsePayload) => void;
11
- /**
12
- * Awaited delivery for the FINISHING update (the 2026-08 field run measured
13
- * the beacon path silently dropping the terminal write on fast page close:
14
- * `submit()` resolved, `saved` fired, and the server kept a step-1 partial).
15
- * `keepalive` lets the request survive an immediate navigation; credentials
16
- * match the beacon path's `${formId}_pa` cookie round-trip.
17
- */
18
10
  export declare const updateResponseConfirmed: (transport: Transport, payload: FormUpdateResponsePayload) => Promise<TransportResult<unknown>>;
19
11
  export type StoredAnswerRow = {
20
12
  questionId: string;
21
13
  response: Record<string, unknown>;
22
14
  };
23
- /**
24
- * Read-back of a stored response for resume (Decisions #11: the route is
25
- * token-gated; the create reply issued the token). External-state
26
- * pseudo-answers (URL_DATA) are stripped — they are attribution snapshots the
27
- * engine re-derives from its own page context, not visitor answers.
28
- */
29
15
  export declare const fetchStoredResponse: (transport: Transport, { responseId, resumeToken }: {
30
16
  responseId: string;
31
17
  resumeToken: string;
32
18
  }) => Promise<TransportResult<{
33
19
  answers: StoredAnswerRow[];
34
20
  }>>;
35
- //# sourceMappingURL=responses.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=responses.test.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=runtimeConfig.contract.test.d.ts.map
@@ -1,19 +1,4 @@
1
1
  import type { Transport, TransportResult } from "./transport";
2
- /**
3
- * Boot-time fetch of the published form record (forms-sdk-plan.md §2.3,
4
- * Decisions #7): `GET /api/v1/public/forms/[formId]/runtime-config` serves the
5
- * same `TCachedForm` payload the hosted `/s/[formId]` page reads — config
6
- * (steps + components, the data contract) and settings (behavioral gates like
7
- * `trackPartialResponses`; tracking ids for the Phase-2 tracking module).
8
- * `settings.password` never arrives — the server strips it and the SDK
9
- * validates gated forms through `/api/v1/check-password`.
10
- *
11
- * The step/question extraction mirrors `extractFlatComponentsFromStep`
12
- * (form-render gridLayoutUtils): a step's `components` is either a flat
13
- * component array or a ComponentGridLayout whose rows hold components or
14
- * `GridLayoutRowItem` wrappers; stateful components carry `state.questionId` —
15
- * the same discriminator the MCP validator's `collectQuestionIds` uses.
16
- */
17
2
  type RuntimeStep = {
18
3
  id: string;
19
4
  endStepKind?: "thank_you" | "disqualified";
@@ -31,14 +16,12 @@ export type RuntimeConfig = {
31
16
  trackCookie?: boolean;
32
17
  } & Record<string, unknown>) | null;
33
18
  };
34
- /** `preview` asks the server for the draft config of a never-published form (authoring loop); published forms serve live either way. */
35
19
  export declare const fetchRuntimeConfig: (transport: Transport, formId: string, { preview, previewToken }?: {
36
20
  preview?: boolean;
37
21
  previewToken?: string;
38
22
  }) => Promise<TransportResult<{
39
23
  data?: RuntimeConfig;
40
24
  }>>;
41
- /** Step order + ending kinds — the engine's traversal contract, including where submit/disqualify land. */
42
25
  export declare const stepsOf: (config: RuntimeConfig["config"]) => Array<{
43
26
  id: string;
44
27
  endStepKind?: "thank_you" | "disqualified";
@@ -48,25 +31,10 @@ export declare const statefulQuestionsOf: (config: RuntimeConfig["config"]) => A
48
31
  componentType?: string;
49
32
  }>;
50
33
  export declare const statefulQuestionIdsOf: (config: RuntimeConfig["config"]) => string[];
51
- /**
52
- * Questions whose answers can trigger real-time enrichment, with the state
53
- * keys to watch — the native renderer's blur triggers translated to data
54
- * (identityInfo.tsx handleOnBlur): IdentityInfo fires on its configured
55
- * `enrichmentSourceField` (default emailAddress) and always on `websiteUrl`;
56
- * EmailForm fires on its email.
57
- */
58
34
  export declare const enrichmentSourcesOf: (config: RuntimeConfig["config"]) => Array<{
59
35
  questionId: string;
60
36
  fieldNames: string[];
61
37
  }>;
62
- /**
63
- * True when a component EXPLICITLY declares `enrichmentSourceField` — the
64
- * authoring-time signal that the owner expects enrichment to run. Implicit
65
- * sources (every EmailForm / IdentityInfo default) don't count: they make any
66
- * form with an email question look enrichment-configured.
67
- */
68
38
  export declare const hasDeclaredEnrichmentSource: (config: RuntimeConfig["config"]) => boolean;
69
- /** Mirrors form-render's provider gate (buildExternalStateStore): v2 config with at least one enabled provider exposing fields. */
70
39
  export declare const hasEnabledEnrichmentProvider: (settings: RuntimeConfig["settings"]) => boolean;
71
40
  export {};
72
- //# sourceMappingURL=runtimeConfig.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=runtimeConfig.test.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=scheduler.contract.test.d.ts.map
@@ -1,22 +1,4 @@
1
1
  import type { Transport, TransportResult } from "./transport";
2
- /**
3
- * Thin wrap of the public Surface-native scheduler endpoints (forms-sdk-plan.md
4
- * row 46 — Phase-1 MVP scope by product decision). Query and payload shapes
5
- * mirror `@surface/scheduler-ui`'s hooks byte-for-byte (that package is
6
- * AGPL-tree and cannot ship in the MIT SDK — plan §2.9), including the split
7
- * of `YYYY-MM` into numeric month/year params and the booking `meta` block
8
- * that drives server-side booking↔response linkage.
9
- *
10
- * `preview: true` mirrors the native BookingForm exactly: queries carry
11
- * `preview=true`, and `book()` resolves a fabricated preview booking without
12
- * any network call — draft interactions never create real bookings.
13
- *
14
- * `toSchedulerAnswerState` reproduces `SurfaceScheduler.handleBookingComplete`:
15
- * the persisted DynamicScheduler component state whose `eventScheduled`/`uri`
16
- * pair the payload builder's bookingId detection and the server's booking
17
- * meta injection key on. `googleMeetLink` is the frozen persisted key even
18
- * though the API field is `meetingJoinLink`.
19
- */
20
2
  export type BookingAttendee = {
21
3
  name: string;
22
4
  email: string;
@@ -62,7 +44,6 @@ export type SchedulerClient = {
62
44
  }>>;
63
45
  getMonthAvailability: (args: {
64
46
  eventTypeId: string;
65
- /** Calendar month as `YYYY-MM`; split into numeric month/year params like native. */
66
47
  month: string;
67
48
  timezone: string;
68
49
  duration?: number;
@@ -85,12 +66,6 @@ export type SchedulerClient = {
85
66
  book: (args: {
86
67
  eventTypeId: string;
87
68
  startTime: string;
88
- /**
89
- * The selected slot's end. Required — every booking comes from a picked
90
- * slot, and a fallback would fabricate zero-length preview meetings. Only
91
- * preview fabrication reads it (the server derives real end times); it is
92
- * never sent on the wire.
93
- */
94
69
  endTime: string;
95
70
  timezone: string;
96
71
  inviteeName: string;
@@ -115,7 +90,5 @@ export declare const createSchedulerClient: ({ transport, preview, }: {
115
90
  transport: Transport;
116
91
  preview?: boolean;
117
92
  }) => SchedulerClient;
118
- /** The persisted DynamicScheduler component state for a completed booking. */
119
93
  export declare const toSchedulerAnswerState: (booking: Booking) => Record<string, unknown>;
120
94
  export {};
121
- //# sourceMappingURL=scheduler.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=scheduler.test.d.ts.map
@@ -1,30 +1,4 @@
1
- /**
2
- * Delivery layer for the SDK's first-party requests, mirroring the native
3
- * runtime's two transports (forms-sdk-plan.md §2.4):
4
- *
5
- * - `post` — plain `fetch` for calls whose response body the engine needs
6
- * (response create returns `responseId`/`meta`, identify returns
7
- * `leadId`/`sessionId`). Never throws: resolves to a typed result so
8
- * callers keep the never-break-the-host-page guarantee (§2.6).
9
- * - `beacon` — `sendBeacon`-first with `fetch(keepalive)` fallback for
10
- * fire-and-forget writes (response updates, events, journey), the same
11
- * semantics as form-render's `updateResponse.ts` / `sendPushEventRequest.ts`.
12
- * Failures are swallowed by design: the server's drop-off sweep reconciles
13
- * missed updates, and events are best-effort.
14
- *
15
- * Unlike form-render (relative paths, same-origin only), every request is
16
- * absolute against a configurable base URL — SDK pages are customer-hosted
17
- * and always cross-origin (§4.1).
18
- */
19
- /** The host the public tag already targets (scripts:src/constants.ts). */
20
1
  export declare const DEFAULT_API_BASE_URL = "https://forms.withsurface.com";
21
- /**
22
- * Sent as `X-Surface-Sdk-Version` on every fetch-path request (Decisions #14:
23
- * SDK 429s must be measurable before rate limits are revisited). `sendBeacon`
24
- * cannot carry headers, so beacon deliveries carry the version as the `sdv`
25
- * query param instead — the server reads both. Bumped manually until
26
- * extraction wires it to package.json at build time.
27
- */
28
2
  export declare const SDK_VERSION = "0.1.0";
29
3
  export type TransportResult<TData> = {
30
4
  ok: true;
@@ -47,10 +21,8 @@ export type Transport = {
47
21
  keepalive?: boolean;
48
22
  credentials?: boolean;
49
23
  }) => Promise<TransportResult<TData>>;
50
- /** Returns true only when `sendBeacon` queued the payload; the fire-and-forget fetch fallback reports false. */
51
24
  beacon: (path: string, payload: unknown) => boolean;
52
25
  };
53
26
  export declare const createTransport: ({ apiBaseUrl, }?: {
54
27
  apiBaseUrl?: string;
55
28
  }) => Transport;
56
- //# sourceMappingURL=transport.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=transport.test.d.ts.map
@@ -1,21 +1,9 @@
1
- /**
2
- * `init({ debug: true })` answer auditing: the bind layer always produces
3
- * valid shapes, but headless `setAnswer` callers are one label-string away
4
- * from the ingest 400 that static gates cannot see (2026-08 field run). The
5
- * auditor checks only facts that cannot false-positive — unknown questionId,
6
- * wrong `type` discriminator, a merged state with no `type` at all, and a
7
- * choice-list answer whose `choices` is not an array — and logs every
8
- * captured answer so a session is replayable from the console.
9
- */
10
1
  export type AuditedQuestion = {
11
2
  questionId: string;
12
3
  componentType?: string;
13
4
  };
14
5
  export declare const auditAnswer: ({ questions, questionId, merged, }: {
15
- /** Stateful questions of the record; empty when the record wasn't fetched (caller-provided steps). */
16
6
  questions: Map<string, AuditedQuestion>;
17
7
  questionId: string;
18
- /** The post-merge state (setAnswer patches accumulate per question). */
19
8
  merged: Record<string, unknown>;
20
9
  }) => void;
21
- //# sourceMappingURL=answerAudit.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=answerAudit.test.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=answerStates.contract.test.d.ts.map
@@ -1,16 +1,3 @@
1
- /**
2
- * Typed answer states for headless callers (plan §2.9): the bind layer builds
3
- * these automatically, but React/headless code hands them to `setAnswer` by
4
- * hand — and shipping a bare label string where a structured state belongs is
5
- * the classic production 400 (2026-08 field run). These local types mirror
6
- * each component's wire schema and are contract-tested against
7
- * `@surface/types` (dev dependency only — the SDK ships zero runtime deps).
8
- *
9
- * `setAnswer` itself stays structurally typed (`Record<string, unknown>`):
10
- * legacy component types not listed here remain settable, and answers merge
11
- * per question, so partial patches are legal. Annotate call sites with these
12
- * types to get the compiler's help.
13
- */
14
1
  export type ShortInputAnswer = {
15
2
  type: "ShortInput";
16
3
  input: string;
@@ -36,7 +23,6 @@ export type FileUploaderAnswer = {
36
23
  type: "FileUploader";
37
24
  fileUrl?: string;
38
25
  };
39
- /** The ENTIRE option list, one entry per record option — never only the picked one. */
40
26
  export type MultipleOptionsAnswer = {
41
27
  type: "MultipleOptionsQuestion";
42
28
  choices: Array<{
@@ -70,13 +56,11 @@ export type MultipleChoiceSingleAnswerAnswer = {
70
56
  value: string;
71
57
  index: number;
72
58
  };
73
- /** Canonical IdentityInfo answer keys (mirrors IdentityInfoKeysArray; contract-tested). */
74
59
  export declare const IDENTITY_INFO_ANSWER_KEYS: readonly ["firstName", "lastName", "fullName", "emailAddress", "workEmailAddress", "phoneNumber", "companyName", "numberOfEmployees", "websiteUrl", "title", "streetAddress", "aptSuiteEtc", "city", "state", "country", "zipCode", "companyRevenue", "profilePictureUrl"];
75
60
  export type IdentityInfoAnswerKey = (typeof IDENTITY_INFO_ANSWER_KEYS)[number];
76
61
  export type IdentityInfoAnswer = {
77
62
  type: "IdentityInfo";
78
63
  } & Partial<Record<IdentityInfoAnswerKey, string>>;
79
- /** Booking answers; `toSchedulerAnswerState` produces this — override `type` to the record's component type. */
80
64
  export type SchedulerAnswer = {
81
65
  type: "CalendlyScreen" | "DynamicScheduler";
82
66
  eventScheduled: boolean;
@@ -89,4 +73,3 @@ export type SchedulerAnswer = {
89
73
  googleMeetLink?: string;
90
74
  };
91
75
  export type KnownAnswerState = ShortInputAnswer | LongInputAnswer | EmailFormAnswer | DropdownAnswer | DisclaimerAnswer | FileUploaderAnswer | MultipleOptionsAnswer | MMChoiceAnswer | MultipleChoiceAnswer | GraphicOptionsAnswer | MultipleChoiceSingleAnswerAnswer | IdentityInfoAnswer | SchedulerAnswer;
92
- //# sourceMappingURL=answerStates.d.ts.map