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

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 (177) hide show
  1. package/README.md +63 -0
  2. package/dist/index.cjs +2737 -0
  3. package/dist/index.cjs.map +7 -0
  4. package/dist/index.mjs +2714 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/dist/react/index.cjs +44 -0
  7. package/dist/react/index.cjs.map +7 -0
  8. package/dist/react/index.mjs +21 -0
  9. package/dist/react/index.mjs.map +7 -0
  10. package/dist/surface-forms-sdk.min.js +2 -0
  11. package/dist/surface-forms-sdk.min.js.map +7 -0
  12. package/dist/types/bind/bindForm.d.ts +43 -0
  13. package/dist/types/bind/bindForm.d.ts.map +1 -0
  14. package/dist/types/bind/bindForm.test.d.ts +2 -0
  15. package/dist/types/bind/bindForm.test.d.ts.map +1 -0
  16. package/dist/types/bind/bookingWidget.d.ts +35 -0
  17. package/dist/types/bind/bookingWidget.d.ts.map +1 -0
  18. package/dist/types/bind/bookingWidget.test.d.ts +2 -0
  19. package/dist/types/bind/bookingWidget.test.d.ts.map +1 -0
  20. package/dist/types/core/client/emailValidation.d.ts +23 -0
  21. package/dist/types/core/client/emailValidation.d.ts.map +1 -0
  22. package/dist/types/core/client/emailValidation.test.d.ts +2 -0
  23. package/dist/types/core/client/emailValidation.test.d.ts.map +1 -0
  24. package/dist/types/core/client/responses.d.ts +35 -0
  25. package/dist/types/core/client/responses.d.ts.map +1 -0
  26. package/dist/types/core/client/responses.test.d.ts +2 -0
  27. package/dist/types/core/client/responses.test.d.ts.map +1 -0
  28. package/dist/types/core/client/runtimeConfig.contract.test.d.ts +2 -0
  29. package/dist/types/core/client/runtimeConfig.contract.test.d.ts.map +1 -0
  30. package/dist/types/core/client/runtimeConfig.d.ts +72 -0
  31. package/dist/types/core/client/runtimeConfig.d.ts.map +1 -0
  32. package/dist/types/core/client/runtimeConfig.test.d.ts +2 -0
  33. package/dist/types/core/client/runtimeConfig.test.d.ts.map +1 -0
  34. package/dist/types/core/client/scheduler.contract.test.d.ts +2 -0
  35. package/dist/types/core/client/scheduler.contract.test.d.ts.map +1 -0
  36. package/dist/types/core/client/scheduler.d.ts +121 -0
  37. package/dist/types/core/client/scheduler.d.ts.map +1 -0
  38. package/dist/types/core/client/scheduler.test.d.ts +2 -0
  39. package/dist/types/core/client/scheduler.test.d.ts.map +1 -0
  40. package/dist/types/core/client/transport.d.ts +56 -0
  41. package/dist/types/core/client/transport.d.ts.map +1 -0
  42. package/dist/types/core/client/transport.test.d.ts +2 -0
  43. package/dist/types/core/client/transport.test.d.ts.map +1 -0
  44. package/dist/types/core/engine/answerAudit.d.ts +21 -0
  45. package/dist/types/core/engine/answerAudit.d.ts.map +1 -0
  46. package/dist/types/core/engine/answerAudit.test.d.ts +2 -0
  47. package/dist/types/core/engine/answerAudit.test.d.ts.map +1 -0
  48. package/dist/types/core/engine/answerStates.contract.test.d.ts +2 -0
  49. package/dist/types/core/engine/answerStates.contract.test.d.ts.map +1 -0
  50. package/dist/types/core/engine/answerStates.d.ts +92 -0
  51. package/dist/types/core/engine/answerStates.d.ts.map +1 -0
  52. package/dist/types/core/engine/formEngine.d.ts +145 -0
  53. package/dist/types/core/engine/formEngine.d.ts.map +1 -0
  54. package/dist/types/core/engine/formEngine.test.d.ts +2 -0
  55. package/dist/types/core/engine/formEngine.test.d.ts.map +1 -0
  56. package/dist/types/core/engine/redirect.d.ts +36 -0
  57. package/dist/types/core/engine/redirect.d.ts.map +1 -0
  58. package/dist/types/core/engine/redirect.test.d.ts +2 -0
  59. package/dist/types/core/engine/redirect.test.d.ts.map +1 -0
  60. package/dist/types/core/engine/responsePayload.contract.test.d.ts +2 -0
  61. package/dist/types/core/engine/responsePayload.contract.test.d.ts.map +1 -0
  62. package/dist/types/core/engine/responsePayload.d.ts +74 -0
  63. package/dist/types/core/engine/responsePayload.d.ts.map +1 -0
  64. package/dist/types/core/engine/responsePayload.test.d.ts +2 -0
  65. package/dist/types/core/engine/responsePayload.test.d.ts.map +1 -0
  66. package/dist/types/core/engine/urlData.contract.test.d.ts +2 -0
  67. package/dist/types/core/engine/urlData.contract.test.d.ts.map +1 -0
  68. package/dist/types/core/engine/urlData.d.ts +30 -0
  69. package/dist/types/core/engine/urlData.d.ts.map +1 -0
  70. package/dist/types/core/engine/urlData.test.d.ts +2 -0
  71. package/dist/types/core/engine/urlData.test.d.ts.map +1 -0
  72. package/dist/types/core/engine/urlPrefill.d.ts +21 -0
  73. package/dist/types/core/engine/urlPrefill.d.ts.map +1 -0
  74. package/dist/types/core/engine/urlPrefill.test.d.ts +2 -0
  75. package/dist/types/core/engine/urlPrefill.test.d.ts.map +1 -0
  76. package/dist/types/core/events/dropoffDetection.d.ts +21 -0
  77. package/dist/types/core/events/dropoffDetection.d.ts.map +1 -0
  78. package/dist/types/core/events/dropoffDetection.test.d.ts +2 -0
  79. package/dist/types/core/events/dropoffDetection.test.d.ts.map +1 -0
  80. package/dist/types/core/events/emitter.d.ts +23 -0
  81. package/dist/types/core/events/emitter.d.ts.map +1 -0
  82. package/dist/types/core/events/emitter.test.d.ts +2 -0
  83. package/dist/types/core/events/emitter.test.d.ts.map +1 -0
  84. package/dist/types/core/events/formJourneyTracker.contract.test.d.ts +2 -0
  85. package/dist/types/core/events/formJourneyTracker.contract.test.d.ts.map +1 -0
  86. package/dist/types/core/events/formJourneyTracker.d.ts +69 -0
  87. package/dist/types/core/events/formJourneyTracker.d.ts.map +1 -0
  88. package/dist/types/core/events/formJourneyTracker.test.d.ts +2 -0
  89. package/dist/types/core/events/formJourneyTracker.test.d.ts.map +1 -0
  90. package/dist/types/core/events/pushEvents.contract.test.d.ts +2 -0
  91. package/dist/types/core/events/pushEvents.contract.test.d.ts.map +1 -0
  92. package/dist/types/core/events/pushEvents.d.ts +62 -0
  93. package/dist/types/core/events/pushEvents.d.ts.map +1 -0
  94. package/dist/types/core/events/pushEvents.test.d.ts +2 -0
  95. package/dist/types/core/events/pushEvents.test.d.ts.map +1 -0
  96. package/dist/types/core/events/startedDetection.d.ts +11 -0
  97. package/dist/types/core/events/startedDetection.d.ts.map +1 -0
  98. package/dist/types/core/events/startedDetection.test.d.ts +2 -0
  99. package/dist/types/core/events/startedDetection.test.d.ts.map +1 -0
  100. package/dist/types/core/events/viewDetection.d.ts +15 -0
  101. package/dist/types/core/events/viewDetection.d.ts.map +1 -0
  102. package/dist/types/core/events/viewDetection.test.d.ts +2 -0
  103. package/dist/types/core/events/viewDetection.test.d.ts.map +1 -0
  104. package/dist/types/core/identity/browserFingerprint.d.ts +40 -0
  105. package/dist/types/core/identity/browserFingerprint.d.ts.map +1 -0
  106. package/dist/types/core/identity/browserFingerprint.test.d.ts +2 -0
  107. package/dist/types/core/identity/browserFingerprint.test.d.ts.map +1 -0
  108. package/dist/types/core/identity/ensureIdentified.d.ts +27 -0
  109. package/dist/types/core/identity/ensureIdentified.d.ts.map +1 -0
  110. package/dist/types/core/identity/ensureIdentified.test.d.ts +2 -0
  111. package/dist/types/core/identity/ensureIdentified.test.d.ts.map +1 -0
  112. package/dist/types/core/identity/identify.contract.test.d.ts +2 -0
  113. package/dist/types/core/identity/identify.contract.test.d.ts.map +1 -0
  114. package/dist/types/core/identity/identify.d.ts +48 -0
  115. package/dist/types/core/identity/identify.d.ts.map +1 -0
  116. package/dist/types/core/identity/identify.test.d.ts +2 -0
  117. package/dist/types/core/identity/identify.test.d.ts.map +1 -0
  118. package/dist/types/core/identity/journey.contract.test.d.ts +2 -0
  119. package/dist/types/core/identity/journey.contract.test.d.ts.map +1 -0
  120. package/dist/types/core/identity/journey.d.ts +28 -0
  121. package/dist/types/core/identity/journey.d.ts.map +1 -0
  122. package/dist/types/core/identity/journey.test.d.ts +2 -0
  123. package/dist/types/core/identity/journey.test.d.ts.map +1 -0
  124. package/dist/types/core/identity/journey.testStubs.d.ts +5 -0
  125. package/dist/types/core/identity/journey.testStubs.d.ts.map +1 -0
  126. package/dist/types/core/identity/leadDataCache.d.ts +27 -0
  127. package/dist/types/core/identity/leadDataCache.d.ts.map +1 -0
  128. package/dist/types/core/identity/leadDataCache.test.d.ts +2 -0
  129. package/dist/types/core/identity/leadDataCache.test.d.ts.map +1 -0
  130. package/dist/types/enrichment/attachEnrichment.d.ts +35 -0
  131. package/dist/types/enrichment/attachEnrichment.d.ts.map +1 -0
  132. package/dist/types/enrichment/attachEnrichment.test.d.ts +2 -0
  133. package/dist/types/enrichment/attachEnrichment.test.d.ts.map +1 -0
  134. package/dist/types/index.d.ts +28 -0
  135. package/dist/types/index.d.ts.map +1 -0
  136. package/dist/types/react/index.d.ts +2 -0
  137. package/dist/types/react/index.d.ts.map +1 -0
  138. package/dist/types/react/ssr.test.d.ts +2 -0
  139. package/dist/types/react/ssr.test.d.ts.map +1 -0
  140. package/dist/types/react/useSurfaceForm.d.ts +25 -0
  141. package/dist/types/react/useSurfaceForm.d.ts.map +1 -0
  142. package/dist/types/react/useSurfaceForm.test.d.ts +2 -0
  143. package/dist/types/react/useSurfaceForm.test.d.ts.map +1 -0
  144. package/dist/types/surfaceForms.d.ts +120 -0
  145. package/dist/types/surfaceForms.d.ts.map +1 -0
  146. package/dist/types/surfaceForms.test.d.ts +2 -0
  147. package/dist/types/surfaceForms.test.d.ts.map +1 -0
  148. package/dist/types/tracking/attachTracking.d.ts +35 -0
  149. package/dist/types/tracking/attachTracking.d.ts.map +1 -0
  150. package/dist/types/tracking/attachTracking.test.d.ts +2 -0
  151. package/dist/types/tracking/attachTracking.test.d.ts.map +1 -0
  152. package/dist/types/tracking/conversionRules.contract.test.d.ts +2 -0
  153. package/dist/types/tracking/conversionRules.contract.test.d.ts.map +1 -0
  154. package/dist/types/tracking/conversionRules.d.ts +87 -0
  155. package/dist/types/tracking/conversionRules.d.ts.map +1 -0
  156. package/dist/types/tracking/conversionRules.test.d.ts +2 -0
  157. package/dist/types/tracking/conversionRules.test.d.ts.map +1 -0
  158. package/dist/types/tracking/vendors.d.ts +46 -0
  159. package/dist/types/tracking/vendors.d.ts.map +1 -0
  160. package/dist/types/tracking/vendors.test.d.ts +2 -0
  161. package/dist/types/tracking/vendors.test.d.ts.map +1 -0
  162. package/dist/types/validation/attachEmailValidation.d.ts +8 -0
  163. package/dist/types/validation/attachEmailValidation.d.ts.map +1 -0
  164. package/dist/types/validation/attachEmailValidation.test.d.ts +2 -0
  165. package/dist/types/validation/attachEmailValidation.test.d.ts.map +1 -0
  166. package/docs/api.md +310 -0
  167. package/docs/reference/binding.md +116 -0
  168. package/docs/reference/clients.md +212 -0
  169. package/docs/reference/engine.md +193 -0
  170. package/docs/reference/events.md +93 -0
  171. package/docs/reference/identity.md +116 -0
  172. package/llms.txt +317 -0
  173. package/package.json +25 -0
  174. package/skills/surface-forms-sdk/SKILL.md +153 -0
  175. package/skills/surface-forms-sdk/debugging.md +64 -0
  176. package/skills/surface-forms-sdk/editing.md +67 -0
  177. package/skills/surface-forms-sdk/patterns.md +222 -0
@@ -0,0 +1,44 @@
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
+ };
44
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/index.ts", "../../src/react/useSurfaceForm.ts"],
4
+ "sourcesContent": ["export { useSurfaceForm, type UseSurfaceFormResult } from \"./useSurfaceForm\";\n", "import { useSyncExternalStore } from \"react\";\nimport type { FormEngine, FormEngineState } from \"../core/engine/formEngine\";\n\n/**\n * React adapter (forms-sdk-plan.md \u00A72.9): a thin `useSyncExternalStore`\n * subscription over the headless engine's store contract. The host renders\n * the current step from `state` with controlled inputs; every action is the\n * engine's own method, so engine semantics are identical to the `bind/` mode\n * by construction \u2014 only who applies visibility differs.\n *\n * Server snapshots reuse `engine.state()`: the engine is SSR-safe to create\n * (no DOM access until interaction), so hydration sees the initial step.\n */\nexport type UseSurfaceFormResult = {\n state: FormEngineState;\n setAnswer: FormEngine[\"setAnswer\"];\n next: FormEngine[\"next\"];\n back: FormEngine[\"back\"];\n goToStep: FormEngine[\"goToStep\"];\n submit: FormEngine[\"submit\"];\n disqualify: FormEngine[\"disqualify\"];\n savePartial: FormEngine[\"savePartial\"];\n markViewed: FormEngine[\"markViewed\"];\n on: FormEngine[\"on\"];\n};\n\nexport const useSurfaceForm = (engine: FormEngine): UseSurfaceFormResult => {\n const state = useSyncExternalStore(engine.subscribe, engine.state, engine.state);\n return {\n state,\n setAnswer: engine.setAnswer,\n next: engine.next,\n back: engine.back,\n goToStep: engine.goToStep,\n submit: engine.submit,\n disqualify: engine.disqualify,\n savePartial: engine.savePartial,\n markViewed: engine.markViewed,\n on: engine.on,\n };\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAqC;AA0B9B,IAAM,iBAAiB,CAAC,WAA6C;AAC1E,QAAM,YAAQ,mCAAqB,OAAO,WAAW,OAAO,OAAO,OAAO,KAAK;AAC/E,SAAO;AAAA,IACL;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,IAAI,OAAO;AAAA,EACb;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
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
+ };
21
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/useSurfaceForm.ts"],
4
+ "sourcesContent": ["import { useSyncExternalStore } from \"react\";\nimport type { FormEngine, FormEngineState } from \"../core/engine/formEngine\";\n\n/**\n * React adapter (forms-sdk-plan.md \u00A72.9): a thin `useSyncExternalStore`\n * subscription over the headless engine's store contract. The host renders\n * the current step from `state` with controlled inputs; every action is the\n * engine's own method, so engine semantics are identical to the `bind/` mode\n * by construction \u2014 only who applies visibility differs.\n *\n * Server snapshots reuse `engine.state()`: the engine is SSR-safe to create\n * (no DOM access until interaction), so hydration sees the initial step.\n */\nexport type UseSurfaceFormResult = {\n state: FormEngineState;\n setAnswer: FormEngine[\"setAnswer\"];\n next: FormEngine[\"next\"];\n back: FormEngine[\"back\"];\n goToStep: FormEngine[\"goToStep\"];\n submit: FormEngine[\"submit\"];\n disqualify: FormEngine[\"disqualify\"];\n savePartial: FormEngine[\"savePartial\"];\n markViewed: FormEngine[\"markViewed\"];\n on: FormEngine[\"on\"];\n};\n\nexport const useSurfaceForm = (engine: FormEngine): UseSurfaceFormResult => {\n const state = useSyncExternalStore(engine.subscribe, engine.state, engine.state);\n return {\n state,\n setAnswer: engine.setAnswer,\n next: engine.next,\n back: engine.back,\n goToStep: engine.goToStep,\n submit: engine.submit,\n disqualify: engine.disqualify,\n savePartial: engine.savePartial,\n markViewed: engine.markViewed,\n on: engine.on,\n };\n};\n"],
5
+ "mappings": ";AAAA,SAAS,4BAA4B;AA0B9B,IAAM,iBAAiB,CAAC,WAA6C;AAC1E,QAAM,QAAQ,qBAAqB,OAAO,WAAW,OAAO,OAAO,OAAO,KAAK;AAC/E,SAAO;AAAA,IACL;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,IAAI,OAAO;AAAA,EACb;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
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