@reform-society/agera-survey 0.1.0

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/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # Agera Survey Runtime
2
+
3
+ A lightweight, attribute-driven runtime for multi-step surveys on Webflow pages.
4
+
5
+ > **Note:** This package is published to npm for internal distribution only. It is not intended for public use and no support is provided.
6
+
7
+ ## Overview
8
+
9
+ - Attribute-based markup with no framework required
10
+ - Built-in transitions and accessibility defaults
11
+ - Persistent session state via `localStorage`
12
+ - Lazy-loaded phone validation for optimal bundle size
13
+ - Basin integration for form submissions
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ pnpm add @reform-society/agera-survey
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ The script auto-initializes on pages containing `[as-survey]`:
24
+
25
+ ```html
26
+ <script src="path/to/agera-survey.js"></script>
27
+
28
+ <div as-survey>
29
+ <section as-step="welcome">
30
+ <h2>Welcome</h2>
31
+ <button as-next>Start</button>
32
+ </section>
33
+
34
+ <section as-step="info">
35
+ <input name="email" as-validate="required|email" />
36
+ <button as-back>Back</button>
37
+ <button as-next>Next</button>
38
+ </section>
39
+
40
+ <section as-step="done">
41
+ <p>Thank you!</p>
42
+ </section>
43
+ </div>
44
+ ```
45
+
46
+ ## API
47
+
48
+ Available at `window.agera.survey`:
49
+
50
+ | Method | Description |
51
+ |--------|-------------|
52
+ | `goToStep(id)` | Navigate to a step |
53
+ | `getCurrentStep()` | Get current step ID |
54
+ | `getAnswers()` | Get all answers |
55
+ | `setAnswer(key, value)` | Set an answer programmatically |
56
+ | `validateCurrentStep()` | Validate current step |
57
+ | `reset()` | Clear session and reload |
58
+ | `dev` | Enable/disable debug mode |
59
+
60
+ ## Documentation
61
+
62
+ See [docs/](./docs/) for detailed documentation:
63
+
64
+ - [Attributes Reference](./docs/attributes.md)
65
+ - [Transitions](./docs/transitions.md)
66
+ - [Validation](./docs/validation.md)
67
+ - [Conditional Logic](./docs/conditional-logic.md)
68
+ - [Quiz Mode](./docs/quiz-mode.md)
69
+ - [Basin Integration](./docs/basin-integration.md)
70
+
71
+ ## Development
72
+
73
+ ```bash
74
+ pnpm dev # Watch mode
75
+ pnpm build # Production build
76
+ pnpm check # Lint + typecheck
77
+ ```
78
+
79
+ ## License
80
+
81
+ MIT - Reform Society
@@ -0,0 +1,19 @@
1
+ "use strict";var AgeraSurvey=(()=>{var Ut=Object.create;var K=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var _t=Object.getOwnPropertyNames;var Wt=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Gt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Yt=(e,t)=>{for(var r in t)K(e,r,{get:t[r],enumerable:!0})},Ne=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _t(t))!Qt.call(e,i)&&i!==r&&K(e,i,{get:()=>t[i],enumerable:!(n=Bt(t,i))||n.enumerable});return e};var x=(e,t,r)=>(r=e!=null?Ut(Wt(e)):{},Ne(t||!e||!e.__esModule?K(r,"default",{value:e,enumerable:!0}):r,e)),Jt=e=>Ne(K({},"__esModule",{value:!0}),e);var L=Gt((qe,X)=>{"use strict";(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof X=="object"&&X.exports?X.exports=t():e.log=t()})(qe,function(){"use strict";var e=function(){},t="undefined",r=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"],i={},o=null;function s(p,v){var d=p[v];if(typeof d.bind=="function")return d.bind(p);try{return Function.prototype.bind.call(d,p)}catch{return function(){return Function.prototype.apply.apply(d,[p,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function u(p){return p==="debug"&&(p="log"),typeof console===t?!1:p==="trace"&&r?a:console[p]!==void 0?s(console,p):console.log!==void 0?s(console,"log"):e}function l(){for(var p=this.getLevel(),v=0;v<n.length;v++){var d=n[v];this[d]=v<p?e:this.methodFactory(d,p,this.name)}if(this.log=this.debug,typeof console===t&&p<this.levels.SILENT)return"No console available for logging"}function f(p){return function(){typeof console!==t&&(l.call(this),this[p].apply(this,arguments))}}function m(p,v,d){return u(p)||f.apply(this,arguments)}function c(p,v){var d=this,$,fe,V,P="loglevel";typeof p=="string"?P+=":"+p:typeof p=="symbol"&&(P=void 0);function zt(b){var A=(n[b]||"silent").toUpperCase();if(!(typeof window===t||!P)){try{window.localStorage[P]=A;return}catch{}try{window.document.cookie=encodeURIComponent(P)+"="+A+";"}catch{}}}function Re(){var b;if(!(typeof window===t||!P)){try{b=window.localStorage[P]}catch{}if(typeof b===t)try{var A=window.document.cookie,J=encodeURIComponent(P),De=A.indexOf(J+"=");De!==-1&&(b=/^([^;]+)/.exec(A.slice(De+J.length+1))[1])}catch{}return d.levels[b]===void 0&&(b=void 0),b}}function Vt(){if(!(typeof window===t||!P)){try{window.localStorage.removeItem(P)}catch{}try{window.document.cookie=encodeURIComponent(P)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function _(b){var A=b;if(typeof A=="string"&&d.levels[A.toUpperCase()]!==void 0&&(A=d.levels[A.toUpperCase()]),typeof A=="number"&&A>=0&&A<=d.levels.SILENT)return A;throw new TypeError("log.setLevel() called with invalid level: "+b)}d.name=p,d.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},d.methodFactory=v||m,d.getLevel=function(){return V??fe??$},d.setLevel=function(b,A){return V=_(b),A!==!1&&zt(V),l.call(d)},d.setDefaultLevel=function(b){fe=_(b),Re()||d.setLevel(b,!1)},d.resetLevel=function(){V=null,Vt(),l.call(d)},d.enableAll=function(b){d.setLevel(d.levels.TRACE,b)},d.disableAll=function(b){d.setLevel(d.levels.SILENT,b)},d.rebuild=function(){if(o!==d&&($=_(o.getLevel())),l.call(d),o===d)for(var b in i)i[b].rebuild()},$=_(o?o.getLevel():"WARN");var ke=Re();ke!=null&&(V=_(ke)),l.call(d)}o=new c,o.getLogger=function(v){if(typeof v!="symbol"&&typeof v!="string"||v==="")throw new TypeError("You must supply a name when creating a logger.");var d=i[v];return d||(d=i[v]=new c(v,o.methodFactory)),d};var g=typeof window!==t?window.log:void 0;return o.noConflict=function(){return typeof window!==t&&window.log===o&&(window.log=g),o},o.getLoggers=function(){return i},o.default=o,o})});var Gn={};Yt(Gn,{init:()=>de});var N=x(L(),1);var Fe={name:"@reform-society/agera-survey",version:"0.1.0",description:"Multi-step survey runtime for Webflow",type:"module",main:"dist/index.global.js",types:"dist/index.d.ts",files:["dist/index.global.js"],repository:{type:"git",url:"git+https://github.com/reform-society/agera-survey-app.git",directory:"packages/agera-survey"},keywords:["webflow","survey","form","multi-step"],author:"Reform Society",license:"MIT",publishConfig:{access:"public",provenance:!0},scripts:{dev:"tsup src/index.ts --format iife --global-name AgeraSurvey --watch --out-dir dist --sourcemap",build:"tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify","build:analyze":"tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify --metafile",lint:"eslint src",typecheck:"tsc --noEmit",check:"pnpm lint; pnpm typecheck"},devDependencies:{"@agera/config":"workspace:*",loglevel:"^1.9.2",nanostores:"^0.11.3","libphonenumber-js":"1.12.25",tsup:"^8.3.5",typescript:"^5.7.2"}};var Oe=Fe.version;var y=x(L(),1);var I=[],q=0,Z=4,Xt=0,ee=e=>{let t=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},lc:0,listen(n){return r.lc=t.push(n),()=>{for(let o=q+Z;o<I.length;)I[o]===n?I.splice(o,Z):o+=Z;let i=t.indexOf(n);~i&&(t.splice(i,1),--r.lc||r.off())}},notify(n,i){Xt++;let o=!I.length;for(let s of t)I.push(s,r.value,n,i);if(o){for(q=0;q<I.length;q+=Z)I[q](I[q+1],I[q+2],I[q+3]);I.length=0}},off(){},set(n){let i=r.value;i!==n&&(r.value=n,r.notify(i))},subscribe(n){let i=r.listen(n);return n(r.value),i},value:e};return r};var h=ee({id:typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,answers:{},startedAt:new Date}),w=ee({current:"",path:[]});function $e(){if(typeof window>"u")return;let e=window.localStorage.getItem("as:session");if(e)try{let t=JSON.parse(e);h.set({...t,startedAt:new Date(t.startedAt)})}catch{window.localStorage.removeItem("as:session")}h.subscribe(t=>{try{window.localStorage.setItem("as:session",JSON.stringify(t))}catch{}})}var M=x(L(),1);var pe=x(L(),1),Zt="https://cdn.jsdelivr.net/npm/libphonenumber-js@1.12.25/max/index.js",en="https://unpkg.com/libphonenumber-js@1.12.25/max/index.js",te=null,W=null;async function me(){return te||W||(W=(async()=>{let e=[Zt,en],t=null;for(let n of e)try{let o=await import(n),s=o.parsePhoneNumberFromString||o.default?.parsePhoneNumberFromString||o.default,a=o.AsYouType||o.default?.AsYouType,u=o.getCountryCallingCode||o.default?.getCountryCallingCode;if(!s||typeof s!="function")throw new Error("parsePhoneNumberFromString not found in module");if(!a||typeof a!="function")throw new Error("AsYouType not found in module");if(!u||typeof u!="function")throw new Error("getCountryCallingCode not found in module");return te={parsePhoneNumberFromString:s,AsYouType:a,getCountryCallingCode:u},te}catch(i){t=i instanceof Error?i:new Error(String(i)),pe.default.warn(`[phone-lib] Failed to load from ${n}, trying fallback...`,t)}let r=new Error(`Failed to load libphonenumber-js from all CDN URLs. Last error: ${t?.message}`);throw pe.default.error("[phone-lib] Failed to load libphonenumber-js from all CDNs:",r),W=null,r})(),W)}async function ne(){try{return(await me())?.parsePhoneNumberFromString??null}catch{return null}}async function ze(){try{return(await me())?.AsYouType??null}catch{return null}}async function Ve(){try{return(await me())?.getCountryCallingCode??null}catch{return null}}var ge={"sv-SE":{required:"Detta f\xE4lt \xE4r obligatoriskt",email:"V\xE4nligen ange en giltig e-postadress",phone:"V\xE4nligen ange ett giltigt telefonnummer",pattern:"Ogiltigt format",min:"F\xF6r kort",max:"F\xF6r l\xE5ngt"},"nb-NO":{required:"Dette feltet er obligatorisk",email:"Vennligst oppgi en gyldig e-postadresse",phone:"Vennligst oppgi et gyldig telefonnummer",pattern:"Ugyldig format",min:"For kort",max:"For lang"},no:{required:"Dette feltet er obligatorisk",email:"Vennligst oppgi en gyldig e-postadresse",phone:"Vennligst oppgi et gyldig telefonnummer",pattern:"Ugyldig format",min:"For kort",max:"For lang"},"da-DK":{required:"Dette felt er p\xE5kr\xE6vet",email:"Indtast venligst en gyldig e-mailadresse",phone:"Indtast venligst et gyldigt telefonnummer",pattern:"Ugyldigt format",min:"For kort",max:"For lang"},"en-US":{required:"This field is required",email:"Please enter a valid email",phone:"Please enter a valid phone number",pattern:"Invalid format",min:"Too short",max:"Too long"},en:{required:"This field is required",email:"Please enter a valid email",phone:"Please enter a valid phone number",pattern:"Invalid format",min:"Too short",max:"Too long"},"de-DE":{required:"Dieses Feld ist erforderlich",email:"Bitte geben Sie eine g\xFCltige E-Mail-Adresse ein",phone:"Bitte geben Sie eine g\xFCltige Telefonnummer ein",pattern:"Ung\xFCltiges Format",min:"Zu kurz",max:"Zu lang"},"es-ES":{required:"Este campo es obligatorio",email:"Por favor, introduce un correo electr\xF3nico v\xE1lido",phone:"Por favor, introduce un n\xFAmero de tel\xE9fono v\xE1lido",pattern:"Formato no v\xE1lido",min:"Demasiado corto",max:"Demasiado largo"},"fi-FI":{required:"T\xE4m\xE4 kentt\xE4 on pakollinen",email:"Anna kelvollinen s\xE4hk\xF6postiosoite",phone:"Anna kelvollinen puhelinnumero",pattern:"Virheellinen muoto",min:"Liian lyhyt",max:"Liian pitk\xE4"},"fr-FR":{required:"Ce champ est obligatoire",email:"Veuillez saisir une adresse e-mail valide",phone:"Veuillez saisir un num\xE9ro de t\xE9l\xE9phone valide",pattern:"Format invalide",min:"Trop court",max:"Trop long"}};function je(){let e=ge.en;if(typeof document>"u")return e;let t=document.documentElement.lang;if(!t)return e;let r=ge[t];if(r)return r;let n=t.split("-")[0];if(n){let i=ge[n];if(i)return i}return e}var T=x(L(),1);var tn=new Set(["__quiz__"]);function nn(e){let t={};return e.querySelectorAll("input, textarea, select").forEach(n=>{if(!n.name&&!n.hasAttribute("as-element-id"))return;let i=[];n.name&&i.push(n.name);let o=n.getAttribute("as-element-id");o&&i.push(o);let s=n.value;if(n instanceof HTMLInputElement&&n.type==="checkbox")s=!!n.checked;else if(n instanceof HTMLInputElement&&n.type==="radio"){if(!n.checked)return;s=n.value}i.forEach(a=>{t[a]=s})}),t}function ye(e){if(typeof document>"u"||!e)return;let t=h.get(),r=nn(e),n=rn(t.answers,r);on(t.answers,n)&&h.set({...t,answers:n})}function rn(e,t){let r={...t};for(let[n,i]of Object.entries(e))(!(n in r)||tn.has(n))&&(r[n]=i);return r}function on(e,t){let r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!0;for(let i of n)if(e[i]!==t[i])return!0;return!1}function Ue(){if(typeof document>"u")return{style:{}};let e=document.getElementById("as-aria-live");if(!e){e=document.createElement("div"),e.id="as-aria-live",e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true");let t=e;t.style.position="absolute",t.style.left="-10000px",t.style.width="1px",t.style.height="1px",t.style.overflow="hidden",document.body.appendChild(e)}return e}function Be(e,t){if(e.startsWith("env.")){let r=e.slice(4).split(".");if(r[0]==="utm"&&r[1])return new URLSearchParams(typeof window<"u"?window.location.search:"").get(`utm_${r[1]}`);if(r[0])return t[r[0]]}if(e.startsWith("quiz.")){let r=e.slice(5).split("."),n=t.__quiz__;if(!n)return;if(r[0]==="winner"){if(r.length===1)return n.winner;if(r[1]==="score")return n.winnerScore}return r[0]==="scores"&&r[1]?n.scores?.[r[1]]:void 0}return t[e]}function H(e,t){switch(e){case"slide-left-right":return t==="in"?"slide-in-left":"slide-out-right";case"slide-right-left":return t==="in"?"slide-in-right":"slide-out-left";case"slide-up-down":return t==="in"?"slide-in-up":"slide-out-down";case"slide-down-up":return t==="in"?"slide-in-down":"slide-out-up";case"scale":return t==="in"?"scale-in":"scale-out";case"fade":return"fade";default:return"fade"}}function R(e,t,r){let n={initial:{},target:{}};switch(e){case"fade":r==="in"?(n.initial={opacity:"0"},n.target={opacity:"1"}):(n.initial={opacity:"1"},n.target={opacity:"0"});break;case"slide-in-left":n.initial={transform:`translateX(-${t})`,opacity:"0"},n.target={transform:"translateX(0)",opacity:"1"};break;case"slide-in-right":n.initial={transform:`translateX(${t})`,opacity:"0"},n.target={transform:"translateX(0)",opacity:"1"};break;case"slide-in-up":n.initial={transform:`translateY(-${t})`,opacity:"0"},n.target={transform:"translateY(0)",opacity:"1"};break;case"slide-in-down":n.initial={transform:`translateY(${t})`,opacity:"0"},n.target={transform:"translateY(0)",opacity:"1"};break;case"slide-out-left":n.initial={transform:"translateX(0)",opacity:"1"},n.target={transform:`translateX(-${t})`,opacity:"0"};break;case"slide-out-right":n.initial={transform:"translateX(0)",opacity:"1"},n.target={transform:`translateX(${t})`,opacity:"0"};break;case"slide-out-up":n.initial={transform:"translateY(0)",opacity:"1"},n.target={transform:`translateY(-${t})`,opacity:"0"};break;case"slide-out-down":n.initial={transform:"translateY(0)",opacity:"1"},n.target={transform:`translateY(${t})`,opacity:"0"};break;case"scale-in":n.initial={transform:"scale(0.98)",opacity:"0"},n.target={transform:"scale(1)",opacity:"1"};break;case"scale-out":n.initial={transform:"scale(1)",opacity:"1"},n.target={transform:"scale(0.98)",opacity:"0"};break}return n}function Qe(e,t={}){let{defaultDuration:r="300ms",defaultDistance:n="24px",onComplete:i,displayValue:o=""}=t,s=window.matchMedia("(prefers-reduced-motion: reduce)").matches;if(e.style.display=o,e.removeAttribute("hidden"),e.removeAttribute("aria-hidden"),s){e.style.opacity="1",i?.();return}let a=e.getAttribute("as-transition-in")||e.getAttribute("as-transition")||"fade",u=H(a,"in"),l=e.getAttribute("as-transition-distance")||n,f=e.getAttribute("as-transition-speed-in")||e.getAttribute("as-transition-speed"),m=R(u,l,"in"),c=window.getComputedStyle(e),g=F(c.transitionDuration,c.transitionDelay)>0,p=!1,v=c.transitionProperty||"";/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(v)||(e.style.transitionProperty="opacity, transform",p=!0),!g&&!f&&(e.style.transitionDuration=r,p||(e.style.transitionProperty="opacity, transform",p=!0)),f&&D(e,f),Object.assign(e.style,m.initial),e.offsetHeight,requestAnimationFrame(()=>{Object.assign(e.style,m.target),k(e,()=>{!g&&!f&&(e.style.transitionDuration=""),f&&(e.style.transitionDuration=""),p&&(e.style.transitionProperty=""),i?.()})})}function Ge(e,t={}){let{defaultDuration:r="300ms",defaultDistance:n="24px",onComplete:i}=t;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches){e.style.display="none",e.setAttribute("aria-hidden","true"),i?.();return}let s=e.getAttribute("as-transition-out")||e.getAttribute("as-transition")||"fade",a=H(s,"out"),u=e.getAttribute("as-transition-distance")||n,l=e.getAttribute("as-transition-speed-out")||e.getAttribute("as-transition-speed"),f=R(a,u,"out"),m=window.getComputedStyle(e),c=F(m.transitionDuration,m.transitionDelay)>0,g=!1,p=m.transitionProperty||"";/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(p)||(e.style.transitionProperty="opacity, transform",g=!0),!c&&!l&&(e.style.transitionDuration=r,g||(e.style.transitionProperty="opacity, transform",g=!0)),l&&D(e,l),Object.assign(e.style,f.target),k(e,()=>{e.style.display="none",e.setAttribute("aria-hidden","true"),j(e),!c&&!l&&(e.style.transitionDuration=""),l&&(e.style.transitionDuration=""),g&&(e.style.transitionProperty=""),i?.()})}function Ye(e,t,r){let n={containerDisplay:e.style.display,containerAlignItems:e.style.alignItems,containerJustifyItems:e.style.justifyItems,incGridArea:t.style.gridArea,incZIndex:t.style.zIndex,outGridArea:r.style.gridArea,outZIndex:r.style.zIndex},i=window.getComputedStyle(e).display;return i!=="grid"&&i!=="inline-grid"&&(e.style.display="grid"),t.style.gridArea="1 / 1 / 2 / 2",r.style.gridArea="1 / 1 / 2 / 2",t.style.zIndex="1",r.style.zIndex="2",()=>{e.style.display=n.containerDisplay,e.style.alignItems=n.containerAlignItems,e.style.justifyItems=n.containerJustifyItems,t.style.gridArea=n.incGridArea,t.style.zIndex=n.incZIndex,r.style.gridArea=n.outGridArea,r.style.zIndex=n.outZIndex}}function Je(e,t,r){if(e.style.display="",e.setAttribute("aria-hidden","false"),e.removeAttribute("inert"),t){e.style.opacity="1",r(e);return}let n=e.getAttribute("as-transition-in")||e.getAttribute("as-transition")||"fade",i=H(n,"in"),o=e.getAttribute("as-transition-distance")||"24px",s=e.getAttribute("as-transition-speed-in")||e.getAttribute("as-transition-speed"),a=R(i,o,"in"),u=window.getComputedStyle(e),l=F(u.transitionDuration,u.transitionDelay)>0,f=!1,m=!1,c=u.transitionProperty||"";/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(c)||(e.style.transitionProperty="opacity, transform",f=!0),!l&&!s&&(e.style.transitionDuration="300ms",f||(e.style.transitionProperty="opacity, transform",f=!0)),e.style.willChange!=="opacity, transform"&&(e.style.willChange="opacity, transform",m=!0),s&&D(e,s),Object.assign(e.style,a.initial),e.offsetHeight,requestAnimationFrame(()=>{Object.assign(e.style,a.target),k(e,()=>{r(e),!l&&!s&&(e.style.transitionDuration=""),s&&(e.style.transitionDuration=""),f&&(e.style.transitionProperty=""),m&&(e.style.willChange="")})})}function be(e,t){if(t){e.style.setProperty("display","none","important"),e.setAttribute("aria-hidden","true"),e.setAttribute("inert","");return}let r=e.getAttribute("as-transition-out")||e.getAttribute("as-transition")||"fade",n=H(r,"out"),i=e.getAttribute("as-transition-distance")||"24px",o=e.getAttribute("as-transition-speed-out")||e.getAttribute("as-transition-speed"),s=R(n,i,"out"),a=window.getComputedStyle(e),u=F(a.transitionDuration,a.transitionDelay)>0,l=!1,f=!1,m=a.transitionProperty||"";/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(m)||(e.style.transitionProperty="opacity, transform",l=!0),!u&&!o&&(e.style.transitionDuration="300ms",l||(e.style.transitionProperty="opacity, transform",l=!0)),e.style.willChange!=="opacity, transform"&&(e.style.willChange="opacity, transform",f=!0),o&&D(e,o),Object.assign(e.style,s.target),k(e,()=>{e.style.setProperty("display","none","important"),e.setAttribute("aria-hidden","true"),e.setAttribute("inert",""),j(e),!u&&!o&&(e.style.transitionDuration=""),o&&(e.style.transitionDuration=""),l&&(e.style.transitionProperty=""),f&&(e.style.willChange="")})}function k(e,t){let r=window.getComputedStyle(e),n=r.transitionDuration,i=r.transitionDelay,o=F(n,i);if(o===0){t();return}let s=!1,a=setTimeout(()=>{s||(s=!0,t())},o+50),u=l=>{l.target===e&&!s&&(s=!0,clearTimeout(a),e.removeEventListener("transitionend",u),e.removeEventListener("animationend",u),t())};e.addEventListener("transitionend",u),e.addEventListener("animationend",u)}function D(e,t){let n=window.getComputedStyle(e).transitionDuration;switch(t){case"fast":e.style.transitionDuration=_e(n,.7);break;case"normal":break;case"slow":e.style.transitionDuration=_e(n,1.5);break;default:e.style.transitionDuration=t;break}}function _e(e,t){return e.split(",").map(n=>n.trim()).map(n=>{let i=n.match(/^([\d.]+)(m?s)$/);if(!i||!i[1]||!i[2])return n;let o=parseFloat(i[1]),s=i[2];return`${o*t}${s}`}).join(", ")}function F(e,t){let r=e.split(",").map(o=>We(o.trim())),n=t.split(",").map(o=>We(o.trim())),i=0;for(let o=0;o<r.length;o++){let s=r[o]||0,a=n[o]||n[0]||0,u=s+a;u>i&&(i=u)}return i}function We(e){let t=e.match(/^([\d.]+)(m?s)$/);if(!t||!t[1]||!t[2])return 0;let r=parseFloat(t[1]);return t[2]==="ms"?r:r*1e3}function j(e){e.style.opacity="",e.style.translate="",e.style.scale="",e.style.transform=""}function tt(e){e&&(ye(e),an(e),he(),Ze(),sn(),h.subscribe(()=>{he(),Ze()}),T.default.debug("[conditions] Initialized"))}function re(e,t){try{let r=JSON.parse(e);return z(r,t)}catch(r){return T.default.error("[conditions] Invalid predicate JSON:",r),!1}}function z(e,t){if("all"in e)return e.all.every(n=>z(n,t));if("any"in e)return e.any.some(n=>z(n,t));if("not"in e)return!z(e.not,t);if("field"in e&&"op"in e){let{field:r,op:n,value:i}=e,o=Be(r,t);switch(n){case"eq":return o===i;case"neq":return o!==i;case"in":return Array.isArray(i)&&i.includes(o);case"nin":return Array.isArray(i)&&!i.includes(o);case"gt":return Number(o)>Number(i);case"gte":return Number(o)>=Number(i);case"lt":return Number(o)<Number(i);case"lte":return Number(o)<=Number(i);case"exists":return o!=null;case"truthy":return!!o;case"falsy":return!o;case"contains":return String(o).includes(String(i));case"starts_with":return String(o).startsWith(String(i));case"ends_with":return String(o).endsWith(String(i));default:return!1}}return!1}function he(){if(typeof document>"u")return;let e=h.get().answers;document.querySelectorAll("[as-show-if]").forEach(t=>{let r=t.getAttribute("as-show-if");if(!r)return;let n=re(r,e);Ke(t,n)}),document.querySelectorAll("[as-hide-if]").forEach(t=>{let r=t.getAttribute("as-hide-if");if(!r)return;let n=re(r,e);Ke(t,!n)})}function Ke(e,t){let r=cn(e);if(t!==r){if(t){ln(e),T.default.debug("[conditions] Showing element with transition");return}un(e),T.default.debug("[conditions] Hiding element with transition")}}function sn(){if(typeof document>"u"||typeof MutationObserver>"u")return;new MutationObserver(()=>{T.default.debug("[conditions] DOM mutation detected, re-applying visibility"),he()}).observe(document.body,{childList:!0,subtree:!0})}function an(e){let t=()=>{ye(e)};e.addEventListener("input",t),e.addEventListener("change",t)}function ln(e){let t=nt(),r=rt(e);if(T.default.debug("[conditions] show transition start",{token:r,skipAnimation:t,element:ie(e)}),e.dataset.asVisibilityState="visible",dn(e),e.setAttribute("aria-hidden","false"),e.removeAttribute("inert"),t){j(e),e.style.opacity="",e.style.transform="",T.default.debug("[conditions] show transition skipped (reduced motion)",{token:r});return}let n=e.getAttribute("as-transition-in")||e.getAttribute("as-transition")||"fade",i=H(n,"in"),o=e.getAttribute("as-transition-distance")||"24px",s=e.getAttribute("as-transition-speed-in")||e.getAttribute("as-transition-speed"),a=R(i,o,"in"),u=window.getComputedStyle(e),l=F(u.transitionDuration,u.transitionDelay)>0,f=u.transitionProperty||"",m=/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(f),c=e.style.transitionProperty,g=e.style.transitionDuration,p=e.style.willChange;e.style.transitionProperty="none",e.style.transitionDuration="0ms",Object.assign(e.style,a.initial),e.offsetHeight,requestAnimationFrame(()=>{if(!ve(e,r)){T.default.debug("[conditions] show transition aborted before animation (token mismatch)",{token:r}),e.style.transitionProperty=c,e.style.transitionDuration=g,e.style.willChange=p;return}let v=!1,d=!1,$=!1;m?e.style.transitionProperty=c:(e.style.transitionProperty="opacity, transform",v=!0),s?D(e,s):l?e.style.transitionDuration=g:(e.style.transitionDuration="300ms",d=!0),e.style.willChange!=="opacity, transform"&&(e.style.willChange="opacity, transform",$=!0),Object.assign(e.style,a.target),k(e,()=>{if(!ve(e,r)){T.default.debug("[conditions] show transition cleanup skipped (token mismatch)",{token:r});return}(d||s)&&(e.style.transitionDuration=g),v&&(e.style.transitionProperty=c),$&&(e.style.willChange=p),T.default.debug("[conditions] show transition complete",{token:r,element:ie(e)})})})}function un(e){let t=nt(),r=rt(e);if(T.default.debug("[conditions] hide transition start",{token:r,skipAnimation:t,element:ie(e)}),e.dataset.asVisibilityState="hidden",t){Xe(e),e.setAttribute("aria-hidden","true"),e.setAttribute("inert",""),j(e),T.default.debug("[conditions] hide transition skipped (reduced motion)",{token:r});return}let n=e.getAttribute("as-transition-out")||e.getAttribute("as-transition")||"fade",i=H(n,"out"),o=e.getAttribute("as-transition-distance")||"24px",s=e.getAttribute("as-transition-speed-out")||e.getAttribute("as-transition-speed"),a=R(i,o,"out"),u=window.getComputedStyle(e),l=F(u.transitionDuration,u.transitionDelay)>0,f=!1,m=!1,c=u.transitionProperty||"";/(^|,|\s)(all|transform|opacity)(,|\s|$)/.test(c)||(e.style.transitionProperty="opacity, transform",f=!0),!l&&!s&&(e.style.transitionDuration="300ms",f||(e.style.transitionProperty="opacity, transform",f=!0)),e.style.willChange!=="opacity, transform"&&(e.style.willChange="opacity, transform",m=!0),s&&D(e,s),Object.assign(e.style,a.target),k(e,()=>{if(!ve(e,r)){T.default.debug("[conditions] hide transition cleanup skipped (token mismatch)",{token:r});return}Xe(e),e.setAttribute("aria-hidden","true"),e.setAttribute("inert",""),j(e),(!l&&!s||s)&&(e.style.transitionDuration=""),f&&(e.style.transitionProperty=""),m&&(e.style.willChange=""),T.default.debug("[conditions] hide transition complete",{token:r,element:ie(e)})})}function nt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches}function rt(e){let t=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`;return e.dataset.asVisibilityToken=t,t}function ve(e,t){return e.dataset.asVisibilityToken===t}function cn(e){let t=e.dataset.asVisibilityState;return t==="visible"?!0:!(t==="hidden"||e.getAttribute("aria-hidden")==="true"||e.style.display==="none")}function dn(e){e.style.removeProperty("display");let t=e.dataset.asDisplayCache;if(t&&t!=="none"){e.style.display=t;return}t||(e.style.display="")}function Xe(e){fn(e),e.style.setProperty("display","none","important")}function fn(e){if(e.dataset.asDisplayCache&&e.dataset.asDisplayCache!=="none")return;let t=e.style.display;if(t&&t!=="none"){e.dataset.asDisplayCache=t;return}if(typeof window<"u"&&typeof window.getComputedStyle=="function"){let r=window.getComputedStyle(e).display;r&&r!=="none"&&(e.dataset.asDisplayCache=r)}}function ie(e){let t=e.id?`#${e.id}`:"",r=e.getAttribute("as-element-id"),n=r?`[${r}]`:"";return`<${e.tagName.toLowerCase()}${t}${n}>`}function it(e,t){try{let r=JSON.parse(e);for(let n of r)if(z(n.if,t))return n.then;return null}catch(r){return T.default.error("[conditions] Invalid next-map JSON:",r),null}}function Ze(){if(typeof document>"u")return;let e=h.get().answers;document.querySelectorAll("[as-disable-if]").forEach(t=>{let r=t.getAttribute("as-disable-if");if(!r)return;let n=re(r,e);et(t,n)}),document.querySelectorAll("[as-enable-if]").forEach(t=>{let r=t.getAttribute("as-enable-if");if(!r)return;let n=re(r,e);et(t,!n)})}function et(e,t){if(!e.hasAttribute("data-as-original-tabindex")&&e.hasAttribute("tabindex")&&e.setAttribute("data-as-original-tabindex",e.getAttribute("tabindex")||"0"),t)(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement||e instanceof HTMLButtonElement)&&(e.disabled=!0),e.setAttribute("aria-disabled","true"),e.setAttribute("tabindex","-1"),e.classList.add("as-disabled"),e.removeAttribute("aria-invalid"),e.removeAttribute("aria-describedby");else{(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement||e instanceof HTMLButtonElement)&&(e.disabled=!1),e.removeAttribute("aria-disabled");let r=e.getAttribute("data-as-original-tabindex");r?(e.setAttribute("tabindex",r),e.removeAttribute("data-as-original-tabindex")):e.removeAttribute("tabindex"),e.classList.remove("as-disabled")}}function ot(e){return(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement||e instanceof HTMLButtonElement)&&e.disabled?!0:e.classList.contains("as-disabled")}var st={defaultDuration:"200ms",defaultDistance:"12px"},pn={required:e=>e.trim()!=="",email:e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),pattern:(e,t)=>new RegExp(t).test(e),min:(e,t)=>e.length>=Number(t),max:(e,t)=>e.length<=Number(t)};function at(e){if(e.dataset.asErrorDisplay)return;let t="",r=e.style.display;if(r&&r!=="none"&&(t=r),!t&&typeof window<"u"&&typeof window.getComputedStyle=="function"){let n=window.getComputedStyle(e).display;n&&n!=="none"&&(t=n)}t||(t=e.tagName==="SPAN"||e.tagName==="LABEL"?"inline":"block"),e.dataset.asErrorDisplay=t}function lt(e){e.dataset.asErrorDefault||(e.dataset.asErrorDefault=e.textContent??""),at(e),e.hasAttribute("role")||e.setAttribute("role","alert"),e.hasAttribute("aria-live")||e.setAttribute("aria-live","polite")}function we(e,t){at(e);let r=e.hasAttribute("as-transition"),n=e.dataset.asErrorDisplay||"block";t?r?Qe(e,{...st,displayValue:n}):(e.style.display=n,e.removeAttribute("hidden"),e.removeAttribute("aria-hidden")):r?Ge(e,st):(e.style.display="none",e.setAttribute("aria-hidden","true"))}function mn(e){if(typeof document>"u")return;let t=[];e instanceof HTMLElement&&e.hasAttribute("as-error-for")&&t.push(e),e.querySelectorAll("[as-error-for]").forEach(r=>{t.includes(r)||t.push(r)});for(let r of t){lt(r);let n=r.dataset.asErrorActive==="true";we(r,n)}}async function gn(e,t){try{let r=await ne();if(!r)return M.default.warn("[validation] Phone library not available"),!1;let n=t?.getAttribute("as-phone-region")||void 0,i=e.trim().startsWith("+");if(M.default.debug("[validation] Validating phone:",e,"has + prefix:",i,"region:",n),i){let o=r(e);if(M.default.debug("[validation] Parse international:",o?"success":"failed"),o&&typeof o.isValid=="function"){let s=o.isValid();return M.default.debug("[validation] Country:",o.country,"isValid:",s),s}return M.default.debug("[validation] International number validation failed"),!1}else{if(!n)return M.default.debug("[validation] No region specified for national number"),!1;let o=r(e,n);if(M.default.debug("[validation] Parse with region:",o?"success":"failed"),o&&typeof o.isValid=="function"){let s=o.isValid();return M.default.debug("[validation] Country:",o.country,"isValid:",s),s}return M.default.debug("[validation] National number validation failed"),!1}}catch(r){return M.default.error("[validation] Failed to validate phone number:",r),!1}}function ut(e){mn(e),M.default.debug("[validation] Initialized")}async function U(e){if(typeof document>"u")return!0;let t=document.querySelector(`[as-step="${e}"]`);if(!t)return!0;let r=Array.from(t.querySelectorAll("input, textarea, select"));for(let n of r){if(ot(n)){oe(n);continue}if(vn(n)){oe(n);continue}let o=(n.getAttribute("as-validate")||"").split("|").map(l=>l.trim()).filter(Boolean),s=[],a=new Set;(n.hasAttribute("required")||n.required===!0)&&(s.push("required"),a.add("required"));for(let l of o)l&&(a.has(l)||(a.add(l),s.push(l)));if(s.length===0){oe(n);continue}let u=wn(n);for(let l of s){let[f,m]=l.split(":"),c=f||"",g;if(c==="phone")g=await gn(u,n);else if(c==="required")g=En(n,t);else{let p=pn[c];g=p?p(u,m??""):!0}if(!g)return yn(n,bn(n,c)),!1}oe(n)}return!0}function yn(e,t){let r=ct(e);if(r){dt(e);let i=hn(r);r.textContent=t,r.dataset.asErrorActive="true",we(r,!0),e.setAttribute("aria-invalid","true"),i&&e.setAttribute("aria-describedby",i);return}let n=e.nextElementSibling;(!n||!n.classList.contains("as-error"))&&(n=document.createElement("div"),n.className="as-error",n.setAttribute("role","alert"),e.parentElement?.insertBefore(n,e.nextSibling)),n.textContent=t,e.setAttribute("aria-invalid","true"),e.setAttribute("aria-describedby",n.id=`err-${typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():Date.now()}`)}function oe(e){let t=ct(e);if(t){let r=t.dataset.asErrorDefault??"";t.textContent=r,delete t.dataset.asErrorActive,we(t,!1)}else dt(e);e.removeAttribute("aria-invalid"),e.removeAttribute("aria-describedby")}function ct(e){let t=e.getAttribute("as-element-id")||e.getAttribute("id")||e.getAttribute("name");return t?(e.closest("[as-step]")??document).querySelector(`[as-error-for="${t}"]`)??null:null}function dt(e){let t=e.nextElementSibling;t&&t.classList.contains("as-error")&&t.remove()}function bn(e,t){let r=e.getAttribute("as-error-message");if(r)return r;let n=e.getAttribute("as-error-messages");if(n)try{let o=JSON.parse(n);if(o[t])return o[t]}catch{}return je()[t]||"Invalid input"}function hn(e){if(lt(e),!e.id){let t=typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`err-${Date.now()}`;e.id=t}return e.id}function vn(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement?e.disabled:!1}function wn(e){if(e instanceof HTMLInputElement){let{type:t}=e;if(t==="checkbox"||t==="radio")return e.checked?e.value||"on":"";if(t==="file")return e.files&&e.files.length>0?"selected":""}return e instanceof HTMLSelectElement&&e.multiple?Array.from(e.selectedOptions).map(t=>t.value).join(","):e.value??""}function En(e,t){if(e instanceof HTMLInputElement){if(e.disabled)return!0;switch(e.type){case"checkbox":return e.checked;case"radio":{let r=e.name;if(!r)return e.checked;let n=`input[type="radio"][name="${An(r)}"]`,i=t.querySelectorAll(n);for(let o of Array.from(i))if(!o.disabled&&o.checked)return!0;return!1}case"file":return!!(e.files&&e.files.length>0);default:return e.value.trim()!==""}}return e instanceof HTMLSelectElement?e.disabled?!0:e.multiple?e.selectedOptions.length>0:e.value.trim()!=="":e instanceof HTMLTextAreaElement?e.disabled?!0:e.value.trim()!=="":!0}function An(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}var C=x(L(),1);var S=x(L(),1);var Ee=new Map;function ft(e){let t=Ae();if(!t){S.default.debug("[basin] No endpoint found in meta tag, skipping Basin integration");return}Tn(e),typeof window<"u"&&window.addEventListener("beforeunload",()=>{let r=Te();r.set("basinjsdraft","true"),navigator.sendBeacon(t,r)}),S.default.debug("[basin] Initialized with endpoint:",t)}function Ae(){if(typeof document>"u")return"";let e=document.querySelector('meta[name="as:basin-endpoint"]');if(e?.content)return e.content;let t=document.body;return t?.hasAttribute("as-basin-endpoint")&&t.getAttribute("as-basin-endpoint")||""}async function pt(e){if(typeof window>"u")return"";let t=window.localStorage.getItem("as:basin-jwt");if(t)return t;try{let r=await fetch(`${e}/generate_jwt`,{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json"}});if(!r.ok)return S.default.warn("[basin] JWT endpoint returned",r.status,"- multistep may not be supported"),"";let n=await r.json();return n.jwt?(window.localStorage.setItem("as:basin-jwt",n.jwt),n.jwt):""}catch(r){return S.default.warn("[basin] Failed to fetch JWT (multistep may not be supported):",r),""}}async function se(e){let t=Ae();if(!t){S.default.warn("[basin] No endpoint, skipping partial submission");return}let r=await pt(t),n=Te();r&&n.append("basinjwt",r),n.append("basinjsmultistep","true"),n.append("basinjsdraft","true");let i=mt(e);if(n.append("basinjsstep",String(i)),S.default.getLevel()<=S.default.levels.DEBUG){S.default.debug(`[basin] Sending partial submission for step: ${e}`);let o=[];n.forEach((s,a)=>{o.push(` ${a}: ${typeof s=="string"?s.substring(0,100):"[File]"}`)}),S.default.debug(`[basin] FormData contents:
2
+ ${o.join(`
3
+ `)}`)}try{let o=await fetch(t,{method:"POST",body:n,keepalive:!0});if(!o.ok){S.default.warn("[basin] Partial submission failed with status:",o.status);return}S.default.debug("[basin] Sent partial submission for step:",e)}catch(o){S.default.error("[basin] Failed to send partial submission:",o)}}async function ae(e){let t=Ae();if(!t){S.default.warn("[basin] No endpoint, skipping final submission");return}let r=await pt(t),n=Te();r&&n.append("basinjwt",r),n.append("basinjsmultistep","true"),n.append("basinjsdraft","false");try{await fetch(t,{method:"POST",body:n,keepalive:!0}),S.default.debug("[basin] Sent final submission for step:",e)}catch(i){S.default.error("[basin] Failed to send final submission:",i)}}function Te(){let e=new FormData;if(typeof document<"u"){document.querySelectorAll('input[name]:not([type="file"]), textarea[name], select[name]').forEach(n=>{let i=n.name;i&&(n instanceof HTMLInputElement?n.type==="checkbox"?n.checked&&e.append(i,n.value||"on"):n.type==="radio"?n.checked&&e.append(i,n.value):n.value&&e.append(i,n.value):(n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)&&n.value&&e.append(i,n.value))});let r=document.querySelectorAll('input[type="file"][name]');Sn(e,r)}if(e.append("frombasinjs","false"),e.append("agera_version","0.1.1"),typeof window<"u"){let t=new URLSearchParams(window.location.search);["source","medium","campaign","term","content"].forEach(r=>{let n=t.get(`utm_${r}`);n&&e.append(`utm_${r}`,n)})}return e}function Tn(e){e.querySelectorAll("input, textarea, select").forEach(r=>{r.name&&(Ee.set(r.name,{displayedAt:new Date}),r.addEventListener("focus",()=>{let n=Ee.get(r.name);n&&!n.firstFocusedAt&&(n.firstFocusedAt=new Date)},{once:!0}),r.addEventListener("input",()=>{let n=Ee.get(r.name);n&&(n.firstAnsweredAt||(n.firstAnsweredAt=new Date),n.lastEditedAt=new Date)}))})}function Sn(e,t){t.forEach(r=>{r.files&&r.name&&Array.from(r.files).forEach(n=>{e.append(r.name,n)})})}function gt(e){e&&(Ln(e),C.default.debug("[redirect] Initialized"))}function Ln(e){e.querySelectorAll("[as-redirect]").forEach(t=>{t.dataset.asRedirectBound!=="true"&&(t.addEventListener("click",r=>{if(r.defaultPrevented)return;let n=r.currentTarget;if(n.hasAttribute("as-next")){C.default.debug("[redirect] Skipping auto-click handler because element also has [as-next]");return}r.preventDefault();let i=n.closest("[as-step]"),o=Cn(i);if(!o){C.default.warn("[redirect] Could not resolve step for redirect trigger:",Hn(n));return}(async()=>{if(In(n,i)&&!await U(o)){C.default.debug("[redirect] Validation failed, aborting redirect click");return}await Le(o,n)})()}),t.dataset.asRedirectBound="true")})}async function Le(e,t){if(typeof document>"u"||typeof window>"u")return;let r=document.querySelector(`[as-step="${e}"]`),n=t instanceof Element?t:null,i=Mn(r,n);if(await ae(e),!i){C.default.debug("[redirect] No redirect configured, final submission sent");return}let o=xn(i.url,i.preserveUtm,i.includeSession,h.get().id);if(C.default.debug("[redirect] Redirecting via %s to: %s",i.source,o),i.useReplace){window.location.replace(o);return}window.location.assign(o)}function xn(e,t,r,n){if(typeof window>"u")return e;let i=new URL(e,window.location.origin);return t&&new URLSearchParams(window.location.search).forEach((s,a)=>{s&&a.toLowerCase().startsWith("utm")&&i.searchParams.set(a,s)}),r&&n&&i.searchParams.set("sessionId",n),i.toString()}function le(e,t){if(!e||!e.hasAttribute(t))return null;let r=e.getAttribute(t);if(!r)return!0;let n=r.trim().toLowerCase();return!["false","0","off","no"].includes(n)}function Mn(e,t){let r=h.get().answers,n=t?.getAttribute("as-redirect-map")??e?.getAttribute("as-redirect-map");if(n){let o=Pn(n,r);if(o)return{url:o.to,preserveUtm:o.preserveUtm??!0,includeSession:o.includeSession??!1,useReplace:o.replace??!1,source:"map"};C.default.debug("[redirect] Redirect map evaluated with no matching rule, falling back to attribute")}let i=t?.getAttribute("as-redirect")??e?.getAttribute("as-redirect");return i?{url:i,preserveUtm:Se("as-redirect-preserve-utm",t,e,!0),includeSession:Se("as-redirect-include-session",t,e,!1),useReplace:Se("as-redirect-replace",t,e,!1),source:"attribute"}:null}function Se(e,t,r,n){return le(t,e)??le(r,e)??n}function Pn(e,t){try{let r=JSON.parse(e);if(!Array.isArray(r))return C.default.warn("[redirect] as-redirect-map must be an array of rules"),null;for(let n of r){if(!n||typeof n.to!="string"||n.to.trim()===""){C.default.warn("[redirect] Redirect map rule missing a 'to' URL, skipping");continue}if(!n.if||z(n.if,t))return n}}catch(r){C.default.error("[redirect] Invalid as-redirect-map JSON:",r)}return null}function In(e,t){return le(e,"as-redirect-validate")??le(t,"as-redirect-validate")??!0}function Cn(e){return e?.hasAttribute("as-step")?e.getAttribute("as-step"):w.get().current||null}function Hn(e){let t=e.getAttribute("id"),r=e.closest("[as-step]")?.getAttribute("as-step");return`<${e.tagName.toLowerCase()}${t?`#${t}`:""}${r?` step="${r}"`:""}>`}function yt(){document.addEventListener("keydown",e=>{if(e.key==="Enter"&&e.target instanceof HTMLInputElement){let t=document.querySelector(`[as-step="${w.get().current}"] [as-next]`);t instanceof HTMLElement&&(e.preventDefault(),t.click())}})}function xe(e){let t=Ue();t.textContent=e}function Me(e){let t=e.querySelector("input, textarea, select, button");t&&setTimeout(()=>t.focus(),100)}var Rn=80;function kn(){return typeof document>"u"?!0:document.body?.getAttribute("as-partial-submissions")?.toLowerCase()!=="off"}function bt(e){let t=e.querySelector(":focus");t&&(y.default.debug("[steps] \u{1F532} Blurring focused element before hiding step"),t.blur())}function ht(e){let t=Array.from(e.querySelectorAll("[as-step]"));if(t.length===0)return;let r=t[0]?.getAttribute("as-step");r&&(w.set({current:r,path:[r]}),y.default.debug(`[steps] First step already visible: ${r}`)),Nn(e),yt()}function Q(e,t){y.default.debug(`[steps] \u{1F4C4} showStep called: "${e}"${t?` (from: "${t}")`:""}`);let r=Array.from(document.querySelectorAll("[as-step]")),n=typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,i=document.querySelector(`[as-step="${e}"]`),o=t?document.querySelector(`[as-step="${t}"]`):null;if(!i){y.default.warn(`[steps] \u274C Cannot show step "${e}" - element not found`);return}y.default.debug(`[steps] \u{1F3AC} Transition: ${n?"reduced motion":"animated"}`),t&&t!==e&&kn()&&(y.default.debug(`[steps] \u{1F4BE} Triggering background partial submission for: "${t}"`),se(t).catch(a=>{y.default.error("[steps] Background partial submission failed:",a)})),r.forEach(a=>{let u=a.getAttribute("as-step");if(u!==e&&u!==t){let l=a;bt(l),l.style.setProperty("display","none","important"),l.setAttribute("aria-hidden","true"),l.setAttribute("inert","")}});let s;if(i&&o&&!n){let a=i.parentElement;a&&(s=Ye(a,i,o));let u=i.getAttribute("as-transition-in")||i.getAttribute("as-transition")||"fade",l=H(u,"in"),f=i.getAttribute("as-transition-distance")||"24px",m=i.getAttribute("as-transition-speed-in")||i.getAttribute("as-transition-speed"),c=R(l,f,"in");i.style.display="",i.style.visibility="hidden",i.setAttribute("aria-hidden","true"),i.setAttribute("inert","");let g=i.style.transitionProperty;i.style.transitionProperty="none",Object.assign(i.style,c.initial),i.offsetHeight,o&&bt(o),be(o,!1),k(o,()=>{setTimeout(()=>{i.setAttribute("aria-hidden","false"),i.removeAttribute("inert"),i.style.transitionProperty="opacity, transform",i.style.transitionDuration="300ms",m&&D(i,m),i.style.willChange!=="opacity, transform"&&(i.style.willChange="opacity, transform"),i.style.visibility="visible",Object.assign(i.style,c.target),k(i,()=>{i.style.transitionDuration="",i.style.transitionProperty=g,i.style.willChange="",Me(i),s&&s()})},Rn)});return}i&&Je(i,n,Me),o&&be(o,n),xe(`Step: ${e}`),y.default.debug(`[steps] \u2705 Step visible: "${e}"`)}function Dn(e){let t=Array.from(document.querySelectorAll("[as-step]")),n=document.querySelector(`[as-step="${e}"]`)?.getAttribute("as-next-map");if(n){y.default.debug("[steps] \u{1F5FA}\uFE0F Evaluating next-map for conditional routing");let s=h.get().answers,a=it(n,s);if(a)return y.default.debug(`[steps] \u2713 Next-map resolved to: "${a}"`),a;y.default.debug("[steps] \u26A0\uFE0F Next-map evaluation returned no match, falling back to linear")}let i=t.findIndex(s=>s.getAttribute("as-step")===e),o=t[i+1]?.getAttribute("as-step")||e;return o!==e&&y.default.debug(`[steps] \u{1F4CB} Linear next step: "${o}"`),o}function Nn(e){e.querySelectorAll("[as-next]").forEach(t=>{t.addEventListener("click",r=>{let n=r.currentTarget;(async()=>{let{current:i,path:o}=w.get();if(y.default.debug(`[steps] \u{1F537} Next button clicked on step: ${i}`),y.default.debug(`[steps] Validating step: ${i}`),!await U(i)){y.default.debug(`[steps] \u274C Validation failed, staying on step: ${i}`);return}y.default.debug("[steps] \u2713 Validation passed");let a=Dn(i);a!==i?(y.default.debug(`[steps] \u27A1\uFE0F Navigating from "${i}" to "${a}"`),w.set({current:a,path:[...o,a]}),Q(a,i)):(y.default.debug("[steps] \u{1F3C1} No next step found, checking for redirect"),await Le(i,n))})()})}),e.querySelectorAll("[as-back]").forEach(t=>{t.addEventListener("click",()=>{let{current:r,path:n}=w.get();if(y.default.debug(`[steps] \u{1F519} Back button clicked on step: ${r}`),n.length>1){let i=n.slice(0,-1),o=i[i.length-1];o&&(y.default.debug(`[steps] \u2B05\uFE0F Navigating back from "${r}" to "${o}"`),w.set({current:o,path:i}),Q(o,r))}else y.default.debug("[steps] \u26A0\uFE0F Cannot go back, already at first step")})}),e.querySelectorAll("[as-goto]").forEach(t=>{let r=null;t.addEventListener("click",n=>{let i=t.getAttribute("as-goto");if(!i||i.trim()==="")return;let o=n.currentTarget,{current:s}=w.get();y.default.debug(`[steps] \u{1F3AF} Goto clicked on step "${s}", target: "${i}" (element: ${o.tagName})`),r&&(clearTimeout(r),r=null,y.default.debug("[steps] \u23F1\uFE0F Cleared previous goto timeout"));let a=o.tagName==="BUTTON"||o.tagName==="A",u=o.tagName==="A",l=a||u?0:500,f=()=>{let{current:m,path:c}=w.get();if(!document.querySelector(`[as-step="${i}"]`)){y.default.warn(`[steps] \u274C Target step not found: ${i}`);return}y.default.debug(`[steps] \u2197\uFE0F Goto navigating from "${m}" to "${i}"`),w.set({current:i,path:[...c,i]}),Q(i,m)};l>0?(y.default.debug(`[steps] \u23F1\uFE0F Debouncing goto by ${l}ms`),r=setTimeout(f,l)):f()})}),e.querySelectorAll("[as-restart]").forEach(t=>{t.addEventListener("click",()=>{y.default.debug("[steps] \u{1F504} Restart button clicked, resetting survey"),window.agera?.survey?.reset()})})}function mt(e){if(typeof document>"u")return 1;let r=Array.from(document.querySelectorAll("[as-step]")).findIndex(n=>n.getAttribute("as-step")===e);return r>=0?r+1:1}var Lt=x(L(),1);var Ie=x(L(),1);function vt(e,t=document){return e.closest("[as-step]")||t}function G(e){return e?e.split("|").map(t=>t.trim()).filter(Boolean):[]}function Pe(e,t){return G(e).includes(t)}function wt(e){return Array.from(e).some(t=>Pe(t.getAttribute("as-validate"),"required"))}function Et(e){return["true","false",""].includes(e.toLowerCase())}function At(e,t){return e.querySelectorAll(`input[type="radio"][name="${t}"]`)}function ue(e,t){t.length>0?e.setAttribute("as-validate",t.join("|")):e.removeAttribute("as-validate")}function Tt(e,t,r="input, select, textarea"){let n=[],i=new Set,o=r.split(",").map(s=>`${s.trim()}[${t}]`).join(", ");return e.querySelectorAll(o).forEach(s=>{i.has(s)||(i.add(s),n.push({attrElement:s,input:s}))}),e.querySelectorAll(`label[${t}]`).forEach(s=>{let a=s.querySelector(r);a&&!i.has(a)&&(i.add(a),n.push({attrElement:s,input:a}))}),n}function Ce(e){let t=e||document;t.querySelectorAll("[as-radio-other-input]").forEach(r=>{let n=r,i=vt(n,t),o=r.getAttribute("as-radio-other-input")||"",s=null;if(Et(o)&&(o=""),o?(s=qn(i,o),s&&(o=s.name)):(s=Fn(n,i),s&&(o=s.name)),!s||!o){Ie.default.debug("[components:radio-other-input] 'other' radio not found near input",n);return}let a=At(i,o);On(n,s,a)}),Ie.default.debug("[components:radio-other-input] Initialized")}function qn(e,t){let r=e.querySelectorAll('input[type="radio"][value="other"]');for(let n of r)if(n.name.toLowerCase()===t.toLowerCase())return n;return null}function Fn(e,t){let r=e.parentElement;for(;r&&r!==t.parentElement;){let n=r.querySelector('input[type="radio"][value="other"]');if(n)return n;r=r.parentElement}return t.querySelector('input[type="radio"][value="other"]')}function On(e,t,r){e.removeAttribute("name");let n=e.getAttribute("as-validate"),i=e.hasAttribute("required"),o=Pe(n,"required"),s=wt(r),a=e.hasAttribute("as-radio-other-required"),u=s||a,l=()=>{let c=e.value.trim();t.value=c||"other"},f=()=>{if(u)if(t.checked){let c=G(n);c.includes("required")||c.push("required"),ue(e,c),e.setAttribute("required","")}else{if(n!==null)if(o)e.setAttribute("as-validate",n);else{let c=G(e.getAttribute("as-validate")).filter(g=>g!=="required");ue(e,c)}else{let c=G(e.getAttribute("as-validate")).filter(g=>g!=="required");ue(e,c)}i||e.removeAttribute("required")}};r.forEach(c=>{c.addEventListener("change",()=>{c===t&&t.checked&&(l(),setTimeout(()=>{e.focus()},0)),f()})});let m=()=>{t.checked||(t.checked=!0,t.dispatchEvent(new Event("change",{bubbles:!0})))};e.addEventListener("click",m),e.addEventListener("focus",m),e.addEventListener("input",l),e.addEventListener("change",l),e.addEventListener("blur",l),l(),f()}var E=x(L(),1);function He(e){(e||document).querySelectorAll("[as-phone-format]").forEach(r=>{let n=r.getAttribute("as-phone-region")||void 0,i=r.getAttribute("as-phone-format")||"INTERNATIONAL",o=null,s=!1;St(n).then(a=>{o=a}),r.addEventListener("focus",()=>{$n(r,i,n,s,a=>{s=a})}),r.addEventListener("input",()=>{zn(r,n,o,a=>{o=a})}),r.addEventListener("blur",()=>{Vn(r,i,n)})}),E.default.debug("[components:phone-format] Initialized")}async function St(e){try{let t=await ze();return t?new t(e):null}catch(t){return E.default.warn("[components:phone-format] Failed to initialize AsYouType:",t),null}}async function $n(e,t,r,n,i){if(n||e.value.trim()){E.default.debug("[components:phone-format] Skipping prefill - already prefilled or has value");return}try{if(E.default.debug("[components:phone-format] Focus handler triggered, format:",t,"region:",r),t.toUpperCase()!=="INTERNATIONAL"){E.default.debug("[components:phone-format] Format is not INTERNATIONAL, skipping prefill");return}if(!r){E.default.debug("[components:phone-format] No region specified, skipping prefill");return}E.default.debug("[components:phone-format] Loading phone library...");let o=await Ve();if(!o){E.default.warn("[components:phone-format] Phone library not available");return}if(e.value.trim()){E.default.debug("[components:phone-format] Field now has value, skipping prefill");return}E.default.debug("[components:phone-format] Getting calling code for region:",r);let s=o(r);E.default.debug("[components:phone-format] Calling code:",s),s?(e.value="+"+s+" ",i(!0),E.default.debug("[components:phone-format] Prefilled country code:",e.value),e.setSelectionRange(e.value.length,e.value.length)):E.default.warn("[components:phone-format] Could not get calling code for region:",r)}catch(o){E.default.error("[components:phone-format] Failed to prefill country code:",o)}}async function zn(e,t,r,n){try{if(!r){let a=await St(t);if(!a)return;n(a),r=a}let i=e.selectionStart||0,o=e.value;r.reset();let s=r.input(o);if(s!==o){e.value=s;let a=s.length-o.length,u=Math.max(0,Math.min(i+a,s.length));e.setSelectionRange(u,u)}}catch(i){E.default.warn("[components:phone-format] Failed to auto-format phone number:",i)}}async function Vn(e,t,r){try{let n=e.value.trim();if(!n)return;let i=await ne();if(!i)return;let o=i(n);if(!o&&r&&(o=i(n,r)),o&&o.isValid&&o.isValid()){let s=jn(o,t,n);e.value=s}}catch(n){E.default.warn("[components:phone-format] Failed to format phone number on blur:",n)}}function jn(e,t,r){switch(t.toUpperCase()){case"E164":return e.format?e.format("E.164"):r;case"NATIONAL":return e.formatNational?e.formatNational():r;case"INTERNATIONAL":default:if(e.formatInternational){let n=e.formatInternational();if(r.replace(/\s/g,"")===n.replace(/\s/g,""))return n}return r}}function xt(e){Ce(e),He(e),Lt.default.debug("[components] Initialized")}var Pt=x(L(),1);function It(e){w.subscribe(()=>Mt()),Mt(),Pt.default.debug("[progress] Initialized")}function Mt(){if(typeof document>"u")return;let{current:e}=w.get(),t=Array.from(document.querySelectorAll("[as-step]")),r=t.length,n=t.findIndex(i=>i.getAttribute("as-step")===e);document.querySelectorAll('[as-progress="bar"]').forEach(i=>{let o=i.querySelector(".as-progress-bar");o||(o=document.createElement("div"),o.className="as-progress-bar",i.appendChild(o)),o.style.width=`${(n+1)/r*100}%`}),document.querySelectorAll('[as-progress="fraction"]').forEach(i=>{i.textContent=`${n+1} / ${r}`}),document.querySelectorAll('[as-progress="steps"]').forEach(i=>{i.innerHTML=t.map((o,s)=>`<span class="as-step-dot ${s<n?"completed":s===n?"current":"pending"}"></span>`).join("")})}var O=x(L(),1);function Ht(e){if(!e.hasAttribute("as-quiz")){O.default.debug("[quiz] Quiz mode not enabled");return}O.default.info("[quiz] Initializing quiz mode"),Rt(e),Un(e),Ct(),h.subscribe(()=>{Ct()}),O.default.debug("[quiz] Quiz mode initialized")}function Un(e){e.querySelectorAll("input, select, textarea").forEach(r=>{r.addEventListener("change",()=>{O.default.debug("[quiz] Answer changed, recalculating scores"),Rt(e)})})}function Rt(e){let t={};Tt(e,"as-weight").forEach(({attrElement:a,input:u})=>{let l=a.getAttribute("as-weight");if(l)try{let f=JSON.parse(l);if(Bn(u))for(let[c,g]of Object.entries(f))typeof g=="number"&&g>0&&(t[c]=(t[c]||0)+g)}catch(f){O.default.warn("[quiz] Invalid as-weight JSON:",a,f)}}),e.querySelectorAll("option[as-weight]:checked").forEach(a=>{let u=a.getAttribute("as-weight");if(u)try{let l=JSON.parse(u);for(let[f,m]of Object.entries(l))typeof m=="number"&&m>0&&(t[f]=(t[f]||0)+m)}catch(l){O.default.warn("[quiz] Invalid as-weight JSON on option:",a,l)}});let i=Wn(t),o=h.get(),s={...o.answers,__quiz__:i};h.set({...o,quiz:i,answers:s}),O.default.debug("[quiz] Scores updated:",i)}function Bn(e){return e instanceof HTMLInputElement&&e.type==="radio"||e instanceof HTMLInputElement&&e.type==="checkbox"?e.checked:e instanceof HTMLInputElement&&e.hasAttribute("as-radio-other-input")?_n(e)?.checked===!0&&e.value.trim()!=="":e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value.trim()!=="":e instanceof HTMLSelectElement?e.value!=="":!1}function _n(e){let t=e.getAttribute("as-radio-other-input"),r=e.closest("[as-step]")||document;if(t&&t!==""&&t!=="true"){let i=Array.from(r.querySelectorAll('input[type="radio"]')).filter(o=>o.name.toLowerCase()===t.toLowerCase());return i.find(o=>o.checked)||i[i.length-1]||null}let n=e.parentElement;for(;n&&n!==r;){let i=n.querySelector('input[type="radio"]');if(i)return i;n=n.parentElement}return null}function Wn(e){let t=Object.keys(e);if(t.length===0)return{scores:{},winner:null,winnerScore:0,ties:[]};let r=Math.max(...Object.values(e)),n=t.filter(i=>e[i]===r);return n.length===1?{scores:e,winner:n[0],winnerScore:r,ties:[]}:{scores:e,winner:n[0],winnerScore:r,ties:n}}function Ct(){let t=h.get().quiz;t&&(document.querySelectorAll("[as-quiz-category]").forEach(r=>{let n=r.getAttribute("as-quiz-category");!n||n===""||n==="true"?r.textContent=t.winner||"":r.textContent=t.winner===n?n:""}),document.querySelectorAll("[as-quiz-score]").forEach(r=>{let n=r.getAttribute("as-quiz-score");if(!n||n===""||n==="true")r.textContent=String(t.winnerScore);else if(n==="all")r.textContent=JSON.stringify(t.scores);else{let i=t.scores[n]||0;r.textContent=String(i)}}))}function ce(){return h.get().quiz||null}function kt(){return ce()?.scores||{}}function Dt(){return ce()?.winner||null}var Y=x(L(),1),B=null,Nt=!1;function Qn(){if(typeof document>"u"||document.getElementById("as-pre-css"))return;let e=document.createElement("style");e.id="as-pre-css",e.textContent='[as-step]~[as-step]{display:none!important;}[as-error-for]:not([data-as-error-active="true"]){display:none;}';let t=document.head||document.getElementsByTagName("head")[0]||document.documentElement;t.insertBefore(e,t.firstChild),Y.default.debug("[prehide] Injected pre-CSS to hide non-first steps")}function qt(){if(typeof document>"u")return;Qn();function e(r,n){let i=r;n!==0&&(i.style.display="none",i.setAttribute("aria-hidden","true"),i.setAttribute("inert",""))}let t=document.querySelectorAll("[as-step]");t.forEach((r,n)=>e(r,n)),t.length>0&&Y.default.debug(`[prehide] Hidden ${t.length-1} non-first steps before paint`),!B&&typeof MutationObserver<"u"&&(B=new MutationObserver(r=>{if(!Nt)for(let n of r)n.addedNodes.forEach(i=>{if(i.nodeType===Node.ELEMENT_NODE){let o=i;o.hasAttribute("as-step")&&e(o,1),o.querySelectorAll("[as-step]").forEach(s=>e(s,1))}})}),B.observe(document.documentElement,{childList:!0,subtree:!0}))}function Ft(){Nt=!0,B&&(B.disconnect(),B=null,Y.default.debug("[prehide] Observer stopped"));let e=document.getElementById("as-pre-css");e&&(e.remove(),Y.default.debug("[prehide] Removed pre-CSS, inline styles now control visibility"))}var Ot=x(L(),1);function $t(){if(typeof document>"u"||document.getElementById("as-runtime-css"))return;let e=document.createElement("style");e.id="as-runtime-css",e.textContent=`
4
+ /* Disabled elements styling */
5
+ [as-disabled],
6
+ [disabled][as-enable-if],
7
+ [disabled][as-disable-if] {
8
+ opacity: 0.5;
9
+ cursor: not-allowed;
10
+ pointer-events: none;
11
+ }
12
+
13
+ /* Quiz display elements (optional styling hooks) */
14
+ [as-quiz-category],
15
+ [as-quiz-score] {
16
+ /* Authors can override these in Webflow */
17
+ }
18
+ `,(document.head||document.getElementsByTagName("head")[0]||document.documentElement).appendChild(e),Ot.default.debug("[styles] Injected runtime CSS")}N.default.setLevel("info");qt();function de(e={}){e.debug&&N.default.setLevel("debug");let t=document.querySelector("[as-survey]");if(!t){N.default.warn("[agera-survey] No [as-survey] element found");return}N.default.info("[agera-survey] Initializing"),Ft(),$t(),$e(),ht(t),ut(t),xt(t),ft(t),tt(t),It(t),gt(t),Ht(t),N.default.info("[agera-survey] Ready")}if(typeof window<"u"){window.agera||(window.agera={}),window.agera.survey={init:de,version:Oe,reset:()=>{window.localStorage.removeItem("as:session"),window.localStorage.removeItem("as:basin-jwt"),window.location.reload()},goToStep:n=>Q(n),getCurrentStep:()=>w.get().current,getStepPath:()=>w.get().path,getAnswers:()=>h.get().answers,setAnswer:(n,i)=>{let o=h.get();h.set({...o,answers:{...o.answers,[n]:i}})},get dev(){return window.localStorage.getItem("as:dev")==="true"},set dev(n){n?(window.localStorage.setItem("as:dev","true"),N.default.setLevel("debug")):(window.localStorage.removeItem("as:dev"),N.default.setLevel("info"))},validateCurrentStep:async()=>{let n=w.get().current;return n?await U(n):!0},triggerPartialSubmit:async()=>{let n=w.get().current;n&&await se(n)},triggerFinalSubmit:async()=>{let n=w.get().current;n&&await ae(n)},getQuizResults:()=>ce(),getQuizScores:()=>kt(),getQuizWinner:()=>Dt()};let t=new URLSearchParams(window.location.search).get("dev")==="true",r=window.localStorage.getItem("as:dev")==="true";(t||r)&&(window.agera.survey.dev=!0,N.default.info("[agera-survey] Debug mode enabled")),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>de()):de()}return Jt(Gn);})();
19
+ //# sourceMappingURL=index.global.js.map
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@reform-society/agera-survey",
3
+ "version": "0.1.0",
4
+ "description": "Multi-step survey runtime for Webflow",
5
+ "type": "module",
6
+ "main": "dist/index.global.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist/index.global.js"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/reform-society/agera-survey-app.git",
14
+ "directory": "packages/agera-survey"
15
+ },
16
+ "keywords": ["webflow", "survey", "form", "multi-step"],
17
+ "author": "Reform Society",
18
+ "license": "MIT",
19
+ "publishConfig": {
20
+ "access": "public",
21
+ "provenance": true
22
+ },
23
+ "scripts": {
24
+ "dev": "tsup src/index.ts --format iife --global-name AgeraSurvey --watch --out-dir dist --sourcemap",
25
+ "build": "tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify",
26
+ "build:analyze": "tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify --metafile",
27
+ "lint": "eslint src",
28
+ "typecheck": "tsc --noEmit",
29
+ "check": "pnpm lint; pnpm typecheck"
30
+ },
31
+ "devDependencies": {
32
+ "@agera/config": "workspace:*",
33
+ "loglevel": "^1.9.2",
34
+ "nanostores": "^0.11.3",
35
+ "libphonenumber-js": "1.12.25",
36
+ "tsup": "^8.3.5",
37
+ "typescript": "^5.7.2"
38
+ }
39
+ }