@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.
- package/dist/index.cjs +2 -3
- package/dist/index.mjs +2 -3
- package/dist/react/index.cjs +0 -1
- package/dist/react/index.mjs +0 -1
- package/dist/surface-forms-sdk.min.js +0 -1
- package/dist/types/bind/bindForm.d.ts +0 -36
- package/dist/types/bind/bindForm.test.d.ts +0 -1
- package/dist/types/bind/bookingWidget.d.ts +0 -11
- package/dist/types/bind/bookingWidget.test.d.ts +0 -1
- package/dist/types/core/client/emailValidation.d.ts +0 -4
- package/dist/types/core/client/emailValidation.test.d.ts +0 -1
- package/dist/types/core/client/responses.d.ts +0 -15
- package/dist/types/core/client/responses.test.d.ts +0 -1
- package/dist/types/core/client/runtimeConfig.contract.test.d.ts +0 -1
- package/dist/types/core/client/runtimeConfig.d.ts +0 -32
- package/dist/types/core/client/runtimeConfig.test.d.ts +0 -1
- package/dist/types/core/client/scheduler.contract.test.d.ts +0 -1
- package/dist/types/core/client/scheduler.d.ts +0 -27
- package/dist/types/core/client/scheduler.test.d.ts +0 -1
- package/dist/types/core/client/transport.d.ts +0 -28
- package/dist/types/core/client/transport.test.d.ts +0 -1
- package/dist/types/core/engine/answerAudit.d.ts +0 -12
- package/dist/types/core/engine/answerAudit.test.d.ts +0 -1
- package/dist/types/core/engine/answerStates.contract.test.d.ts +0 -1
- package/dist/types/core/engine/answerStates.d.ts +0 -17
- package/dist/types/core/engine/formEngine.d.ts +0 -53
- package/dist/types/core/engine/formEngine.test.d.ts +0 -1
- package/dist/types/core/engine/redirect.d.ts +0 -23
- package/dist/types/core/engine/redirect.test.d.ts +0 -1
- package/dist/types/core/engine/responsePayload.contract.test.d.ts +0 -1
- package/dist/types/core/engine/responsePayload.d.ts +0 -28
- package/dist/types/core/engine/responsePayload.test.d.ts +0 -1
- package/dist/types/core/engine/urlData.contract.test.d.ts +0 -1
- package/dist/types/core/engine/urlData.d.ts +0 -17
- package/dist/types/core/engine/urlData.test.d.ts +0 -1
- package/dist/types/core/engine/urlPrefill.d.ts +0 -9
- package/dist/types/core/engine/urlPrefill.test.d.ts +0 -1
- package/dist/types/core/events/dropoffDetection.d.ts +0 -14
- package/dist/types/core/events/dropoffDetection.test.d.ts +0 -1
- package/dist/types/core/events/emitter.d.ts +0 -17
- package/dist/types/core/events/emitter.test.d.ts +0 -1
- package/dist/types/core/events/formJourneyTracker.contract.test.d.ts +0 -1
- package/dist/types/core/events/formJourneyTracker.d.ts +0 -19
- package/dist/types/core/events/formJourneyTracker.test.d.ts +0 -1
- package/dist/types/core/events/pushEvents.contract.test.d.ts +0 -1
- package/dist/types/core/events/pushEvents.d.ts +0 -16
- package/dist/types/core/events/pushEvents.test.d.ts +0 -1
- package/dist/types/core/events/startedDetection.d.ts +0 -10
- package/dist/types/core/events/startedDetection.test.d.ts +0 -1
- package/dist/types/core/events/viewDetection.d.ts +0 -14
- package/dist/types/core/events/viewDetection.test.d.ts +0 -1
- package/dist/types/core/identity/browserFingerprint.d.ts +0 -19
- package/dist/types/core/identity/browserFingerprint.test.d.ts +0 -1
- package/dist/types/core/identity/ensureIdentified.d.ts +0 -16
- package/dist/types/core/identity/ensureIdentified.test.d.ts +0 -1
- package/dist/types/core/identity/identify.contract.test.d.ts +0 -1
- package/dist/types/core/identity/identify.d.ts +0 -15
- package/dist/types/core/identity/identify.test.d.ts +0 -1
- package/dist/types/core/identity/journey.contract.test.d.ts +0 -1
- package/dist/types/core/identity/journey.d.ts +0 -16
- package/dist/types/core/identity/journey.test.d.ts +0 -1
- package/dist/types/core/identity/journey.testStubs.d.ts +0 -2
- package/dist/types/core/identity/leadDataCache.d.ts +0 -16
- package/dist/types/core/identity/leadDataCache.test.d.ts +0 -1
- package/dist/types/enrichment/attachEnrichment.d.ts +0 -21
- package/dist/types/enrichment/attachEnrichment.test.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/react/index.d.ts +0 -1
- package/dist/types/react/ssr.test.d.ts +0 -1
- package/dist/types/react/useSurfaceForm.d.ts +0 -11
- package/dist/types/react/useSurfaceForm.test.d.ts +0 -1
- package/dist/types/surfaceForms.d.ts +0 -72
- package/dist/types/surfaceForms.test.d.ts +0 -1
- package/dist/types/tracking/attachTracking.d.ts +0 -22
- package/dist/types/tracking/attachTracking.test.d.ts +0 -1
- package/dist/types/tracking/conversionRules.contract.test.d.ts +0 -1
- package/dist/types/tracking/conversionRules.d.ts +0 -12
- package/dist/types/tracking/conversionRules.test.d.ts +0 -1
- package/dist/types/tracking/vendors.d.ts +0 -22
- package/dist/types/tracking/vendors.test.d.ts +0 -1
- package/dist/types/validation/attachEmailValidation.d.ts +0 -1
- package/dist/types/validation/attachEmailValidation.test.d.ts +0 -1
- package/docs/reference/identity.md +2 -3
- package/package.json +1 -1
- package/dist/index.cjs.map +0 -7
- package/dist/index.mjs.map +0 -7
- package/dist/react/index.cjs.map +0 -7
- package/dist/react/index.mjs.map +0 -7
- package/dist/surface-forms-sdk.min.js.map +0 -7
- package/dist/types/bind/bindForm.d.ts.map +0 -1
- package/dist/types/bind/bindForm.test.d.ts.map +0 -1
- package/dist/types/bind/bookingWidget.d.ts.map +0 -1
- package/dist/types/bind/bookingWidget.test.d.ts.map +0 -1
- package/dist/types/core/client/emailValidation.d.ts.map +0 -1
- package/dist/types/core/client/emailValidation.test.d.ts.map +0 -1
- package/dist/types/core/client/responses.d.ts.map +0 -1
- package/dist/types/core/client/responses.test.d.ts.map +0 -1
- package/dist/types/core/client/runtimeConfig.contract.test.d.ts.map +0 -1
- package/dist/types/core/client/runtimeConfig.d.ts.map +0 -1
- package/dist/types/core/client/runtimeConfig.test.d.ts.map +0 -1
- package/dist/types/core/client/scheduler.contract.test.d.ts.map +0 -1
- package/dist/types/core/client/scheduler.d.ts.map +0 -1
- package/dist/types/core/client/scheduler.test.d.ts.map +0 -1
- package/dist/types/core/client/transport.d.ts.map +0 -1
- package/dist/types/core/client/transport.test.d.ts.map +0 -1
- package/dist/types/core/engine/answerAudit.d.ts.map +0 -1
- package/dist/types/core/engine/answerAudit.test.d.ts.map +0 -1
- package/dist/types/core/engine/answerStates.contract.test.d.ts.map +0 -1
- package/dist/types/core/engine/answerStates.d.ts.map +0 -1
- package/dist/types/core/engine/formEngine.d.ts.map +0 -1
- package/dist/types/core/engine/formEngine.test.d.ts.map +0 -1
- package/dist/types/core/engine/redirect.d.ts.map +0 -1
- package/dist/types/core/engine/redirect.test.d.ts.map +0 -1
- package/dist/types/core/engine/responsePayload.contract.test.d.ts.map +0 -1
- package/dist/types/core/engine/responsePayload.d.ts.map +0 -1
- package/dist/types/core/engine/responsePayload.test.d.ts.map +0 -1
- package/dist/types/core/engine/urlData.contract.test.d.ts.map +0 -1
- package/dist/types/core/engine/urlData.d.ts.map +0 -1
- package/dist/types/core/engine/urlData.test.d.ts.map +0 -1
- package/dist/types/core/engine/urlPrefill.d.ts.map +0 -1
- package/dist/types/core/engine/urlPrefill.test.d.ts.map +0 -1
- package/dist/types/core/events/dropoffDetection.d.ts.map +0 -1
- package/dist/types/core/events/dropoffDetection.test.d.ts.map +0 -1
- package/dist/types/core/events/emitter.d.ts.map +0 -1
- package/dist/types/core/events/emitter.test.d.ts.map +0 -1
- package/dist/types/core/events/formJourneyTracker.contract.test.d.ts.map +0 -1
- package/dist/types/core/events/formJourneyTracker.d.ts.map +0 -1
- package/dist/types/core/events/formJourneyTracker.test.d.ts.map +0 -1
- package/dist/types/core/events/pushEvents.contract.test.d.ts.map +0 -1
- package/dist/types/core/events/pushEvents.d.ts.map +0 -1
- package/dist/types/core/events/pushEvents.test.d.ts.map +0 -1
- package/dist/types/core/events/startedDetection.d.ts.map +0 -1
- package/dist/types/core/events/startedDetection.test.d.ts.map +0 -1
- package/dist/types/core/events/viewDetection.d.ts.map +0 -1
- package/dist/types/core/events/viewDetection.test.d.ts.map +0 -1
- package/dist/types/core/identity/browserFingerprint.d.ts.map +0 -1
- package/dist/types/core/identity/browserFingerprint.test.d.ts.map +0 -1
- package/dist/types/core/identity/ensureIdentified.d.ts.map +0 -1
- package/dist/types/core/identity/ensureIdentified.test.d.ts.map +0 -1
- package/dist/types/core/identity/identify.contract.test.d.ts.map +0 -1
- package/dist/types/core/identity/identify.d.ts.map +0 -1
- package/dist/types/core/identity/identify.test.d.ts.map +0 -1
- package/dist/types/core/identity/journey.contract.test.d.ts.map +0 -1
- package/dist/types/core/identity/journey.d.ts.map +0 -1
- package/dist/types/core/identity/journey.test.d.ts.map +0 -1
- package/dist/types/core/identity/journey.testStubs.d.ts.map +0 -1
- package/dist/types/core/identity/leadDataCache.d.ts.map +0 -1
- package/dist/types/core/identity/leadDataCache.test.d.ts.map +0 -1
- package/dist/types/enrichment/attachEnrichment.d.ts.map +0 -1
- package/dist/types/enrichment/attachEnrichment.test.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/react/index.d.ts.map +0 -1
- package/dist/types/react/ssr.test.d.ts.map +0 -1
- package/dist/types/react/useSurfaceForm.d.ts.map +0 -1
- package/dist/types/react/useSurfaceForm.test.d.ts.map +0 -1
- package/dist/types/surfaceForms.d.ts.map +0 -1
- package/dist/types/surfaceForms.test.d.ts.map +0 -1
- package/dist/types/tracking/attachTracking.d.ts.map +0 -1
- package/dist/types/tracking/attachTracking.test.d.ts.map +0 -1
- package/dist/types/tracking/conversionRules.contract.test.d.ts.map +0 -1
- package/dist/types/tracking/conversionRules.d.ts.map +0 -1
- package/dist/types/tracking/conversionRules.test.d.ts.map +0 -1
- package/dist/types/tracking/vendors.d.ts.map +0 -1
- package/dist/types/tracking/vendors.test.d.ts.map +0 -1
- package/dist/types/validation/attachEmailValidation.d.ts.map +0 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
package/dist/react/index.cjs
CHANGED
package/dist/react/index.mjs
CHANGED
|
@@ -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&>(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
|
|
@@ -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,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
|
|
@@ -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,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,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,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,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,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
|