@picked/client 0.0.70-next.4 → 0.0.70-next.6

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.
@@ -1 +1 @@
1
- var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.70-next.4`,i=`v1`;function a(e,t){return new URL(`/api/${i}/${t}`,e).toString()}function o(e){return{...n(`sdk`,r()),...e}}async function s(e,t,n,r){let i=a(e,t);return fetch(i,{headers:o(n),signal:r})}async function c(e,t,n,r){let i=a(e,t);return fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`,...o(r)},body:JSON.stringify(n)})}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
1
+ var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.70-next.6`,i=`v1`;function a(e,t){return new URL(`/api/${i}/${t}`,e).toString()}function o(e){return{...n(`sdk`,r()),...e}}async function s(e,t,n,r){let i=a(e,t);return fetch(i,{headers:o(n),signal:r})}async function c(e,t,n,r){let i=a(e,t);return fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`,...o(r)},body:JSON.stringify(n)})}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
@@ -8,7 +8,7 @@ function n(n, r) {
8
8
  }
9
9
  //#endregion
10
10
  //#region src/utils/version.ts
11
- var r = () => "0.0.70-next.4", i = "v1";
11
+ var r = () => "0.0.70-next.6", i = "v1";
12
12
  function a(e, t) {
13
13
  return new URL(`/api/${i}/${t}`, e).toString();
14
14
  }
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-CDrHc_j9.cjs"),a=require("../experience-instance-DurC3pE-.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-K1zSYLAz.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.attach)({source:(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0?!0:t.n(s)?await t.t(e,s)===!0:!0}}),g=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),_=(0,u.createEvent)(),v=(0,u.createEvent)(),y=f.createStore(void 0,{skipVoid:!1}).on(_,(e,t)=>t).on(v,(e,t)=>t);return(0,u.sample)({clock:_,target:h}),(0,u.sample)({clock:h.doneData,source:y,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:h.doneData,filter:Boolean,target:g}),(0,u.sample)({clock:v,source:y,fn:e=>e,target:m}),(0,u.sample)({clock:v,target:g}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:h,initialiseRequested:_,initialiseDirectly:v,prepareExperienceContentFx:g},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}await c(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function te(e){return typeof e==`number`&&!isNaN(e)}function j(e){return typeof e==`string`}function M(e){return Array.isArray(e)}function N(e){return e instanceof Promise}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function F(e){if(te(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function I(e){return`${e}`}var ne={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>F(e)>F(t),">=":(e,t)=>F(e)>=F(t),"<":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<i;let a=F(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<=i;let a=F(n);return r<=i&&i<=a},"!!":async e=>await R(e),"!":async e=>!await R(e),"%":(e,t)=>F(e)%F(t),log:e=>(console.log(e),e),in:(e,t)=>t?j(t)?t.indexOf(I(e))!==-1:M(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(I).join(``),substr:(e,t,n)=>{let r=I(e),i=F(t);if(n===void 0)return r.substr(i);let a=F(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>F(e)+F(t),0),"*":(...e)=>e.reduce((e,t)=>F(e)*F(t),1),"-":(e,t)=>{let n=F(e);return t===void 0?-n:n-F(t)},"/":(e,t)=>F(e)/F(t),min:(...e)=>Math.min(...e.map(F)),max:(...e)=>Math.max(...e.map(F)),merge:(...e)=>e.reduce((e,t)=>M(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=I(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=M(e[0])?e[0]:e,n=[];for(let e of t){let t=await L({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await L({missing:t},this);if(!M(n)||!M(t))return[];let r=n.filter(j);return t.filter(j).length-r.length>=F(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>j(e)&&j(t)&&e.startsWith(t),endsWith:(e,t)=>j(e)&&j(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(M(e)){let[t,i]=e;n=t,r=i}return!j(n)||!j(r)?!1:new RegExp(n,r).test(I(t))},throw(e){throw Error(I(e))}};async function L(e,t){if(!e)return e;if(N(e))return L(await e,t);if(M(e))return Promise.all(e.map(e=>L(e,t)));if(!P(e))return e;let n=re(e),r=n?e[n]??[]:[];switch(M(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await R(await L(r[e],t)))return L(r[e+1],t);return r.length%2==1?L(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await L(n,t),!await R(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await L(n,t),await R(e))return e;return e}case`map`:{let e=await L(r[0],t);return M(e)?await Promise.all(e.map(e=>L(r[1],e))):[]}case`filter`:{let e=await L(r[0],t);return M(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await R(await L(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await L(r[0],t);if(!M(e))return r.length>2?await L(r[2],t):null;let n=r[1],i=r.length>2?await L(r[2],t):null;for(let t of e)i=await L(n,{current:t,accumulator:i});return i}case`all`:{let e=await L(r[0],t);if(!M(e)||e.length===0)return!1;for(let t of e)if(!await R(await L(r[1],t)))return!1;return!0}case`some`:{let e=await L(r[0],t);if(!M(e))return!1;for(let t of e)if(await R(await L(r[1],t)))return!0;return!1}case`none`:{let e=await L(r[0],t);if(!M(e))return!0;for(let t of e)if(await R(await L(r[1],t)))return!1;return!0}case`catch`:try{return await L(r[0],t)}catch(e){return P(e)?await L(e,t):r[1]?await L(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>L(e,t))),a=n?ne[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function R(e){return N(e)?R(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function re(e){return Object.keys(e)[0]}function z(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>n.has(i)?!1:await L(a.logic,{...t,conditions:z(e,t,new Set(n).add(i))})===!0}})}var ie=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await L(o,{...d,conditions:z(a,d,new Set)})}}));function ae(e){return(0,d.invoke)(ie,e)}var oe=6e3,se=o.t(`last_ping`,`global`),ce=async e=>{try{let t=Date.now(),n=o.n.get(se),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<oe)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},B=(0,u.createDomain)(`lifecycle`),le=(0,d.createFactory)(({client:e})=>{let n=B.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),s=B.store(`idle`),c=B.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{ce(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);return(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x}),(0,u.sample)({clock:(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n),filter:e=>e,fn:()=>void 0,target:S}),(0,u.sample)({clock:(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r)),filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function ue(e){return(0,d.invoke)(le,e)}var de=(0,u.createDomain)(`predicate`),fe=(0,d.createFactory)(({client:e})=>{let t=de.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function pe(e){return(0,d.invoke)(fe,e)}var me=(e,t,n)=>{n.register({name:e,predicate:t})},V=(0,u.createDomain)(`feature`),he=(0,d.createFactory)(({client:e})=>{let t=V.store({}),r=V.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`})=>{let r=o.t(`feature:${e}:${t}`,`global`),i=(n===`session`?o.r:o.n).get(r).boolean();return i===null?null:{id:e,key:t,bucket:i,storage:n}}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage}},target:s}),(0,u.sample)({source:t,clock:d.doneData,fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:e},{id:t,key:n})=>!e.some(e=>e.id===t&&e.key===n),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:r,fn:(e,t)=>!t||e.some(e=>e.id===t.id&&e.key===t.key)?e:[...e,t],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}function m(e){return t.map(t=>t[e],{skipVoid:!1})}function h(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=(0,u.attach)({source:p(e),effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({source:r,filter:t=>t.some(t=>t.id===e),target:n}),(0,u.sample)({clock:n.doneData,filter:e=>e!==void 0,target:t}),n(),t}return{register:a,getById:p,getByName:m,listStore:f,getEvokableFeature:h}});function ge(e){return(0,d.invoke)(he,e)}var _e=(e,t,n)=>{n.register({id:e,feature:t})},H=(0,u.createDomain)(`history`);function U(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var ve=(0,d.createFactory)(()=>{let e=H.store({entries:[]}),t=H.event(),n=H.event(),r=H.event(),i=H.event();e.on(t,(e,t)=>({entries:[...e.entries,U(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),U(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ye(){return(0,d.invoke)(ve)}var be=0,xe=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:be++,at:new Date,payload:t}]),t},Se=(0,u.createDomain)(`field`),Ce=(0,d.createFactory)(()=>{let e=Se.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function we(){return(0,d.invoke)(Ce)}var Te=(0,u.createDomain)(`step`),Ee=(0,d.createFactory)(()=>{let e=Te.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function De(){return(0,d.invoke)(Ee)}function Oe(e,t){t.register(e)}var ke=(0,u.createDomain)(`content`),Ae=(0,d.createFactory)(()=>{let e=ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function je(){return(0,d.invoke)(Ae)}function Me(e,t){t.register(e)}var Ne=(0,u.createDomain)(`action`),Pe=(0,d.createFactory)(({client:e})=>{let t=Ne.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Fe(e){return(0,d.invoke)(Pe,e)}var Ie=(e,t,n)=>{n.register({key:e,action:t})};function W(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function G(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Le(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function K(e){try{return JSON.stringify(e),!0}catch{return!1}}function Re(e,t){return t.find(t=>t.key===e)??null}function ze(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function Be(e,t){if(e.type!==`object`||G(t))return null;if(e.multiple){if(!Array.isArray(t))return W(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return W(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!K(n))return W(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?W(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?W(e,t,`This field expects an object value`,`Field expects an object value.`):K(t)?null:W(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Ve(e,t){if(G(t)||!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=new Set(e.options.map(e=>JSON.stringify(e.value)));return n.every(e=>r.has(JSON.stringify(e)))?null:W(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!Le(e)||e===null?!1:r.includes(e))?null:W(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function He(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!G(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return W(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return W(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&G(r)?W(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?W(n,r,`This field expects a single response`,`Field expects a single response.`):null}var Ue=(0,u.createDomain)(`response`),We=(0,d.createFactory)(({client:e})=>{let n=Ue.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=Re(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=ze(o,n),l=await He(s,o,c,a);if(l){r.push(l);return}let u=Be(o,c);if(u){r.push(u);return}let d=Ve(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function l(e){return c(e)}let d=(0,u.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,u.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function Ge(e){return(0,d.invoke)(We,e)}var Ke=(0,u.createDomain)(`condition`),qe=(0,d.createFactory)(()=>{let e=Ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Je(){return(0,d.invoke)(qe)}function Ye(){if(r.i()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function q(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var J=o.t(`session`,`global`);function Xe(){return r.r()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}function Ze(){if(!r.s())return null;let e=o.n.get(J);if(!e.isSet())return null;try{return e.json()}catch{return null}}var Qe=(0,d.createFactory)(()=>{let e=Ze(),t={id:e?.id??Xe()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}});return(0,u.sample)({source:n,target:(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(J).set(e)}catch{}}})}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function $e(){return(0,d.invoke)(Qe,void 0)}function Y(){if(r.f())return globalThis.window.pickedConfig}function et(){if(r.f())return Y()?.projectId}function tt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function nt(e){if(e.projectId)return e.projectId;let t=et();if(t)return t;let n=tt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-CDrHc_j9.cjs"),a=require("../experience-instance-DurC3pE-.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-CoUkIxIr.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.attach)({source:(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0?!0:t.n(s)?await t.t(e,s)===!0:!0}}),g=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),_=(0,u.createEvent)(),v=(0,u.createEvent)(),y=f.createStore(void 0,{skipVoid:!1}).on(_,(e,t)=>t).on(v,(e,t)=>t);return(0,u.sample)({clock:_,target:h}),(0,u.sample)({clock:h.doneData,source:y,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:h.doneData,filter:Boolean,target:g}),(0,u.sample)({clock:v,source:y,fn:e=>e,target:m}),(0,u.sample)({clock:v,target:g}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:h,initialiseRequested:_,initialiseDirectly:v,prepareExperienceContentFx:g},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}await c(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function te(e){return typeof e==`number`&&!isNaN(e)}function j(e){return typeof e==`string`}function M(e){return Array.isArray(e)}function N(e){return e instanceof Promise}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function F(e){if(te(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function I(e){return`${e}`}var ne={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>F(e)>F(t),">=":(e,t)=>F(e)>=F(t),"<":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<i;let a=F(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<=i;let a=F(n);return r<=i&&i<=a},"!!":async e=>await R(e),"!":async e=>!await R(e),"%":(e,t)=>F(e)%F(t),log:e=>(console.log(e),e),in:(e,t)=>t?j(t)?t.indexOf(I(e))!==-1:M(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(I).join(``),substr:(e,t,n)=>{let r=I(e),i=F(t);if(n===void 0)return r.substr(i);let a=F(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>F(e)+F(t),0),"*":(...e)=>e.reduce((e,t)=>F(e)*F(t),1),"-":(e,t)=>{let n=F(e);return t===void 0?-n:n-F(t)},"/":(e,t)=>F(e)/F(t),min:(...e)=>Math.min(...e.map(F)),max:(...e)=>Math.max(...e.map(F)),merge:(...e)=>e.reduce((e,t)=>M(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=I(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=M(e[0])?e[0]:e,n=[];for(let e of t){let t=await L({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await L({missing:t},this);if(!M(n)||!M(t))return[];let r=n.filter(j);return t.filter(j).length-r.length>=F(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>j(e)&&j(t)&&e.startsWith(t),endsWith:(e,t)=>j(e)&&j(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(M(e)){let[t,i]=e;n=t,r=i}return!j(n)||!j(r)?!1:new RegExp(n,r).test(I(t))},throw(e){throw Error(I(e))}};async function L(e,t){if(!e)return e;if(N(e))return L(await e,t);if(M(e))return Promise.all(e.map(e=>L(e,t)));if(!P(e))return e;let n=re(e),r=n?e[n]??[]:[];switch(M(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await R(await L(r[e],t)))return L(r[e+1],t);return r.length%2==1?L(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await L(n,t),!await R(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await L(n,t),await R(e))return e;return e}case`map`:{let e=await L(r[0],t);return M(e)?await Promise.all(e.map(e=>L(r[1],e))):[]}case`filter`:{let e=await L(r[0],t);return M(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await R(await L(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await L(r[0],t);if(!M(e))return r.length>2?await L(r[2],t):null;let n=r[1],i=r.length>2?await L(r[2],t):null;for(let t of e)i=await L(n,{current:t,accumulator:i});return i}case`all`:{let e=await L(r[0],t);if(!M(e)||e.length===0)return!1;for(let t of e)if(!await R(await L(r[1],t)))return!1;return!0}case`some`:{let e=await L(r[0],t);if(!M(e))return!1;for(let t of e)if(await R(await L(r[1],t)))return!0;return!1}case`none`:{let e=await L(r[0],t);if(!M(e))return!0;for(let t of e)if(await R(await L(r[1],t)))return!1;return!0}case`catch`:try{return await L(r[0],t)}catch(e){return P(e)?await L(e,t):r[1]?await L(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>L(e,t))),a=n?ne[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function R(e){return N(e)?R(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function re(e){return Object.keys(e)[0]}function z(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>n.has(i)?!1:await L(a.logic,{...t,conditions:z(e,t,new Set(n).add(i))})===!0}})}var ie=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await L(o,{...d,conditions:z(a,d,new Set)})}}));function ae(e){return(0,d.invoke)(ie,e)}var oe=6e3,se=o.t(`last_ping`,`global`),ce=async e=>{try{let t=Date.now(),n=o.n.get(se),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<oe)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},B=(0,u.createDomain)(`lifecycle`),le=(0,d.createFactory)(({client:e})=>{let n=B.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),s=B.store(`idle`),c=B.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{ce(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);return(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x}),(0,u.sample)({clock:(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n),filter:e=>e,fn:()=>void 0,target:S}),(0,u.sample)({clock:(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r)),filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function ue(e){return(0,d.invoke)(le,e)}var de=(0,u.createDomain)(`predicate`),fe=(0,d.createFactory)(({client:e})=>{let t=de.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function pe(e){return(0,d.invoke)(fe,e)}var me=(e,t,n)=>{n.register({name:e,predicate:t})},V=(0,u.createDomain)(`feature`);function H(e){return e?.enabled===!1}var he=(0,d.createFactory)(({client:e})=>{let t=V.store({}),r=V.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`,enabled:r})=>{if(r===!1)return null;let i=o.t(`feature:${e}:${t}`,`global`),a=(n===`session`?o.r:o.n).get(i).boolean();return a===null?null:{id:e,key:t,bucket:a,storage:n}}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);if(H(o.feature))return{id:o.id,bucket:!1,key:i,storage:o.feature.storage};let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage,enabled:n.feature.enabled}},target:s}),(0,u.sample)({source:t,clock:d.doneData,filter:(e,t)=>!H(e[t.id]?.feature),fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r,allFeatures:t},filter:({resolvedFeatures:e,allFeatures:t},{id:n,key:r})=>H(t[n]?.feature)?!1:!e.some(e=>e.id===n&&e.key===r),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:{resolvedFeatures:r,allFeatures:t},fn:({resolvedFeatures:e,allFeatures:t},n)=>!n||H(t[n.id]?.feature)||e.some(e=>e.id===n.id&&e.key===n.key)?e:[...e,n],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}function m(e){return t.map(t=>t[e],{skipVoid:!1})}function h(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=(0,u.attach)({source:p(e),effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({source:r,filter:t=>t.some(t=>t.id===e),target:n}),(0,u.sample)({clock:n.doneData,filter:e=>e!==void 0,target:t}),n(),t}return{register:a,getById:p,getByName:m,listStore:f,getEvokableFeature:h}});function ge(e){return(0,d.invoke)(he,e)}var _e=(e,t,n)=>{n.register({id:e,feature:t})},U=(0,u.createDomain)(`history`);function W(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var ve=(0,d.createFactory)(()=>{let e=U.store({entries:[]}),t=U.event(),n=U.event(),r=U.event(),i=U.event();e.on(t,(e,t)=>({entries:[...e.entries,W(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),W(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ye(){return(0,d.invoke)(ve)}var be=0,xe=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:be++,at:new Date,payload:t}]),t},Se=(0,u.createDomain)(`field`),Ce=(0,d.createFactory)(()=>{let e=Se.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function we(){return(0,d.invoke)(Ce)}var Te=(0,u.createDomain)(`step`),Ee=(0,d.createFactory)(()=>{let e=Te.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function De(){return(0,d.invoke)(Ee)}function Oe(e,t){t.register(e)}var ke=(0,u.createDomain)(`content`),Ae=(0,d.createFactory)(()=>{let e=ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function je(){return(0,d.invoke)(Ae)}function Me(e,t){t.register(e)}var Ne=(0,u.createDomain)(`action`),Pe=(0,d.createFactory)(({client:e})=>{let t=Ne.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Fe(e){return(0,d.invoke)(Pe,e)}var Ie=(e,t,n)=>{n.register({key:e,action:t})};function G(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function K(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Le(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function q(e){try{return JSON.stringify(e),!0}catch{return!1}}function Re(e,t){return t.find(t=>t.key===e)??null}function ze(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function Be(e,t){if(e.type!==`object`||K(t))return null;if(e.multiple){if(!Array.isArray(t))return G(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return G(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!q(n))return G(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?G(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?G(e,t,`This field expects an object value`,`Field expects an object value.`):q(t)?null:G(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Ve(e,t){if(K(t)||!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=new Set(e.options.map(e=>JSON.stringify(e.value)));return n.every(e=>r.has(JSON.stringify(e)))?null:G(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!Le(e)||e===null?!1:r.includes(e))?null:G(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function He(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!K(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return G(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return G(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&K(r)?G(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?G(n,r,`This field expects a single response`,`Field expects a single response.`):null}var Ue=(0,u.createDomain)(`response`),We=(0,d.createFactory)(({client:e})=>{let n=Ue.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=Re(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=ze(o,n),l=await He(s,o,c,a);if(l){r.push(l);return}let u=Be(o,c);if(u){r.push(u);return}let d=Ve(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function l(e){return c(e)}let d=(0,u.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,u.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function Ge(e){return(0,d.invoke)(We,e)}var Ke=(0,u.createDomain)(`condition`),qe=(0,d.createFactory)(()=>{let e=Ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Je(){return(0,d.invoke)(qe)}function Ye(){if(r.i()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function J(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var Y=o.t(`session`,`global`);function Xe(){return r.r()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}function Ze(){if(!r.s())return null;let e=o.n.get(Y);if(!e.isSet())return null;try{return e.json()}catch{return null}}var Qe=(0,d.createFactory)(()=>{let e=Ze(),t={id:e?.id??Xe()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}});return(0,u.sample)({source:n,target:(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(Y).set(e)}catch{}}})}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function $e(){return(0,d.invoke)(Qe,void 0)}function X(){if(r.f())return globalThis.window.pickedConfig}function et(){if(r.f())return X()?.projectId}function tt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function nt(e){if(e.projectId)return e.projectId;let t=et();if(t)return t;let n=tt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
2
2
  (1) createClient({ projectId }) options;
3
3
  (2) window.pickedConfig = { projectId };
4
- (3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes a data-projectid (or project-id) attribute.`)}function X(e){return e==null||e===``||Number.isNaN(e)}var rt={default:(e,t)=>X(e)?String(t??``):String(e),append:(e,t)=>t&&!X(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!X(e)?`${t} ${e}`:e,upper:e=>typeof e==`string`?e.toUpperCase():e,lower:e=>typeof e==`string`?e.toLowerCase():e,capitalize:e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):e,list:e=>{if(!e||typeof e!=`object`)return e;let t=new Intl.ListFormat(`en`,{style:`long`,type:`conjunction`});if(Array.isArray(e))return t.format(e.map(String));if(e instanceof Map){let n=Array.from(e.entries()).map(([e,t])=>`${e}: ${t}`);return t.format(n)}return e instanceof Set?t.format(Array.from(e).map(String)):e}};function it(e){return typeof e==`object`&&!!e}function at(e,t){let n=t;for(let t of e.split(`.`))if(it(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function ot(e,t){let n=e.split(`|`).map(e=>e.trim()),r=at(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=rt[i];o&&(r=o(r,a))}return X(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function st(e,t){let n=``,r=0;for(;r<e.length;)if(e[r]===`{`&&e[r+1]===`{`){r+=2;let i=``;for(;r<e.length;){if(e[r]===`}`&&e[r+1]===`}`){r+=2;break}i+=e[r++]}n+=ot(i.trim(),t)}else n+=e[r++];return n}var Z=`preview-token`;function Q(){return!r.f()||!r.t()?!1:!!q()[Z]?.[0]}var $=class{static logger=n.t;options;dataSource=null;contentLoader;previewEmbedderOrigins=null;plugins={};eventBus=(0,u.createEvent)();events;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session=$e();searchParams=q();history=ye();components=w({client:this});experienceInstances=a.n({client:this});experiences=g({client:this});frameworks=O({client:this});predicates=pe({client:this});features=ge({client:this});conditions=Je();fields=we();responses=Ge({client:this});steps=De();contents=je();actions=Fe({client:this});conditionResults=a.r();stateSnapshotStore=ee({client:this});evaluateRuleLogicFx=ae({client:this});start;readyStore;preconditionPassedStore;conditionPassedStore;lifecycleStageStore;lifecycle=ue({client:this});renderStringFx=(0,u.attach)({source:this.responses.listStore,effect:(e,{template:t,context:n})=>{let r={};for(let t of e)r[t.fieldKey]=t.value;return st(t,{...n,responses:r})}});constructor(e){this.events=xe(this.eventBus),this.projectId=nt(e),this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ye(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.start=this.lifecycle.start,this.readyStore=this.lifecycle.readyStore,this.preconditionPassedStore=this.lifecycle.preconditionPassedStore,this.conditionPassedStore=this.lifecycle.conditionPassedStore,this.lifecycleStageStore=this.lifecycle.lifecycleStageStore,this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.lifecycle.setPrecondition(e.precondition),this.lifecycle.setCondition(e.condition),this.eventBus({type:`load`,version:s.r()}),this.maybeStartPreviewChannel()}maybeStartPreviewChannel(){Q()&&Promise.resolve().then(()=>require("../preview-channel-Cx0e6fye.cjs")).then(e=>e.initPreviewChannel(this)).catch(()=>void 0)}registerFramework=e=>{k(e,this.frameworks)};registerComponent=(e,t)=>{T(e,t,this.components)};registerPlugin=e=>{y(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.lifecycle.registerPluginStartHook(t.onStart)};registerFeature=(e,t)=>{_e(e,t,this.features)};registerPredicate=(e,t)=>{me(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{Oe(e,this.steps)};registerContent=e=>{Me(e,this.contents)};patchContent=(e,t)=>{this.contents.patch(e,t)};registerAction=(e,t)=>{Ie(e,t,this.actions)};registerExperience=e=>{e.component&&T(`experience:${e.id}`,e.component,this.components),this.experiences.register(e)};launchExperienceById=async(e,t)=>{this.experiences.launch({id:e,options:t})};launchExperienceByKey=async(e,t)=>{this.experiences.launch({key:e,options:t})};openExperienceById=async e=>{this.experiences.open({id:e})};openExperienceByKey=async e=>{this.experiences.open({key:e})};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(e=>{this.registerPlugin(e)});return}let t=typeof e==`function`?e():e;if(Array.isArray(t)){t.forEach(e=>this.registerPlugin(e));return}this.registerPlugin(t)})}setupFeatures(){let e=this.options.features;e&&Object.entries(e).forEach(([e,t])=>{let n=typeof t==`function`?t():t;this.registerFeature(e,n)}),this.searchParams.feature&&this.searchParams.feature.forEach(e=>{try{let[t,n]=e.split(`:`);if(!t||!n)return;let r=n;r===`true`&&(r=!0),r===`false`&&(r=!1),this.registerFeature(t,{key:`${r}`,name:t,decide:()=>r,storage:`session`})}catch{}})}setupPredicates(){let e=this.options.predicates;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerPredicate(e,t)})}setupActions(){let e=this.options.actions;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerAction(e,t)})}setupComponents(){let e=this.options.components;e&&Object.entries(e).forEach(([e,t])=>{this.registerComponent(e,t)})}getPluginConfig=e=>this.plugins[e]??{}},ct=`application/picked-javascript`,lt=`application/picked-module`,ut=`data-picked-hydrated`;async function dt(e){if(!(`document`in globalThis))return;let t=`application/picked-module`,n=`data-picked-hydrated`;function r(e,t){let r=document.createElement(`script`);for(let t of Array.from(e.attributes))t.name!==`type`&&r.setAttribute(t.name,t.value);t&&r.setAttribute(`type`,t),r.setAttribute(n,``),e.src?r.async=!1:r.textContent=e.textContent;let i=e.src?new Promise(e=>{r.addEventListener(`load`,()=>e(),{once:!0}),r.addEventListener(`error`,()=>e(),{once:!0})}):null;return e.src?e.replaceWith(r):(globalThis.__pickedEmbedScriptRoot=e.getRootNode(),e.replaceWith(r),globalThis.__pickedEmbedScriptRoot=null),i}let i=Array.from(e.querySelectorAll(`script[type="application/picked-javascript"]:not([${n}]), script[type="${t}"]:not([${n}])`)).filter(e=>e instanceof HTMLScriptElement);for(let e of i){if(!e.isConnected)continue;let n=r(e,e.getAttribute(`type`)===t?`module`:null);n&&await n}}function ft(){return`<script>(${dt.toString()})(document)<\/script>`}function pt(e){return typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&`content`in e&&(typeof e.content==`string`||e.content===null)}function mt(e){return{$$type:`lazy-component`,load:e}}function ht(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var gt=e=>{let t=new $(e);return r.m(t),t};exports.PICKED_HYDRATED_ATTR=ut,exports.PICKED_MODULE_SCRIPT_TYPE=lt,exports.PICKED_SCRIPT_TYPE=ct,exports.PREVIEW_TOKEN_PARAM=Z,exports.Picked=$,exports.buildRehydrateBootstrap=ft,exports.createClient=gt,exports.createPluginEffect=v,exports.createStorageKey=o.t,exports.evaluateRuleLogic=t.t,exports.getPickedConfig=Y,exports.isHtmlAssetValue=pt,exports.isInsideIframe=r.t,exports.isLazyLoader=ht,exports.isPickedRoot=i.a,exports.isPreviewSession=Q,exports.lazyComponent=mt,exports.localStore=o.n,exports.onInertScriptSubtrees=l.t,exports.rehydrateScripts=dt,exports.reportInertScriptSubtrees=l.n,exports.resetInertScriptReport=l.r,exports.sessionStore=o.r,exports.subscribe=o.i,exports.supportsCookies=r.n,exports.supportsCryptoRandomUUID=r.r,exports.supportsDocument=r.i,exports.supportsHistory=r.a,exports.supportsIntersectionObserver=r.o,exports.supportsLocalStorage=r.s,exports.supportsLocation=r.c,exports.supportsSessionStorage=r.l,exports.supportsShadowRoot=r.u,exports.supportsWebComponents=r.d,exports.supportsWindow=r.f;
4
+ (3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes a data-projectid (or project-id) attribute.`)}function Z(e){return e==null||e===``||Number.isNaN(e)}var rt={default:(e,t)=>Z(e)?String(t??``):String(e),append:(e,t)=>t&&!Z(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!Z(e)?`${t} ${e}`:e,upper:e=>typeof e==`string`?e.toUpperCase():e,lower:e=>typeof e==`string`?e.toLowerCase():e,capitalize:e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):e,list:e=>{if(!e||typeof e!=`object`)return e;let t=new Intl.ListFormat(`en`,{style:`long`,type:`conjunction`});if(Array.isArray(e))return t.format(e.map(String));if(e instanceof Map){let n=Array.from(e.entries()).map(([e,t])=>`${e}: ${t}`);return t.format(n)}return e instanceof Set?t.format(Array.from(e).map(String)):e}};function it(e){return typeof e==`object`&&!!e}function at(e,t){let n=t;for(let t of e.split(`.`))if(it(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function ot(e,t){let n=e.split(`|`).map(e=>e.trim()),r=at(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=rt[i];o&&(r=o(r,a))}return Z(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function st(e,t){let n=``,r=0;for(;r<e.length;)if(e[r]===`{`&&e[r+1]===`{`){r+=2;let i=``;for(;r<e.length;){if(e[r]===`}`&&e[r+1]===`}`){r+=2;break}i+=e[r++]}n+=ot(i.trim(),t)}else n+=e[r++];return n}var Q=`preview-token`;function $(){return!r.f()||!r.t()?!1:!!J()[Q]?.[0]}var ct=class{static logger=n.t;options;dataSource=null;contentLoader;previewEmbedderOrigins=null;plugins={};eventBus=(0,u.createEvent)();events;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session=$e();searchParams=J();history=ye();components=w({client:this});experienceInstances=a.n({client:this});experiences=g({client:this});frameworks=O({client:this});predicates=pe({client:this});features=ge({client:this});conditions=Je();fields=we();responses=Ge({client:this});steps=De();contents=je();actions=Fe({client:this});conditionResults=a.r();stateSnapshotStore=ee({client:this});evaluateRuleLogicFx=ae({client:this});start;readyStore;preconditionPassedStore;conditionPassedStore;lifecycleStageStore;lifecycle=ue({client:this});renderStringFx=(0,u.attach)({source:this.responses.listStore,effect:(e,{template:t,context:n})=>{let r={};for(let t of e)r[t.fieldKey]=t.value;return st(t,{...n,responses:r})}});constructor(e){this.events=xe(this.eventBus),this.projectId=nt(e),this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ye(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.start=this.lifecycle.start,this.readyStore=this.lifecycle.readyStore,this.preconditionPassedStore=this.lifecycle.preconditionPassedStore,this.conditionPassedStore=this.lifecycle.conditionPassedStore,this.lifecycleStageStore=this.lifecycle.lifecycleStageStore,this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.lifecycle.setPrecondition(e.precondition),this.lifecycle.setCondition(e.condition),this.eventBus({type:`load`,version:s.r()}),this.maybeStartPreviewChannel()}maybeStartPreviewChannel(){$()&&Promise.resolve().then(()=>require("../preview-channel-Cx0e6fye.cjs")).then(e=>e.initPreviewChannel(this)).catch(()=>void 0)}registerFramework=e=>{k(e,this.frameworks)};registerComponent=(e,t)=>{T(e,t,this.components)};registerPlugin=e=>{y(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.lifecycle.registerPluginStartHook(t.onStart)};registerFeature=(e,t)=>{_e(e,t,this.features)};registerPredicate=(e,t)=>{me(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{Oe(e,this.steps)};registerContent=e=>{Me(e,this.contents)};patchContent=(e,t)=>{this.contents.patch(e,t)};registerAction=(e,t)=>{Ie(e,t,this.actions)};registerExperience=e=>{e.component&&T(`experience:${e.id}`,e.component,this.components),this.experiences.register(e)};launchExperienceById=async(e,t)=>{this.experiences.launch({id:e,options:t})};launchExperienceByKey=async(e,t)=>{this.experiences.launch({key:e,options:t})};openExperienceById=async e=>{this.experiences.open({id:e})};openExperienceByKey=async e=>{this.experiences.open({key:e})};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(e=>{this.registerPlugin(e)});return}let t=typeof e==`function`?e():e;if(Array.isArray(t)){t.forEach(e=>this.registerPlugin(e));return}this.registerPlugin(t)})}setupFeatures(){let e=this.options.features;e&&Object.entries(e).forEach(([e,t])=>{let n=typeof t==`function`?t():t;this.registerFeature(e,n)}),this.searchParams.feature&&this.searchParams.feature.forEach(e=>{try{let[t,n]=e.split(`:`);if(!t||!n)return;let r=n;r===`true`&&(r=!0),r===`false`&&(r=!1),this.registerFeature(t,{key:`${r}`,name:t,decide:()=>r,storage:`session`})}catch{}})}setupPredicates(){let e=this.options.predicates;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerPredicate(e,t)})}setupActions(){let e=this.options.actions;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerAction(e,t)})}setupComponents(){let e=this.options.components;e&&Object.entries(e).forEach(([e,t])=>{this.registerComponent(e,t)})}getPluginConfig=e=>this.plugins[e]??{}},lt=`application/picked-javascript`,ut=`application/picked-module`,dt=`data-picked-hydrated`;async function ft(e){if(!(`document`in globalThis))return;let t=`application/picked-module`,n=`data-picked-hydrated`;function r(e){try{Function(e.textContent)}catch(t){return t instanceof SyntaxError?(console.error(`[picked] Skipped a rehydrated inline script that failed to parse.`,t),e.setAttribute(n,``),!0):!1}return!1}function i(e,t){let r=document.createElement(`script`);for(let t of Array.from(e.attributes))t.name!==`type`&&r.setAttribute(t.name,t.value);t&&r.setAttribute(`type`,t),r.setAttribute(n,``),e.src?r.async=!1:r.textContent=e.textContent;let i=e.src?new Promise(e=>{r.addEventListener(`load`,()=>e(),{once:!0}),r.addEventListener(`error`,()=>e(),{once:!0})}):null;return e.src?e.replaceWith(r):(globalThis.__pickedEmbedScriptRoot=e.getRootNode(),e.replaceWith(r),globalThis.__pickedEmbedScriptRoot=null),i}let a=Array.from(e.querySelectorAll(`script[type="application/picked-javascript"]:not([${n}]), script[type="${t}"]:not([${n}])`)).filter(e=>e instanceof HTMLScriptElement);for(let e of a){if(!e.isConnected)continue;let n=e.getAttribute(`type`)===t?`module`:null;if(!e.src&&n===null&&r(e))continue;let a=i(e,n);a&&await a}}function pt(){return`<script>(${ft.toString()})(document)<\/script>`}function mt(e){return typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&`content`in e&&(typeof e.content==`string`||e.content===null)}function ht(e){return{$$type:`lazy-component`,load:e}}function gt(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var _t=e=>{let t=new ct(e);return r.m(t),t};exports.PICKED_HYDRATED_ATTR=dt,exports.PICKED_MODULE_SCRIPT_TYPE=ut,exports.PICKED_SCRIPT_TYPE=lt,exports.PREVIEW_TOKEN_PARAM=Q,exports.Picked=ct,exports.buildRehydrateBootstrap=pt,exports.createClient=_t,exports.createPluginEffect=v,exports.createStorageKey=o.t,exports.evaluateRuleLogic=t.t,exports.getPickedConfig=X,exports.isHtmlAssetValue=mt,exports.isInsideIframe=r.t,exports.isLazyLoader=gt,exports.isPickedRoot=i.a,exports.isPreviewSession=$,exports.lazyComponent=ht,exports.localStore=o.n,exports.onInertScriptSubtrees=l.t,exports.rehydrateScripts=ft,exports.reportInertScriptSubtrees=l.n,exports.resetInertScriptReport=l.r,exports.sessionStore=o.r,exports.subscribe=o.i,exports.supportsCookies=r.n,exports.supportsCryptoRandomUUID=r.r,exports.supportsDocument=r.i,exports.supportsHistory=r.a,exports.supportsIntersectionObserver=r.o,exports.supportsLocalStorage=r.s,exports.supportsLocation=r.c,exports.supportsSessionStorage=r.l,exports.supportsShadowRoot=r.u,exports.supportsWebComponents=r.d,exports.supportsWindow=r.f;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-K1zSYLAz.cjs"),t=require("../../../plugin-C9epZ61H.cjs");exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=t.t,exports.fetchExperienceContent=t.n,exports.fetchProject=t.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-CoUkIxIr.cjs"),t=require("../../../plugin-CASdGtTX.cjs");exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=t.t,exports.fetchExperienceContent=t.n,exports.fetchProject=t.r;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../experience-instance-DurC3pE-.cjs"),t=require("../../plugin-C9epZ61H.cjs");let n=require("effector");var r=1e4;function i(e){if(e?.location!==void 0)return{location:e.location}}function a(t,n){return t.nodes.filter(e.u).some(e=>n.get(e.stepId)===!0)}async function o(n,o){let{projectConfig:s}=o,c=n.session.store.getState().id;n.conditionResults.reset(),t.i(n,s,{isPreview:!1,sessionId:c});let l=i(o.attributes),u=o.timeoutMs??r,d=new Map(s.steps.map(e=>[e.id,e.layoutContentId!==void 0&&e.layoutContentId!==null])),f=[];for(let t of s.experiences)await e.o(n,{condition:t.condition},{context:l})&&f.push(t);let p=new Map;for(let e of f){if(!a(e,d))continue;let r=o.getContent?await o.getContent({id:e.id,key:e.key},{previewToken:o.previewToken}):await t.n(n.apiUrl,n.projectId,e.id,{previewToken:o.previewToken,signal:AbortSignal.timeout(u)});if(r)for(let e of r.content)p.set(e.id,e)}return{versionId:s.versionId,projectConfig:s,content:Array.from(p.values()),conditionResults:n.conditionResults.store.getState()}}function s(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:t=>e(t),reject:e=>t(e)}}function c(t,r){let{promise:i,resolve:a}=s(),o=(0,n.createEvent)(),c=(0,n.createEvent)(),l=(0,n.createEvent)(),u=(0,n.createEvent)(),d=(0,n.createEvent)(),f=t.experiences.listStore.map(n=>n.map(n=>e.t({client:t,experience:n}))),p=(0,n.createStore)({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),m=(0,n.createEffect)(async e=>{let r=(0,n.attach)({source:e.experience.componentStore,effect:async(n,r)=>{let i=e.availableRenderers[r];return n&&i?.isValidComponent(n.component)?{rendered:await i.render(n.component,t,e.experience),rendererIndex:r}:null}}),i=e.startRendererIndex??0;for(let t=i;t<e.availableRenderers.length;t++){let e=await r(t);if(e)return e}return null}),h=(0,n.createEffect)(async({experience:e,availableRenderers:t,startRendererIndex:n=0})=>e?m({experience:e,availableRenderers:t,startRendererIndex:n}):null);return p.on(l,(e,t)=>({...e,renderedExperiences:[...e.renderedExperiences,t],currentExperienceIndex:e.currentExperienceIndex+1})).on(d,e=>({...e,currentExperienceIndex:e.currentExperienceIndex+1})).on(u,e=>({...e,isComplete:!0})).reset(o),(0,n.sample)({clock:o,target:c}),(0,n.sample)({clock:c,source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex<e.length&&!t.isComplete,fn:({experiences:e,state:t})=>({experience:e[t.currentExperienceIndex],availableRenderers:r,startRendererIndex:0}),target:h}),(0,n.sample)({clock:h.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),(0,n.sample)({clock:l,target:c}),(0,n.sample)({clock:h.doneData,filter:e=>e===null,target:d}),(0,n.sample)({clock:d,target:c}),(0,n.sample)({clock:[c,d,l],source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex>=e.length,target:u}),(0,n.sample)({clock:u,target:(0,n.attach)({source:p,effect:e=>{e.isComplete&&a(e.renderedExperiences)}})}),o(),i}exports.createExperienceInstance=e.t,exports.evaluateConditionMemo=e.i,exports.hashRule=e.a,exports.isExperienceActive=e.o,exports.registerProjectConfig=t.i,exports.render=c,exports.ruleReferencesAction=e.s,exports.ruleReferencesActionDeep=e.c,exports.serialize=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../experience-instance-DurC3pE-.cjs"),t=require("../../plugin-CASdGtTX.cjs");let n=require("effector");var r=1e4;function i(e){if(e?.location!==void 0)return{location:e.location}}function a(t,n){return t.nodes.filter(e.u).some(e=>n.get(e.stepId)===!0)}async function o(n,o){let{projectConfig:s}=o,c=n.session.store.getState().id;n.conditionResults.reset(),t.i(n,s,{isPreview:!1,sessionId:c});let l=i(o.attributes),u=o.timeoutMs??r,d=new Map(s.steps.map(e=>[e.id,e.layoutContentId!==void 0&&e.layoutContentId!==null])),f=[];for(let t of s.experiences)await e.o(n,{condition:t.condition},{context:l})&&f.push(t);let p=new Map;for(let e of f){if(!a(e,d))continue;let r=o.getContent?await o.getContent({id:e.id,key:e.key},{previewToken:o.previewToken}):await t.n(n.apiUrl,n.projectId,e.id,{previewToken:o.previewToken,signal:AbortSignal.timeout(u)});if(r)for(let e of r.content)p.set(e.id,e)}return{versionId:s.versionId,projectConfig:s,content:Array.from(p.values()),conditionResults:n.conditionResults.store.getState()}}function s(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:t=>e(t),reject:e=>t(e)}}function c(t,r){let{promise:i,resolve:a}=s(),o=(0,n.createEvent)(),c=(0,n.createEvent)(),l=(0,n.createEvent)(),u=(0,n.createEvent)(),d=(0,n.createEvent)(),f=t.experiences.listStore.map(n=>n.map(n=>e.t({client:t,experience:n}))),p=(0,n.createStore)({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),m=(0,n.createEffect)(async e=>{let r=(0,n.attach)({source:e.experience.componentStore,effect:async(n,r)=>{let i=e.availableRenderers[r];return n&&i?.isValidComponent(n.component)?{rendered:await i.render(n.component,t,e.experience),rendererIndex:r}:null}}),i=e.startRendererIndex??0;for(let t=i;t<e.availableRenderers.length;t++){let e=await r(t);if(e)return e}return null}),h=(0,n.createEffect)(async({experience:e,availableRenderers:t,startRendererIndex:n=0})=>e?m({experience:e,availableRenderers:t,startRendererIndex:n}):null);return p.on(l,(e,t)=>({...e,renderedExperiences:[...e.renderedExperiences,t],currentExperienceIndex:e.currentExperienceIndex+1})).on(d,e=>({...e,currentExperienceIndex:e.currentExperienceIndex+1})).on(u,e=>({...e,isComplete:!0})).reset(o),(0,n.sample)({clock:o,target:c}),(0,n.sample)({clock:c,source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex<e.length&&!t.isComplete,fn:({experiences:e,state:t})=>({experience:e[t.currentExperienceIndex],availableRenderers:r,startRendererIndex:0}),target:h}),(0,n.sample)({clock:h.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),(0,n.sample)({clock:l,target:c}),(0,n.sample)({clock:h.doneData,filter:e=>e===null,target:d}),(0,n.sample)({clock:d,target:c}),(0,n.sample)({clock:[c,d,l],source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex>=e.length,target:u}),(0,n.sample)({clock:u,target:(0,n.attach)({source:p,effect:e=>{e.isComplete&&a(e.renderedExperiences)}})}),o(),i}exports.createExperienceInstance=e.t,exports.evaluateConditionMemo=e.i,exports.hashRule=e.a,exports.isExperienceActive=e.o,exports.registerProjectConfig=t.i,exports.render=c,exports.ruleReferencesAction=e.s,exports.ruleReferencesActionDeep=e.c,exports.serialize=o;
@@ -23,7 +23,7 @@ Feature flags let you run A/B tests and roll changes out gradually. Control whic
23
23
 
24
24
  ## Keys
25
25
 
26
- Each feature flag has a unique key. Use this key in your application to check whether a visitor is allocated to the flag. The key is set when you create the flag and cannot be changed later.
26
+ Each feature flag has a unique key. Use this key in your application to check whether a visitor is allocated to the feature flag. The key is set when you create the feature flag and cannot be changed later.
27
27
 
28
28
  ## Configure allocation
29
29
 
@@ -31,34 +31,48 @@ Set allocation from the feature flag detail page:
31
31
 
32
32
  | Control | What it does |
33
33
  | --- | --- |
34
- | **Enabled** | Whether visitors are allocated to the flag. A disabled flag allocates nobody. |
35
- | **Weight** | The percentage of visitors allocated to the flag, from 0 to 100. |
36
- | **Description** | An internal note describing what the flag tests. |
34
+ | **Enabled** | Whether visitors are allocated to the feature flag. A disabled feature flag allocates nobody, and records nothing — see [Disabling a feature flag](#disabling-a-feature-flag). |
35
+ | **Weight** | The percentage of visitors allocated to the feature flag, from 0 to 100. |
36
+ | **Description** | An internal note describing what the feature flag tests. |
37
37
 
38
38
  A feature flag has one weight, and resolves to one of two outcomes per visitor: allocated, or not. A weight of 30 allocates 30% of visitors and leaves the other 70% unallocated. A weight of 0 allocates nobody; a weight of 100 allocates everybody.
39
39
 
40
40
  ## How visitors are allocated
41
41
 
42
- Allocation is deterministic. Each visitor is assigned a stable value derived from their visitor ID, which is compared against the flag's weight — if the value falls below the weight, the visitor is allocated.
42
+ Allocation is deterministic. Each visitor is assigned a stable value derived from their visitor ID and the feature flag, which is compared against the feature flag's weight — if the value falls below the weight, the visitor is allocated.
43
43
 
44
- The same visitor always gets the same result, on every visit, as long as the weight and version stay the same.
44
+ The same visitor always gets the same result for a given feature flag, on every visit, as long as the weight stays the same. The version is not part of that value — it controls caching only, covered under [Feature flag versions](#feature-flag-versions).
45
45
 
46
- :::warning
47
- Allocation is shared across feature flags, not calculated independently for each one.
46
+ Each feature flag draws its own value, so concurrent tests are independent of one another. Two feature flags both at weight 50 split visitors into four equal quarters — allocated to both, to one, to the other, to neither. Three feature flags at weight 50 give eight groups of 12.5%, and so on for each feature flag you add.
48
47
 
49
- Every flag compares against the same per-visitor value, so allocations are nested rather than independent. A flag at weight 50 always includes everyone allocated to a flag at weight 30. Two flags both at weight 50 allocate **exactly the same visitors** — not two independent halves.
48
+ :::note
49
+ Within a single feature flag, raising the weight only ever adds visitors. Everyone allocated at weight 30 is still allocated at weight 50, so you can ramp a rollout up without moving anyone already in it. Lowering the weight removes visitors from the top of the range.
50
+ :::
51
+
52
+ ## Disabling a feature flag
53
+
54
+ A disabled feature flag allocates nobody, and the distinction from a weight of 0 matters for your reporting: a visitor is **not in the test at all**, rather than assigned to control.
55
+
56
+ Nothing is recorded. The SDK does not evaluate the feature flag, stores no decision in the visitor's browser, and reports no decision to analytics. Disabled feature flags are absent from the feature list on every analytics event.
50
57
 
51
- If you are running concurrent tests and need genuinely independent groups, this is not supported today. Define the flag in SDK code with your own allocation logic instead.
58
+ Experiences whose conditions reference a disabled feature flag behave as though the visitor is not in the test — the condition reads as not allocated, without an assignment being recorded.
59
+
60
+ Disabling is temporary and does not discard decisions already made. A visitor who was allocated before you disabled the feature flag keeps that decision in their browser, and re-enabling picks up where it left off rather than re-drawing them.
61
+
62
+ :::note
63
+ Expect a step change in reporting when a feature flag is disabled: fewer feature flags per visitor, and fewer decision events overall. That is the disabled feature flag dropping out, not data loss.
52
64
  :::
53
65
 
66
+ Disabled feature flags remain visible in developer tooling, and a [URL override](/sdk/features#url-based-overrides) still forces one on for QA.
67
+
54
68
  ## Feature flag versions
55
69
 
56
- Each feature flag has a version number, starting at 1. The version forms part of the key the SDK uses to cache allocation decisions in the visitor's browser. Incrementing it discards those cached decisions, so every visitor is evaluated again on their next page load.
70
+ Each feature flag has a version number, starting at 1. The version forms part of the key the SDK uses to cache allocation decisions in the visitor's browser, and nothing else — it is not an input to the allocation value itself. Incrementing it discards those cached decisions, so every visitor is evaluated again on their next page load.
57
71
 
58
72
  ### What happens when you increment the version
59
73
 
60
- - **Cached decisions are invalidated.** The SDK caches decisions under a key that includes the version, so the old entry no longer matches and the flag is treated as undecided.
61
- - **Visitors are re-evaluated against the current weight.** Allocation is deterministic, so re-evaluating the same visitor against an unchanged weight produces the same result.
74
+ - **Cached decisions are invalidated.** The SDK caches decisions under a key that includes the version, so the old entry no longer matches and the feature flag is treated as undecided.
75
+ - **Visitors are re-evaluated against the current weight.** Allocation is deterministic and the version is not one of its inputs, so re-evaluating the same visitor against an unchanged weight produces the same result.
62
76
  - **This is irreversible.** You cannot decrement a version.
63
77
 
64
78
  :::note
@@ -6,25 +6,25 @@ layout: docs
6
6
 
7
7
  Reading a feature flag's bucket is what allocates a visitor to it. This page covers when that happens, how to observe it, and how to make sure a visitor is allocated before you report on it.
8
8
 
9
- ## Registering a flag is not deciding it
9
+ ## Registering a feature flag is not deciding it
10
10
 
11
- The SDK loads every flag in your project at startup, but it does not allocate visitors then. A flag stays undecided until something reads its bucket. The first read runs the `decide` function, stores the result, and reports the decision.
11
+ The SDK loads every feature flag in your project at startup, but it does not allocate visitors then. A feature flag stays undecided until something reads its bucket. The first read runs the `decide` function, stores the result, and reports the decision.
12
12
 
13
- That means you choose when a visitor is committed to a flag, simply by choosing when you read it.
13
+ That means you choose when a visitor is committed to a feature flag, simply by choosing when you read it.
14
14
 
15
15
  ## Reading a bucket records an exposure
16
16
 
17
- Because the first read is the decision, reading a bucket is the moment the visitor enters the test. Read every flag at startup and every visitor counts as exposed to every test, including ones they never reached.
17
+ Because the first read is the decision, reading a bucket is the moment the visitor enters the test. Read every feature flag at startup and every visitor counts as exposed to every test, including ones they never reached.
18
18
 
19
19
  :::warning
20
- Avoid looping over every flag at startup to read its bucket. It commits every visitor to every test immediately and removes your ability to defer a decision until the data it depends on has arrived.
20
+ Avoid looping over every feature flag at startup to read its bucket. It commits every visitor to every test immediately and removes your ability to defer a decision until the data it depends on has arrived.
21
21
  :::
22
22
 
23
- Read a flag at the point the decision matters — after the cart loads, after the quote returns, after you know who the visitor is.
23
+ Read a feature flag at the point the decision matters — after the cart loads, after the quote returns, after you know who the visitor is.
24
24
 
25
- ## Inspecting flags without deciding them
25
+ ## Inspecting feature flags without deciding them
26
26
 
27
- `client.features.listStore` holds every registered flag. Each entry reports whether it has been decided yet, so you can inspect flags without committing anyone:
27
+ `client.features.listStore` holds every registered feature flag. Each entry reports whether it has been decided yet, so you can inspect feature flags without committing anyone:
28
28
 
29
29
  ```ts
30
30
  for (const flag of client.features.listStore.getState()) {
@@ -41,7 +41,7 @@ for (const flag of client.features.listStore.getState()) {
41
41
 
42
42
  ## When `feature_decide` fires
43
43
 
44
- A `feature_decide` event is emitted the first time a flag is decided for a visitor — and only then.
44
+ A `feature_decide` event is emitted the first time a feature flag is decided for a visitor — and only then.
45
45
 
46
46
  :::warning
47
47
  On later page loads the decision is restored from browser storage, and **no event is emitted**. A returning visitor produces no `feature_decide` events at all, even though they are still allocated.
@@ -59,7 +59,7 @@ Use the right source for the question you are asking:
59
59
 
60
60
  ## Observing decisions
61
61
 
62
- `listStore` updates whenever a flag resolves, whether it was restored from storage or decided just now. Watching it gives you the current picture at all times:
62
+ `listStore` updates whenever a feature flag resolves, whether it was restored from storage or decided just now. Watching it gives you the current picture at all times:
63
63
 
64
64
  ```ts
65
65
  const buckets = new Map<string, string | boolean>()
@@ -94,7 +94,7 @@ const earlier = client.events
94
94
 
95
95
  ## Deciding before you report
96
96
 
97
- To guarantee a flag is decided before a downstream event fires, await it first:
97
+ To guarantee a feature flag is decided before a downstream event fires, await it first:
98
98
 
99
99
  ```ts
100
100
  const flag = client.features.getById('quote-experiment').getState()
@@ -105,22 +105,22 @@ if (flag) {
105
105
  }
106
106
  ```
107
107
 
108
- Awaiting `getBucket()` resolves the flag if it has not been decided, and returns the stored value if it has. Either way the bucket is known before the next line runs.
108
+ Awaiting `getBucket()` resolves the feature flag if it has not been decided, and returns the stored value if it has. Either way the bucket is known before the next line runs.
109
109
 
110
110
  ## What Picked already reports
111
111
 
112
112
  Before building your own tracking, note what the SDK sends already.
113
113
 
114
- Every Picked analytics event carries a `feature_list` context describing the flags this visitor has resolved:
114
+ Every Picked analytics event carries a `feature_list` context describing the feature flags this visitor has resolved:
115
115
 
116
116
  | Field | Description |
117
117
  | --- | --- |
118
- | `ab_feature` | Flag ID |
119
- | `ab_name` | Flag name |
118
+ | `ab_feature` | Feature flag ID |
119
+ | `ab_name` | Feature flag name |
120
120
  | `ab_key` | Version key, such as `v3` |
121
121
  | `ab_bucket` | The resolved bucket |
122
122
 
123
- Only resolved flags appear, so the context reflects what the visitor was actually exposed to at the time the event fired.
123
+ Only resolved feature flags appear, so the context reflects what the visitor was actually exposed to at the time the event fired.
124
124
 
125
125
  If the [Sentry plugin](https://www.npmjs.com/package/@picked/sentry) is installed, each decision also tags the Sentry scope as `picked.feature.<flag-id>` with the bucket as the value, so errors can be filtered by variant.
126
126
 
@@ -8,25 +8,25 @@ Feature flags let you run A/B tests and roll changes out gradually. Manage them
8
8
 
9
9
  ## Where feature flags come from
10
10
 
11
- Most flags are managed from the dashboard. The [dynamic experiences plugin](/sdk/plugins/dynamic-experiences) fetches your project configuration at runtime and registers every flag automatically — you do not declare them in code.
11
+ Most feature flags are managed from the dashboard. The [dynamic experiences plugin](/sdk/plugins/dynamic-experiences) fetches your project configuration at runtime and registers every feature flag automatically — you do not declare them in code.
12
12
 
13
- For a dashboard-managed flag, the SDK generates the definition:
13
+ For a dashboard-managed feature flag, the SDK generates the definition:
14
14
 
15
15
  | Field | Value |
16
16
  | --- | --- |
17
- | `id` | The flag's dashboard key |
17
+ | `id` | The feature flag's dashboard key |
18
18
  | `key` | `v{version}` — for example `v3` |
19
- | `name` | The flag's dashboard name |
19
+ | `name` | The feature flag's dashboard name |
20
20
  | `enabled` | The dashboard **Enabled** toggle |
21
21
  | `weight` | The dashboard **Weight**, 0–100 |
22
22
  | `storage` | `local`, or `session` in [preview mode](/sdk/feature-allocation#preview-mode) |
23
- | `decide` | Generated — allocates by comparing the visitor's stable value against `weight` |
23
+ | `decide` | Generated — allocates by comparing the visitor's stable value for this feature flag against `weight` |
24
24
 
25
- The generated `decide` derives from the visitor ID and the weight alone, so a dashboard-managed flag cannot base its decision on your application's data. Define the flag in SDK code when you need that.
25
+ The generated `decide` derives from the visitor ID, the feature flag ID, and the weight alone, so a dashboard-managed feature flag cannot base its decision on your application's data. Define the feature flag in SDK code when you need that.
26
26
 
27
- ## Defining flags in SDK code
27
+ ## Defining feature flags in SDK code
28
28
 
29
- Define flags when creating the Picked client by passing a `features` object. Use this when a decision depends on data only your application has. Each flag requires a unique identifier, a versioning key, a human-readable name, and a `decide` function:
29
+ Define feature flags when creating the Picked client by passing a `features` object. Use this when a decision depends on data only your application has. Each feature flag requires a unique identifier, a versioning key, a human-readable name, and a `decide` function:
30
30
 
31
31
  ```ts
32
32
  import { createClient } from '@picked/client'
@@ -72,8 +72,8 @@ features: {
72
72
 
73
73
  When a feature flag is registered, the SDK follows this execution order:
74
74
 
75
- 1. **Registration** — flags are registered with the client at startup. Registering does not allocate anyone.
76
- 2. **Cache check** — the SDK looks in browser storage for a decision from a previous visit, keyed by the flag `id` and `key`. If one exists the flag starts out already resolved, which is why a returning visitor is allocated before anything reads the flag.
75
+ 1. **Registration** — feature flags are registered with the client at startup. Registering does not allocate anyone.
76
+ 2. **Cache check** — the SDK looks in browser storage for a decision from a previous visit, keyed by the feature flag `id` and `key`. If one exists the feature flag starts out already resolved, which is why a returning visitor is allocated before anything reads the feature flag.
77
77
  3. **Lazy evaluation** — with no cached decision, `decide` runs the first time something reads the bucket.
78
78
  4. **Storage** — the resolved bucket is written to browser storage.
79
79
  5. **Event emission** — a `feature_decide` event fires, but only for a decision made during this page view. A decision restored in step 2 emits nothing.
@@ -153,18 +153,18 @@ function MyComponent() {
153
153
 
154
154
  ### Choosing an accessor
155
155
 
156
- Accessors differ in what they return, and in whether reading one resolves the flag. Resolving is what commits a visitor to a bucket and reports the decision — see [Allocation and exposure](/sdk/feature-allocation).
156
+ Accessors differ in what they return, and in whether reading one resolves the feature flag. Resolving is what commits a visitor to a bucket and reports the decision — see [Allocation and exposure](/sdk/feature-allocation).
157
157
 
158
- | API | Returns | Resolves the flag? |
158
+ | API | Returns | Resolves the feature flag? |
159
159
  | --- | --- | --- |
160
160
  | `useFeature` / `getFeature` | `() => Promise<bucket>` | Only when you call the returned function |
161
161
  | `useFeatureResult` / `getFeatureResult` | `{ id, bucket }`, `undefined` until resolved | Yes, as soon as the component renders |
162
- | `useFeatureEnabled` / `getFeatureEnabled` | `boolean \| undefined` — the dashboard **Enabled** flag | No |
163
- | `client.features.listStore` | Every registered flag, each with an `isResolved` flag | No |
164
- | `client.features.getById(id)` | A store holding a single flag | No |
162
+ | `useFeatureEnabled` / `getFeatureEnabled` | `boolean \| undefined` — the dashboard **Enabled** toggle | No |
163
+ | `client.features.listStore` | Every registered feature flag, each with an `isResolved` boolean | No |
164
+ | `client.features.getById(id)` | A store holding a single feature flag | No |
165
165
 
166
166
  :::warning
167
- `useFeatureResult` and `getFeatureResult` resolve the flag as soon as the component renders, committing the visitor to a bucket at that moment.
167
+ `useFeatureResult` and `getFeatureResult` resolve the feature flag as soon as the component renders, committing the visitor to a bucket at that moment.
168
168
 
169
169
  If the decision should wait for data you do not have yet — a cart, a quote, a signed-in profile — use `useFeature` or `getFeature` and call the function they return once that data arrives.
170
170
  :::
@@ -193,13 +193,13 @@ const myExperience = createExperience({
193
193
  })
194
194
  ```
195
195
 
196
- The ID in `features.<id>` is the flag's **Key** from the dashboard — the same value shown on the flag detail page.
196
+ The ID in `features.<id>` is the feature flag's **Key** from the dashboard — the same value shown on the feature flag detail page.
197
197
 
198
- Evaluating a condition reads the bucket, so a flag referenced by an experience condition is allocated at the moment that condition runs.
198
+ Evaluating a condition reads the bucket, so a feature flag referenced by an experience condition is allocated at the moment that condition runs.
199
199
 
200
200
  ## Listening to feature flag decisions
201
201
 
202
- Subscribe to the `feature_decide` event to track when flags are resolved:
202
+ Subscribe to the `feature_decide` event to track when feature flags are resolved:
203
203
 
204
204
  ```ts
205
205
  client.eventBus.watch((event) => {
@@ -219,25 +219,25 @@ client.eventBus.watch((event) => {
219
219
 
220
220
  ## Versioning and cache invalidation
221
221
 
222
- Feature flag decisions are cached in browser storage (localStorage, or sessionStorage in preview) under a key derived from the flag ID and version, so a visitor keeps the same decision across page loads.
222
+ Feature flag decisions are cached in browser storage (localStorage, or sessionStorage in preview) under a key derived from the feature flag ID and version, so a visitor keeps the same decision across page loads.
223
223
 
224
224
  :::warning
225
- Bucket values that are strings, such as `'variant-a'`, are not yet restored correctly from storage — the visitor is treated as unallocated on their next page load. Boolean bucket values, which includes every flag managed from the dashboard, are unaffected. Tracked in PICK-1574.
225
+ Bucket values that are strings, such as `'variant-a'`, are not yet restored correctly from storage — the visitor is treated as unallocated on their next page load. Boolean bucket values, which includes every feature flag managed from the dashboard, are unaffected. Tracked in PICK-1574.
226
226
  :::
227
227
 
228
228
  ### How versioning works
229
229
 
230
- When you create a feature flag in the dashboard, it starts at version 1. The SDK uses the version to build the cache key — for example, a flag at version 3 caches under `v3`.
230
+ When you create a feature flag in the dashboard, it starts at version 1. The SDK uses the version to build the cache key — for example, a feature flag at version 3 caches under `v3`.
231
231
 
232
- The version affects **caching only**. It is not part of the allocation calculation, which for dashboard-managed flags derives from the visitor ID and the flag's weight.
232
+ The version affects **caching only**. It is not part of the allocation calculation, which for dashboard-managed feature flags derives from the visitor ID, the feature flag ID, and the feature flag's weight.
233
233
 
234
234
  ### What happens when the version is incremented
235
235
 
236
- When you increment a flag's version in the dashboard:
236
+ When you increment a feature flag's version in the dashboard:
237
237
 
238
- 1. **Cache keys change.** The old cache entry (e.g., `v3`) no longer matches the new key (`v4`), so the SDK treats the flag as undecided.
238
+ 1. **Cache keys change.** The old cache entry (e.g., `v3`) no longer matches the new key (`v4`), so the SDK treats the feature flag as undecided.
239
239
  2. **The `decide` function runs again.** On the next page load, the SDK calls `decide()` fresh and caches the new result.
240
- 3. **Visitors are re-evaluated, not reshuffled.** For dashboard-managed flags allocation is deterministic, so re-evaluating the same visitor against an unchanged weight produces the same bucket.
240
+ 3. **Visitors are re-evaluated, not reshuffled.** For dashboard-managed feature flags allocation is deterministic, so re-evaluating the same visitor against an unchanged weight produces the same bucket.
241
241
 
242
242
  :::note
243
243
  Incrementing the version clears cached decisions and runs allocation again. It does not randomise visitors — with an unchanged weight, everyone lands where they were. Increment it after changing a weight, so visitors who already hold a cached decision are re-evaluated against the new one.
@@ -256,11 +256,11 @@ features: {
256
256
  }
257
257
  ```
258
258
 
259
- For flags managed through the dashboard, versioning is handled automatically — the dashboard appends the version number to the cache key used by the SDK.
259
+ For feature flags managed through the dashboard, versioning is handled automatically — the dashboard appends the version number to the cache key used by the SDK.
260
260
 
261
261
  ## Best practices
262
262
 
263
263
  - **Use `session` storage for temporary tests**: Set `storage: 'session'` for short-lived experiments that shouldn't persist across browser sessions
264
- - **Keep `decide` functions fast**: Anything awaiting the flag — an experience condition, a component reading the result — waits for `decide` to finish, so avoid slow network calls inside it
265
- - **Allocate when the decision matters**: Defer reading a flag until the data it depends on has arrived, rather than reading every flag at startup. See [Allocation and exposure](/sdk/feature-allocation)
266
- - **Return consistent types**: Don't mix boolean and string returns for the same flag - pick one type and stick with it
264
+ - **Keep `decide` functions fast**: Anything awaiting the feature flag — an experience condition, a component reading the result — waits for `decide` to finish, so avoid slow network calls inside it
265
+ - **Allocate when the decision matters**: Defer reading a feature flag until the data it depends on has arrived, rather than reading every feature flag at startup. See [Allocation and exposure](/sdk/feature-allocation)
266
+ - **Return consistent types**: Don't mix boolean and string returns for the same feature flag - pick one type and stick with it