posthog-js 1.316.0 → 1.317.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/all-external-dependencies.js +1 -1
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.full.es5.js +1 -1
- package/dist/array.full.es5.js.map +1 -1
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +1 -1
- package/dist/array.full.no-external.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/customizations.full.js +1 -1
- package/dist/element-inference.d.ts +21 -0
- package/dist/element-inference.js +2 -0
- package/dist/element-inference.js.map +1 -0
- package/dist/lazy-recorder.js +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.d.ts +12 -0
- package/dist/module.full.d.ts +12 -0
- package/dist/module.full.js +1 -1
- package/dist/module.full.js.map +1 -1
- package/dist/module.full.no-external.d.ts +12 -0
- package/dist/module.full.no-external.js +1 -1
- package/dist/module.full.no-external.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +12 -0
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/dist/posthog-recorder.js +1 -1
- package/dist/product-tours-preview.d.ts +12 -0
- package/dist/product-tours-preview.js +1 -1
- package/dist/product-tours-preview.js.map +1 -1
- package/dist/product-tours.js +1 -1
- package/dist/product-tours.js.map +1 -1
- package/dist/src/entrypoints/element-inference.es.d.ts +1 -0
- package/dist/src/entrypoints/product-tours.d.ts +2 -0
- package/dist/src/extensions/product-tours/element-inference.d.ts +30 -0
- package/dist/src/extensions/product-tours/index.d.ts +2 -0
- package/dist/src/extensions/product-tours/product-tours-utils.d.ts +2 -1
- package/dist/src/extensions/surveys.d.ts +2 -2
- package/dist/src/posthog-product-tours-types.d.ts +7 -0
- package/dist/src/utils/survey-branching.d.ts +11 -0
- package/dist/src/utils/survey-url-prefill.d.ts +7 -5
- package/dist/surveys-preview.d.ts +18 -1
- package/dist/surveys-preview.js +1 -1
- package/dist/surveys-preview.js.map +1 -1
- package/dist/surveys.js +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +5 -1
- package/lib/src/entrypoints/element-inference.es.d.ts +1 -0
- package/lib/src/entrypoints/element-inference.es.js +8 -0
- package/lib/src/entrypoints/element-inference.es.js.map +1 -0
- package/lib/src/entrypoints/product-tours.d.ts +2 -0
- package/lib/src/entrypoints/product-tours.js +5 -0
- package/lib/src/entrypoints/product-tours.js.map +1 -1
- package/lib/src/extensions/product-tours/components/ProductTourTooltip.js +5 -2
- package/lib/src/extensions/product-tours/components/ProductTourTooltip.js.map +1 -1
- package/lib/src/extensions/product-tours/components/ProductTourTooltipInner.js +1 -1
- package/lib/src/extensions/product-tours/components/ProductTourTooltipInner.js.map +1 -1
- package/lib/src/extensions/product-tours/element-inference.d.ts +30 -0
- package/lib/src/extensions/product-tours/element-inference.js +296 -0
- package/lib/src/extensions/product-tours/element-inference.js.map +1 -0
- package/lib/src/extensions/product-tours/index.d.ts +2 -0
- package/lib/src/extensions/product-tours/index.js +4 -1
- package/lib/src/extensions/product-tours/index.js.map +1 -1
- package/lib/src/extensions/product-tours/preview.js +1 -1
- package/lib/src/extensions/product-tours/preview.js.map +1 -1
- package/lib/src/extensions/product-tours/product-tours-utils.d.ts +2 -1
- package/lib/src/extensions/product-tours/product-tours-utils.js +12 -0
- package/lib/src/extensions/product-tours/product-tours-utils.js.map +1 -1
- package/lib/src/extensions/product-tours/product-tours.js +15 -31
- package/lib/src/extensions/product-tours/product-tours.js.map +1 -1
- package/lib/src/extensions/surveys.d.ts +2 -2
- package/lib/src/extensions/surveys.js +5 -94
- package/lib/src/extensions/surveys.js.map +1 -1
- package/lib/src/posthog-product-tours-types.d.ts +7 -0
- package/lib/src/posthog-product-tours-types.js.map +1 -1
- package/lib/src/utils/survey-branching.d.ts +11 -0
- package/lib/src/utils/survey-branching.js +106 -0
- package/lib/src/utils/survey-branching.js.map +1 -0
- package/lib/src/utils/survey-url-prefill.d.ts +7 -5
- package/lib/src/utils/survey-url-prefill.js +30 -18
- package/lib/src/utils/survey-url-prefill.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -3
package/dist/surveys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surveys.js","sources":["../../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/dist/preact.module.js","../../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/hooks/dist/hooks.module.js","../src/posthog-surveys-types.ts","../src/utils/globals.ts","../../core/dist/utils/type-utils.mjs","../../core/dist/utils/user-agent-utils.mjs","../src/utils/logger.ts","../src/utils/index.ts","../src/utils/survey-utils.ts","../src/uuidv7.ts","../src/request.ts","../src/utils/regex-utils.ts","../src/utils/property-utils.ts","../src/extensions/utils/stylesheet-loader.ts","../src/extensions/surveys/surveys-extension-utils.tsx","../src/extensions/surveys/icons.tsx","../src/extensions/surveys/components/PostHogLogo.tsx","../src/extensions/surveys/components/BottomSection.tsx","../src/extensions/surveys/components/QuestionHeader.tsx","../src/extensions/surveys/components/ConfirmationMessage.tsx","../src/extensions/surveys/components/QuestionTypes.tsx","../src/extensions/surveys.tsx","../src/constants.ts","../src/utils/survey-url-prefill.ts","../src/entrypoints/surveys.ts"],"sourcesContent":["var n,l,u,t,i,o,r,f,e,c={},s=[],a=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,h=Array.isArray;function v(n,l){for(var u in l)n[u]=l[u];return n}function p(n){var l=n.parentNode;l&&l.removeChild(n)}function y(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return d(l,f,i,o,null)}function d(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function _(){return{current:null}}function g(n){return n.children}function b(n,l){this.props=n,this.context=l}function m(n,l){if(null==l)return n.__?m(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?m(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function w(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!x.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(x)}function x(){var n,u,t,o,r,e,c,s,a;for(i.sort(f);n=i.shift();)n.__d&&(u=i.length,o=void 0,e=(r=(t=n).__v).__e,s=[],a=[],(c=t.__P)&&((o=v({},r)).__v=r.__v+1,l.vnode&&l.vnode(o),L(c,o,r,t.__n,void 0!==c.ownerSVGElement,32&r.__u?[e]:null,s,null==e?m(r):e,!!(32&r.__u),a),o.__.__k[o.__i]=o,M(s,o,a),o.__e!=e&&k(o)),i.length>u&&i.sort(f));x.__r=0}function C(n,l,u,t,i,o,r,f,e,a,h){var v,p,y,d,_,g=t&&t.__k||s,b=l.length;for(u.__d=e,P(u,l,g),e=u.__d,v=0;v<b;v++)null!=(y=u.__k[v])&&\"boolean\"!=typeof y&&\"function\"!=typeof y&&(p=-1===y.__i?c:g[y.__i]||c,y.__i=v,L(n,y,p,i,o,r,f,e,a,h),d=y.__e,y.ref&&p.ref!=y.ref&&(p.ref&&z(p.ref,null,y),h.push(y.ref,y.__c||d,y)),null==_&&null!=d&&(_=d),65536&y.__u||p.__k===y.__k?e=S(y,e,n):\"function\"==typeof y.type&&void 0!==y.__d?e=y.__d:d&&(e=d.nextSibling),y.__d=void 0,y.__u&=-196609);u.__d=e,u.__e=_}function P(n,l,u){var t,i,o,r,f,e=l.length,c=u.length,s=c,a=0;for(n.__k=[],t=0;t<e;t++)null!=(i=n.__k[t]=null==(i=l[t])||\"boolean\"==typeof i||\"function\"==typeof i?null:\"string\"==typeof i||\"number\"==typeof i||\"bigint\"==typeof i||i.constructor==String?d(null,i,null,null,i):h(i)?d(g,{children:i},null,null,null):void 0===i.constructor&&i.__b>0?d(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=H(i,u,r=t+a,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,\"function\"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f===r+1?a++:f>r?s>e-r?a+=f-r:a--:a=f<r&&f==r-1?f-r:0,f!==t+a&&(i.__u|=65536))):(o=u[t])&&null==o.key&&o.__e&&(o.__e==n.__d&&(n.__d=m(o)),N(o,o,!1),u[t]=null,s--);if(s)for(t=0;t<c;t++)null!=(o=u[t])&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=m(o)),N(o,o))}function S(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=S(t[i],l,u));return l}return n.__e!=l&&(u.insertBefore(n.__e,l||null),l=n.__e),l&&l.nextSibling}function $(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(h(n)?n.some(function(n){$(n,l)}):l.push(n)),l}function H(n,l,u,t){var i=n.key,o=n.type,r=u-1,f=u+1,e=l[u];if(null===e||e&&i==e.key&&o===e.type)return u;if(t>(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f<l.length;){if(r>=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f<l.length){if((e=l[f])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return f;f++}}return-1}function I(n,l,u){\"-\"===l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||a.test(l)?u:u+\"px\"}function T(n,l,u,t,i){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||I(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||I(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/(PointerCapture)$|Capture$/,\"$1\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=Date.now(),n.addEventListener(l,o?D:A,o)):n.removeEventListener(l,o?D:A,o);else{if(i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!==l&&\"height\"!==l&&\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&\"rowSpan\"!==l&&\"colSpan\"!==l&&\"role\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!==l[4]?n.removeAttribute(l):n.setAttribute(l,u))}}function A(n){var u=this.l[n.type+!1];if(n.t){if(n.t<=u.u)return}else n.t=Date.now();return u(l.event?l.event(n):n)}function D(n){return this.l[n.type+!0](l.event?l.event(n):n)}function L(n,u,t,i,o,r,f,e,c,s){var a,p,y,d,_,m,k,w,x,P,S,$,H,I,T,A=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[e=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof A)try{if(w=u.props,x=(a=A.contextType)&&i[a.__c],P=a?x?x.props.value:a.__:i,t.__c?k=(p=u.__c=t.__c).__=p.__E:(\"prototype\"in A&&A.prototype.render?u.__c=p=new A(w,P):(u.__c=p=new b(w,P),p.constructor=A,p.render=O),x&&x.sub(p),p.props=w,p.state||(p.state={}),p.context=P,p.__n=i,y=p.__d=!0,p.__h=[],p._sb=[]),null==p.__s&&(p.__s=p.state),null!=A.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=v({},p.__s)),v(p.__s,A.getDerivedStateFromProps(w,p.__s))),d=p.props,_=p.state,p.__v=u,y)null==A.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==A.getDerivedStateFromProps&&w!==d&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(w,P),!p.__e&&(null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(w,p.__s,P)||u.__v===t.__v)){for(u.__v!==t.__v&&(p.props=w,p.state=p.__s,p.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u)}),S=0;S<p._sb.length;S++)p.__h.push(p._sb[S]);p._sb=[],p.__h.length&&f.push(p);break n}null!=p.componentWillUpdate&&p.componentWillUpdate(w,p.__s,P),null!=p.componentDidUpdate&&p.__h.push(function(){p.componentDidUpdate(d,_,m)})}if(p.context=P,p.props=w,p.__P=n,p.__e=!1,$=l.__r,H=0,\"prototype\"in A&&A.prototype.render){for(p.state=p.__s,p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),I=0;I<p._sb.length;I++)p.__h.push(p._sb[I]);p._sb=[]}else do{p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),p.state=p.__s}while(p.__d&&++H<25);p.state=p.__s,null!=p.getChildContext&&(i=v(v({},i),p.getChildContext())),y||null==p.getSnapshotBeforeUpdate||(m=p.getSnapshotBeforeUpdate(d,_)),C(n,h(T=null!=a&&a.type===g&&null==a.key?a.props.children:a)?T:[T],u,t,i,o,r,f,e,c,s),p.base=u.__e,u.__u&=-161,p.__h.length&&f.push(p),k&&(p.__E=p.__=null)}catch(n){u.__v=null,c||null!=r?(u.__e=e,u.__u|=c?160:32,r[r.indexOf(e)]=null):(u.__e=t.__e,u.__k=t.__k),l.__e(n,u,t)}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=j(t.__e,u,t,i,o,r,f,c,s);(a=l.diffed)&&a(u)}function M(n,u,t){u.__d=void 0;for(var i=0;i<t.length;i++)z(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function j(l,u,t,i,o,r,f,e,s){var a,v,y,d,_,g,b,k=t.props,w=u.props,x=u.type;if(\"svg\"===x&&(o=!0),null!=r)for(a=0;a<r.length;a++)if((_=r[a])&&\"setAttribute\"in _==!!x&&(x?_.localName===x:3===_.nodeType)){l=_,r[a]=null;break}if(null==l){if(null===x)return document.createTextNode(w);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",x):document.createElement(x,w.is&&w),r=null,e=!1}if(null===x)k===w||e&&l.data===w||(l.data=w);else{if(r=r&&n.call(l.childNodes),k=t.props||c,!e&&null!=r)for(k={},a=0;a<l.attributes.length;a++)k[(_=l.attributes[a]).name]=_.value;for(a in k)_=k[a],\"children\"==a||(\"dangerouslySetInnerHTML\"==a?y=_:\"key\"===a||a in w||T(l,a,null,_,o));for(a in w)_=w[a],\"children\"==a?d=_:\"dangerouslySetInnerHTML\"==a?v=_:\"value\"==a?g=_:\"checked\"==a?b=_:\"key\"===a||e&&\"function\"!=typeof _||k[a]===_||T(l,a,_,k[a],o);if(v)e||y&&(v.__html===y.__html||v.__html===l.innerHTML)||(l.innerHTML=v.__html),u.__k=[];else if(y&&(l.innerHTML=\"\"),C(l,h(d)?d:[d],u,t,i,o&&\"foreignObject\"!==x,r,f,r?r[0]:t.__k&&m(t,0),e,s),null!=r)for(a=r.length;a--;)null!=r[a]&&p(r[a]);e||(a=\"value\",void 0!==g&&(g!==l[a]||\"progress\"===x&&!g||\"option\"===x&&g!==k[a])&&T(l,a,g,k[a],!1),a=\"checked\",void 0!==b&&b!==l[a]&&T(l,a,b,k[a],!1))}return l}function z(n,u,t){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,t)}}function N(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||z(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null,n.__c=void 0}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&N(i[o],u,t||\"function\"!=typeof n.type);t||null==n.__e||p(n.__e),n.__=n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function q(u,t,i){var o,r,f,e;l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],e=[],L(t,u=(!o&&i||t).__k=y(g,null,[u]),r||c,c,void 0!==t.ownerSVGElement,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,f,!o&&i?i:r?r.__e:t.firstChild,o,e),M(f,u,e)}function B(n,l){q(n,l,B)}function E(l,u,t){var i,o,r,f,e=v({},l.props);for(r in l.type&&l.type.defaultProps&&(f=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=void 0===u[r]&&void 0!==f?f[r]:u[r];return arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),d(l.type,e,i||l.key,o||l.ref,null)}function F(n,l){var u={__c:l=\"__cC\"+e++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,w(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=v({},this.state),\"function\"==typeof n&&(n=n(v({},u),this.props)),n&&v(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),w(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),w(this))},b.prototype.render=g,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},x.__r=0,e=0;export{b as Component,g as Fragment,E as cloneElement,F as createContext,y as createElement,_ as createRef,y as h,B as hydrate,t as isValidElement,l as options,q as render,$ as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=[],e=n.__b,a=n.__r,v=n.diffed,l=n.__c,m=n.unmount;function d(t,u){n.__h&&n.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c}),i.__[t]}function h(n){return o=1,s(B,n)}function s(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function p(u,i){var o=d(t++,3);!n.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o))}function y(u,i){var o=d(t++,4);!n.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o))}function _(n){return o=5,F(function(){return{current:n}},[])}function A(n,t,r){o=6,y(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function F(n,r){var u=d(t++,7);return z(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function q(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x(t,r){n.useDebugValue&&n.useDebugValue(r?r(t):t)}function P(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function V(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w),t.__H.__h=[]}catch(r){t.__H.__h=[],n.__e(r,t.__v)}}n.__b=function(n){r=null,e&&e(n)},n.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0})):(i.__h.forEach(k),i.__h.forEach(w),i.__h=[],t=0)),u=r},n.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===n.requestAnimationFrame||((i=n.requestAnimationFrame)||j)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c})),u=r=null},n.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return!n.__||w(n)})}catch(u){r.some(function(n){n.__h&&(n.__h=[])}),r=[],n.__e(u,t.__v)}}),l&&l(t,r)},n.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n)}catch(n){r=n}}),u.__H=void 0,r&&n.__e(r,u.__v))};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r))}function k(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function w(n){var t=r;n.__c=n.__(),r=t}function z(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B(n,t){return\"function\"==typeof t?t(n):t}export{T as useCallback,q as useContext,x as useDebugValue,p as useEffect,P as useErrorBoundary,V as useId,A as useImperativeHandle,y as useLayoutEffect,F as useMemo,s as useReducer,_ as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\n\nimport type { PropertyMatchType } from './types'\nimport type { SurveyAppearance as CoreSurveyAppearance } from '@posthog/core'\n\nexport enum SurveyEventType {\n Activation = 'events',\n Cancellation = 'cancelEvents',\n}\n\n// Extended operator type to include numeric operators not in PropertyMatchType\nexport type PropertyOperator = PropertyMatchType | 'gt' | 'lt'\n\nexport type PropertyFilters = {\n [propertyName: string]: {\n values: string[]\n operator: PropertyOperator\n }\n}\n\nexport interface SurveyEventWithFilters {\n name: string\n propertyFilters?: PropertyFilters\n}\n\nexport enum SurveyWidgetType {\n Button = 'button',\n Tab = 'tab',\n Selector = 'selector',\n}\n\nexport enum SurveyPosition {\n TopLeft = 'top_left',\n TopRight = 'top_right',\n TopCenter = 'top_center',\n MiddleLeft = 'middle_left',\n MiddleRight = 'middle_right',\n MiddleCenter = 'middle_center',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n NextToTrigger = 'next_to_trigger',\n}\n\nexport enum SurveyTabPosition {\n Top = 'top',\n Left = 'left',\n Right = 'right',\n Bottom = 'bottom',\n}\n\n// Extends core SurveyAppearance with browser-specific fields\n// Omit 'position' from core because browser's SurveyPosition has additional values (e.g., NextToTrigger)\nexport interface SurveyAppearance extends Omit<CoreSurveyAppearance, 'position'> {\n // Browser-specific fields not in core\n /** @deprecated - not currently used */\n descriptionTextColor?: string\n ratingButtonHoverColor?: string\n whiteLabel?: boolean\n tabPosition?: SurveyTabPosition\n fontFamily?: string\n maxWidth?: string\n zIndex?: string\n disabledButtonOpacity?: string\n boxPadding?: string\n /** @deprecated Use inputBackground instead (inherited from core) */\n inputBackgroundColor?: string\n // Hide the X (cancel) button - defaults to false (show the button)\n hideCancelButton?: boolean\n // Browser's SurveyPosition has more options than core (e.g., NextToTrigger)\n position?: SurveyPosition\n}\n\nexport enum SurveyType {\n Popover = 'popover',\n API = 'api',\n Widget = 'widget',\n ExternalSurvey = 'external_survey',\n}\n\nexport type SurveyQuestion = BasicSurveyQuestion | LinkSurveyQuestion | RatingSurveyQuestion | MultipleSurveyQuestion\n\nexport type SurveyQuestionDescriptionContentType = 'html' | 'text'\n\ninterface SurveyQuestionBase {\n question: string\n id?: string\n description?: string | null\n descriptionContentType?: SurveyQuestionDescriptionContentType\n optional?: boolean\n buttonText?: string\n branching?: NextQuestionBranching | EndBranching | ResponseBasedBranching | SpecificQuestionBranching\n}\n\nexport interface BasicSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Open\n}\n\nexport interface LinkSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Link\n link?: string | null\n}\n\nexport interface RatingSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Rating\n display: 'number' | 'emoji'\n scale: 3 | 5 | 7 | 10\n lowerBoundLabel: string\n upperBoundLabel: string\n skipSubmitButton?: boolean\n}\n\nexport interface MultipleSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.SingleChoice | SurveyQuestionType.MultipleChoice\n choices: string[]\n hasOpenChoice?: boolean\n shuffleOptions?: boolean\n skipSubmitButton?: boolean\n}\n\nexport enum SurveyQuestionType {\n Open = 'open',\n MultipleChoice = 'multiple_choice',\n SingleChoice = 'single_choice',\n Rating = 'rating',\n Link = 'link',\n}\n\nexport enum SurveyQuestionBranchingType {\n NextQuestion = 'next_question',\n End = 'end',\n ResponseBased = 'response_based',\n SpecificQuestion = 'specific_question',\n}\n\ninterface NextQuestionBranching {\n type: SurveyQuestionBranchingType.NextQuestion\n}\n\ninterface EndBranching {\n type: SurveyQuestionBranchingType.End\n}\n\ninterface ResponseBasedBranching {\n type: SurveyQuestionBranchingType.ResponseBased\n responseValues: Record<string, any>\n}\n\ninterface SpecificQuestionBranching {\n type: SurveyQuestionBranchingType.SpecificQuestion\n index: number\n}\n\nexport type SurveyCallback = (surveys: Survey[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport interface SurveyElement {\n text?: string\n $el_text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\nexport interface SurveyRenderReason {\n visible: boolean\n disabledReason?: string\n}\n\nexport enum SurveySchedule {\n Once = 'once',\n Recurring = 'recurring',\n Always = 'always',\n}\n\nexport interface Survey {\n // Sync this with the backend's SurveyAPISerializer!\n id: string\n name: string\n description: string\n type: SurveyType\n feature_flag_keys:\n | {\n key: string\n value?: string\n }[]\n | null\n // the linked flag key is the flag key that is used to link the survey to a flag\n linked_flag_key: string | null\n targeting_flag_key: string | null\n // the internal targeting flag key is the flag key that is used to target users who have seen the survey\n // eg survey-targeting-<survey-id>\n internal_targeting_flag_key: string | null\n questions: SurveyQuestion[]\n appearance: SurveyAppearance | null\n conditions: {\n url?: string\n selector?: string\n seenSurveyWaitPeriodInDays?: number\n urlMatchType?: PropertyMatchType\n /** events that trigger surveys */\n events: {\n repeatedActivation?: boolean\n values: SurveyEventWithFilters[]\n } | null\n /** events that cancel \"pending\" (time-delayed) surveys */\n cancelEvents: {\n values: SurveyEventWithFilters[]\n } | null\n actions: {\n values: SurveyActionType[]\n } | null\n deviceTypes?: string[]\n deviceTypesMatchType?: PropertyMatchType\n linkedFlagVariant?: string\n } | null\n start_date: string | null\n end_date: string | null\n current_iteration: number | null\n current_iteration_start_date: string | null\n schedule?: SurveySchedule | null\n enable_partial_responses?: boolean | null\n}\n\nexport type SurveyWithTypeAndAppearance = Pick<Survey, 'id' | 'type' | 'appearance'>\n\nexport interface SurveyActionType {\n id: number\n name: string | null\n steps?: ActionStepType[]\n}\n\n/** Sync with plugin-server/src/types.ts */\nexport type ActionStepStringMatching = 'contains' | 'exact' | 'regex'\n\nexport interface ActionStepType {\n event?: string | null\n selector?: string | null\n /** pre-compiled regex pattern for matching selector against $elements_chain */\n selector_regex?: string | null\n /** @deprecated Only `selector` should be used now. */\n tag_name?: string\n text?: string | null\n /** @default StringMatching.Exact */\n text_matching?: ActionStepStringMatching | null\n href?: string | null\n /** @default ActionStepStringMatching.Exact */\n href_matching?: ActionStepStringMatching | null\n url?: string | null\n /** @default StringMatching.Contains */\n url_matching?: ActionStepStringMatching | null\n /** Property filters for action step matching */\n properties?: {\n key: string\n value?: string | number | boolean | (string | number | boolean)[] | null\n operator?: PropertyMatchType\n type?: string\n }[]\n}\n\nexport enum SurveyEventName {\n SHOWN = 'survey shown',\n DISMISSED = 'survey dismissed',\n SENT = 'survey sent',\n ABANDONED = 'survey abandoned',\n}\n\nexport enum SurveyEventProperties {\n SURVEY_ID = '$survey_id',\n SURVEY_NAME = '$survey_name',\n SURVEY_RESPONSE = '$survey_response',\n SURVEY_ITERATION = '$survey_iteration',\n SURVEY_ITERATION_START_DATE = '$survey_iteration_start_date',\n SURVEY_PARTIALLY_COMPLETED = '$survey_partially_completed',\n SURVEY_SUBMISSION_ID = '$survey_submission_id',\n SURVEY_QUESTIONS = '$survey_questions',\n SURVEY_COMPLETED = '$survey_completed',\n PRODUCT_TOUR_ID = '$product_tour_id',\n SURVEY_LAST_SEEN_DATE = '$survey_last_seen_date',\n}\n\nexport enum DisplaySurveyType {\n Popover = 'popover',\n Inline = 'inline',\n}\n\ninterface DisplaySurveyOptionsBase {\n ignoreConditions: boolean\n ignoreDelay: boolean\n displayType: DisplaySurveyType\n}\n\ninterface DisplaySurveyPopoverOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Popover\n}\n\ninterface DisplaySurveyInlineOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Inline\n selector: string\n}\n\nexport type DisplaySurveyOptions = DisplaySurveyPopoverOptions | DisplaySurveyInlineOptions\n\nexport interface SurveyConfig {\n prefillFromUrl?: boolean\n /**\n * @deprecated No longer used. Surveys will automatically advance past\n * prefilled questions with skipSubmitButton enabled. If partial response\n * collection is enabled, partial responses for pre-filled questions will\n * be submitted automatically on page load.\n */\n autoSubmitIfComplete?: boolean\n /**\n * @deprecated No longer used. Pre-filled responses are now sent\n * immediately when partial responses are enabled, or all required\n * quesions have been pre-filled.\n */\n autoSubmitDelay?: number\n}\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x);\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import { includes } from \"./string-utils.mjs\";\nimport { isFunction, isUndefined } from \"./type-utils.mjs\";\nconst FACEBOOK = 'Facebook';\nconst MOBILE = 'Mobile';\nconst IOS = 'iOS';\nconst ANDROID = 'Android';\nconst TABLET = 'Tablet';\nconst ANDROID_TABLET = ANDROID + ' ' + TABLET;\nconst IPAD = 'iPad';\nconst APPLE = 'Apple';\nconst APPLE_WATCH = APPLE + ' Watch';\nconst SAFARI = 'Safari';\nconst BLACKBERRY = 'BlackBerry';\nconst SAMSUNG = 'Samsung';\nconst SAMSUNG_BROWSER = SAMSUNG + 'Browser';\nconst SAMSUNG_INTERNET = SAMSUNG + ' Internet';\nconst CHROME = 'Chrome';\nconst CHROME_OS = CHROME + ' OS';\nconst CHROME_IOS = CHROME + ' ' + IOS;\nconst INTERNET_EXPLORER = 'Internet Explorer';\nconst INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE;\nconst OPERA = 'Opera';\nconst OPERA_MINI = OPERA + ' Mini';\nconst EDGE = 'Edge';\nconst MICROSOFT_EDGE = 'Microsoft ' + EDGE;\nconst FIREFOX = 'Firefox';\nconst FIREFOX_IOS = FIREFOX + ' ' + IOS;\nconst NINTENDO = 'Nintendo';\nconst PLAYSTATION = 'PlayStation';\nconst XBOX = 'Xbox';\nconst ANDROID_MOBILE = ANDROID + ' ' + MOBILE;\nconst MOBILE_SAFARI = MOBILE + ' ' + SAFARI;\nconst WINDOWS = 'Windows';\nconst WINDOWS_PHONE = WINDOWS + ' Phone';\nconst NOKIA = 'Nokia';\nconst OUYA = 'Ouya';\nconst GENERIC = 'Generic';\nconst GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase();\nconst GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase();\nconst KONQUEROR = 'Konqueror';\nconst BROWSER_VERSION_REGEX_SUFFIX = '(\\\\d+(\\\\.\\\\d+)?)';\nconst DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX);\nconst XBOX_REGEX = new RegExp(XBOX, 'i');\nconst PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\\\w+', 'i');\nconst NINTENDO_REGEX = new RegExp(NINTENDO + ' \\\\w+', 'i');\nconst BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i');\nconst windowsVersionMap = {\n 'NT3.51': 'NT 3.11',\n 'NT4.0': 'NT 4.0',\n '5.0': '2000',\n '5.1': 'XP',\n '5.2': 'XP',\n '6.0': 'Vista',\n '6.1': '7',\n '6.2': '8',\n '6.3': '8.1',\n '6.4': '10',\n '10.0': '10'\n};\nfunction isSafari(userAgent) {\n return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID);\n}\nconst safariCheck = (ua, vendor)=>vendor && includes(vendor, APPLE) || isSafari(ua);\nconst detectBrowser = function(user_agent, vendor) {\n vendor = vendor || '';\n if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) return OPERA_MINI;\n if (includes(user_agent, ' OPR/')) return OPERA;\n if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) return INTERNET_EXPLORER_MOBILE;\n if (includes(user_agent, SAMSUNG_BROWSER)) return SAMSUNG_INTERNET;\n else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) return MICROSOFT_EDGE;\n else if (includes(user_agent, 'FBIOS')) return FACEBOOK + ' ' + MOBILE;\n else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) return 'UC Browser';\n else if (includes(user_agent, 'CriOS')) return CHROME_IOS;\n else if (includes(user_agent, 'CrMo')) return CHROME;\n else if (includes(user_agent, CHROME)) return CHROME;\n else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) return ANDROID_MOBILE;\n else if (includes(user_agent, 'FxiOS')) return FIREFOX_IOS;\n else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) return KONQUEROR;\n else if (safariCheck(user_agent, vendor)) return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI;\n else if (includes(user_agent, FIREFOX)) return FIREFOX;\n else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) return INTERNET_EXPLORER;\n else if (includes(user_agent, 'Gecko')) return FIREFOX;\n return '';\n};\nconst versionRegexes = {\n [INTERNET_EXPLORER_MOBILE]: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [MICROSOFT_EDGE]: [\n new RegExp(EDGE + '?\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME]: [\n new RegExp('(' + CHROME + '|CrMo)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME_IOS]: [\n new RegExp('CriOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n 'UC Browser': [\n new RegExp('(UCBrowser|UCWEB)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [MOBILE_SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [OPERA]: [\n new RegExp('(' + OPERA + '|OPR)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX]: [\n new RegExp(FIREFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX_IOS]: [\n new RegExp('FxiOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [KONQUEROR]: [\n new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [BLACKBERRY]: [\n new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX),\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [ANDROID_MOBILE]: [\n new RegExp('android\\\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [SAMSUNG_INTERNET]: [\n new RegExp(SAMSUNG_BROWSER + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [INTERNET_EXPLORER]: [\n new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n Mozilla: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ]\n};\nconst detectBrowserVersion = function(userAgent, vendor) {\n const browser = detectBrowser(userAgent, vendor);\n const regexes = versionRegexes[browser];\n if (isUndefined(regexes)) return null;\n for(let i = 0; i < regexes.length; i++){\n const regex = regexes[i];\n const matches = userAgent.match(regex);\n if (matches) return parseFloat(matches[matches.length - 2]);\n }\n return null;\n};\nconst osMatchers = [\n [\n new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),\n (match)=>[\n XBOX,\n match && match[1] || ''\n ]\n ],\n [\n new RegExp(NINTENDO, 'i'),\n [\n NINTENDO,\n ''\n ]\n ],\n [\n new RegExp(PLAYSTATION, 'i'),\n [\n PLAYSTATION,\n ''\n ]\n ],\n [\n BLACKBERRY_REGEX,\n [\n BLACKBERRY,\n ''\n ]\n ],\n [\n new RegExp(WINDOWS, 'i'),\n (_, user_agent)=>{\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) return [\n WINDOWS_PHONE,\n ''\n ];\n if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\\b/.test(user_agent)) return [\n WINDOWS + ' ' + MOBILE,\n ''\n ];\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent);\n if (match && match[1]) {\n const version = match[1];\n let osVersion = windowsVersionMap[version] || '';\n if (/arm/i.test(user_agent)) osVersion = 'RT';\n return [\n WINDOWS,\n osVersion\n ];\n }\n return [\n WINDOWS,\n ''\n ];\n }\n ],\n [\n /((iPhone|iPad|iPod).*?OS (\\d+)_(\\d+)_?(\\d+)?|iPhone)/,\n (match)=>{\n if (match && match[3]) {\n const versionParts = [\n match[3],\n match[4],\n match[5] || '0'\n ];\n return [\n IOS,\n versionParts.join('.')\n ];\n }\n return [\n IOS,\n ''\n ];\n }\n ],\n [\n /(watch.*\\/(\\d+\\.\\d+\\.\\d+)|watch os,(\\d+\\.\\d+),)/i,\n (match)=>{\n let version = '';\n if (match && match.length >= 3) version = isUndefined(match[2]) ? match[3] : match[2];\n return [\n 'watchOS',\n version\n ];\n }\n ],\n [\n new RegExp('(' + ANDROID + ' (\\\\d+)\\\\.(\\\\d+)\\\\.?(\\\\d+)?|' + ANDROID + ')', 'i'),\n (match)=>{\n if (match && match[2]) {\n const versionParts = [\n match[2],\n match[3],\n match[4] || '0'\n ];\n return [\n ANDROID,\n versionParts.join('.')\n ];\n }\n return [\n ANDROID,\n ''\n ];\n }\n ],\n [\n /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i,\n (match)=>{\n const result = [\n 'Mac OS X',\n ''\n ];\n if (match && match[1]) {\n const versionParts = [\n match[1],\n match[2],\n match[3] || '0'\n ];\n result[1] = versionParts.join('.');\n }\n return result;\n }\n ],\n [\n /Mac/i,\n [\n 'Mac OS X',\n ''\n ]\n ],\n [\n /CrOS/,\n [\n CHROME_OS,\n ''\n ]\n ],\n [\n /Linux|debian/i,\n [\n 'Linux',\n ''\n ]\n ]\n];\nconst detectOS = function(user_agent) {\n for(let i = 0; i < osMatchers.length; i++){\n const [rgex, resultOrFn] = osMatchers[i];\n const match = rgex.exec(user_agent);\n const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn);\n if (result) return result;\n }\n return [\n '',\n ''\n ];\n};\nconst detectDevice = function(user_agent) {\n if (NINTENDO_REGEX.test(user_agent)) return NINTENDO;\n if (PLAYSTATION_REGEX.test(user_agent)) return PLAYSTATION;\n if (XBOX_REGEX.test(user_agent)) return XBOX;\n if (new RegExp(OUYA, 'i').test(user_agent)) return OUYA;\n if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) return WINDOWS_PHONE;\n else if (/iPad/.test(user_agent)) return IPAD;\n else if (/iPod/.test(user_agent)) return 'iPod Touch';\n else if (/iPhone/.test(user_agent)) return 'iPhone';\n else if (/(watch)(?: ?os[,/]|\\d,\\d\\/)[\\d.]+/i.test(user_agent)) return APPLE_WATCH;\n else if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n else if (/(kobo)\\s(ereader|touch)/i.test(user_agent)) return 'Kobo';\n else if (new RegExp(NOKIA, 'i').test(user_agent)) return NOKIA;\n else if (/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i.test(user_agent) || /(kf[a-z]+)( bui|\\)).+silk\\//i.test(user_agent)) return 'Kindle Fire';\n else if (/(Android|ZTE)/i.test(user_agent)) if (!(!new RegExp(MOBILE).test(user_agent) || /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent))) return ANDROID;\n else {\n if (/pixel[\\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent) || /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) || /lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent)) return ANDROID;\n return ANDROID_TABLET;\n }\n else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) return GENERIC_MOBILE;\n else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) return GENERIC_TABLET;\n else return '';\n};\nconst detectDeviceType = function(user_agent) {\n const device = detectDevice(user_agent);\n if (device === IPAD || device === ANDROID_TABLET || 'Kobo' === device || 'Kindle Fire' === device || device === GENERIC_TABLET) return TABLET;\n if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) return 'Console';\n if (device === APPLE_WATCH) return 'Wearable';\n if (device) return MOBILE;\n return 'Desktop';\n};\nexport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS };\n","import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void\n uninitializedWarning: (methodName: string) => void\n createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n const logger: PosthogJsLogger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if (\n window &&\n (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n !isUndefined(window.console) &&\n window.console\n ) {\n const consoleLog =\n '__rrweb_original__' in window.console[level]\n ? (window.console[level] as any)['__rrweb_original__']\n : window.console[level]\n\n // eslint-disable-next-line no-console\n consoleLog(prefix, ...args)\n }\n },\n\n info: (...args: any[]) => {\n logger._log('log', ...args)\n },\n\n warn: (...args: any[]) => {\n logger._log('warn', ...args)\n },\n\n error: (...args: any[]) => {\n logger._log('error', ...args)\n },\n\n critical: (...args: any[]) => {\n // Critical errors are always logged to the console\n // eslint-disable-next-line no-console\n console.error(prefix, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n\n createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n _createLogger(`${prefix} ${additionalPrefix}`, options),\n }\n return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n","import { Breaker, Properties } from '../types'\nimport { nativeForEach, nativeIndexOf } from './globals'\nimport { logger } from './logger'\nimport { isFormData, isNull, isNullish, isNumber, isString, isUndefined, hasOwnProperty, isArray } from '@posthog/core'\n\nconst breaker: Breaker = {}\n\nexport function eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (isNullish(obj)) {\n return\n }\n if (isArray(obj)) {\n return eachArray(obj, iterator, thisArg)\n }\n if (isFormData(obj)) {\n for (const pair of obj.entries()) {\n if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {\n return\n }\n }\n return\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const extendArray = function <T>(obj: T[], ...args: T[][]): T[] {\n eachArray(args, function (source) {\n eachArray(source, function (item) {\n obj.push(item)\n })\n })\n return obj\n}\n\nexport const include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (isNull(obj)) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch {\n return undefined\n }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical(\n 'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n )\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n const ret: Properties = {}\n each(p, function (v, k) {\n if ((isString(v) && v.length > 0) || isNumber(v)) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (isArray(value)) {\n result = [] as any as T\n eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any) => {\n if (isString(value) && !isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n const hostname = documentLocation?.hostname\n\n if (!isString(hostname)) {\n return false\n }\n // split and slice isn't a great way to match arbitrary domains,\n // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n // for the hostname\n const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n if (lastTwoParts === excluded) {\n return false\n }\n }\n\n return true\n}\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n for (let i = 0; i < value.length; i++) {\n if (predicate(value[i])) {\n return value[i]\n }\n }\n return undefined\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n element: Window | Document | Element | undefined,\n event: string,\n callback: EventListener,\n options?: AddEventListenerOptions\n): void {\n const { capture = false, passive = true } = options ?? {}\n\n // This is the only place where we are allowed to call this function\n // because the whole idea is that we should be calling this instead of the built-in one\n // eslint-disable-next-line posthog-js/no-add-event-listener\n element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n config: Record<string, any>,\n newField: string,\n oldField: string,\n defaultValue: T,\n loggerInstance?: { warn: (message: string) => void }\n): T {\n const hasNewField = newField in config && !isUndefined(config[newField])\n const hasOldField = oldField in config && !isUndefined(config[oldField])\n\n if (hasNewField) {\n return config[newField]\n }\n\n if (hasOldField) {\n if (loggerInstance) {\n loggerInstance.warn(\n `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n `The old field will be removed in a future major version.`\n )\n }\n return config[oldField]\n }\n\n return defaultValue\n}\n","import { DisplaySurveyOptions, DisplaySurveyType, Survey, SurveyType } from '../posthog-surveys-types'\nimport { createLogger } from '../utils/logger'\n\nexport const SURVEY_LOGGER = createLogger('[Surveys]')\n\nexport function isSurveyRunning(survey: Survey): boolean {\n return !!(survey.start_date && !survey.end_date)\n}\n\nexport function doesSurveyActivateByEvent(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.events?.values?.length\n}\n\nexport function doesSurveyActivateByAction(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.actions?.values?.length\n}\n\nexport const SURVEY_SEEN_PREFIX = 'seenSurvey_'\nexport const SURVEY_IN_PROGRESS_PREFIX = 'inProgressSurvey_'\nexport const SURVEY_ABANDONED_PREFIX = 'abandonedSurvey_'\n\nexport const getSurveyInteractionProperty = (\n survey: Pick<Survey, 'id' | 'current_iteration'>,\n action: 'responded' | 'dismissed'\n): string => {\n let surveyProperty = `$survey_${action}/${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n surveyProperty = `$survey_${action}/${survey.id}/${survey.current_iteration}`\n }\n\n return surveyProperty\n}\n\nconst getSurveyStorageKey = (prefix: string, survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n let key = `${prefix}${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n key = `${prefix}${survey.id}_${survey.current_iteration}`\n }\n return key\n}\n\nexport const getSurveySeenKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_SEEN_PREFIX, survey)\n}\n\nexport const getSurveyAbandonedKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_ABANDONED_PREFIX, survey)\n}\n\nexport const setSurveySeenOnLocalStorage = (survey: Pick<Survey, 'id' | 'current_iteration'>) => {\n const isSurveySeen = localStorage.getItem(getSurveySeenKey(survey))\n // if survey is already seen, no need to set it again\n if (isSurveySeen) {\n return\n }\n\n localStorage.setItem(getSurveySeenKey(survey), 'true')\n}\n\n// These surveys are relevant for the getActiveMatchingSurveys method. They are used to\n// display surveys in our customer's application. Any new in-app survey type should be added here.\nexport const IN_APP_SURVEY_TYPES = [SurveyType.Popover, SurveyType.Widget, SurveyType.API]\n\nexport const DEFAULT_DISPLAY_SURVEY_OPTIONS: DisplaySurveyOptions = {\n ignoreConditions: false,\n ignoreDelay: false,\n displayType: DisplaySurveyType.Popover,\n}\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private _timestamp = 0\n private _counter = 0\n private readonly _random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (!isUndefined(value)) {\n return value\n } else {\n // reset state and resume\n this._timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (isUndefined(valueAfterReset)) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this._timestamp) {\n this._timestamp = ts\n this._resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this._counter++\n if (this._counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this._timestamp++\n this._resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this._timestamp,\n Math.trunc(this._counter / 2 ** 30),\n this._counter & (2 ** 30 - 1),\n this._random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private _resetCounter(): void {\n this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n // TRICKY: don't use the isUndefined method here as can't pass the reference\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly _buffer = new Uint32Array(8)\n private _cursor = Infinity\n nextUint32(): number {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer)\n this._cursor = 0\n }\n return this._buffer[this._cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n // remove hyphens\n const hex = uuid.replace(/-/g, '')\n // ensure that it's a version 7 UUID\n if (hex.length !== 32) {\n throw new Error('Not a valid UUID')\n }\n if (hex[12] !== '7') {\n throw new Error('Not a UUIDv7')\n }\n // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n return parseInt(hex.substring(0, 12), 16)\n}\n","import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart\n estimatedSize: number\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n const updatedSearch =\n search?.split('&').map((pair) => {\n const [key, origValue] = pair.split('=')\n const value = replace ? (newParams[key] ?? origValue) : origValue\n delete newParams[key]\n return `${key}=${value}`\n }) ?? []\n\n const remaining = formDataToQuery(newParams)\n if (remaining) {\n updatedSearch.push(remaining)\n }\n\n return `${baseUrl}?${updatedSearch.join('&')}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n // see https://github.com/PostHog/posthog-js/issues/1440\n // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n // would not be able to operate on these numerically anyway.\n return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = ({ data, compression }: RequestWithOptions): EncodedBody | undefined => {\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n const blob = new Blob([gzipData], { type: CONTENT_TYPE_PLAIN })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: blob,\n estimatedSize: blob.size,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const req = new XMLHttpRequest!()\n req.open(options.method || 'GET', options.url, true)\n const { contentType, body } = encodePostData(options) ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n if (!options.disableXHRCredentials) {\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n // eslint-disable-next-line compat/compat\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n const url = options.url\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => controller.abort(), options.timeout),\n }\n }\n\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch((error) => {\n logger.error(error)\n options.callback?.({ statusCode: 0, text: error })\n })\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n const url = extendURLParams(options.url, {\n beacon: '1',\n })\n\n try {\n const { contentType, body } = encodePostData(options) ?? {}\n // sendBeacon requires a blob so we convert it\n const sendBeaconBody = typeof body === 'string' ? new Blob([body], { type: contentType }) : body\n navigator!.sendBeacon!(url, sendBeaconBody)\n } catch {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options = { ..._options }\n options.timeout = options.timeout || 60000\n\n options.url = extendURLParams(options.url, {\n _: new Date().getTime().toString(),\n ver: Config.LIB_VERSION,\n compression: options.compression,\n })\n\n const transport = options.transport ?? 'fetch'\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n transportMethod(options)\n}\n","export const isValidRegex = function (str: string): boolean {\n try {\n new RegExp(str)\n } catch {\n return false\n }\n return true\n}\n\nexport const isMatchingRegex = function (value: string, pattern: string): boolean {\n if (!isValidRegex(pattern)) return false\n\n try {\n return new RegExp(pattern).test(value)\n } catch {\n return false\n }\n}\n","import { isNull, isUndefined } from '@posthog/core'\nimport { jsonStringify } from '../request'\nimport { PropertyFilters, PropertyOperator } from '../posthog-surveys-types'\nimport type { Properties } from '../types'\nimport { isMatchingRegex } from './regex-utils'\n\nexport function getPersonPropertiesHash(\n distinct_id: string,\n userPropertiesToSet?: Properties,\n userPropertiesToSetOnce?: Properties\n): string {\n return jsonStringify({ distinct_id, userPropertiesToSet, userPropertiesToSetOnce })\n}\n\nexport const propertyComparisons: Record<PropertyOperator, (targets: string[], values: string[]) => boolean> = {\n exact: (targets, values) => values.some((value) => targets.some((target) => value === target)),\n is_not: (targets, values) => values.every((value) => targets.every((target) => value !== target)),\n regex: (targets, values) => values.some((value) => targets.some((target) => isMatchingRegex(value, target))),\n not_regex: (targets, values) => values.every((value) => targets.every((target) => !isMatchingRegex(value, target))),\n icontains: (targets, values) =>\n values.map(toLowerCase).some((value) => targets.map(toLowerCase).some((target) => value.includes(target))),\n not_icontains: (targets, values) =>\n values.map(toLowerCase).every((value) => targets.map(toLowerCase).every((target) => !value.includes(target))),\n gt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue > parseFloat(t))\n }),\n lt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue < parseFloat(t))\n }),\n}\n\nconst toLowerCase = (v: string): string => v.toLowerCase()\n\nexport function matchPropertyFilters(\n propertyFilters: PropertyFilters | undefined,\n eventProperties: Properties | undefined\n): boolean {\n // if there are no property filters, it means we're only matching on event name\n if (!propertyFilters) {\n return true\n }\n\n return Object.entries(propertyFilters).every(([propertyName, filter]) => {\n const eventPropertyValue = eventProperties?.[propertyName]\n\n if (isUndefined(eventPropertyValue) || isNull(eventPropertyValue)) {\n return false\n }\n\n // convert event property to string array for comparison\n const eventValues = [String(eventPropertyValue)]\n\n const comparisonFunction = propertyComparisons[filter.operator]\n if (!comparisonFunction) {\n return false\n }\n\n return comparisonFunction(filter.values, eventValues)\n })\n}\n","import { PostHog } from '../../posthog-core'\nimport { createLogger } from '../../utils/logger'\n\nconst logger = createLogger('[Stylesheet Loader]')\n\nexport const prepareStylesheet = (document: Document, innerText: string, posthog?: PostHog) => {\n // Forcing the existence of `document` requires this function to be called in a browser environment\n let stylesheet: HTMLStyleElement | null = document.createElement('style')\n stylesheet.innerText = innerText\n\n if (posthog?.config?.prepare_external_dependency_stylesheet) {\n stylesheet = posthog.config.prepare_external_dependency_stylesheet(stylesheet)\n }\n\n if (!stylesheet) {\n logger.error('prepare_external_dependency_stylesheet returned null')\n return null\n }\n\n return stylesheet\n}\n","import { VNode, cloneElement, createContext, type JSX } from 'preact'\nimport { PostHog } from '../../posthog-core'\nimport {\n MultipleSurveyQuestion,\n Survey,\n SurveyAppearance,\n SurveyEventName,\n SurveyEventProperties,\n SurveyPosition,\n SurveyQuestion,\n SurveySchedule,\n SurveyType,\n SurveyWidgetType,\n} from '../../posthog-surveys-types'\nimport { document as _document, window as _window, userAgent } from '../../utils/globals'\nimport {\n getSurveyInteractionProperty,\n getSurveySeenKey,\n getSurveyAbandonedKey,\n SURVEY_LOGGER as logger,\n setSurveySeenOnLocalStorage,\n SURVEY_IN_PROGRESS_PREFIX,\n} from '../../utils/survey-utils'\nimport { isArray, isNullish } from '@posthog/core'\n\nimport { detectDeviceType } from '@posthog/core'\nimport { propertyComparisons } from '../../utils/property-utils'\nimport { PropertyMatchType } from '../../types'\nimport { prepareStylesheet } from '../utils/stylesheet-loader'\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\nimport surveyStyles from './survey.css'\nimport { useContext } from 'preact/hooks'\n\nexport function getFontFamily(fontFamily?: string): string {\n if (fontFamily === 'inherit') {\n return 'inherit'\n }\n\n const defaultFontStack =\n 'BlinkMacSystemFont, \"Inter\", \"Segoe UI\", \"Roboto\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"'\n return fontFamily ? `${fontFamily}, ${defaultFontStack}` : `-apple-system, ${defaultFontStack}`\n}\n\nexport function getSurveyResponseKey(questionId: string) {\n return `$survey_response_${questionId}`\n}\n\nconst BLACK_TEXT_COLOR = '#020617' // Maps out to text-slate-950 from tailwind colors. Intended for text use outside interactive elements like buttons\n\n// Keep in sync with defaultSurveyAppearance on the main app\nexport const defaultSurveyAppearance = {\n fontFamily: 'inherit',\n backgroundColor: '#eeeded',\n submitButtonColor: 'black',\n submitButtonTextColor: 'white',\n ratingButtonColor: 'white',\n ratingButtonActiveColor: 'black',\n borderColor: '#c9c6c6',\n placeholder: 'Start typing...',\n whiteLabel: false,\n displayThankYouMessage: true,\n thankYouMessageHeader: 'Thank you for your feedback!',\n position: SurveyPosition.Right,\n widgetType: SurveyWidgetType.Tab,\n widgetLabel: 'Feedback',\n widgetColor: 'black',\n zIndex: '2147483647',\n disabledButtonOpacity: '0.6',\n maxWidth: '300px',\n textSubtleColor: '#939393',\n boxPadding: '20px 24px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n borderRadius: '10px',\n shuffleQuestions: false,\n surveyPopupDelaySeconds: undefined,\n // Not customizable atm\n outlineColor: 'rgba(59, 130, 246, 0.8)',\n inputBackground: 'white',\n inputTextColor: BLACK_TEXT_COLOR,\n scrollbarThumbColor: 'var(--ph-survey-border-color)',\n scrollbarTrackColor: 'var(--ph-survey-background-color)',\n} as const\n\nexport const addSurveyCSSVariablesToElement = (\n element: HTMLElement,\n type: SurveyType,\n appearance?: SurveyAppearance | null\n) => {\n const effectiveAppearance = { ...defaultSurveyAppearance, ...appearance }\n const hostStyle = element.style\n\n const surveyHasBottomBorder =\n ![SurveyPosition.Center, SurveyPosition.Left, SurveyPosition.Right].includes(effectiveAppearance.position) ||\n (type === SurveyType.Widget && appearance?.widgetType === SurveyWidgetType.Tab)\n\n hostStyle.setProperty('--ph-survey-font-family', getFontFamily(effectiveAppearance.fontFamily))\n hostStyle.setProperty('--ph-survey-box-padding', effectiveAppearance.boxPadding)\n hostStyle.setProperty('--ph-survey-max-width', effectiveAppearance.maxWidth)\n hostStyle.setProperty('--ph-survey-z-index', effectiveAppearance.zIndex)\n hostStyle.setProperty('--ph-survey-border-color', effectiveAppearance.borderColor)\n // Non-bottom surveys or tab surveys have the border bottom\n if (surveyHasBottomBorder) {\n hostStyle.setProperty('--ph-survey-border-radius', effectiveAppearance.borderRadius)\n hostStyle.setProperty('--ph-survey-border-bottom', '1.5px solid var(--ph-survey-border-color)')\n } else {\n hostStyle.setProperty('--ph-survey-border-bottom', 'none')\n hostStyle.setProperty(\n '--ph-survey-border-radius',\n `${effectiveAppearance.borderRadius} ${effectiveAppearance.borderRadius} 0 0`\n )\n }\n hostStyle.setProperty('--ph-survey-background-color', effectiveAppearance.backgroundColor)\n hostStyle.setProperty('--ph-survey-box-shadow', effectiveAppearance.boxShadow)\n hostStyle.setProperty('--ph-survey-disabled-button-opacity', effectiveAppearance.disabledButtonOpacity)\n hostStyle.setProperty('--ph-survey-submit-button-color', effectiveAppearance.submitButtonColor)\n hostStyle.setProperty(\n '--ph-survey-submit-button-text-color',\n appearance?.submitButtonTextColor || getContrastingTextColor(effectiveAppearance.submitButtonColor)\n )\n hostStyle.setProperty('--ph-survey-rating-bg-color', effectiveAppearance.ratingButtonColor)\n hostStyle.setProperty('--ph-survey-rating-active-bg-color', effectiveAppearance.ratingButtonActiveColor)\n // Active rating text is always auto-calculated for contrast with active background\n hostStyle.setProperty(\n '--ph-survey-rating-active-text-color',\n getContrastingTextColor(effectiveAppearance.ratingButtonActiveColor)\n )\n // Primary text color: use override if provided, otherwise auto-calculate from background\n hostStyle.setProperty(\n '--ph-survey-text-primary-color',\n appearance?.textColor || getContrastingTextColor(effectiveAppearance.backgroundColor)\n )\n hostStyle.setProperty('--ph-survey-text-subtle-color', effectiveAppearance.textSubtleColor)\n hostStyle.setProperty('--ph-widget-color', effectiveAppearance.widgetColor)\n hostStyle.setProperty('--ph-widget-text-color', getContrastingTextColor(effectiveAppearance.widgetColor))\n hostStyle.setProperty('--ph-widget-z-index', effectiveAppearance.zIndex)\n\n // Use user-provided inputBackground (or deprecated inputBackgroundColor for backwards compat)\n // Fallback to internal default, with slight adjustment for white backgrounds\n const userInputBg = appearance?.inputBackground || appearance?.inputBackgroundColor\n let inputBgColor = userInputBg || effectiveAppearance.inputBackground\n if (!userInputBg && effectiveAppearance.backgroundColor === 'white') {\n inputBgColor = '#f8f8f8'\n }\n hostStyle.setProperty('--ph-survey-input-background', inputBgColor)\n // Input text color applies to both text inputs and inactive rating buttons\n const inputTextColor = appearance?.inputTextColor || getContrastingTextColor(inputBgColor)\n hostStyle.setProperty('--ph-survey-input-text-color', inputTextColor)\n hostStyle.setProperty('--ph-survey-rating-text-color', inputTextColor)\n hostStyle.setProperty('--ph-survey-scrollbar-thumb-color', effectiveAppearance.scrollbarThumbColor)\n hostStyle.setProperty('--ph-survey-scrollbar-track-color', effectiveAppearance.scrollbarTrackColor)\n hostStyle.setProperty('--ph-survey-outline-color', effectiveAppearance.outlineColor)\n}\n\nfunction nameToHex(name: string) {\n return {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n 'indianred ': '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgrey: '#d3d3d3',\n lightgreen: '#90ee90',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370d8',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#d87093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n }[name.toLowerCase()]\n}\n\nexport function hex2rgb(c: string): string {\n if (c.startsWith('#')) {\n let hexColor = c.replace(/^#/, '')\n // Handle 3-character shorthand (e.g., #111 -> #111111, #abc -> #aabbcc)\n if (/^[0-9A-Fa-f]{3}$/.test(hexColor)) {\n hexColor = hexColor[0] + hexColor[0] + hexColor[1] + hexColor[1] + hexColor[2] + hexColor[2]\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(hexColor)) {\n return 'rgb(255, 255, 255)'\n }\n const r = parseInt(hexColor.slice(0, 2), 16)\n const g = parseInt(hexColor.slice(2, 4), 16)\n const b = parseInt(hexColor.slice(4, 6), 16)\n return `rgb(${r},${g},${b})`\n }\n return 'rgb(255, 255, 255)'\n}\n\nexport function hexToRgba(hex: string, opacity: number): string {\n const rgb = hex2rgb(hex)\n const match = rgb.match(/^rgb\\((\\d+),(\\d+),(\\d+)\\)$/)\n if (!match) {\n return hex\n }\n return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${opacity})`\n}\n\nexport function getContrastingTextColor(color: string = defaultSurveyAppearance.backgroundColor) {\n let rgb\n if (color[0] === '#') {\n rgb = hex2rgb(color)\n }\n if (color.startsWith('rgb')) {\n rgb = color\n }\n // otherwise it's a color name\n const nameColorToHex = nameToHex(color)\n if (nameColorToHex) {\n rgb = hex2rgb(nameColorToHex)\n }\n if (!rgb) {\n return BLACK_TEXT_COLOR\n }\n const colorMatch = rgb.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/)\n if (colorMatch) {\n const r = parseInt(colorMatch[1])\n const g = parseInt(colorMatch[2])\n const b = parseInt(colorMatch[3])\n const hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b))\n return hsp > 127.5 ? BLACK_TEXT_COLOR : 'white'\n }\n return BLACK_TEXT_COLOR\n}\n\nexport function getSurveyStylesheet(posthog?: PostHog) {\n const stylesheet = prepareStylesheet(document, typeof surveyStyles === 'string' ? surveyStyles : '', posthog)\n stylesheet?.setAttribute('data-ph-survey-style', 'true')\n return stylesheet\n}\n\nexport const retrieveSurveyShadow = (\n survey: Pick<Survey, 'id' | 'appearance' | 'type'>,\n posthog?: PostHog,\n element?: Element\n) => {\n const widgetClassName = getSurveyContainerClass(survey)\n const existingDiv = document.querySelector(`.${widgetClassName}`)\n\n if (existingDiv && existingDiv.shadowRoot) {\n return {\n shadow: existingDiv.shadowRoot,\n isNewlyCreated: false,\n }\n }\n\n // If it doesn't exist, create it\n const div = document.createElement('div')\n addSurveyCSSVariablesToElement(div, survey.type, survey.appearance)\n div.className = widgetClassName\n const shadow = div.attachShadow({ mode: 'open' })\n const stylesheet = getSurveyStylesheet(posthog)\n if (stylesheet) {\n const existingStylesheet = shadow.querySelector('style')\n if (existingStylesheet) {\n shadow.removeChild(existingStylesheet)\n }\n shadow.appendChild(stylesheet)\n }\n ;(element ? element : document.body).appendChild(div)\n return {\n shadow,\n isNewlyCreated: true,\n }\n}\n\ninterface SendSurveyEventArgs {\n responses: Record<string, string | number | string[] | null>\n survey: Survey\n surveySubmissionId: string\n isSurveyCompleted: boolean\n posthog?: PostHog\n}\n\nconst getSurveyResponseValue = (responses: Record<string, string | number | string[] | null>, questionId?: string) => {\n if (!questionId) {\n return null\n }\n const response = responses[getSurveyResponseKey(questionId)]\n if (isArray(response)) {\n return [...response]\n }\n return response\n}\n\nexport const sendSurveyEvent = ({\n responses,\n survey,\n surveySubmissionId,\n posthog,\n isSurveyCompleted,\n}: SendSurveyEventArgs) => {\n if (!posthog) {\n logger.error('[survey sent] event not captured, PostHog instance not found.')\n return\n }\n setSurveySeenOnLocalStorage(survey)\n posthog.capture(SurveyEventName.SENT, {\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n [SurveyEventProperties.SURVEY_QUESTIONS]: survey.questions.map((question) => ({\n id: question.id,\n question: question.question,\n response: getSurveyResponseValue(responses, question.id),\n })),\n [SurveyEventProperties.SURVEY_SUBMISSION_ID]: surveySubmissionId,\n [SurveyEventProperties.SURVEY_COMPLETED]: isSurveyCompleted,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n ...responses,\n $set: {\n [getSurveyInteractionProperty(survey, 'responded')]: true,\n },\n })\n if (isSurveyCompleted) {\n // Only dispatch PHSurveySent if the survey is completed, as that removes the survey from focus\n window.dispatchEvent(new CustomEvent('PHSurveySent', { detail: { surveyId: survey.id } }))\n clearInProgressSurveyState(survey)\n }\n}\n\nconst _surveyHasResponses = (inProgressSurvey: InProgressSurveyState | null) => {\n return Object.values(inProgressSurvey?.responses || {}).filter((resp) => !isNullish(resp)).length > 0\n}\n\nconst _buildSurveyEventProperties = (\n survey: Survey,\n inProgressSurvey: InProgressSurveyState | null,\n posthog: PostHog\n) => ({\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n [SurveyEventProperties.SURVEY_PARTIALLY_COMPLETED]: _surveyHasResponses(inProgressSurvey),\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n ...inProgressSurvey?.responses,\n [SurveyEventProperties.SURVEY_SUBMISSION_ID]: inProgressSurvey?.surveySubmissionId,\n [SurveyEventProperties.SURVEY_QUESTIONS]: survey.questions.map((question) => ({\n id: question.id,\n question: question.question,\n response: getSurveyResponseValue(inProgressSurvey?.responses || {}, question.id),\n })),\n})\n\nexport const dismissedSurveyEvent = (survey: Survey, posthog?: PostHog, readOnly?: boolean) => {\n if (!posthog) {\n logger.error('[survey dismissed] event not captured, PostHog instance not found.')\n return\n }\n if (readOnly) {\n return\n }\n\n const inProgressSurvey = getInProgressSurveyState(survey)\n posthog.capture(SurveyEventName.DISMISSED, {\n ..._buildSurveyEventProperties(survey, inProgressSurvey, posthog),\n $set: {\n [getSurveyInteractionProperty(survey, 'dismissed')]: true,\n },\n })\n clearInProgressSurveyState(survey)\n setSurveySeenOnLocalStorage(survey)\n window.dispatchEvent(new CustomEvent('PHSurveyClosed', { detail: { surveyId: survey.id } }))\n}\n\nexport const sendSurveyAbandonedEvent = (survey: Survey, posthog?: PostHog) => {\n if (!posthog) {\n logger.error('[survey abandoned] event not captured, PostHog instance not found.')\n return\n }\n\n const abandonedKey = getSurveyAbandonedKey(survey)\n try {\n if (localStorage.getItem(abandonedKey) === 'true') {\n return\n }\n } catch {\n // localStorage not available\n return\n }\n\n const inProgressSurvey = getInProgressSurveyState(survey)\n if (!inProgressSurvey) {\n return\n }\n\n try {\n localStorage.setItem(abandonedKey, 'true')\n } catch {\n // localStorage not available\n }\n\n posthog.capture(SurveyEventName.ABANDONED, _buildSurveyEventProperties(survey, inProgressSurvey, posthog), {\n transport: 'sendBeacon',\n })\n}\n\n// Use the Fisher-yates algorithm to shuffle this array\n// https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\nexport const shuffle = (array: any[]) => {\n return array\n .map((a) => ({ sort: Math.floor(Math.random() * 10), value: a }))\n .sort((a, b) => a.sort - b.sort)\n .map((a) => a.value)\n}\n\nconst reverseIfUnshuffled = (unshuffled: any[], shuffled: any[]): any[] => {\n if (unshuffled.length === shuffled.length && unshuffled.every((val, index) => val === shuffled[index])) {\n return shuffled.reverse()\n }\n\n return shuffled\n}\n\nexport const getDisplayOrderChoices = (question: MultipleSurveyQuestion): string[] => {\n if (!question.shuffleOptions) {\n return question.choices\n }\n\n const displayOrderChoices = question.choices\n let openEndedChoice = ''\n if (question.hasOpenChoice) {\n // if the question has an open-ended choice, its always the last element in the choices array.\n openEndedChoice = displayOrderChoices.pop()!\n }\n\n const shuffledOptions = reverseIfUnshuffled(displayOrderChoices, shuffle(displayOrderChoices))\n\n if (question.hasOpenChoice) {\n question.choices.push(openEndedChoice)\n shuffledOptions.push(openEndedChoice)\n }\n\n return shuffledOptions\n}\n\nexport const getDisplayOrderQuestions = (survey: Survey): SurveyQuestion[] => {\n if (!survey.appearance || !survey.appearance.shuffleQuestions || survey.enable_partial_responses) {\n return survey.questions\n }\n\n return reverseIfUnshuffled(survey.questions, shuffle(survey.questions))\n}\n\nexport const hasEvents = (survey: Pick<Survey, 'conditions'>): boolean => {\n return survey.conditions?.events?.values?.length != undefined && survey.conditions?.events?.values?.length > 0\n}\n\nexport const canActivateRepeatedly = (\n survey: Pick<Survey, 'schedule' | 'conditions' | 'id' | 'current_iteration'>\n): boolean => {\n return (\n !!(survey.conditions?.events?.repeatedActivation && hasEvents(survey)) ||\n survey.schedule === SurveySchedule.Always ||\n isSurveyInProgress(survey)\n )\n}\n\n/**\n * getSurveySeen checks local storage for the surveySeen Key a\n * and overrides this value if the survey can be repeatedly activated by its events.\n * @param survey\n */\nexport const getSurveySeen = (survey: Survey): boolean => {\n const surveySeen = localStorage.getItem(getSurveySeenKey(survey))\n if (surveySeen) {\n // if a survey has already been seen,\n // we will override it with the event repeated activation value.\n return !canActivateRepeatedly(survey)\n }\n\n return false\n}\n\nconst LAST_SEEN_SURVEY_DATE_KEY = 'lastSeenSurveyDate'\n\nexport const hasWaitPeriodPassed = (waitPeriodInDays: number | undefined): boolean => {\n const lastSeenSurveyDate = localStorage.getItem(LAST_SEEN_SURVEY_DATE_KEY)\n if (!waitPeriodInDays || !lastSeenSurveyDate) {\n return true\n }\n\n const today = new Date()\n const diff = Math.abs(today.getTime() - new Date(lastSeenSurveyDate).getTime())\n const diffDaysFromToday = Math.ceil(diff / (1000 * 3600 * 24))\n return diffDaysFromToday > waitPeriodInDays\n}\n\ninterface SurveyContextProps {\n isPreviewMode: boolean\n previewPageIndex: number | undefined\n onPopupSurveyDismissed: () => void\n isPopup: boolean\n onPreviewSubmit: (res: string | string[] | number | null) => void\n surveySubmissionId: string\n}\n\nexport const SurveyContext = createContext<SurveyContextProps>({\n isPreviewMode: false,\n previewPageIndex: 0,\n onPopupSurveyDismissed: () => {},\n isPopup: true,\n onPreviewSubmit: () => {},\n surveySubmissionId: '',\n})\n\nexport const useSurveyContext = () => {\n return useContext(SurveyContext)\n}\n\ninterface RenderProps {\n component: VNode<{ className: string }>\n children: string\n renderAsHtml?: boolean\n style?: JSX.CSSProperties\n}\n\nexport const renderChildrenAsTextOrHtml = ({ component, children, renderAsHtml, style }: RenderProps) => {\n return renderAsHtml\n ? cloneElement(component, {\n dangerouslySetInnerHTML: { __html: children },\n style,\n })\n : cloneElement(component, {\n children,\n style,\n })\n}\n\nfunction defaultMatchType(matchType?: PropertyMatchType): PropertyMatchType {\n return matchType ?? 'icontains'\n}\n\n// use urlMatchType to validate url condition, fallback to contains for backwards compatibility\nexport function doesSurveyUrlMatch(survey: Pick<Survey, 'conditions'>): boolean {\n if (!survey.conditions?.url) {\n return true\n }\n // if we dont know the url, assume it is not a match\n const href = window?.location?.href\n if (!href) {\n return false\n }\n const targets = [survey.conditions.url]\n const matchType = defaultMatchType(survey.conditions?.urlMatchType)\n return propertyComparisons[matchType](targets, [href])\n}\n\nexport function doesSurveyDeviceTypesMatch(survey: Survey): boolean {\n if (!survey.conditions?.deviceTypes || survey.conditions?.deviceTypes.length === 0) {\n return true\n }\n // if we dont know the device type, assume it is not a match\n if (!userAgent) {\n return false\n }\n\n const deviceType = detectDeviceType(userAgent)\n return propertyComparisons[defaultMatchType(survey.conditions?.deviceTypesMatchType)](\n survey.conditions.deviceTypes,\n [deviceType]\n )\n}\n\nexport function doesSurveyMatchSelector(survey: Survey): boolean {\n if (!survey.conditions?.selector) {\n return true\n }\n return !!document?.querySelector(survey.conditions.selector)\n}\n\ninterface InProgressSurveyState {\n surveySubmissionId: string\n lastQuestionIndex: number\n responses: Record<string, string | number | string[] | null>\n}\n\nconst getInProgressSurveyStateKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n let key = `${SURVEY_IN_PROGRESS_PREFIX}${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n key = `${SURVEY_IN_PROGRESS_PREFIX}${survey.id}_${survey.current_iteration}`\n }\n return key\n}\n\nexport const setInProgressSurveyState = (\n survey: Pick<Survey, 'id' | 'current_iteration'>,\n state: InProgressSurveyState\n): void => {\n try {\n localStorage.setItem(getInProgressSurveyStateKey(survey), JSON.stringify(state))\n } catch (e) {\n logger.error('Error setting in-progress survey state in localStorage', e)\n }\n}\n\nexport const getInProgressSurveyState = (\n survey: Pick<Survey, 'id' | 'current_iteration'>\n): InProgressSurveyState | null => {\n try {\n const stateString = localStorage.getItem(getInProgressSurveyStateKey(survey))\n if (stateString) {\n return JSON.parse(stateString) as InProgressSurveyState\n }\n } catch (e) {\n logger.error('Error getting in-progress survey state from localStorage', e)\n }\n return null\n}\n\nexport const isSurveyInProgress = (survey: Pick<Survey, 'id' | 'current_iteration'>): boolean => {\n const state = getInProgressSurveyState(survey)\n return !isNullish(state?.surveySubmissionId)\n}\n\nexport const clearInProgressSurveyState = (survey: Pick<Survey, 'id' | 'current_iteration'>): void => {\n try {\n localStorage.removeItem(getInProgressSurveyStateKey(survey))\n } catch (e) {\n logger.error('Error clearing in-progress survey state from localStorage', e)\n }\n}\n\nexport function getSurveyContainerClass(survey: Pick<Survey, 'id'>, asSelector = false): string {\n const className = `PostHogSurvey-${survey.id}`\n return asSelector ? `.${className}` : className\n}\n","export const satisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm146 272q66 0 121.5-35.5T682-393h-52q-23 40-63 61.5T480.5-310q-46.5 0-87-21T331-393h-53q26 61 81 96.5T480-261Zm0 181q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const neutralEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm20 194h253v-49H354v49ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const dissatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm146.174 116Q413-417 358.5-379.5T278-280h53q22-42 62.173-65t87.5-23Q528-368 567.5-344.5T630-280h52q-25-63-79.826-100-54.826-37-122-37ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const veryDissatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M480-417q-67 0-121.5 37.5T278-280h404q-25-63-80-100t-122-37Zm-183-72 50-45 45 45 31-36-45-45 45-45-31-36-45 45-50-45-31 36 45 45-45 45 31 36Zm272 0 44-45 51 45 31-36-45-45 45-45-31-36-51 45-44-45-31 36 44 45-44 45 31 36ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142 0 241-99t99-241q0-142-99-241t-241-99q-142 0-241 99t-99 241q0 142 99 241t241 99Z\" />\n </svg>\n)\nexport const verySatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M479.504-261Q537-261 585.5-287q48.5-26 78.5-72.4 6-11.6-.75-22.6-6.75-11-20.25-11H316.918Q303-393 296.5-382t-.5 22.6q30 46.4 78.5 72.4 48.5 26 105.004 26ZM347-578l27 27q7.636 8 17.818 8Q402-543 410-551q8-8 8-18t-8-18l-42-42q-8.8-9-20.9-9-12.1 0-21.1 9l-42 42q-8 7.636-8 17.818Q276-559 284-551q8 8 18 8t18-8l27-27Zm267 0 27 27q7.714 8 18 8t18-8q8-7.636 8-17.818Q685-579 677-587l-42-42q-8.8-9-20.9-9-12.1 0-21.1 9l-42 42q-8 7.714-8 18t8 18q7.636 8 17.818 8Q579-543 587-551l27-27ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const cancelSVG = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-labelledby=\"close-survey-title\"\n >\n <title id=\"close-survey-title\">Close survey</title>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M0.164752 0.164752C0.384422 -0.0549175 0.740578 -0.0549175 0.960248 0.164752L6 5.20451L11.0398 0.164752C11.2594 -0.0549175 11.6156 -0.0549175 11.8352 0.164752C12.0549 0.384422 12.0549 0.740578 11.8352 0.960248L6.79549 6L11.8352 11.0398C12.0549 11.2594 12.0549 11.6156 11.8352 11.8352C11.6156 12.0549 11.2594 12.0549 11.0398 11.8352L6 6.79549L0.960248 11.8352C0.740578 12.0549 0.384422 12.0549 0.164752 11.8352C-0.0549175 11.6156 -0.0549175 11.2594 0.164752 11.0398L5.20451 6L0.164752 0.960248C-0.0549175 0.740578 -0.0549175 0.384422 0.164752 0.164752Z\"\n fill=\"black\"\n />\n </svg>\n)\nexport const IconPosthogLogo = (\n <svg width=\"77\" height=\"14\" viewBox=\"0 0 77 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_2415_6911)\">\n <mask\n id=\"mask0_2415_6911\"\n style={{ maskType: 'luminance' }}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"77\"\n height=\"14\"\n >\n <path d=\"M0.5 0H76.5V14H0.5V0Z\" fill=\"white\" />\n </mask>\n <g mask=\"url(#mask0_2415_6911)\">\n <path\n d=\"M5.77226 8.02931C5.59388 8.37329 5.08474 8.37329 4.90634 8.02931L4.4797 7.20672C4.41155 7.07535 4.41155 6.9207 4.4797 6.78933L4.90634 5.96669C5.08474 5.62276 5.59388 5.62276 5.77226 5.96669L6.19893 6.78933C6.26709 6.9207 6.26709 7.07535 6.19893 7.20672L5.77226 8.02931ZM5.77226 12.6946C5.59388 13.0386 5.08474 13.0386 4.90634 12.6946L4.4797 11.872C4.41155 11.7406 4.41155 11.586 4.4797 11.4546L4.90634 10.632C5.08474 10.288 5.59388 10.288 5.77226 10.632L6.19893 11.4546C6.26709 11.586 6.26709 11.7406 6.19893 11.872L5.77226 12.6946Z\"\n fill=\"#1D4AFF\"\n />\n <path\n d=\"M0.5 10.9238C0.5 10.508 1.02142 10.2998 1.32637 10.5938L3.54508 12.7327C3.85003 13.0267 3.63405 13.5294 3.20279 13.5294H0.984076C0.716728 13.5294 0.5 13.3205 0.5 13.0627V10.9238ZM0.5 8.67083C0.5 8.79459 0.551001 8.91331 0.641783 9.00081L5.19753 13.3927C5.28831 13.4802 5.41144 13.5294 5.53982 13.5294H8.0421C8.47337 13.5294 8.68936 13.0267 8.3844 12.7327L1.32637 5.92856C1.02142 5.63456 0.5 5.84278 0.5 6.25854V8.67083ZM0.5 4.00556C0.5 4.12932 0.551001 4.24802 0.641783 4.33554L10.0368 13.3927C10.1276 13.4802 10.2508 13.5294 10.3791 13.5294H12.8814C13.3127 13.5294 13.5287 13.0267 13.2237 12.7327L1.32637 1.26329C1.02142 0.969312 0.5 1.17752 0.5 1.59327V4.00556ZM5.33931 4.00556C5.33931 4.12932 5.39033 4.24802 5.4811 4.33554L14.1916 12.7327C14.4965 13.0267 15.0179 12.8185 15.0179 12.4028V9.99047C15.0179 9.86671 14.9669 9.74799 14.8762 9.66049L6.16568 1.26329C5.86071 0.969307 5.33931 1.17752 5.33931 1.59327V4.00556ZM11.005 1.26329C10.7 0.969307 10.1786 1.17752 10.1786 1.59327V4.00556C10.1786 4.12932 10.2296 4.24802 10.3204 4.33554L14.1916 8.06748C14.4965 8.36148 15.0179 8.15325 15.0179 7.7375V5.3252C15.0179 5.20144 14.9669 5.08272 14.8762 4.99522L11.005 1.26329Z\"\n fill=\"#F9BD2B\"\n />\n <path\n d=\"M21.0852 10.981L16.5288 6.58843C16.2238 6.29443 15.7024 6.50266 15.7024 6.91841V13.0627C15.7024 13.3205 15.9191 13.5294 16.1865 13.5294H23.2446C23.5119 13.5294 23.7287 13.3205 23.7287 13.0627V12.5032C23.7287 12.2455 23.511 12.0396 23.2459 12.0063C22.4323 11.9042 21.6713 11.546 21.0852 10.981ZM18.0252 12.0365C17.5978 12.0365 17.251 11.7021 17.251 11.2901C17.251 10.878 17.5978 10.5436 18.0252 10.5436C18.4527 10.5436 18.7996 10.878 18.7996 11.2901C18.7996 11.7021 18.4527 12.0365 18.0252 12.0365Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M0.5 13.0627C0.5 13.3205 0.716728 13.5294 0.984076 13.5294H3.20279C3.63405 13.5294 3.85003 13.0267 3.54508 12.7327L1.32637 10.5938C1.02142 10.2998 0.5 10.508 0.5 10.9238V13.0627ZM5.33931 5.13191L1.32637 1.26329C1.02142 0.969306 0.5 1.17752 0.5 1.59327V4.00556C0.5 4.12932 0.551001 4.24802 0.641783 4.33554L5.33931 8.86412V5.13191ZM1.32637 5.92855C1.02142 5.63455 0.5 5.84278 0.5 6.25853V8.67083C0.5 8.79459 0.551001 8.91331 0.641783 9.00081L5.33931 13.5294V9.79717L1.32637 5.92855Z\"\n fill=\"#1D4AFF\"\n />\n <path\n d=\"M10.1787 5.3252C10.1787 5.20144 10.1277 5.08272 10.0369 4.99522L6.16572 1.26329C5.8608 0.969306 5.33936 1.17752 5.33936 1.59327V4.00556C5.33936 4.12932 5.39037 4.24802 5.48114 4.33554L10.1787 8.86412V5.3252ZM5.33936 13.5294H8.04214C8.47341 13.5294 8.6894 13.0267 8.38443 12.7327L5.33936 9.79717V13.5294ZM5.33936 5.13191V8.67083C5.33936 8.79459 5.39037 8.91331 5.48114 9.00081L10.1787 13.5294V9.99047C10.1787 9.86671 10.1277 9.74803 10.0369 9.66049L5.33936 5.13191Z\"\n fill=\"#F54E00\"\n />\n <path\n d=\"M29.375 11.6667H31.3636V8.48772H33.0249C34.8499 8.48772 36.0204 7.4443 36.0204 5.83052C36.0204 4.21681 34.8499 3.17334 33.0249 3.17334H29.375V11.6667ZM31.3636 6.84972V4.81136H32.8236C33.5787 4.81136 34.0318 5.19958 34.0318 5.83052C34.0318 6.4615 33.5787 6.84972 32.8236 6.84972H31.3636ZM39.618 11.7637C41.5563 11.7637 42.9659 10.429 42.9659 8.60905C42.9659 6.78905 41.5563 5.45438 39.618 5.45438C37.6546 5.45438 36.2701 6.78905 36.2701 8.60905C36.2701 10.429 37.6546 11.7637 39.618 11.7637ZM38.1077 8.60905C38.1077 7.63838 38.7118 6.97105 39.618 6.97105C40.5116 6.97105 41.1157 7.63838 41.1157 8.60905C41.1157 9.57972 40.5116 10.2471 39.618 10.2471C38.7118 10.2471 38.1077 9.57972 38.1077 8.60905ZM46.1482 11.7637C47.6333 11.7637 48.6402 10.8658 48.6402 9.81025C48.6402 7.33505 45.2294 8.13585 45.2294 7.16518C45.2294 6.8983 45.5189 6.72843 45.9342 6.72843C46.3622 6.72843 46.8782 6.98318 47.0418 7.54132L48.527 6.94678C48.2375 6.06105 47.1677 5.45438 45.8713 5.45438C44.4743 5.45438 43.6058 6.25518 43.6058 7.21372C43.6058 9.53118 46.9663 8.88812 46.9663 9.84665C46.9663 10.1864 46.6391 10.417 46.1482 10.417C45.4434 10.417 44.9525 9.94376 44.8015 9.3735L43.3164 9.93158C43.6436 10.8537 44.6001 11.7637 46.1482 11.7637ZM53.4241 11.606L53.2982 10.0651C53.0843 10.1743 52.8074 10.2106 52.5808 10.2106C52.1278 10.2106 51.8257 9.89523 51.8257 9.34918V7.03172H53.3612V5.55145H51.8257V3.78001H49.9755V5.55145H48.9687V7.03172H49.9755V9.57972C49.9755 11.06 51.0202 11.7637 52.3921 11.7637C52.7696 11.7637 53.122 11.7031 53.4241 11.606ZM59.8749 3.17334V6.47358H56.376V3.17334H54.3874V11.6667H56.376V8.11158H59.8749V11.6667H61.8761V3.17334H59.8749ZM66.2899 11.7637C68.2281 11.7637 69.6378 10.429 69.6378 8.60905C69.6378 6.78905 68.2281 5.45438 66.2899 5.45438C64.3265 5.45438 62.942 6.78905 62.942 8.60905C62.942 10.429 64.3265 11.7637 66.2899 11.7637ZM64.7796 8.60905C64.7796 7.63838 65.3837 6.97105 66.2899 6.97105C67.1835 6.97105 67.7876 7.63838 67.7876 8.60905C67.7876 9.57972 67.1835 10.2471 66.2899 10.2471C65.3837 10.2471 64.7796 9.57972 64.7796 8.60905ZM73.2088 11.4725C73.901 11.4725 74.5177 11.242 74.845 10.8416V11.424C74.845 12.1034 74.2786 12.5767 73.4102 12.5767C72.7935 12.5767 72.2523 12.2854 72.1642 11.788L70.4776 12.0428C70.7042 13.1955 71.925 13.972 73.4102 13.972C75.361 13.972 76.6574 12.8679 76.6574 11.2298V5.55145H74.8324V6.07318C74.4926 5.69705 73.9136 5.45438 73.171 5.45438C71.409 5.45438 70.3014 6.61918 70.3014 8.46345C70.3014 10.3077 71.409 11.4725 73.2088 11.4725ZM72.1012 8.46345C72.1012 7.55345 72.655 6.97105 73.5109 6.97105C74.3793 6.97105 74.9331 7.55345 74.9331 8.46345C74.9331 9.37345 74.3793 9.95585 73.5109 9.95585C72.655 9.95585 72.1012 9.37345 72.1012 8.46345Z\"\n fill=\"currentColor\"\n />\n </g>\n </g>\n <defs>\n <clipPath id=\"clip0_2415_6911\">\n <rect width=\"76\" height=\"14\" fill=\"white\" transform=\"translate(0.5)\" />\n </clipPath>\n </defs>\n </svg>\n)\nexport const checkSVG = (\n <svg width=\"16\" height=\"12\" viewBox=\"0 0 16 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.30769 10.6923L4.77736 11.2226C4.91801 11.3633 5.10878 11.4423 5.30769 11.4423C5.5066 11.4423 5.69737 11.3633 5.83802 11.2226L5.30769 10.6923ZM15.5303 1.53033C15.8232 1.23744 15.8232 0.762563 15.5303 0.46967C15.2374 0.176777 14.7626 0.176777 14.4697 0.46967L15.5303 1.53033ZM1.53033 5.85429C1.23744 5.56139 0.762563 5.56139 0.46967 5.85429C0.176777 6.14718 0.176777 6.62205 0.46967 6.91495L1.53033 5.85429ZM5.83802 11.2226L15.5303 1.53033L14.4697 0.46967L4.77736 10.162L5.83802 11.2226ZM0.46967 6.91495L4.77736 11.2226L5.83802 10.162L1.53033 5.85429L0.46967 6.91495Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n","import { IconPosthogLogo } from '../icons'\n\nexport function PostHogLogo() {\n return (\n <a href=\"https://posthog.com/surveys\" target=\"_blank\" rel=\"noopener\" className=\"footer-branding\">\n Survey by {IconPosthogLogo}\n </a>\n )\n}\n","import { window } from '../../../utils/globals'\n\nimport { SurveyAppearance } from '../../../posthog-surveys-types'\n\nimport { useContext } from 'preact/hooks'\nimport { SurveyContext } from '../surveys-extension-utils'\nimport { PostHogLogo } from './PostHogLogo'\n\nexport function BottomSection({\n text,\n submitDisabled,\n appearance,\n onSubmit,\n link,\n onPreviewSubmit,\n skipSubmitButton,\n}: {\n text: string\n submitDisabled: boolean\n appearance: SurveyAppearance\n onSubmit: () => void\n link?: string | null\n onPreviewSubmit?: () => void\n skipSubmitButton?: boolean\n}) {\n const { isPreviewMode } = useContext(SurveyContext)\n return (\n <div className=\"bottom-section\">\n {!skipSubmitButton && (\n <button\n className=\"form-submit\"\n disabled={submitDisabled}\n aria-label=\"Submit survey\"\n type=\"button\"\n onClick={() => {\n if (link) {\n window?.open(link)\n }\n if (isPreviewMode) {\n onPreviewSubmit?.()\n } else {\n onSubmit()\n }\n }}\n >\n {text}\n </button>\n )}\n {!appearance.whiteLabel && <PostHogLogo />}\n </div>\n )\n}\n","import { h } from 'preact'\nimport { useContext } from 'preact/hooks'\nimport { SurveyQuestion, SurveyQuestionType } from '../../../posthog-surveys-types'\nimport { cancelSVG } from '../icons'\nimport { SurveyContext, renderChildrenAsTextOrHtml } from '../surveys-extension-utils'\n\nexport function QuestionHeader({\n question,\n forceDisableHtml,\n htmlFor,\n}: {\n question: Pick<SurveyQuestion, 'question' | 'description' | 'descriptionContentType' | 'type'>\n forceDisableHtml: boolean\n htmlFor?: string\n}) {\n const TitleComponent = question.type === SurveyQuestionType.Open ? 'label' : 'h3'\n return (\n <div class=\"question-header\">\n <TitleComponent className=\"survey-question\" htmlFor={htmlFor}>\n {question.question}\n </TitleComponent>\n {question.description &&\n renderChildrenAsTextOrHtml({\n component: h('p', { className: 'survey-question-description' }),\n children: question.description,\n renderAsHtml: !forceDisableHtml && question.descriptionContentType !== 'text',\n })}\n </div>\n )\n}\n\nexport function Cancel({ onClick }: { onClick: () => void }) {\n const { isPreviewMode } = useContext(SurveyContext)\n\n return (\n <button\n className=\"form-cancel\"\n onClick={onClick}\n disabled={isPreviewMode}\n aria-label=\"Close survey\"\n type=\"button\"\n >\n {cancelSVG}\n </button>\n )\n}\n","import { h } from 'preact'\nimport { SurveyAppearance, SurveyQuestionDescriptionContentType } from '../../../posthog-surveys-types'\nimport { renderChildrenAsTextOrHtml } from '../surveys-extension-utils'\nimport { BottomSection } from './BottomSection'\nimport { Cancel } from './QuestionHeader'\n\nimport { useContext, useEffect } from 'preact/hooks'\nimport { SurveyContext } from '../surveys-extension-utils'\nimport { addEventListener } from '../../../utils'\nimport { window as _window } from '../../../utils/globals'\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window\n\nexport function ConfirmationMessage({\n header,\n description,\n contentType,\n forceDisableHtml,\n appearance,\n onClose,\n}: {\n header: string\n description: string\n forceDisableHtml: boolean\n contentType?: SurveyQuestionDescriptionContentType\n appearance: SurveyAppearance\n onClose: () => void\n}) {\n const { isPopup } = useContext(SurveyContext)\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault()\n onClose()\n }\n }\n addEventListener(window, 'keydown', handleKeyDown as EventListener)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [onClose])\n\n const renderCancelButton = isPopup && appearance.hideCancelButton !== true\n\n return (\n <div className=\"thank-you-message\" role=\"status\" tabIndex={0} aria-atomic=\"true\">\n {renderCancelButton && <Cancel onClick={() => onClose()} />}\n <h3 className=\"thank-you-message-header\">{header}</h3>\n {description &&\n renderChildrenAsTextOrHtml({\n component: h('p', { className: 'thank-you-message-body' }),\n children: description,\n renderAsHtml: !forceDisableHtml && contentType !== 'text',\n })}\n {isPopup && (\n <BottomSection\n text={appearance.thankYouMessageCloseButtonText || 'Close'}\n submitDisabled={false}\n appearance={appearance}\n onSubmit={() => onClose()}\n />\n )}\n </div>\n )\n}\n","import { Fragment, type JSX } from 'preact'\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport {\n BasicSurveyQuestion,\n LinkSurveyQuestion,\n MultipleSurveyQuestion,\n RatingSurveyQuestion,\n SurveyAppearance,\n SurveyQuestionType,\n} from '../../../posthog-surveys-types'\nimport { isArray, isNull, isNumber, isString } from '@posthog/core'\nimport { dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, veryDissatisfiedEmoji, verySatisfiedEmoji } from '../icons'\nimport { getDisplayOrderChoices, useSurveyContext } from '../surveys-extension-utils'\nimport { BottomSection } from './BottomSection'\nimport { QuestionHeader } from './QuestionHeader'\n\nexport interface CommonQuestionProps {\n forceDisableHtml: boolean\n appearance: SurveyAppearance\n onSubmit: (res: string | string[] | number | null) => void\n onPreviewSubmit: (res: string | string[] | number | null) => void\n initialValue?: string | string[] | number | null\n displayQuestionIndex: number\n}\n\ninterface OpenEndedInputState {\n isSelected: boolean\n inputValue: string\n}\n\nconst isValidStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every((item) => isString(item))\n}\n\nconst initializeSelectedChoices = (\n initialValue: string | string[] | number | null | undefined,\n questionType: SurveyQuestionType\n): string | string[] | null => {\n if (isString(initialValue)) {\n return initialValue\n }\n if (isValidStringArray(initialValue)) {\n return initialValue\n }\n return questionType === SurveyQuestionType.SingleChoice ? null : []\n}\n\nconst initializeOpenEndedState = (\n initialValue: string | string[] | number | null | undefined,\n choices: string[]\n): OpenEndedInputState => {\n if (isString(initialValue) && !choices.includes(initialValue)) {\n return {\n isSelected: true,\n inputValue: initialValue,\n }\n }\n if (isValidStringArray(initialValue)) {\n const openEndedValue = initialValue.find((choice) => !choices.includes(choice))\n if (openEndedValue) {\n return {\n isSelected: true,\n inputValue: openEndedValue,\n }\n }\n }\n return {\n isSelected: false,\n inputValue: '',\n }\n}\n\nexport function OpenTextQuestion({\n question,\n forceDisableHtml,\n appearance,\n onSubmit,\n onPreviewSubmit,\n displayQuestionIndex,\n initialValue,\n}: CommonQuestionProps & {\n question: BasicSurveyQuestion\n}) {\n const { isPreviewMode } = useSurveyContext()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const [text, setText] = useState<string>(() => {\n if (isString(initialValue)) {\n return initialValue\n }\n return ''\n })\n\n useEffect(() => {\n setTimeout(() => {\n if (!isPreviewMode) {\n inputRef.current?.focus()\n }\n }, 100)\n }, [isPreviewMode])\n\n const htmlFor = `surveyQuestion${displayQuestionIndex}`\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} htmlFor={htmlFor} />\n <textarea\n ref={inputRef}\n id={htmlFor}\n rows={4}\n placeholder={appearance?.placeholder}\n onInput={(e) => {\n setText(e.currentTarget.value)\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n }}\n value={text}\n />\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={!text && !question.optional}\n appearance={appearance}\n onSubmit={() => onSubmit(text)}\n onPreviewSubmit={() => onPreviewSubmit(text)}\n />\n </Fragment>\n )\n}\n\nexport function LinkQuestion({\n question,\n forceDisableHtml,\n appearance,\n onSubmit,\n onPreviewSubmit,\n}: CommonQuestionProps & {\n question: LinkSurveyQuestion\n}) {\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={false}\n link={question.link}\n appearance={appearance}\n onSubmit={() => onSubmit('link clicked')}\n onPreviewSubmit={() => onPreviewSubmit('link clicked')}\n />\n </Fragment>\n )\n}\n\nexport function RatingQuestion({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: CommonQuestionProps & {\n question: RatingSurveyQuestion\n}) {\n const scale = question.scale\n const starting = question.scale === 10 ? 0 : 1\n const [rating, setRating] = useState<number | null>(() => {\n if (isNumber(initialValue)) {\n return initialValue\n }\n if (isArray(initialValue) && initialValue.length > 0 && isNumber(parseInt(initialValue[0]))) {\n return parseInt(initialValue[0])\n }\n if (isString(initialValue) && isNumber(parseInt(initialValue))) {\n return parseInt(initialValue)\n }\n return null\n })\n\n const { isPreviewMode } = useSurveyContext()\n\n const handleSubmit = (num: number) => {\n if (isPreviewMode) {\n return onPreviewSubmit(num)\n }\n return onSubmit(num)\n }\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n <div className=\"rating-section\">\n <div className=\"rating-options\">\n {question.display === 'emoji' && (\n <div className=\"rating-options-emoji\">\n {(question.scale === 3 ? threeScaleEmojis : fiveScaleEmojis).map((emoji, idx) => {\n const active = idx + 1 === rating\n return (\n <button\n aria-label={`Rate ${idx + 1}`}\n className={`ratings-emoji question-${displayQuestionIndex}-rating-${idx} ${\n active ? 'rating-active' : ''\n }`}\n value={idx + 1}\n key={idx}\n type=\"button\"\n onClick={() => {\n const response = idx + 1\n setRating(response)\n if (question.skipSubmitButton) {\n handleSubmit(response)\n }\n }}\n >\n {emoji}\n </button>\n )\n })}\n </div>\n )}\n {question.display === 'number' && (\n <div\n className=\"rating-options-number\"\n style={{ gridTemplateColumns: `repeat(${scale - starting + 1}, minmax(0, 1fr))` }}\n >\n {getScaleNumbers(question.scale).map((number, idx) => {\n const active = rating === number\n return (\n <RatingButton\n key={idx}\n displayQuestionIndex={displayQuestionIndex}\n active={active}\n appearance={appearance}\n num={number}\n setActiveNumber={(response) => {\n setRating(response)\n if (question.skipSubmitButton) {\n handleSubmit(response)\n }\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n <div className=\"rating-text\">\n <div>{question.lowerBoundLabel}</div>\n <div>{question.upperBoundLabel}</div>\n </div>\n </div>\n </div>\n <BottomSection\n text={question.buttonText || appearance?.submitButtonText || 'Submit'}\n submitDisabled={isNull(rating) && !question.optional}\n appearance={appearance}\n onSubmit={() => onSubmit(rating)}\n onPreviewSubmit={() => onPreviewSubmit(rating)}\n skipSubmitButton={question.skipSubmitButton}\n />\n </Fragment>\n )\n}\n\nexport function RatingButton({\n num,\n active,\n displayQuestionIndex,\n setActiveNumber,\n}: {\n num: number\n active: boolean\n displayQuestionIndex: number\n appearance: SurveyAppearance\n setActiveNumber: (num: number) => void\n}) {\n return (\n <button\n aria-label={`Rate ${num}`}\n className={`ratings-number question-${displayQuestionIndex}-rating-${num} ${active ? 'rating-active' : ''}`}\n type=\"button\"\n onClick={() => {\n setActiveNumber(num)\n }}\n >\n {num}\n </button>\n )\n}\n\nexport function MultipleChoiceQuestion({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: CommonQuestionProps & {\n question: MultipleSurveyQuestion\n}) {\n const openChoiceInputRef = useRef<HTMLInputElement>(null)\n const choices = useMemo(() => getDisplayOrderChoices(question), [question])\n const [selectedChoices, setSelectedChoices] = useState<string | string[] | null>(() =>\n initializeSelectedChoices(initialValue, question.type)\n )\n const [openEndedState, setOpenEndedState] = useState<OpenEndedInputState>(() =>\n initializeOpenEndedState(initialValue, choices)\n )\n\n const { isPreviewMode } = useSurveyContext()\n\n const isSingleChoiceQuestion = question.type === SurveyQuestionType.SingleChoice\n const isMultipleChoiceQuestion = question.type === SurveyQuestionType.MultipleChoice\n\n const shouldSkipSubmit = question.skipSubmitButton && isSingleChoiceQuestion && !question.hasOpenChoice\n\n const handleChoiceChange = (val: string, isOpenChoice: boolean) => {\n if (isOpenChoice) {\n const newOpenSelected = !openEndedState.isSelected\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: newOpenSelected,\n inputValue: newOpenSelected ? prev.inputValue : '',\n }))\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices('')\n }\n\n // Focus the input when open choice is selected, slight delay because of the animation\n if (newOpenSelected) {\n setTimeout(() => openChoiceInputRef.current?.focus(), 75)\n }\n return\n }\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices(val)\n // Deselect open choice when selecting another option\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: false,\n inputValue: '',\n }))\n\n if (shouldSkipSubmit) {\n onSubmit(val)\n if (isPreviewMode) {\n onPreviewSubmit(val)\n }\n }\n return\n }\n\n if (isMultipleChoiceQuestion && isArray(selectedChoices)) {\n if (selectedChoices.includes(val)) {\n setSelectedChoices(selectedChoices.filter((choice) => choice !== val))\n } else {\n setSelectedChoices([...selectedChoices, val])\n }\n }\n }\n\n const handleOpenEndedInputChange = (e: JSX.TargetedEvent<HTMLInputElement>) => {\n e.stopPropagation()\n const newValue = e.currentTarget.value\n\n setOpenEndedState((prev) => ({\n ...prev,\n inputValue: newValue,\n }))\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices(newValue)\n }\n }\n\n const handleOpenEndedKeyDown = (e: JSX.TargetedKeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation()\n\n // Handle Enter key to submit form if valid\n if (e.key === 'Enter' && !isSubmitDisabled()) {\n e.preventDefault()\n handleSubmit()\n }\n\n // Handle Escape key to clear input and deselect\n if (e.key === 'Escape') {\n e.preventDefault()\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: false,\n inputValue: '',\n }))\n if (isSingleChoiceQuestion) {\n setSelectedChoices(null)\n }\n }\n }\n\n const isSubmitDisabled = (): boolean => {\n if (question.optional) {\n return false\n }\n if (isNull(selectedChoices)) {\n return true\n }\n if (isArray(selectedChoices)) {\n if (!openEndedState.isSelected && selectedChoices.length === 0) {\n return true\n }\n }\n if (openEndedState.isSelected && openEndedState.inputValue.trim() === '') {\n return true\n }\n return false\n }\n\n const handleSubmit = () => {\n if (openEndedState.isSelected && isMultipleChoiceQuestion) {\n if (isArray(selectedChoices)) {\n isPreviewMode\n ? onPreviewSubmit([...selectedChoices, openEndedState.inputValue])\n : onSubmit([...selectedChoices, openEndedState.inputValue])\n }\n } else {\n isPreviewMode ? onPreviewSubmit(selectedChoices) : onSubmit(selectedChoices)\n }\n }\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n <fieldset className=\"multiple-choice-options limit-height\">\n <legend className=\"sr-only\">\n {isMultipleChoiceQuestion ? ' Select all that apply' : ' Select one'}\n </legend>\n {choices.map((choice: string, idx: number) => {\n const isOpenChoice = !!question.hasOpenChoice && idx === question.choices.length - 1\n const inputId = `surveyQuestion${displayQuestionIndex}Choice${idx}`\n const openInputId = `${inputId}Open`\n\n const isChecked = isOpenChoice\n ? openEndedState.isSelected\n : isSingleChoiceQuestion\n ? selectedChoices === choice\n : isArray(selectedChoices) && selectedChoices.includes(choice)\n\n return (\n <label className={isOpenChoice ? 'choice-option-open' : ''} key={idx}>\n <div className=\"response-choice\">\n <input\n type={isSingleChoiceQuestion ? 'radio' : 'checkbox'}\n name={inputId}\n checked={isChecked}\n onChange={() => handleChoiceChange(choice, isOpenChoice)}\n id={inputId}\n aria-controls={openInputId}\n />\n <span>{isOpenChoice ? `${choice}:` : choice}</span>\n </div>\n {isOpenChoice && (\n <input\n type=\"text\"\n ref={openChoiceInputRef}\n id={openInputId}\n name={`question${displayQuestionIndex}Open`}\n value={openEndedState.inputValue}\n onKeyDown={handleOpenEndedKeyDown}\n onInput={handleOpenEndedInputChange}\n onClick={(e) => {\n // Ensure the checkbox/radio gets checked when clicking the input\n if (!openEndedState.isSelected) {\n handleChoiceChange(choice, true)\n }\n e.stopPropagation()\n }}\n aria-label={`${choice} - please specify`}\n />\n )}\n </label>\n )\n })}\n </fieldset>\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={isSubmitDisabled()}\n appearance={appearance}\n onSubmit={handleSubmit}\n onPreviewSubmit={handleSubmit}\n skipSubmitButton={shouldSkipSubmit}\n />\n </Fragment>\n )\n}\n\nconst threeScaleEmojis = [dissatisfiedEmoji, neutralEmoji, satisfiedEmoji]\nconst fiveScaleEmojis = [veryDissatisfiedEmoji, dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, verySatisfiedEmoji]\nconst fiveScaleNumbers = [1, 2, 3, 4, 5]\nconst sevenScaleNumbers = [1, 2, 3, 4, 5, 6, 7]\nconst tenScaleNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\nfunction getScaleNumbers(scale: number): number[] {\n switch (scale) {\n case 5:\n return fiveScaleNumbers\n case 7:\n return sevenScaleNumbers\n case 10:\n return tenScaleNumbers\n default:\n return fiveScaleNumbers\n }\n}\n","import { type JSX, type RefObject, render, Fragment } from 'preact'\nimport { useContext, useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport { PostHog } from '../posthog-core'\nimport {\n Survey,\n SurveyCallback,\n SurveyEventName,\n SurveyEventProperties,\n SurveyPosition,\n SurveyQuestion,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveySchedule,\n SurveyTabPosition,\n SurveyType,\n SurveyWidgetType,\n SurveyWithTypeAndAppearance,\n} from '../posthog-surveys-types'\nimport { addEventListener } from '../utils'\nimport { document as _document, window as _window } from '../utils/globals'\nimport {\n doesSurveyActivateByAction,\n doesSurveyActivateByEvent,\n IN_APP_SURVEY_TYPES,\n isSurveyRunning,\n SURVEY_LOGGER as logger,\n} from '../utils/survey-utils'\nimport { isNull, isUndefined } from '@posthog/core'\nimport { SURVEYS } from '../constants'\nimport { uuidv7 } from '../uuidv7'\nimport { ConfirmationMessage } from './surveys/components/ConfirmationMessage'\nimport { Cancel } from './surveys/components/QuestionHeader'\nimport {\n CommonQuestionProps,\n LinkQuestion,\n MultipleChoiceQuestion,\n OpenTextQuestion,\n RatingQuestion,\n} from './surveys/components/QuestionTypes'\nimport {\n canActivateRepeatedly,\n retrieveSurveyShadow,\n defaultSurveyAppearance,\n dismissedSurveyEvent,\n doesSurveyDeviceTypesMatch,\n doesSurveyMatchSelector,\n doesSurveyUrlMatch,\n getDisplayOrderQuestions,\n getInProgressSurveyState,\n getSurveyContainerClass,\n getSurveyResponseKey,\n getSurveySeen,\n hasWaitPeriodPassed,\n isSurveyInProgress,\n sendSurveyEvent,\n sendSurveyAbandonedEvent,\n setInProgressSurveyState,\n SurveyContext,\n getSurveyStylesheet,\n addSurveyCSSVariablesToElement,\n} from './surveys/surveys-extension-utils'\nimport {\n extractPrefillParamsFromUrl,\n convertPrefillToResponses,\n calculatePrefillStartIndex,\n} from '../utils/survey-url-prefill'\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\n\nconst DISPATCH_FEEDBACK_WIDGET_EVENT = 'ph:show_survey_widget'\nconst WIDGET_LISTENER_ATTRIBUTE = 'PHWidgetSurveyClickListener'\n\nfunction getRatingBucketForResponseValue(responseValue: number, scale: number) {\n if (scale === 3) {\n if (responseValue < 1 || responseValue > 3) {\n throw new Error('The response must be in range 1-3')\n }\n\n return responseValue === 1 ? 'negative' : responseValue === 2 ? 'neutral' : 'positive'\n } else if (scale === 5) {\n if (responseValue < 1 || responseValue > 5) {\n throw new Error('The response must be in range 1-5')\n }\n\n return responseValue <= 2 ? 'negative' : responseValue === 3 ? 'neutral' : 'positive'\n } else if (scale === 7) {\n if (responseValue < 1 || responseValue > 7) {\n throw new Error('The response must be in range 1-7')\n }\n\n return responseValue <= 3 ? 'negative' : responseValue === 4 ? 'neutral' : 'positive'\n } else if (scale === 10) {\n if (responseValue < 0 || responseValue > 10) {\n throw new Error('The response must be in range 0-10')\n }\n\n return responseValue <= 6 ? 'detractors' : responseValue <= 8 ? 'passives' : 'promoters'\n }\n\n throw new Error('The scale must be one of: 3, 5, 7, 10')\n}\n\nexport function getNextSurveyStep(\n survey: Survey,\n currentQuestionIndex: number,\n response: string | string[] | number | null\n) {\n const question = survey.questions[currentQuestionIndex]\n const nextQuestionIndex = currentQuestionIndex + 1\n\n if (!question.branching?.type) {\n if (currentQuestionIndex === survey.questions.length - 1) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n\n if (question.branching.type === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n } else if (question.branching.type === SurveyQuestionBranchingType.SpecificQuestion) {\n if (Number.isInteger(question.branching.index)) {\n return question.branching.index\n }\n } else if (question.branching.type === SurveyQuestionBranchingType.ResponseBased) {\n // Single choice\n if (question.type === SurveyQuestionType.SingleChoice) {\n // :KLUDGE: for now, look up the choiceIndex based on the response\n // TODO: once QuestionTypes.MultipleChoiceQuestion is refactored, pass the selected choiceIndex into this method\n let selectedChoiceIndex = question.choices.indexOf(`${response}`)\n\n if (selectedChoiceIndex === -1 && question.hasOpenChoice) {\n // if the response is not found in the choices, it must be the open choice,\n // which is always the last choice\n selectedChoiceIndex = question.choices.length - 1\n }\n\n if (question.branching?.responseValues?.hasOwnProperty(selectedChoiceIndex)) {\n const nextStep = question.branching.responseValues[selectedChoiceIndex]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n } else if (question.type === SurveyQuestionType.Rating) {\n if (typeof response !== 'number' || !Number.isInteger(response)) {\n throw new Error('The response type must be an integer')\n }\n\n const ratingBucket = getRatingBucketForResponseValue(response, question.scale)\n\n if (question.branching?.responseValues?.hasOwnProperty(ratingBucket)) {\n const nextStep = question.branching.responseValues[ratingBucket]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n }\n\n return nextQuestionIndex\n }\n\n logger.warn('Falling back to next question index due to unexpected branching type')\n return nextQuestionIndex\n}\n\nconst SURVEY_NEXT_TO_TRIGGER_PARAMS = {\n ESTIMATED_MIN_HEIGHT: 250,\n HORIZONTAL_PADDING: 20,\n TRIGGER_SPACING: 12,\n} as const\n\nfunction getNextToTriggerPosition(target: HTMLElement, surveyWidth: number): JSX.CSSProperties | null {\n try {\n const buttonRect = target.getBoundingClientRect()\n const viewportHeight = window.innerHeight\n const viewportWidth = window.innerWidth\n const estimatedMinSurveyHeight = SURVEY_NEXT_TO_TRIGGER_PARAMS.ESTIMATED_MIN_HEIGHT\n const buttonCenterX = buttonRect.left + buttonRect.width / 2\n let left = buttonCenterX - surveyWidth / 2\n const horizontalPadding = SURVEY_NEXT_TO_TRIGGER_PARAMS.HORIZONTAL_PADDING\n if (left + surveyWidth > viewportWidth - horizontalPadding) {\n left = viewportWidth - surveyWidth - horizontalPadding\n }\n if (left < horizontalPadding) {\n left = horizontalPadding\n }\n const spacing = SURVEY_NEXT_TO_TRIGGER_PARAMS.TRIGGER_SPACING\n const spaceBelow = viewportHeight - buttonRect.bottom\n const spaceAbove = buttonRect.top\n const showAbove = spaceBelow < estimatedMinSurveyHeight && spaceAbove > spaceBelow\n\n return {\n position: 'fixed',\n top: showAbove ? 'auto' : `${buttonRect.bottom + spacing}px`,\n left: `${left}px`,\n right: 'auto',\n bottom: showAbove ? `${viewportHeight - buttonRect.top + spacing}px` : 'auto',\n zIndex: defaultSurveyAppearance.zIndex,\n } satisfies JSX.CSSProperties\n } catch (error) {\n logger.warn('Failed to calculate trigger position:', error)\n return null\n }\n}\n\n// Keep in sync with posthog/constants.py on main repo\nconst SURVEY_TARGETING_FLAG_PREFIX = 'survey-targeting-'\n\nexport class SurveyManager {\n private _posthog: PostHog\n private _surveyInFocus: string | null\n private _surveyTimeouts: Map<string, NodeJS.Timeout> = new Map()\n private _widgetSelectorListeners: Map<string, { element: Element; listener: EventListener; survey: Survey }> =\n new Map()\n private _prefillHandledSurveys: Set<string> = new Set()\n\n constructor(posthog: PostHog) {\n this._posthog = posthog\n // This is used to track the survey that is currently in focus. We only show one survey at a time.\n this._surveyInFocus = null\n }\n\n public handlePageUnload = (): void => {\n // we don't use getSurveys to avoid adding extra API calls here.\n // if no surveys are cached, there's nothing to do anyways\n const surveys = this._posthog.get_property(SURVEYS) as Survey[] | undefined\n if (!surveys) {\n return\n }\n for (const survey of surveys) {\n if (isSurveyInProgress(survey)) {\n sendSurveyAbandonedEvent(survey, this._posthog)\n }\n }\n }\n\n private _clearSurveyTimeout(surveyId: string) {\n const timeout = this._surveyTimeouts.get(surveyId)\n if (timeout) {\n clearTimeout(timeout)\n this._surveyTimeouts.delete(surveyId)\n }\n }\n\n /**\n * cancel a \"pending\" survey, i.e. one that is waiting to be displayed in\n * the _surveyTimeouts queue\n */\n public cancelSurvey(surveyId: string): void {\n // only works for surveys in the _surveyTimeouts queue...\n if (!this._surveyTimeouts.has(surveyId)) {\n return\n }\n\n logger.info(`Cancelled pending survey ${surveyId}`)\n this._clearSurveyTimeout(surveyId)\n\n // release focus - it was claimed when the delay timer started.\n // \"focus\" != \"survey is displayed\"\n if (this._surveyInFocus === surveyId) {\n this._surveyInFocus = null\n }\n }\n\n public handlePopoverSurvey = (survey: Survey): void => {\n this._clearSurveyTimeout(survey.id)\n this._addSurveyToFocus(survey)\n const delaySeconds = survey.appearance?.surveyPopupDelaySeconds || 0\n const { shadow } = retrieveSurveyShadow(survey, this._posthog)\n if (delaySeconds <= 0) {\n return render(\n <SurveyPopup\n posthog={this._posthog}\n survey={survey}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n />,\n shadow\n )\n }\n const timeoutId = setTimeout(() => {\n // remove survey to keep `_surveyTimeouts` as a true list of \"pending\" surveys\n this._surveyTimeouts.delete(survey.id)\n\n if (!doesSurveyUrlMatch(survey)) {\n return this._removeSurveyFromFocus(survey)\n }\n // rendering with surveyPopupDelaySeconds = 0 because we're already handling the timeout here\n render(\n <SurveyPopup\n posthog={this._posthog}\n survey={{ ...survey, appearance: { ...survey.appearance, surveyPopupDelaySeconds: 0 } }}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n />,\n shadow\n )\n }, delaySeconds * 1000)\n this._surveyTimeouts.set(survey.id, timeoutId)\n }\n\n private _handleWidget = (survey: Survey): void => {\n // Ensure widget container exists if it doesn't\n const { shadow, isNewlyCreated } = retrieveSurveyShadow(survey, this._posthog)\n\n // If the widget is already rendered, do nothing. Otherwise the widget will be re-rendered every second\n if (!isNewlyCreated) {\n return\n }\n\n render(<FeedbackWidget posthog={this._posthog} survey={survey} key={survey.id} />, shadow)\n }\n\n private _removeWidgetSelectorListener = (survey: Pick<Survey, 'id' | 'type' | 'appearance'>): void => {\n this._removeSurveyFromDom(survey)\n const existing = this._widgetSelectorListeners.get(survey.id)\n if (existing) {\n existing.element.removeEventListener('click', existing.listener)\n existing.element.removeAttribute(WIDGET_LISTENER_ATTRIBUTE)\n this._widgetSelectorListeners.delete(survey.id)\n logger.info(`Removed click listener for survey ${survey.id}`)\n }\n }\n\n private _manageWidgetSelectorListener = (survey: Survey, selector: string): void => {\n const currentElement = document.querySelector(selector)\n const existingListenerData = this._widgetSelectorListeners.get(survey.id)\n\n if (!currentElement) {\n if (existingListenerData) {\n this._removeWidgetSelectorListener(survey)\n }\n return\n }\n\n this._handleWidget(survey)\n\n if (existingListenerData) {\n // Listener exists, check if element changed\n if (currentElement !== existingListenerData.element) {\n logger.info(`Selector element changed for survey ${survey.id}. Re-attaching listener.`)\n this._removeWidgetSelectorListener(survey)\n // Continue to attach listener to the new element below\n } else {\n // Element is the same, listener already attached, do nothing\n return\n }\n }\n\n // Element found, and no listener attached (or it was just removed from old element)\n if (!currentElement.hasAttribute(WIDGET_LISTENER_ATTRIBUTE)) {\n const listener = (event: Event) => {\n event.stopPropagation() // Prevent bubbling\n\n const positionStyles =\n survey.appearance?.position === SurveyPosition.NextToTrigger\n ? getNextToTriggerPosition(\n event.currentTarget as HTMLElement,\n parseInt(survey.appearance?.maxWidth || defaultSurveyAppearance.maxWidth)\n )\n : {}\n\n window.dispatchEvent(\n new CustomEvent(DISPATCH_FEEDBACK_WIDGET_EVENT, {\n detail: { surveyId: survey.id, position: positionStyles },\n })\n )\n }\n\n addEventListener(currentElement, 'click', listener)\n currentElement.setAttribute(WIDGET_LISTENER_ATTRIBUTE, 'true')\n this._widgetSelectorListeners.set(survey.id, { element: currentElement, listener, survey })\n logger.info(`Attached click listener for feedback button survey ${survey.id}`)\n }\n }\n\n /**\n * Sorts surveys by their appearance delay in ascending order. If a survey does not have an appearance delay,\n * it is considered to have a delay of 0.\n * @param surveys\n * @returns The surveys sorted by their appearance delay\n */\n private _sortSurveysByAppearanceDelay(surveys: Survey[]): Survey[] {\n return surveys.sort((a, b) => {\n const isSurveyInProgressA = isSurveyInProgress(a)\n const isSurveyInProgressB = isSurveyInProgress(b)\n if (isSurveyInProgressA && !isSurveyInProgressB) {\n return -1 // a comes before b (in progress surveys first)\n }\n if (!isSurveyInProgressA && isSurveyInProgressB) {\n return 1 // a comes after b (in progress surveys first)\n }\n const aIsAlways = a.schedule === SurveySchedule.Always\n const bIsAlways = b.schedule === SurveySchedule.Always\n\n if (aIsAlways && !bIsAlways) {\n return 1 // a comes after b\n }\n if (!aIsAlways && bIsAlways) {\n return -1 // a comes before b\n }\n // If both are Always or neither is Always, sort by delay\n return (a.appearance?.surveyPopupDelaySeconds || 0) - (b.appearance?.surveyPopupDelaySeconds || 0)\n })\n }\n\n public renderPopover = (survey: Survey): void => {\n const { shadow } = retrieveSurveyShadow(survey, this._posthog)\n render(\n <SurveyPopup posthog={this._posthog} survey={survey} removeSurveyFromFocus={this._removeSurveyFromFocus} />,\n shadow\n )\n }\n\n public renderSurvey = (survey: Survey, selector: Element): void => {\n if (this._posthog.config?.surveys?.prefillFromUrl) {\n this._handleUrlPrefill(survey)\n }\n\n render(\n <SurveyPopup\n posthog={this._posthog}\n survey={survey}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n isPopup={false}\n />,\n selector\n )\n }\n\n private _handleUrlPrefill(survey: Survey): void {\n // Only handle prefill once per survey session to avoid overwriting in-progress responses\n if (this._prefillHandledSurveys.has(survey.id)) {\n return\n }\n\n try {\n const { params } = extractPrefillParamsFromUrl(window.location.search)\n\n if (Object.keys(params).length === 0) {\n return\n }\n\n logger.info('[Survey Prefill] Detected URL prefill parameters')\n\n const responses = convertPrefillToResponses(survey, params)\n\n if (Object.keys(responses).length === 0) {\n logger.warn('[Survey Prefill] No valid responses after conversion')\n return\n }\n\n const submissionId = uuidv7()\n\n // calculate which question to start at based on prefilled questions\n const prefilledIndices = Object.keys(params).map((k) => parseInt(k, 10))\n const { startQuestionIndex, skippedResponses } = calculatePrefillStartIndex(\n survey.questions,\n prefilledIndices,\n responses\n )\n const isSurveyCompleted = startQuestionIndex >= survey.questions.length\n\n setInProgressSurveyState(survey, {\n surveySubmissionId: submissionId,\n responses: responses,\n lastQuestionIndex: isSurveyCompleted ? survey.questions.length - 1 : startQuestionIndex,\n })\n\n logger.info('[Survey Prefill] Stored prefilled responses in localStorage')\n\n /**\n * auto-submit some survey events on pageload only if:\n * 1) survey is complete, OR\n * 2) partial responses are enabled AND the skipped questions were set to auto-submit\n */\n const shouldAutoSubmitPrefilled =\n Object.keys(skippedResponses).length > 0 && survey.enable_partial_responses\n if (shouldAutoSubmitPrefilled || isSurveyCompleted) {\n sendSurveyEvent({\n responses: isSurveyCompleted ? responses : skippedResponses,\n survey,\n surveySubmissionId: submissionId,\n posthog: this._posthog,\n isSurveyCompleted,\n })\n }\n\n // Mark this survey as having been prefilled\n this._prefillHandledSurveys.add(survey.id)\n } catch (error) {\n logger.error('[Survey Prefill] Error handling URL prefill:', error)\n }\n }\n\n private _isSurveyFeatureFlagEnabled(flagKey: string | null, flagVariant: string | undefined = undefined) {\n if (!flagKey) {\n return true\n }\n const isFeatureEnabled = !!this._posthog.featureFlags.isFeatureEnabled(flagKey, {\n send_event: !flagKey.startsWith(SURVEY_TARGETING_FLAG_PREFIX),\n })\n let flagVariantCheck = true\n if (flagVariant) {\n const flagVariantValue = this._posthog.featureFlags.getFeatureFlag(flagKey, { send_event: false })\n flagVariantCheck = flagVariantValue === flagVariant || flagVariant === 'any'\n }\n return isFeatureEnabled && flagVariantCheck\n }\n\n private _isSurveyConditionMatched(survey: Survey): boolean {\n if (!survey.conditions) {\n return true\n }\n return doesSurveyUrlMatch(survey) && doesSurveyDeviceTypesMatch(survey) && doesSurveyMatchSelector(survey)\n }\n\n private _internalFlagCheckSatisfied(survey: Survey): boolean {\n return (\n canActivateRepeatedly(survey) ||\n this._isSurveyFeatureFlagEnabled(survey.internal_targeting_flag_key) ||\n isSurveyInProgress(survey)\n )\n }\n\n public checkSurveyEligibility(survey: Survey): { eligible: boolean; reason?: string } {\n const eligibility = { eligible: true, reason: undefined as string | undefined }\n\n if (!isSurveyRunning(survey)) {\n eligibility.eligible = false\n eligibility.reason = `Survey is not running. It was completed on ${survey.end_date}`\n return eligibility\n }\n\n if (!IN_APP_SURVEY_TYPES.includes(survey.type)) {\n eligibility.eligible = false\n eligibility.reason = `Surveys of type ${survey.type} are never eligible to be shown in the app`\n return eligibility\n }\n\n const linkedFlagVariant = survey.conditions?.linkedFlagVariant\n if (!this._isSurveyFeatureFlagEnabled(survey.linked_flag_key, linkedFlagVariant)) {\n eligibility.eligible = false\n if (!linkedFlagVariant) {\n eligibility.reason = `Survey linked feature flag is not enabled`\n } else {\n eligibility.reason = `Survey linked feature flag is not enabled for variant ${linkedFlagVariant}`\n }\n return eligibility\n }\n\n if (!this._isSurveyFeatureFlagEnabled(survey.targeting_flag_key)) {\n eligibility.eligible = false\n eligibility.reason = `Survey targeting feature flag is not enabled`\n return eligibility\n }\n\n if (!this._internalFlagCheckSatisfied(survey)) {\n eligibility.eligible = false\n eligibility.reason =\n 'Survey internal targeting flag is not enabled and survey cannot activate repeatedly and survey is not in progress'\n return eligibility\n }\n\n if (!hasWaitPeriodPassed(survey.conditions?.seenSurveyWaitPeriodInDays)) {\n eligibility.eligible = false\n eligibility.reason = `Survey wait period has not passed`\n return eligibility\n }\n\n if (getSurveySeen(survey)) {\n eligibility.eligible = false\n eligibility.reason = `Survey has already been seen and it can't be activated again`\n return eligibility\n }\n\n return eligibility\n }\n\n /**\n * Surveys can be activated by events or actions. This method checks if the survey has events and actions,\n * and if so, it checks if the survey has been activated.\n * @param survey\n */\n private _hasActionOrEventTriggeredSurvey(survey: Survey): boolean {\n if (!doesSurveyActivateByEvent(survey) && !doesSurveyActivateByAction(survey)) {\n // If survey doesn't depend on events/actions, it's considered \"triggered\" by default\n return true\n }\n const surveysActivatedByEventsOrActions: string[] | undefined =\n this._posthog.surveys._surveyEventReceiver?.getSurveys()\n return !!surveysActivatedByEventsOrActions?.includes(survey.id)\n }\n\n private _checkFlags(survey: Survey): boolean {\n if (!survey.feature_flag_keys?.length) {\n return true\n }\n\n return survey.feature_flag_keys.every(({ key, value }) => {\n if (!key || !value) {\n return true\n }\n return this._isSurveyFeatureFlagEnabled(value)\n })\n }\n\n public getActiveMatchingSurveys = (callback: SurveyCallback, forceReload = false): void => {\n this._posthog?.surveys.getSurveys((surveys) => {\n const targetingMatchedSurveys = surveys.filter((survey) => {\n const eligibility = this.checkSurveyEligibility(survey)\n return (\n eligibility.eligible &&\n this._isSurveyConditionMatched(survey) &&\n this._hasActionOrEventTriggeredSurvey(survey) &&\n this._checkFlags(survey)\n )\n })\n\n callback(targetingMatchedSurveys)\n }, forceReload)\n }\n\n public callSurveysAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getActiveMatchingSurveys((surveys) => {\n const inAppSurveysWithDisplayLogic = surveys.filter(\n (survey) => survey.type === SurveyType.Popover || survey.type === SurveyType.Widget\n )\n\n // Create a queue of surveys sorted by their appearance delay. We will evaluate the display logic\n // for each survey in the queue in order, and only display one survey at a time.\n const inAppSurveysQueue = this._sortSurveysByAppearanceDelay(inAppSurveysWithDisplayLogic)\n\n // Keep track of surveys processed this cycle to remove listeners for inactive ones\n const activeSelectorSurveys = new Set<string>()\n\n inAppSurveysQueue.forEach((survey) => {\n // Widget Type Logic\n if (survey.type === SurveyType.Widget) {\n if (survey.appearance?.widgetType === SurveyWidgetType.Tab) {\n this._handleWidget(survey)\n return\n }\n\n // For selector widget types, we need to manage the listener attachment/detachment dynamically\n if (\n survey.appearance?.widgetType === SurveyWidgetType.Selector &&\n survey.appearance?.widgetSelector\n ) {\n activeSelectorSurveys.add(survey.id)\n this._manageWidgetSelectorListener(survey, survey.appearance?.widgetSelector)\n }\n }\n\n // Popover Type Logic (only one shown at a time)\n if (isNull(this._surveyInFocus) && survey.type === SurveyType.Popover) {\n this.handlePopoverSurvey(survey)\n }\n })\n\n // Clean up listeners for surveys that are no longer active or matched\n this._widgetSelectorListeners.forEach(({ survey }) => {\n if (!activeSelectorSurveys.has(survey.id)) {\n this._removeWidgetSelectorListener(survey)\n }\n })\n }, forceReload)\n }\n\n private _addSurveyToFocus = (survey: Pick<Survey, 'id'>): void => {\n if (!isNull(this._surveyInFocus)) {\n logger.error(`Survey ${this._surveyInFocus} already in focus. Cannot add survey ${survey.id}.`)\n }\n this._surveyInFocus = survey.id\n }\n\n private _removeSurveyFromDom(survey: Pick<Survey, 'id' | 'type' | 'appearance'>): void {\n try {\n const shadowContainer = document.querySelector(getSurveyContainerClass(survey, true))\n if (shadowContainer?.shadowRoot) {\n render(null, shadowContainer.shadowRoot)\n }\n shadowContainer?.remove()\n } catch (error) {\n logger.warn(`Failed to remove survey ${survey.id} from DOM:`, error)\n }\n }\n\n private _removeSurveyFromFocus = (survey: SurveyWithTypeAndAppearance): void => {\n if (this._surveyInFocus !== survey.id) {\n logger.error(`Survey ${survey.id} is not in focus. Cannot remove survey ${survey.id}.`)\n }\n this._clearSurveyTimeout(survey.id)\n this._surveyInFocus = null\n this._removeSurveyFromDom(survey)\n }\n\n // Expose internal state and methods for testing\n public getTestAPI() {\n return {\n addSurveyToFocus: this._addSurveyToFocus,\n removeSurveyFromFocus: this._removeSurveyFromFocus,\n surveyInFocus: this._surveyInFocus,\n surveyTimeouts: this._surveyTimeouts,\n handleWidget: this._handleWidget,\n handlePopoverSurvey: this.handlePopoverSurvey,\n manageWidgetSelectorListener: this._manageWidgetSelectorListener,\n sortSurveysByAppearanceDelay: this._sortSurveysByAppearanceDelay,\n checkFlags: this._checkFlags.bind(this),\n isSurveyFeatureFlagEnabled: this._isSurveyFeatureFlagEnabled.bind(this),\n }\n }\n}\n\nconst DEFAULT_PREVIEW_POSITION_STYLES: JSX.CSSProperties = {\n position: 'relative',\n left: 'unset',\n right: 'unset',\n top: 'unset',\n bottom: 'unset',\n transform: 'unset',\n}\n\nexport const renderSurveysPreview = ({\n survey,\n parentElement,\n previewPageIndex,\n forceDisableHtml,\n onPreviewSubmit,\n positionStyles = DEFAULT_PREVIEW_POSITION_STYLES,\n}: {\n survey: Survey\n parentElement: HTMLElement\n previewPageIndex: number\n forceDisableHtml?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n posthog?: PostHog\n positionStyles?: JSX.CSSProperties\n}) => {\n const currentStyle = parentElement.querySelector('style[data-ph-survey-style]')\n if (currentStyle) {\n currentStyle.remove()\n }\n const stylesheet = getSurveyStylesheet()\n if (stylesheet) {\n parentElement.appendChild(stylesheet)\n addSurveyCSSVariablesToElement(parentElement, survey.type, survey.appearance)\n }\n render(\n <SurveyPopup\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={positionStyles}\n onPreviewSubmit={onPreviewSubmit}\n previewPageIndex={previewPageIndex}\n removeSurveyFromFocus={() => {}}\n />,\n parentElement\n )\n}\n\nexport const renderFeedbackWidgetPreview = ({\n survey,\n root,\n forceDisableHtml,\n}: {\n survey: Survey\n root: HTMLElement\n forceDisableHtml?: boolean\n}) => {\n const stylesheet = getSurveyStylesheet()\n if (stylesheet) {\n root.appendChild(stylesheet)\n addSurveyCSSVariablesToElement(root, survey.type, survey.appearance)\n }\n\n render(<FeedbackWidget forceDisableHtml={forceDisableHtml} survey={survey} readOnly={true} />, root)\n}\n\n// This is the main exported function\nexport function generateSurveys(posthog: PostHog, isSurveysEnabled: boolean | undefined) {\n // NOTE: Important to ensure we never try and run surveys without a window environment\n if (!document || !window) {\n return\n }\n\n const surveyManager = new SurveyManager(posthog)\n if (posthog.config.disable_surveys_automatic_display) {\n logger.info('Surveys automatic display is disabled. Skipping call surveys and evaluate display logic.')\n return surveyManager\n }\n\n // NOTE: The `generateSurveys` function used to accept just a single parameter, without any `isSurveysEnabled` parameter.\n // To keep compatibility with old clients, we'll consider `undefined` the same as `true`\n if (isSurveysEnabled === false) {\n logger.info('There are no surveys to load or Surveys is disabled in the project settings.')\n return surveyManager\n }\n\n surveyManager.callSurveysAndEvaluateDisplayLogic(true)\n\n let intervalId: number | undefined\n\n const startInterval = () => {\n if (!isUndefined(intervalId)) {\n return\n }\n intervalId = setInterval(() => {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n }, 1000) as unknown as number\n }\n\n const stopInterval = () => {\n if (!isUndefined(intervalId)) {\n clearInterval(intervalId)\n intervalId = undefined\n }\n }\n\n startInterval()\n\n addEventListener(document, 'visibilitychange', () => {\n if (document.hidden) {\n stopInterval()\n } else {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n startInterval()\n }\n })\n\n return surveyManager\n}\n\ntype UseHideSurveyOnURLChangeProps = {\n survey: Pick<Survey, 'id' | 'conditions' | 'type' | 'appearance'>\n removeSurveyFromFocus?: (survey: SurveyWithTypeAndAppearance) => void\n setSurveyVisible: (visible: boolean) => void\n isPreviewMode?: boolean\n}\n\n/**\n * This hook handles URL-based survey visibility after the initial mount.\n * The initial URL check is handled by the `getActiveMatchingSurveys` method in the `PostHogSurveys` class,\n * which ensures the URL matches before displaying a survey for the first time.\n * That is the method that is called every second to see if there's a matching survey.\n *\n * This separation of concerns means:\n * 1. Initial URL matching is done by `getActiveMatchingSurveys` before displaying the survey\n * 2. Subsequent URL changes are handled here to hide the survey as the user navigates\n */\nexport function useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus = () => {},\n setSurveyVisible,\n isPreviewMode = false,\n}: UseHideSurveyOnURLChangeProps) {\n useEffect(() => {\n if (isPreviewMode || !survey.conditions?.url) {\n return\n }\n\n const checkUrlMatch = () => {\n const isSurveyTypeWidget = survey.type === SurveyType.Widget\n const doesSurveyMatchUrlCondition = doesSurveyUrlMatch(survey)\n const isSurveyWidgetTypeTab = survey.appearance?.widgetType === SurveyWidgetType.Tab && isSurveyTypeWidget\n\n if (doesSurveyMatchUrlCondition) {\n if (isSurveyWidgetTypeTab) {\n logger.info(`Showing survey ${survey.id} because it is a feedback button tab and URL matches`)\n setSurveyVisible(true)\n }\n return\n }\n\n logger.info(`Hiding survey ${survey.id} because URL does not match`)\n setSurveyVisible(false)\n return removeSurveyFromFocus(survey)\n }\n\n // Listen for browser back/forward browser history changes\n addEventListener(window, 'popstate', checkUrlMatch)\n // Listen for hash changes, for SPA frameworks that use hash-based routing\n // The hashchange event is fired when the fragment identifier of the URL has changed (the part of the URL beginning with and following the # symbol).\n addEventListener(window, 'hashchange', checkUrlMatch)\n\n // Listen for SPA navigation\n const originalPushState = window.history.pushState\n const originalReplaceState = window.history.replaceState\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args)\n checkUrlMatch()\n }\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args)\n checkUrlMatch()\n }\n\n return () => {\n window.removeEventListener('popstate', checkUrlMatch)\n window.removeEventListener('hashchange', checkUrlMatch)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [isPreviewMode, survey, removeSurveyFromFocus, setSurveyVisible])\n}\n\nexport function usePopupVisibility(\n survey: Survey,\n posthog: PostHog | undefined,\n millisecondDelay: number,\n isPreviewMode: boolean,\n removeSurveyFromFocus: (survey: SurveyWithTypeAndAppearance) => void,\n isPopup: boolean,\n surveyContainerRef?: RefObject<HTMLDivElement>\n) {\n const [isPopupVisible, setIsPopupVisible] = useState(\n isPreviewMode || millisecondDelay === 0 || survey.type === SurveyType.ExternalSurvey\n )\n const [isSurveySent, setIsSurveySent] = useState(false)\n\n const hidePopupWithViewTransition = () => {\n const removeDOMAndHidePopup = () => {\n if (isPopup) {\n removeSurveyFromFocus(survey)\n }\n setIsPopupVisible(false)\n }\n\n if (!document.startViewTransition) {\n removeDOMAndHidePopup()\n return\n }\n\n const transition = document.startViewTransition(() => {\n surveyContainerRef?.current?.remove()\n })\n\n transition.finished.then(() => {\n setTimeout(() => {\n removeDOMAndHidePopup()\n }, 100)\n })\n }\n\n const handleSurveyClosed = (event: CustomEvent) => {\n if (event.detail.surveyId !== survey.id) {\n return\n }\n hidePopupWithViewTransition()\n }\n\n useEffect(() => {\n if (!posthog) {\n logger.error('usePopupVisibility hook called without a PostHog instance.')\n return\n }\n if (isPreviewMode) {\n return\n }\n\n const handleSurveySent = (event: CustomEvent) => {\n if (event.detail.surveyId !== survey.id) {\n return\n }\n if (!survey.appearance?.displayThankYouMessage) {\n return hidePopupWithViewTransition()\n }\n setIsSurveySent(true)\n if (survey.appearance?.autoDisappear) {\n setTimeout(() => {\n hidePopupWithViewTransition()\n }, 5000)\n }\n }\n\n const showSurvey = () => {\n // check if the url is still matching, necessary for delayed surveys, as the URL may have changed\n if (!doesSurveyUrlMatch(survey)) {\n return\n }\n setIsPopupVisible(true)\n window.dispatchEvent(new Event('PHSurveyShown'))\n posthog.capture(SurveyEventName.SHOWN, {\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n })\n localStorage.setItem('lastSeenSurveyDate', new Date().toISOString())\n }\n\n addEventListener(window, 'PHSurveyClosed', handleSurveyClosed as EventListener)\n addEventListener(window, 'PHSurveySent', handleSurveySent as EventListener)\n\n if (millisecondDelay > 0) {\n // This path is only used for direct usage of SurveyPopup,\n // not for surveys managed by SurveyManager\n const timeoutId = setTimeout(showSurvey, millisecondDelay)\n return () => {\n clearTimeout(timeoutId)\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed as EventListener)\n window.removeEventListener('PHSurveySent', handleSurveySent as EventListener)\n }\n } else {\n // This is the path used for surveys managed by SurveyManager\n showSurvey()\n return () => {\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed as EventListener)\n window.removeEventListener('PHSurveySent', handleSurveySent as EventListener)\n }\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsPopupVisible,\n isPreviewMode,\n })\n\n return { isPopupVisible, isSurveySent, setIsPopupVisible, hidePopupWithViewTransition }\n}\n\ninterface SurveyPopupProps {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n style?: JSX.CSSProperties\n previewPageIndex?: number | undefined\n removeSurveyFromFocus?: (survey: SurveyWithTypeAndAppearance) => void\n isPopup?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n onPopupSurveyDismissed?: () => void\n onCloseConfirmationMessage?: () => void\n}\n\nfunction getPopoverPosition(\n type: SurveyType,\n position: SurveyPosition = SurveyPosition.Right,\n surveyWidgetType?: SurveyWidgetType\n) {\n if (type === SurveyType.ExternalSurvey) {\n return {}\n }\n\n switch (position) {\n case SurveyPosition.TopLeft:\n return { top: '0', left: '0', transform: 'translate(30px, 30px)' }\n case SurveyPosition.TopRight:\n return { top: '0', right: '0', transform: 'translate(-30px, 30px)' }\n case SurveyPosition.TopCenter:\n return { top: '0', left: '50%', transform: 'translate(-50%, 30px)' }\n case SurveyPosition.MiddleLeft:\n return { top: '50%', left: '0', transform: 'translate(30px, -50%)' }\n case SurveyPosition.MiddleRight:\n return { top: '50%', right: '0', transform: 'translate(-30px, -50%)' }\n case SurveyPosition.MiddleCenter:\n return { top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n case SurveyPosition.Left:\n return { left: '30px' }\n case SurveyPosition.Center:\n return {\n left: '50%',\n transform: 'translateX(-50%)',\n }\n default:\n case SurveyPosition.Right:\n return { right: type === SurveyType.Widget && surveyWidgetType === SurveyWidgetType.Tab ? '60px' : '30px' }\n }\n}\n\nfunction getTabPositionStyles(position: SurveyTabPosition = SurveyTabPosition.Right): JSX.CSSProperties {\n switch (position) {\n case SurveyTabPosition.Top:\n return { top: '0', left: '50%', transform: 'translateX(-50%)' }\n case SurveyTabPosition.Left:\n return { top: '50%', left: '0', transform: 'rotate(90deg) translateY(-100%)', transformOrigin: 'left top' }\n case SurveyTabPosition.Bottom: // bottom center\n return { bottom: '0', left: '50%', transform: 'translateX(-50%)' }\n default:\n case SurveyTabPosition.Right:\n // not perfectly centered vertically, to avoid a \"breaking\" change\n return {\n top: '50%',\n right: '0',\n transform: 'rotate(-90deg) translateY(-100%)',\n transformOrigin: 'right top',\n }\n }\n}\n\nexport function SurveyPopup({\n survey,\n forceDisableHtml,\n posthog,\n style = {},\n previewPageIndex,\n removeSurveyFromFocus = () => {},\n isPopup = true,\n onPreviewSubmit = () => {},\n onPopupSurveyDismissed = () => {},\n onCloseConfirmationMessage = () => {},\n}: SurveyPopupProps) {\n const surveyContainerRef = useRef<HTMLDivElement>(null)\n const isPreviewMode = Number.isInteger(previewPageIndex)\n // NB: The client-side code passes the millisecondDelay in seconds, but setTimeout expects milliseconds, so we multiply by 1000\n const surveyPopupDelayMilliseconds = survey.appearance?.surveyPopupDelaySeconds\n ? survey.appearance.surveyPopupDelaySeconds * 1000\n : 0\n const { isPopupVisible, isSurveySent, hidePopupWithViewTransition } = usePopupVisibility(\n survey,\n posthog,\n surveyPopupDelayMilliseconds,\n isPreviewMode,\n removeSurveyFromFocus,\n isPopup,\n surveyContainerRef\n )\n\n const shouldShowConfirmation = isSurveySent || previewPageIndex === survey.questions.length\n const surveyContextValue = useMemo(() => {\n const getInProgressSurvey = getInProgressSurveyState(survey)\n return {\n isPreviewMode,\n previewPageIndex: previewPageIndex,\n onPopupSurveyDismissed: () => {\n dismissedSurveyEvent(survey, posthog, isPreviewMode)\n onPopupSurveyDismissed()\n },\n isPopup: isPopup || false,\n surveySubmissionId: getInProgressSurvey?.surveySubmissionId || uuidv7(),\n onPreviewSubmit,\n posthog,\n }\n }, [isPreviewMode, previewPageIndex, isPopup, posthog, survey, onPopupSurveyDismissed, onPreviewSubmit])\n\n if (!isPopupVisible) {\n return null\n }\n\n return (\n <SurveyContext.Provider value={surveyContextValue}>\n <div\n className=\"ph-survey\"\n style={{\n ...getPopoverPosition(survey.type, survey.appearance?.position, survey.appearance?.widgetType),\n ...style,\n }}\n ref={surveyContainerRef}\n >\n {!shouldShowConfirmation ? (\n <Questions survey={survey} forceDisableHtml={!!forceDisableHtml} posthog={posthog} />\n ) : (\n <ConfirmationMessage\n header={survey.appearance?.thankYouMessageHeader || 'Thank you!'}\n description={survey.appearance?.thankYouMessageDescription || ''}\n forceDisableHtml={!!forceDisableHtml}\n contentType={survey.appearance?.thankYouMessageDescriptionContentType}\n appearance={survey.appearance || defaultSurveyAppearance}\n onClose={() => {\n hidePopupWithViewTransition()\n onCloseConfirmationMessage()\n }}\n />\n )}\n </div>\n </SurveyContext.Provider>\n )\n}\n\nexport function Questions({\n survey,\n forceDisableHtml,\n posthog,\n}: {\n survey: Survey\n forceDisableHtml: boolean\n posthog?: PostHog\n}) {\n // Initialize responses from localStorage or empty object\n const [questionsResponses, setQuestionsResponses] = useState(() => {\n const inProgressSurveyData = getInProgressSurveyState(survey)\n if (inProgressSurveyData?.responses) {\n logger.info('Survey is already in progress, filling in initial responses')\n }\n return inProgressSurveyData?.responses || {}\n })\n const { previewPageIndex, onPopupSurveyDismissed, isPopup, onPreviewSubmit, surveySubmissionId, isPreviewMode } =\n useContext(SurveyContext)\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(() => {\n const inProgressSurveyData = getInProgressSurveyState(survey)\n return previewPageIndex || inProgressSurveyData?.lastQuestionIndex || 0\n })\n const surveyQuestions = useMemo(() => getDisplayOrderQuestions(survey), [survey])\n\n // Sync preview state\n useEffect(() => {\n if (isPreviewMode && !isUndefined(previewPageIndex)) {\n setCurrentQuestionIndex(previewPageIndex)\n }\n }, [previewPageIndex, isPreviewMode])\n\n const onNextButtonClick = ({\n res,\n displayQuestionIndex,\n questionId,\n }: {\n res: string | string[] | number | null\n displayQuestionIndex: number\n questionId?: string\n }) => {\n if (!posthog) {\n logger.error('onNextButtonClick called without a PostHog instance.')\n return\n }\n\n if (!questionId) {\n logger.error('onNextButtonClick called without a questionId.')\n return\n }\n\n const responseKey = getSurveyResponseKey(questionId)\n\n const newResponses = { ...questionsResponses, [responseKey]: res }\n setQuestionsResponses(newResponses)\n\n const nextStep = getNextSurveyStep(survey, displayQuestionIndex, res)\n const isSurveyCompleted = nextStep === SurveyQuestionBranchingType.End\n\n if (!isSurveyCompleted) {\n setCurrentQuestionIndex(nextStep)\n setInProgressSurveyState(survey, {\n surveySubmissionId: surveySubmissionId,\n responses: newResponses,\n lastQuestionIndex: nextStep,\n })\n }\n\n // If partial responses are enabled, send the survey sent event with with the responses,\n // otherwise only send the event when the survey is completed\n if (survey.enable_partial_responses || isSurveyCompleted) {\n sendSurveyEvent({\n responses: newResponses,\n survey,\n surveySubmissionId,\n isSurveyCompleted,\n posthog,\n })\n }\n }\n\n const currentQuestion = surveyQuestions.at(currentQuestionIndex)\n\n if (!currentQuestion) {\n return null\n }\n\n const renderCancelButton = isPopup && survey.appearance?.hideCancelButton !== true\n\n return (\n <form className=\"survey-form\" name=\"surveyForm\">\n {renderCancelButton && (\n <Cancel\n onClick={() => {\n onPopupSurveyDismissed()\n }}\n />\n )}\n <div className=\"survey-box\">\n {getQuestionComponent({\n question: currentQuestion,\n forceDisableHtml,\n displayQuestionIndex: currentQuestionIndex,\n appearance: survey.appearance || defaultSurveyAppearance,\n onSubmit: (res) =>\n onNextButtonClick({\n res,\n displayQuestionIndex: currentQuestionIndex,\n questionId: currentQuestion.id,\n }),\n onPreviewSubmit,\n initialValue: currentQuestion.id\n ? questionsResponses[getSurveyResponseKey(currentQuestion.id)]\n : undefined,\n })}\n </div>\n </form>\n )\n}\n\nexport function FeedbackWidget({\n survey,\n forceDisableHtml,\n posthog,\n readOnly,\n}: {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n readOnly?: boolean\n}): JSX.Element | null {\n const [isFeedbackButtonVisible, setIsFeedbackButtonVisible] = useState(true)\n const [showSurvey, setShowSurvey] = useState(false)\n const [styleOverrides, setStyleOverrides] = useState<JSX.CSSProperties>({})\n\n const toggleSurvey = () => {\n setShowSurvey(!showSurvey)\n }\n\n useEffect(() => {\n if (!posthog) {\n logger.error('FeedbackWidget called without a PostHog instance.')\n return\n }\n if (readOnly) {\n return\n }\n\n if (survey.appearance?.widgetType === 'tab') {\n setStyleOverrides({\n top: '50%',\n bottom: 'auto',\n })\n }\n const handleShowSurvey = (event: Event) => {\n const customEvent = event as CustomEvent\n // Check if the event is for this specific survey instance\n if (customEvent.detail?.surveyId === survey.id) {\n logger.info(`Received show event for feedback button survey ${survey.id}`)\n setStyleOverrides(customEvent.detail.position || {})\n toggleSurvey()\n }\n }\n\n addEventListener(window, DISPATCH_FEEDBACK_WIDGET_EVENT, handleShowSurvey)\n\n // Cleanup listener on component unmount\n return () => {\n window.removeEventListener(DISPATCH_FEEDBACK_WIDGET_EVENT, handleShowSurvey)\n }\n }, [\n posthog,\n readOnly,\n survey.id,\n survey.appearance?.widgetType,\n survey.appearance?.widgetSelector,\n survey.appearance?.borderColor,\n ])\n\n useHideSurveyOnURLChange({\n survey,\n setSurveyVisible: setIsFeedbackButtonVisible,\n })\n\n if (!isFeedbackButtonVisible) {\n return null\n }\n\n const resetShowSurvey = () => {\n // hide the feedback button after answering or closing the survey if it's not always show\n if (survey.schedule !== SurveySchedule.Always) {\n setIsFeedbackButtonVisible(false)\n }\n // important so our view transition has time to run\n setTimeout(() => {\n setShowSurvey(false)\n }, 200)\n }\n\n return (\n <Fragment>\n {survey.appearance?.widgetType === 'tab' && (\n <button\n className={`ph-survey-widget-tab ${survey.appearance?.tabPosition === SurveyTabPosition.Top ? 'widget-tab-top' : ''}`}\n onClick={toggleSurvey}\n disabled={readOnly}\n style={getTabPositionStyles(survey.appearance?.tabPosition)}\n >\n {survey.appearance?.widgetLabel || ''}\n </button>\n )}\n {showSurvey && (\n <SurveyPopup\n posthog={posthog}\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={styleOverrides}\n onPopupSurveyDismissed={resetShowSurvey}\n onCloseConfirmationMessage={resetShowSurvey}\n />\n )}\n </Fragment>\n )\n}\n\ninterface GetQuestionComponentProps extends CommonQuestionProps {\n question: SurveyQuestion\n displayQuestionIndex: number\n}\n\nconst getQuestionComponent = ({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: GetQuestionComponentProps): JSX.Element | null => {\n const baseProps = {\n forceDisableHtml,\n appearance,\n onPreviewSubmit: (res: string | string[] | number | null) => {\n onPreviewSubmit(res)\n },\n onSubmit: (res: string | string[] | number | null) => {\n onSubmit(res)\n },\n initialValue,\n displayQuestionIndex,\n }\n\n switch (question.type) {\n case SurveyQuestionType.Open:\n return <OpenTextQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.Link:\n return <LinkQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.Rating:\n return <RatingQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.SingleChoice:\n case SurveyQuestionType.MultipleChoice:\n return <MultipleChoiceQuestion {...baseProps} question={question} key={question.id} />\n default:\n logger.error(`Unsupported question type: ${(question as any).type}`)\n return null\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n // Conversations keys (defined in lazy-loaded extension)\n '$conversations_widget_session_id',\n '$conversations_ticket_id',\n '$conversations_widget_state',\n '$conversations_user_traits',\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n","import { Survey, SurveyQuestion, SurveyQuestionType } from '../posthog-surveys-types'\nimport { getSurveyResponseKey } from '../extensions/surveys/surveys-extension-utils'\nimport { logger } from './logger'\nimport { isUndefined } from '@posthog/core'\n\n/**\n * Extracted URL prefill parameters by question index\n */\nexport interface PrefillParams {\n [questionIndex: number]: string[]\n}\n\n/**\n * Extract prefill parameters from URL search string\n * Format: ?q0=1&q1=8&q2=0&q2=2&auto_submit=true\n * NOTE: Manual parsing for IE11/op_mini compatibility (no URLSearchParams)\n */\nexport function extractPrefillParamsFromUrl(searchString: string): {\n params: PrefillParams\n autoSubmit: boolean\n} {\n const params: PrefillParams = {}\n let autoSubmit = false\n\n // Remove leading ? if present\n const cleanSearch = searchString.replace(/^\\?/, '')\n if (!cleanSearch) {\n return { params, autoSubmit }\n }\n\n // Split by & to get key-value pairs\n const pairs = cleanSearch.split('&')\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n if (!key || isUndefined(value)) {\n continue\n }\n\n const decodedKey = decodeURIComponent(key)\n const decodedValue = decodeURIComponent(value)\n\n // Check for auto_submit parameter\n if (decodedKey === 'auto_submit' && decodedValue === 'true') {\n autoSubmit = true\n continue\n }\n\n // Check for question parameters (q0, q1, etc.)\n const match = decodedKey.match(/^q(\\d+)$/)\n if (match) {\n const questionIndex = parseInt(match[1], 10)\n if (!params[questionIndex]) {\n params[questionIndex] = []\n }\n params[questionIndex].push(decodedValue)\n }\n }\n\n return { params, autoSubmit }\n}\n\n/**\n * Convert URL prefill values to SDK response format\n */\nexport function convertPrefillToResponses(survey: Survey, prefillParams: PrefillParams): Record<string, any> {\n const responses: Record<string, any> = {}\n\n survey.questions.forEach((question: SurveyQuestion, index: number) => {\n if (!prefillParams[index] || !question.id) {\n return\n }\n\n const values = prefillParams[index]\n const responseKey = getSurveyResponseKey(question.id)\n\n try {\n switch (question.type) {\n case SurveyQuestionType.SingleChoice: {\n if (!question.choices || question.choices.length === 0) {\n logger.warn(`[Survey Prefill] Question ${index} has no choices`)\n return\n }\n const choiceIndex = parseInt(values[0], 10)\n if (isNaN(choiceIndex) || choiceIndex < 0 || choiceIndex >= question.choices.length) {\n logger.warn(`[Survey Prefill] Invalid choice index for q${index}: ${values[0]}`)\n return\n }\n responses[responseKey] = question.choices[choiceIndex]\n break\n }\n\n case SurveyQuestionType.MultipleChoice: {\n if (!question.choices || question.choices.length === 0) {\n logger.warn(`[Survey Prefill] Question ${index} has no choices`)\n return\n }\n const choiceIndices = values\n .map((v) => parseInt(v, 10))\n .filter((i) => !isNaN(i) && i >= 0 && i < question.choices.length)\n\n if (choiceIndices.length === 0) {\n logger.warn(`[Survey Prefill] No valid choices for q${index}`)\n return\n }\n\n // Remove duplicates and map to choice values\n const uniqueChoices = [...new Set(choiceIndices.map((i) => question.choices[i]))]\n if (uniqueChoices.length < choiceIndices.length) {\n logger.warn(`[Survey Prefill] Removed duplicate choices for q${index}`)\n }\n responses[responseKey] = uniqueChoices\n break\n }\n\n case SurveyQuestionType.Rating: {\n const rating = parseInt(values[0], 10)\n const scale = question.scale || 10\n\n if (isNaN(rating) || rating < 0 || rating > scale) {\n logger.warn(`[Survey Prefill] Invalid rating for q${index}: ${values[0]} (scale: 0-${scale})`)\n return\n }\n responses[responseKey] = rating\n break\n }\n\n default:\n logger.info(`[Survey Prefill] Question type ${question.type} does not support prefill`)\n }\n } catch (error) {\n logger.error(`[Survey Prefill] Error converting q${index}:`, error)\n }\n })\n\n return responses\n}\n\n/**\n * Calculate which question index to start at based on prefilled questions.\n * Only advances past consecutive prefilled questions (starting from index 0)\n * that have skipSubmitButton enabled.\n *\n * @param questions - The survey questions array\n * @param prefilledIndices - Array of question indices that have been prefilled\n * @returns Object with startQuestionIndex and map of questions which have been skipped\n */\nexport function calculatePrefillStartIndex(\n questions: SurveyQuestion[],\n prefilledIndices: number[],\n responses: Record<string, any>\n): { startQuestionIndex: number; skippedResponses: Record<string, any> } {\n let startQuestionIndex = 0\n const skippedResponses: Record<string, any> = {}\n\n for (let i = 0; i < questions.length; i++) {\n // stop at the first question that is not prefilled\n if (!prefilledIndices.includes(i)) {\n break\n }\n\n const question = questions[i]\n // only advance if the prefilled question has skipSubmitButton\n if (question && 'skipSubmitButton' in question && question.skipSubmitButton) {\n startQuestionIndex = i + 1\n if (!question.id) continue\n const responseKey = getSurveyResponseKey(question.id)\n if (!isUndefined(responses[responseKey])) {\n skippedResponses[responseKey] = responses[responseKey]\n }\n } else {\n // show question if skipSubmitButton is false, even if prefilled\n break\n }\n }\n\n return { startQuestionIndex, skippedResponses }\n}\n","import { generateSurveys } from '../extensions/surveys'\n\nimport { assignableWindow } from '../utils/globals'\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.generateSurveys = generateSurveys\n\n// this used to be directly on window, but we moved it to __PosthogExtensions__\n// it is still on window for backwards compatibility\nassignableWindow.extendPostHogWithSurveys = generateSurveys\n\nexport default generateSurveys\n"],"names":["c","s","a","t","r","u","i","o","f","e","n","__b","__r","v","diffed","l","__c","m","unmount","d","__h","__H","__","length","push","__V","h","B","__N","setState","filter","every","call","this","forEach","props","shouldComponentUpdate","componentWillUpdate","__e","p","__s","z","_","F","current","q","context","sub","value","b","shift","__P","k","w","__v","requestAnimationFrame","j","some","g","clearTimeout","cancelAnimationFrame","setTimeout","SurveyWidgetType","SurveyPosition","SurveyTabPosition","SurveyType","SurveyQuestionType","SurveyQuestionBranchingType","SurveySchedule","SurveyEventName","SurveyEventProperties","win","window","undefined","global","globalThis","self","File","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","nativeIsArray","Array","isArray","type_utils_toString","Object","prototype","toString","obj","isUndefined","x","isString","isNull","isNullish","isNumber","MOBILE","ANDROID","TABLET","ANDROID_TABLET","IPAD","APPLE_WATCH","APPLE","BLACKBERRY","NINTENDO","PLAYSTATION","XBOX","WINDOWS_PHONE","WINDOWS","NOKIA","OUYA","GENERIC","GENERIC_MOBILE","toLowerCase","GENERIC_TABLET","XBOX_REGEX","RegExp","PLAYSTATION_REGEX","NINTENDO_REGEX","BLACKBERRY_REGEX","detectDeviceType","user_agent","device","test","detectDevice","_createLogger","prefix","_temp","debugEnabled","logger","_log","level","POSTHOG_DEBUG","console","consoleLog","_len","arguments","args","_key","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_len5","_key5","uninitializedWarning","methodName","createLogger","additionalPrefix","options","addEventListener","element","event","callback","capture","passive","SURVEY_LOGGER","SURVEY_IN_PROGRESS_PREFIX","getSurveyInteractionProperty","survey","action","surveyProperty","id","current_iteration","getSurveyStorageKey","key","getSurveySeenKey","setSurveySeenOnLocalStorage","localStorage","getItem","setItem","IN_APP_SURVEY_TYPES","Popover","Widget","API","Math","trunc","ceil","floor","Number","isInteger","isFinite","DIGITS","UUID","constructor","bytes","TypeError","fromFieldsV7","unixTsMs","randA","randBHi","randBLo","RangeError","Uint8Array","pow","text","charAt","Error","clone","slice","equals","other","compareTo","diff","sign","V7Generator","_timestamp","_counter","_random","DefaultRandom","generate","generateOrAbort","valueAfterReset","ts","Date","now","_resetCounter","nextUint32","defaultGenerator","getRandomValues","buffer","UUIDV7_DENY_WEAK_RNG","random","crypto","_buffer","Uint32Array","_cursor","Infinity","uuidv7","uuidv7obj","sendBeacon","isMatchingRegex","pattern","str","_unused","isValidRegex","_unused2","propertyComparisons","exact","targets","values","target","is_not","regex","not_regex","icontains","map","includes","not_icontains","gt","numValue","parseFloat","isNaN","lt","_window","_document","getSurveyResponseKey","questionId","BLACK_TEXT_COLOR","defaultSurveyAppearance","fontFamily","backgroundColor","submitButtonColor","submitButtonTextColor","ratingButtonColor","ratingButtonActiveColor","borderColor","placeholder","whiteLabel","displayThankYouMessage","thankYouMessageHeader","position","Right","widgetType","Tab","widgetLabel","widgetColor","zIndex","disabledButtonOpacity","maxWidth","textSubtleColor","boxPadding","boxShadow","borderRadius","shuffleQuestions","surveyPopupDelaySeconds","outlineColor","inputBackground","inputTextColor","scrollbarThumbColor","scrollbarTrackColor","hex2rgb","startsWith","hexColor","replace","parseInt","getContrastingTextColor","color","rgb","nameColorToHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","colorMatch","match","sqrt","getSurveyStylesheet","posthog","stylesheet","prepareStylesheet","innerText","_posthog$config","createElement","config","prepare_external_dependency_stylesheet","setAttribute","retrieveSurveyShadow","widgetClassName","getSurveyContainerClass","existingDiv","querySelector","shadowRoot","shadow","isNewlyCreated","div","addSurveyCSSVariablesToElement","type","appearance","effectiveAppearance","_extends","hostStyle","style","surveyHasBottomBorder","Center","Left","setProperty","defaultFontStack","getFontFamily","textColor","userInputBg","inputBackgroundColor","inputBgColor","className","attachShadow","mode","existingStylesheet","removeChild","appendChild","getSurveyResponseValue","responses","response","sendSurveyEvent","_ref","surveySubmissionId","isSurveyCompleted","SENT","SURVEY_NAME","name","SURVEY_ID","SURVEY_ITERATION","SURVEY_ITERATION_START_DATE","current_iteration_start_date","SURVEY_QUESTIONS","questions","question","SURVEY_SUBMISSION_ID","SURVEY_COMPLETED","sessionRecordingUrl","get_session_replay_url","$set","dispatchEvent","CustomEvent","detail","surveyId","clearInProgressSurveyState","_surveyHasResponses","inProgressSurvey","resp","_buildSurveyEventProperties","SURVEY_PARTIALLY_COMPLETED","dismissedSurveyEvent","readOnly","getInProgressSurveyState","DISMISSED","sendSurveyAbandonedEvent","abandonedKey","getSurveyAbandonedKey","ABANDONED","transport","shuffle","array","sort","reverseIfUnshuffled","unshuffled","shuffled","val","index","reverse","getDisplayOrderQuestions","enable_partial_responses","canActivateRepeatedly","_survey$conditions3","conditions","events","repeatedActivation","_survey$conditions","_survey$conditions2","hasEvents","schedule","Always","isSurveyInProgress","SurveyContext","createContext","isPreviewMode","previewPageIndex","onPopupSurveyDismissed","isPopup","onPreviewSubmit","useSurveyContext","useContext","renderChildrenAsTextOrHtml","_ref2","component","children","renderAsHtml","cloneElement","dangerouslySetInnerHTML","__html","defaultMatchType","matchType","doesSurveyUrlMatch","_survey$conditions4","_window$location","_survey$conditions5","url","href","urlMatchType","getInProgressSurveyStateKey","setInProgressSurveyState","state","JSON","stringify","stateString","parse","removeItem","asSelector","satisfiedEmoji","_jsx","xmlns","height","viewBox","width","neutralEmoji","dissatisfiedEmoji","veryDissatisfiedEmoji","verySatisfiedEmoji","cancelSVG","_jsxs","fill","IconPosthogLogo","maskType","maskUnits","y","mask","transform","PostHogLogo","rel","BottomSection","submitDisabled","onSubmit","link","skipSubmitButton","disabled","onClick","open","QuestionHeader","forceDisableHtml","htmlFor","class","Open","description","descriptionContentType","Cancel","ConfirmationMessage","header","contentType","onClose","useEffect","handleKeyDown","preventDefault","removeEventListener","role","tabIndex","hideCancelButton","thankYouMessageCloseButtonText","isValidStringArray","item","OpenTextQuestion","displayQuestionIndex","initialValue","inputRef","useRef","setText","useState","_inputRef$current","focus","Fragment","ref","rows","onInput","currentTarget","stopPropagation","onKeyDown","buttonText","optional","LinkQuestion","RatingQuestion","_ref3","scale","starting","rating","setRating","handleSubmit","num","display","threeScaleEmojis","fiveScaleEmojis","emoji","idx","gridTemplateColumns","getScaleNumbers","number","RatingButton","active","setActiveNumber","lowerBoundLabel","upperBoundLabel","submitButtonText","_ref4","MultipleChoiceQuestion","_ref5","openChoiceInputRef","choices","useMemo","shuffleOptions","displayOrderChoices","openEndedChoice","hasOpenChoice","pop","shuffledOptions","getDisplayOrderChoices","selectedChoices","setSelectedChoices","initializeSelectedChoices","questionType","SingleChoice","openEndedState","setOpenEndedState","initializeOpenEndedState","isSelected","inputValue","openEndedValue","find","choice","isSingleChoiceQuestion","isMultipleChoiceQuestion","MultipleChoice","shouldSkipSubmit","handleChoiceChange","isOpenChoice","newOpenSelected","prev","_openChoiceInputRef$c","handleOpenEndedInputChange","newValue","handleOpenEndedKeyDown","isSubmitDisabled","trim","inputId","openInputId","isChecked","checked","onChange","fiveScaleNumbers","sevenScaleNumbers","tenScaleNumbers","DISPATCH_FEEDBACK_WIDGET_EVENT","WIDGET_LISTENER_ATTRIBUTE","getNextSurveyStep","currentQuestionIndex","_question$branching","nextQuestionIndex","branching","End","SpecificQuestion","ResponseBased","_question$branching2","selectedChoiceIndex","indexOf","responseValues","hasOwnProperty","nextStep","Rating","_question$branching3","ratingBucket","responseValue","getRatingBucketForResponseValue","SURVEY_NEXT_TO_TRIGGER_PARAMS","SurveyManager","_this","_surveyTimeouts","Map","_widgetSelectorListeners","_prefillHandledSurveys","Set","handlePageUnload","surveys","_posthog","get_property","handlePopoverSurvey","_survey$appearance","_clearSurveyTimeout","_addSurveyToFocus","delaySeconds","render","SurveyPopup","removeSurveyFromFocus","_removeSurveyFromFocus","timeoutId","delete","set","_handleWidget","FeedbackWidget","_removeWidgetSelectorListener","_removeSurveyFromDom","existing","get","listener","removeAttribute","_manageWidgetSelectorListener","selector","currentElement","existingListenerData","hasAttribute","_survey$appearance2","_survey$appearance3","positionStyles","NextToTrigger","surveyWidth","buttonRect","getBoundingClientRect","viewportHeight","innerHeight","viewportWidth","innerWidth","estimatedMinSurveyHeight","left","spacing","spaceBelow","bottom","spaceAbove","top","showAbove","right","getNextToTriggerPosition","renderPopover","renderSurvey","_this$_posthog$config","prefillFromUrl","_handleUrlPrefill","getActiveMatchingSurveys","forceReload","_this$_posthog","getSurveys","targetingMatchedSurveys","checkSurveyEligibility","eligible","_isSurveyConditionMatched","_hasActionOrEventTriggeredSurvey","_checkFlags","callSurveysAndEvaluateDisplayLogic","inAppSurveysWithDisplayLogic","inAppSurveysQueue","_sortSurveysByAppearanceDelay","activeSelectorSurveys","_survey$appearance4","_survey$appearance5","_survey$appearance6","_survey$appearance7","Selector","widgetSelector","add","_surveyInFocus","has","timeout","cancelSurvey","_a$appearance","_b$appearance","isSurveyInProgressA","isSurveyInProgressB","aIsAlways","bIsAlways","params","searchString","autoSubmit","cleanSearch","pairs","split","pair","decodedKey","decodeURIComponent","decodedValue","questionIndex","extractPrefillParamsFromUrl","search","keys","prefillParams","responseKey","choiceIndex","choiceIndices","uniqueChoices","convertPrefillToResponses","submissionId","prefilledIndices","startQuestionIndex","skippedResponses","calculatePrefillStartIndex","lastQuestionIndex","_isSurveyFeatureFlagEnabled","flagKey","flagVariant","isFeatureEnabled","featureFlags","send_event","flagVariantCheck","getFeatureFlag","_survey$conditions6","_survey$conditions7","_survey$conditions8","deviceTypes","deviceType","deviceTypesMatchType","doesSurveyDeviceTypesMatch","_survey$conditions9","doesSurveyMatchSelector","_internalFlagCheckSatisfied","internal_targeting_flag_key","eligibility","reason","start_date","end_date","isSurveyRunning","linkedFlagVariant","linked_flag_key","targeting_flag_key","waitPeriodInDays","lastSeenSurveyDate","today","abs","getTime","hasWaitPeriodPassed","seenSurveyWaitPeriodInDays","getSurveySeen","_this$_posthog$survey","doesSurveyActivateByEvent","actions","doesSurveyActivateByAction","surveysActivatedByEventsOrActions","_surveyEventReceiver","_survey$feature_flag_","feature_flag_keys","shadowContainer","remove","getTestAPI","addSurveyToFocus","surveyInFocus","surveyTimeouts","handleWidget","manageWidgetSelectorListener","sortSurveysByAppearanceDelay","checkFlags","bind","isSurveyFeatureFlagEnabled","generateSurveys","isSurveysEnabled","intervalId","surveyManager","disable_surveys_automatic_display","startInterval","setInterval","hidden","clearInterval","useHideSurveyOnURLChange","setSurveyVisible","checkUrlMatch","_survey$appearance8","isSurveyTypeWidget","doesSurveyMatchUrlCondition","isSurveyWidgetTypeTab","originalPushState","history","pushState","originalReplaceState","replaceState","apply","getPopoverPosition","surveyWidgetType","ExternalSurvey","TopLeft","TopRight","TopCenter","MiddleLeft","MiddleRight","MiddleCenter","getTabPositionStyles","Top","transformOrigin","Bottom","_ref6","_survey$appearance1","_survey$appearance10","_survey$appearance11","_survey$appearance12","_survey$appearance13","_survey$appearance14","onCloseConfirmationMessage","surveyContainerRef","surveyPopupDelayMilliseconds","isPopupVisible","isSurveySent","hidePopupWithViewTransition","millisecondDelay","setIsPopupVisible","setIsSurveySent","removeDOMAndHidePopup","startViewTransition","_surveyContainerRef$c","finished","then","handleSurveyClosed","handleSurveySent","_survey$appearance9","_survey$appearance0","autoDisappear","showSurvey","Event","SHOWN","toISOString","usePopupVisibility","shouldShowConfirmation","surveyContextValue","getInProgressSurvey","Provider","thankYouMessageDescription","thankYouMessageDescriptionContentType","Questions","_ref7","_survey$appearance15","questionsResponses","setQuestionsResponses","inProgressSurveyData","setCurrentQuestionIndex","surveyQuestions","currentQuestion","at","getQuestionComponent","res","_ref8","newResponses","onNextButtonClick","_ref9","_survey$appearance17","_survey$appearance18","_survey$appearance19","_survey$appearance20","_survey$appearance21","_survey$appearance22","_survey$appearance23","isFeedbackButtonVisible","setIsFeedbackButtonVisible","setShowSurvey","styleOverrides","setStyleOverrides","toggleSurvey","_survey$appearance16","handleShowSurvey","_customEvent$detail","customEvent","resetShowSurvey","tabPosition","_ref0","baseProps","_createElement","Link","__PosthogExtensions__","extendPostHogWithSurveys"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"surveys.js","sources":["../../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/dist/preact.module.js","../../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/hooks/dist/hooks.module.js","../src/posthog-surveys-types.ts","../src/utils/globals.ts","../../core/dist/utils/type-utils.mjs","../../core/dist/utils/user-agent-utils.mjs","../src/utils/logger.ts","../src/utils/index.ts","../src/utils/survey-utils.ts","../src/uuidv7.ts","../src/request.ts","../src/utils/regex-utils.ts","../src/utils/property-utils.ts","../src/extensions/utils/stylesheet-loader.ts","../src/extensions/surveys/surveys-extension-utils.tsx","../src/extensions/surveys/icons.tsx","../src/extensions/surveys/components/PostHogLogo.tsx","../src/extensions/surveys/components/BottomSection.tsx","../src/extensions/surveys/components/QuestionHeader.tsx","../src/extensions/surveys/components/ConfirmationMessage.tsx","../src/extensions/surveys/components/QuestionTypes.tsx","../src/utils/survey-branching.ts","../src/extensions/surveys.tsx","../src/constants.ts","../src/utils/survey-url-prefill.ts","../src/entrypoints/surveys.ts"],"sourcesContent":["var n,l,u,t,i,o,r,f,e,c={},s=[],a=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,h=Array.isArray;function v(n,l){for(var u in l)n[u]=l[u];return n}function p(n){var l=n.parentNode;l&&l.removeChild(n)}function y(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return d(l,f,i,o,null)}function d(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function _(){return{current:null}}function g(n){return n.children}function b(n,l){this.props=n,this.context=l}function m(n,l){if(null==l)return n.__?m(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?m(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function w(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!x.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(x)}function x(){var n,u,t,o,r,e,c,s,a;for(i.sort(f);n=i.shift();)n.__d&&(u=i.length,o=void 0,e=(r=(t=n).__v).__e,s=[],a=[],(c=t.__P)&&((o=v({},r)).__v=r.__v+1,l.vnode&&l.vnode(o),L(c,o,r,t.__n,void 0!==c.ownerSVGElement,32&r.__u?[e]:null,s,null==e?m(r):e,!!(32&r.__u),a),o.__.__k[o.__i]=o,M(s,o,a),o.__e!=e&&k(o)),i.length>u&&i.sort(f));x.__r=0}function C(n,l,u,t,i,o,r,f,e,a,h){var v,p,y,d,_,g=t&&t.__k||s,b=l.length;for(u.__d=e,P(u,l,g),e=u.__d,v=0;v<b;v++)null!=(y=u.__k[v])&&\"boolean\"!=typeof y&&\"function\"!=typeof y&&(p=-1===y.__i?c:g[y.__i]||c,y.__i=v,L(n,y,p,i,o,r,f,e,a,h),d=y.__e,y.ref&&p.ref!=y.ref&&(p.ref&&z(p.ref,null,y),h.push(y.ref,y.__c||d,y)),null==_&&null!=d&&(_=d),65536&y.__u||p.__k===y.__k?e=S(y,e,n):\"function\"==typeof y.type&&void 0!==y.__d?e=y.__d:d&&(e=d.nextSibling),y.__d=void 0,y.__u&=-196609);u.__d=e,u.__e=_}function P(n,l,u){var t,i,o,r,f,e=l.length,c=u.length,s=c,a=0;for(n.__k=[],t=0;t<e;t++)null!=(i=n.__k[t]=null==(i=l[t])||\"boolean\"==typeof i||\"function\"==typeof i?null:\"string\"==typeof i||\"number\"==typeof i||\"bigint\"==typeof i||i.constructor==String?d(null,i,null,null,i):h(i)?d(g,{children:i},null,null,null):void 0===i.constructor&&i.__b>0?d(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=H(i,u,r=t+a,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,\"function\"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f===r+1?a++:f>r?s>e-r?a+=f-r:a--:a=f<r&&f==r-1?f-r:0,f!==t+a&&(i.__u|=65536))):(o=u[t])&&null==o.key&&o.__e&&(o.__e==n.__d&&(n.__d=m(o)),N(o,o,!1),u[t]=null,s--);if(s)for(t=0;t<c;t++)null!=(o=u[t])&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=m(o)),N(o,o))}function S(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=S(t[i],l,u));return l}return n.__e!=l&&(u.insertBefore(n.__e,l||null),l=n.__e),l&&l.nextSibling}function $(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(h(n)?n.some(function(n){$(n,l)}):l.push(n)),l}function H(n,l,u,t){var i=n.key,o=n.type,r=u-1,f=u+1,e=l[u];if(null===e||e&&i==e.key&&o===e.type)return u;if(t>(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f<l.length;){if(r>=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f<l.length){if((e=l[f])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return f;f++}}return-1}function I(n,l,u){\"-\"===l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||a.test(l)?u:u+\"px\"}function T(n,l,u,t,i){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||I(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||I(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/(PointerCapture)$|Capture$/,\"$1\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=Date.now(),n.addEventListener(l,o?D:A,o)):n.removeEventListener(l,o?D:A,o);else{if(i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!==l&&\"height\"!==l&&\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&\"rowSpan\"!==l&&\"colSpan\"!==l&&\"role\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!==l[4]?n.removeAttribute(l):n.setAttribute(l,u))}}function A(n){var u=this.l[n.type+!1];if(n.t){if(n.t<=u.u)return}else n.t=Date.now();return u(l.event?l.event(n):n)}function D(n){return this.l[n.type+!0](l.event?l.event(n):n)}function L(n,u,t,i,o,r,f,e,c,s){var a,p,y,d,_,m,k,w,x,P,S,$,H,I,T,A=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[e=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof A)try{if(w=u.props,x=(a=A.contextType)&&i[a.__c],P=a?x?x.props.value:a.__:i,t.__c?k=(p=u.__c=t.__c).__=p.__E:(\"prototype\"in A&&A.prototype.render?u.__c=p=new A(w,P):(u.__c=p=new b(w,P),p.constructor=A,p.render=O),x&&x.sub(p),p.props=w,p.state||(p.state={}),p.context=P,p.__n=i,y=p.__d=!0,p.__h=[],p._sb=[]),null==p.__s&&(p.__s=p.state),null!=A.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=v({},p.__s)),v(p.__s,A.getDerivedStateFromProps(w,p.__s))),d=p.props,_=p.state,p.__v=u,y)null==A.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==A.getDerivedStateFromProps&&w!==d&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(w,P),!p.__e&&(null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(w,p.__s,P)||u.__v===t.__v)){for(u.__v!==t.__v&&(p.props=w,p.state=p.__s,p.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u)}),S=0;S<p._sb.length;S++)p.__h.push(p._sb[S]);p._sb=[],p.__h.length&&f.push(p);break n}null!=p.componentWillUpdate&&p.componentWillUpdate(w,p.__s,P),null!=p.componentDidUpdate&&p.__h.push(function(){p.componentDidUpdate(d,_,m)})}if(p.context=P,p.props=w,p.__P=n,p.__e=!1,$=l.__r,H=0,\"prototype\"in A&&A.prototype.render){for(p.state=p.__s,p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),I=0;I<p._sb.length;I++)p.__h.push(p._sb[I]);p._sb=[]}else do{p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),p.state=p.__s}while(p.__d&&++H<25);p.state=p.__s,null!=p.getChildContext&&(i=v(v({},i),p.getChildContext())),y||null==p.getSnapshotBeforeUpdate||(m=p.getSnapshotBeforeUpdate(d,_)),C(n,h(T=null!=a&&a.type===g&&null==a.key?a.props.children:a)?T:[T],u,t,i,o,r,f,e,c,s),p.base=u.__e,u.__u&=-161,p.__h.length&&f.push(p),k&&(p.__E=p.__=null)}catch(n){u.__v=null,c||null!=r?(u.__e=e,u.__u|=c?160:32,r[r.indexOf(e)]=null):(u.__e=t.__e,u.__k=t.__k),l.__e(n,u,t)}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=j(t.__e,u,t,i,o,r,f,c,s);(a=l.diffed)&&a(u)}function M(n,u,t){u.__d=void 0;for(var i=0;i<t.length;i++)z(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function j(l,u,t,i,o,r,f,e,s){var a,v,y,d,_,g,b,k=t.props,w=u.props,x=u.type;if(\"svg\"===x&&(o=!0),null!=r)for(a=0;a<r.length;a++)if((_=r[a])&&\"setAttribute\"in _==!!x&&(x?_.localName===x:3===_.nodeType)){l=_,r[a]=null;break}if(null==l){if(null===x)return document.createTextNode(w);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",x):document.createElement(x,w.is&&w),r=null,e=!1}if(null===x)k===w||e&&l.data===w||(l.data=w);else{if(r=r&&n.call(l.childNodes),k=t.props||c,!e&&null!=r)for(k={},a=0;a<l.attributes.length;a++)k[(_=l.attributes[a]).name]=_.value;for(a in k)_=k[a],\"children\"==a||(\"dangerouslySetInnerHTML\"==a?y=_:\"key\"===a||a in w||T(l,a,null,_,o));for(a in w)_=w[a],\"children\"==a?d=_:\"dangerouslySetInnerHTML\"==a?v=_:\"value\"==a?g=_:\"checked\"==a?b=_:\"key\"===a||e&&\"function\"!=typeof _||k[a]===_||T(l,a,_,k[a],o);if(v)e||y&&(v.__html===y.__html||v.__html===l.innerHTML)||(l.innerHTML=v.__html),u.__k=[];else if(y&&(l.innerHTML=\"\"),C(l,h(d)?d:[d],u,t,i,o&&\"foreignObject\"!==x,r,f,r?r[0]:t.__k&&m(t,0),e,s),null!=r)for(a=r.length;a--;)null!=r[a]&&p(r[a]);e||(a=\"value\",void 0!==g&&(g!==l[a]||\"progress\"===x&&!g||\"option\"===x&&g!==k[a])&&T(l,a,g,k[a],!1),a=\"checked\",void 0!==b&&b!==l[a]&&T(l,a,b,k[a],!1))}return l}function z(n,u,t){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,t)}}function N(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||z(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null,n.__c=void 0}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&N(i[o],u,t||\"function\"!=typeof n.type);t||null==n.__e||p(n.__e),n.__=n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function q(u,t,i){var o,r,f,e;l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],e=[],L(t,u=(!o&&i||t).__k=y(g,null,[u]),r||c,c,void 0!==t.ownerSVGElement,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,f,!o&&i?i:r?r.__e:t.firstChild,o,e),M(f,u,e)}function B(n,l){q(n,l,B)}function E(l,u,t){var i,o,r,f,e=v({},l.props);for(r in l.type&&l.type.defaultProps&&(f=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=void 0===u[r]&&void 0!==f?f[r]:u[r];return arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),d(l.type,e,i||l.key,o||l.ref,null)}function F(n,l){var u={__c:l=\"__cC\"+e++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,w(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=v({},this.state),\"function\"==typeof n&&(n=n(v({},u),this.props)),n&&v(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),w(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),w(this))},b.prototype.render=g,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},x.__r=0,e=0;export{b as Component,g as Fragment,E as cloneElement,F as createContext,y as createElement,_ as createRef,y as h,B as hydrate,t as isValidElement,l as options,q as render,$ as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=[],e=n.__b,a=n.__r,v=n.diffed,l=n.__c,m=n.unmount;function d(t,u){n.__h&&n.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c}),i.__[t]}function h(n){return o=1,s(B,n)}function s(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function p(u,i){var o=d(t++,3);!n.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o))}function y(u,i){var o=d(t++,4);!n.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o))}function _(n){return o=5,F(function(){return{current:n}},[])}function A(n,t,r){o=6,y(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function F(n,r){var u=d(t++,7);return z(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function q(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x(t,r){n.useDebugValue&&n.useDebugValue(r?r(t):t)}function P(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function V(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w),t.__H.__h=[]}catch(r){t.__H.__h=[],n.__e(r,t.__v)}}n.__b=function(n){r=null,e&&e(n)},n.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0})):(i.__h.forEach(k),i.__h.forEach(w),i.__h=[],t=0)),u=r},n.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===n.requestAnimationFrame||((i=n.requestAnimationFrame)||j)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c})),u=r=null},n.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return!n.__||w(n)})}catch(u){r.some(function(n){n.__h&&(n.__h=[])}),r=[],n.__e(u,t.__v)}}),l&&l(t,r)},n.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n)}catch(n){r=n}}),u.__H=void 0,r&&n.__e(r,u.__v))};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r))}function k(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function w(n){var t=r;n.__c=n.__(),r=t}function z(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B(n,t){return\"function\"==typeof t?t(n):t}export{T as useCallback,q as useContext,x as useDebugValue,p as useEffect,P as useErrorBoundary,V as useId,A as useImperativeHandle,y as useLayoutEffect,F as useMemo,s as useReducer,_ as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\n\nimport type { PropertyMatchType } from './types'\nimport type { SurveyAppearance as CoreSurveyAppearance } from '@posthog/core'\n\nexport enum SurveyEventType {\n Activation = 'events',\n Cancellation = 'cancelEvents',\n}\n\n// Extended operator type to include numeric operators not in PropertyMatchType\nexport type PropertyOperator = PropertyMatchType | 'gt' | 'lt'\n\nexport type PropertyFilters = {\n [propertyName: string]: {\n values: string[]\n operator: PropertyOperator\n }\n}\n\nexport interface SurveyEventWithFilters {\n name: string\n propertyFilters?: PropertyFilters\n}\n\nexport enum SurveyWidgetType {\n Button = 'button',\n Tab = 'tab',\n Selector = 'selector',\n}\n\nexport enum SurveyPosition {\n TopLeft = 'top_left',\n TopRight = 'top_right',\n TopCenter = 'top_center',\n MiddleLeft = 'middle_left',\n MiddleRight = 'middle_right',\n MiddleCenter = 'middle_center',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n NextToTrigger = 'next_to_trigger',\n}\n\nexport enum SurveyTabPosition {\n Top = 'top',\n Left = 'left',\n Right = 'right',\n Bottom = 'bottom',\n}\n\n// Extends core SurveyAppearance with browser-specific fields\n// Omit 'position' from core because browser's SurveyPosition has additional values (e.g., NextToTrigger)\nexport interface SurveyAppearance extends Omit<CoreSurveyAppearance, 'position'> {\n // Browser-specific fields not in core\n /** @deprecated - not currently used */\n descriptionTextColor?: string\n ratingButtonHoverColor?: string\n whiteLabel?: boolean\n tabPosition?: SurveyTabPosition\n fontFamily?: string\n maxWidth?: string\n zIndex?: string\n disabledButtonOpacity?: string\n boxPadding?: string\n /** @deprecated Use inputBackground instead (inherited from core) */\n inputBackgroundColor?: string\n // Hide the X (cancel) button - defaults to false (show the button)\n hideCancelButton?: boolean\n // Browser's SurveyPosition has more options than core (e.g., NextToTrigger)\n position?: SurveyPosition\n}\n\nexport enum SurveyType {\n Popover = 'popover',\n API = 'api',\n Widget = 'widget',\n ExternalSurvey = 'external_survey',\n}\n\nexport type SurveyQuestion = BasicSurveyQuestion | LinkSurveyQuestion | RatingSurveyQuestion | MultipleSurveyQuestion\n\nexport type SurveyQuestionDescriptionContentType = 'html' | 'text'\n\ninterface SurveyQuestionBase {\n question: string\n id?: string\n description?: string | null\n descriptionContentType?: SurveyQuestionDescriptionContentType\n optional?: boolean\n buttonText?: string\n branching?: NextQuestionBranching | EndBranching | ResponseBasedBranching | SpecificQuestionBranching\n}\n\nexport interface BasicSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Open\n}\n\nexport interface LinkSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Link\n link?: string | null\n}\n\nexport interface RatingSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Rating\n display: 'number' | 'emoji'\n scale: 3 | 5 | 7 | 10\n lowerBoundLabel: string\n upperBoundLabel: string\n skipSubmitButton?: boolean\n}\n\nexport interface MultipleSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.SingleChoice | SurveyQuestionType.MultipleChoice\n choices: string[]\n hasOpenChoice?: boolean\n shuffleOptions?: boolean\n skipSubmitButton?: boolean\n}\n\nexport enum SurveyQuestionType {\n Open = 'open',\n MultipleChoice = 'multiple_choice',\n SingleChoice = 'single_choice',\n Rating = 'rating',\n Link = 'link',\n}\n\nexport enum SurveyQuestionBranchingType {\n NextQuestion = 'next_question',\n End = 'end',\n ResponseBased = 'response_based',\n SpecificQuestion = 'specific_question',\n}\n\ninterface NextQuestionBranching {\n type: SurveyQuestionBranchingType.NextQuestion\n}\n\ninterface EndBranching {\n type: SurveyQuestionBranchingType.End\n}\n\ninterface ResponseBasedBranching {\n type: SurveyQuestionBranchingType.ResponseBased\n responseValues: Record<string, any>\n}\n\ninterface SpecificQuestionBranching {\n type: SurveyQuestionBranchingType.SpecificQuestion\n index: number\n}\n\nexport type SurveyCallback = (surveys: Survey[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport interface SurveyElement {\n text?: string\n $el_text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\nexport interface SurveyRenderReason {\n visible: boolean\n disabledReason?: string\n}\n\nexport enum SurveySchedule {\n Once = 'once',\n Recurring = 'recurring',\n Always = 'always',\n}\n\nexport interface Survey {\n // Sync this with the backend's SurveyAPISerializer!\n id: string\n name: string\n description: string\n type: SurveyType\n feature_flag_keys:\n | {\n key: string\n value?: string\n }[]\n | null\n // the linked flag key is the flag key that is used to link the survey to a flag\n linked_flag_key: string | null\n targeting_flag_key: string | null\n // the internal targeting flag key is the flag key that is used to target users who have seen the survey\n // eg survey-targeting-<survey-id>\n internal_targeting_flag_key: string | null\n questions: SurveyQuestion[]\n appearance: SurveyAppearance | null\n conditions: {\n url?: string\n selector?: string\n seenSurveyWaitPeriodInDays?: number\n urlMatchType?: PropertyMatchType\n /** events that trigger surveys */\n events: {\n repeatedActivation?: boolean\n values: SurveyEventWithFilters[]\n } | null\n /** events that cancel \"pending\" (time-delayed) surveys */\n cancelEvents: {\n values: SurveyEventWithFilters[]\n } | null\n actions: {\n values: SurveyActionType[]\n } | null\n deviceTypes?: string[]\n deviceTypesMatchType?: PropertyMatchType\n linkedFlagVariant?: string\n } | null\n start_date: string | null\n end_date: string | null\n current_iteration: number | null\n current_iteration_start_date: string | null\n schedule?: SurveySchedule | null\n enable_partial_responses?: boolean | null\n}\n\nexport type SurveyWithTypeAndAppearance = Pick<Survey, 'id' | 'type' | 'appearance'>\n\nexport interface SurveyActionType {\n id: number\n name: string | null\n steps?: ActionStepType[]\n}\n\n/** Sync with plugin-server/src/types.ts */\nexport type ActionStepStringMatching = 'contains' | 'exact' | 'regex'\n\nexport interface ActionStepType {\n event?: string | null\n selector?: string | null\n /** pre-compiled regex pattern for matching selector against $elements_chain */\n selector_regex?: string | null\n /** @deprecated Only `selector` should be used now. */\n tag_name?: string\n text?: string | null\n /** @default StringMatching.Exact */\n text_matching?: ActionStepStringMatching | null\n href?: string | null\n /** @default ActionStepStringMatching.Exact */\n href_matching?: ActionStepStringMatching | null\n url?: string | null\n /** @default StringMatching.Contains */\n url_matching?: ActionStepStringMatching | null\n /** Property filters for action step matching */\n properties?: {\n key: string\n value?: string | number | boolean | (string | number | boolean)[] | null\n operator?: PropertyMatchType\n type?: string\n }[]\n}\n\nexport enum SurveyEventName {\n SHOWN = 'survey shown',\n DISMISSED = 'survey dismissed',\n SENT = 'survey sent',\n ABANDONED = 'survey abandoned',\n}\n\nexport enum SurveyEventProperties {\n SURVEY_ID = '$survey_id',\n SURVEY_NAME = '$survey_name',\n SURVEY_RESPONSE = '$survey_response',\n SURVEY_ITERATION = '$survey_iteration',\n SURVEY_ITERATION_START_DATE = '$survey_iteration_start_date',\n SURVEY_PARTIALLY_COMPLETED = '$survey_partially_completed',\n SURVEY_SUBMISSION_ID = '$survey_submission_id',\n SURVEY_QUESTIONS = '$survey_questions',\n SURVEY_COMPLETED = '$survey_completed',\n PRODUCT_TOUR_ID = '$product_tour_id',\n SURVEY_LAST_SEEN_DATE = '$survey_last_seen_date',\n}\n\nexport enum DisplaySurveyType {\n Popover = 'popover',\n Inline = 'inline',\n}\n\ninterface DisplaySurveyOptionsBase {\n ignoreConditions: boolean\n ignoreDelay: boolean\n displayType: DisplaySurveyType\n}\n\ninterface DisplaySurveyPopoverOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Popover\n}\n\ninterface DisplaySurveyInlineOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Inline\n selector: string\n}\n\nexport type DisplaySurveyOptions = DisplaySurveyPopoverOptions | DisplaySurveyInlineOptions\n\nexport interface SurveyConfig {\n prefillFromUrl?: boolean\n /**\n * @deprecated No longer used. Surveys will automatically advance past\n * prefilled questions with skipSubmitButton enabled. If partial response\n * collection is enabled, partial responses for pre-filled questions will\n * be submitted automatically on page load.\n */\n autoSubmitIfComplete?: boolean\n /**\n * @deprecated No longer used. Pre-filled responses are now sent\n * immediately when partial responses are enabled, or all required\n * quesions have been pre-filled.\n */\n autoSubmitDelay?: number\n}\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x);\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import { includes } from \"./string-utils.mjs\";\nimport { isFunction, isUndefined } from \"./type-utils.mjs\";\nconst FACEBOOK = 'Facebook';\nconst MOBILE = 'Mobile';\nconst IOS = 'iOS';\nconst ANDROID = 'Android';\nconst TABLET = 'Tablet';\nconst ANDROID_TABLET = ANDROID + ' ' + TABLET;\nconst IPAD = 'iPad';\nconst APPLE = 'Apple';\nconst APPLE_WATCH = APPLE + ' Watch';\nconst SAFARI = 'Safari';\nconst BLACKBERRY = 'BlackBerry';\nconst SAMSUNG = 'Samsung';\nconst SAMSUNG_BROWSER = SAMSUNG + 'Browser';\nconst SAMSUNG_INTERNET = SAMSUNG + ' Internet';\nconst CHROME = 'Chrome';\nconst CHROME_OS = CHROME + ' OS';\nconst CHROME_IOS = CHROME + ' ' + IOS;\nconst INTERNET_EXPLORER = 'Internet Explorer';\nconst INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE;\nconst OPERA = 'Opera';\nconst OPERA_MINI = OPERA + ' Mini';\nconst EDGE = 'Edge';\nconst MICROSOFT_EDGE = 'Microsoft ' + EDGE;\nconst FIREFOX = 'Firefox';\nconst FIREFOX_IOS = FIREFOX + ' ' + IOS;\nconst NINTENDO = 'Nintendo';\nconst PLAYSTATION = 'PlayStation';\nconst XBOX = 'Xbox';\nconst ANDROID_MOBILE = ANDROID + ' ' + MOBILE;\nconst MOBILE_SAFARI = MOBILE + ' ' + SAFARI;\nconst WINDOWS = 'Windows';\nconst WINDOWS_PHONE = WINDOWS + ' Phone';\nconst NOKIA = 'Nokia';\nconst OUYA = 'Ouya';\nconst GENERIC = 'Generic';\nconst GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase();\nconst GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase();\nconst KONQUEROR = 'Konqueror';\nconst BROWSER_VERSION_REGEX_SUFFIX = '(\\\\d+(\\\\.\\\\d+)?)';\nconst DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX);\nconst XBOX_REGEX = new RegExp(XBOX, 'i');\nconst PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\\\w+', 'i');\nconst NINTENDO_REGEX = new RegExp(NINTENDO + ' \\\\w+', 'i');\nconst BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i');\nconst windowsVersionMap = {\n 'NT3.51': 'NT 3.11',\n 'NT4.0': 'NT 4.0',\n '5.0': '2000',\n '5.1': 'XP',\n '5.2': 'XP',\n '6.0': 'Vista',\n '6.1': '7',\n '6.2': '8',\n '6.3': '8.1',\n '6.4': '10',\n '10.0': '10'\n};\nfunction isSafari(userAgent) {\n return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID);\n}\nconst safariCheck = (ua, vendor)=>vendor && includes(vendor, APPLE) || isSafari(ua);\nconst detectBrowser = function(user_agent, vendor) {\n vendor = vendor || '';\n if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) return OPERA_MINI;\n if (includes(user_agent, ' OPR/')) return OPERA;\n if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) return INTERNET_EXPLORER_MOBILE;\n if (includes(user_agent, SAMSUNG_BROWSER)) return SAMSUNG_INTERNET;\n else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) return MICROSOFT_EDGE;\n else if (includes(user_agent, 'FBIOS')) return FACEBOOK + ' ' + MOBILE;\n else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) return 'UC Browser';\n else if (includes(user_agent, 'CriOS')) return CHROME_IOS;\n else if (includes(user_agent, 'CrMo')) return CHROME;\n else if (includes(user_agent, CHROME)) return CHROME;\n else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) return ANDROID_MOBILE;\n else if (includes(user_agent, 'FxiOS')) return FIREFOX_IOS;\n else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) return KONQUEROR;\n else if (safariCheck(user_agent, vendor)) return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI;\n else if (includes(user_agent, FIREFOX)) return FIREFOX;\n else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) return INTERNET_EXPLORER;\n else if (includes(user_agent, 'Gecko')) return FIREFOX;\n return '';\n};\nconst versionRegexes = {\n [INTERNET_EXPLORER_MOBILE]: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [MICROSOFT_EDGE]: [\n new RegExp(EDGE + '?\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME]: [\n new RegExp('(' + CHROME + '|CrMo)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME_IOS]: [\n new RegExp('CriOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n 'UC Browser': [\n new RegExp('(UCBrowser|UCWEB)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [MOBILE_SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [OPERA]: [\n new RegExp('(' + OPERA + '|OPR)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX]: [\n new RegExp(FIREFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX_IOS]: [\n new RegExp('FxiOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [KONQUEROR]: [\n new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [BLACKBERRY]: [\n new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX),\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [ANDROID_MOBILE]: [\n new RegExp('android\\\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [SAMSUNG_INTERNET]: [\n new RegExp(SAMSUNG_BROWSER + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [INTERNET_EXPLORER]: [\n new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n Mozilla: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ]\n};\nconst detectBrowserVersion = function(userAgent, vendor) {\n const browser = detectBrowser(userAgent, vendor);\n const regexes = versionRegexes[browser];\n if (isUndefined(regexes)) return null;\n for(let i = 0; i < regexes.length; i++){\n const regex = regexes[i];\n const matches = userAgent.match(regex);\n if (matches) return parseFloat(matches[matches.length - 2]);\n }\n return null;\n};\nconst osMatchers = [\n [\n new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),\n (match)=>[\n XBOX,\n match && match[1] || ''\n ]\n ],\n [\n new RegExp(NINTENDO, 'i'),\n [\n NINTENDO,\n ''\n ]\n ],\n [\n new RegExp(PLAYSTATION, 'i'),\n [\n PLAYSTATION,\n ''\n ]\n ],\n [\n BLACKBERRY_REGEX,\n [\n BLACKBERRY,\n ''\n ]\n ],\n [\n new RegExp(WINDOWS, 'i'),\n (_, user_agent)=>{\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) return [\n WINDOWS_PHONE,\n ''\n ];\n if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\\b/.test(user_agent)) return [\n WINDOWS + ' ' + MOBILE,\n ''\n ];\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent);\n if (match && match[1]) {\n const version = match[1];\n let osVersion = windowsVersionMap[version] || '';\n if (/arm/i.test(user_agent)) osVersion = 'RT';\n return [\n WINDOWS,\n osVersion\n ];\n }\n return [\n WINDOWS,\n ''\n ];\n }\n ],\n [\n /((iPhone|iPad|iPod).*?OS (\\d+)_(\\d+)_?(\\d+)?|iPhone)/,\n (match)=>{\n if (match && match[3]) {\n const versionParts = [\n match[3],\n match[4],\n match[5] || '0'\n ];\n return [\n IOS,\n versionParts.join('.')\n ];\n }\n return [\n IOS,\n ''\n ];\n }\n ],\n [\n /(watch.*\\/(\\d+\\.\\d+\\.\\d+)|watch os,(\\d+\\.\\d+),)/i,\n (match)=>{\n let version = '';\n if (match && match.length >= 3) version = isUndefined(match[2]) ? match[3] : match[2];\n return [\n 'watchOS',\n version\n ];\n }\n ],\n [\n new RegExp('(' + ANDROID + ' (\\\\d+)\\\\.(\\\\d+)\\\\.?(\\\\d+)?|' + ANDROID + ')', 'i'),\n (match)=>{\n if (match && match[2]) {\n const versionParts = [\n match[2],\n match[3],\n match[4] || '0'\n ];\n return [\n ANDROID,\n versionParts.join('.')\n ];\n }\n return [\n ANDROID,\n ''\n ];\n }\n ],\n [\n /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i,\n (match)=>{\n const result = [\n 'Mac OS X',\n ''\n ];\n if (match && match[1]) {\n const versionParts = [\n match[1],\n match[2],\n match[3] || '0'\n ];\n result[1] = versionParts.join('.');\n }\n return result;\n }\n ],\n [\n /Mac/i,\n [\n 'Mac OS X',\n ''\n ]\n ],\n [\n /CrOS/,\n [\n CHROME_OS,\n ''\n ]\n ],\n [\n /Linux|debian/i,\n [\n 'Linux',\n ''\n ]\n ]\n];\nconst detectOS = function(user_agent) {\n for(let i = 0; i < osMatchers.length; i++){\n const [rgex, resultOrFn] = osMatchers[i];\n const match = rgex.exec(user_agent);\n const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn);\n if (result) return result;\n }\n return [\n '',\n ''\n ];\n};\nconst detectDevice = function(user_agent) {\n if (NINTENDO_REGEX.test(user_agent)) return NINTENDO;\n if (PLAYSTATION_REGEX.test(user_agent)) return PLAYSTATION;\n if (XBOX_REGEX.test(user_agent)) return XBOX;\n if (new RegExp(OUYA, 'i').test(user_agent)) return OUYA;\n if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) return WINDOWS_PHONE;\n else if (/iPad/.test(user_agent)) return IPAD;\n else if (/iPod/.test(user_agent)) return 'iPod Touch';\n else if (/iPhone/.test(user_agent)) return 'iPhone';\n else if (/(watch)(?: ?os[,/]|\\d,\\d\\/)[\\d.]+/i.test(user_agent)) return APPLE_WATCH;\n else if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n else if (/(kobo)\\s(ereader|touch)/i.test(user_agent)) return 'Kobo';\n else if (new RegExp(NOKIA, 'i').test(user_agent)) return NOKIA;\n else if (/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i.test(user_agent) || /(kf[a-z]+)( bui|\\)).+silk\\//i.test(user_agent)) return 'Kindle Fire';\n else if (/(Android|ZTE)/i.test(user_agent)) if (!(!new RegExp(MOBILE).test(user_agent) || /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent))) return ANDROID;\n else {\n if (/pixel[\\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent) || /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) || /lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent)) return ANDROID;\n return ANDROID_TABLET;\n }\n else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) return GENERIC_MOBILE;\n else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) return GENERIC_TABLET;\n else return '';\n};\nconst detectDeviceType = function(user_agent) {\n const device = detectDevice(user_agent);\n if (device === IPAD || device === ANDROID_TABLET || 'Kobo' === device || 'Kindle Fire' === device || device === GENERIC_TABLET) return TABLET;\n if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) return 'Console';\n if (device === APPLE_WATCH) return 'Wearable';\n if (device) return MOBILE;\n return 'Desktop';\n};\nexport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS };\n","import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void\n uninitializedWarning: (methodName: string) => void\n createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n const logger: PosthogJsLogger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if (\n window &&\n (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n !isUndefined(window.console) &&\n window.console\n ) {\n const consoleLog =\n '__rrweb_original__' in window.console[level]\n ? (window.console[level] as any)['__rrweb_original__']\n : window.console[level]\n\n // eslint-disable-next-line no-console\n consoleLog(prefix, ...args)\n }\n },\n\n info: (...args: any[]) => {\n logger._log('log', ...args)\n },\n\n warn: (...args: any[]) => {\n logger._log('warn', ...args)\n },\n\n error: (...args: any[]) => {\n logger._log('error', ...args)\n },\n\n critical: (...args: any[]) => {\n // Critical errors are always logged to the console\n // eslint-disable-next-line no-console\n console.error(prefix, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n\n createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n _createLogger(`${prefix} ${additionalPrefix}`, options),\n }\n return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n","import { Breaker, Properties } from '../types'\nimport { nativeForEach, nativeIndexOf } from './globals'\nimport { logger } from './logger'\nimport { isFormData, isNull, isNullish, isNumber, isString, isUndefined, hasOwnProperty, isArray } from '@posthog/core'\n\nconst breaker: Breaker = {}\n\nexport function eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (isNullish(obj)) {\n return\n }\n if (isArray(obj)) {\n return eachArray(obj, iterator, thisArg)\n }\n if (isFormData(obj)) {\n for (const pair of obj.entries()) {\n if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {\n return\n }\n }\n return\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const extendArray = function <T>(obj: T[], ...args: T[][]): T[] {\n eachArray(args, function (source) {\n eachArray(source, function (item) {\n obj.push(item)\n })\n })\n return obj\n}\n\nexport const include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (isNull(obj)) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch {\n return undefined\n }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical(\n 'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n )\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n const ret: Properties = {}\n each(p, function (v, k) {\n if ((isString(v) && v.length > 0) || isNumber(v)) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (isArray(value)) {\n result = [] as any as T\n eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any) => {\n if (isString(value) && !isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n const hostname = documentLocation?.hostname\n\n if (!isString(hostname)) {\n return false\n }\n // split and slice isn't a great way to match arbitrary domains,\n // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n // for the hostname\n const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n if (lastTwoParts === excluded) {\n return false\n }\n }\n\n return true\n}\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n for (let i = 0; i < value.length; i++) {\n if (predicate(value[i])) {\n return value[i]\n }\n }\n return undefined\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n element: Window | Document | Element | undefined,\n event: string,\n callback: EventListener,\n options?: AddEventListenerOptions\n): void {\n const { capture = false, passive = true } = options ?? {}\n\n // This is the only place where we are allowed to call this function\n // because the whole idea is that we should be calling this instead of the built-in one\n // eslint-disable-next-line posthog-js/no-add-event-listener\n element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n config: Record<string, any>,\n newField: string,\n oldField: string,\n defaultValue: T,\n loggerInstance?: { warn: (message: string) => void }\n): T {\n const hasNewField = newField in config && !isUndefined(config[newField])\n const hasOldField = oldField in config && !isUndefined(config[oldField])\n\n if (hasNewField) {\n return config[newField]\n }\n\n if (hasOldField) {\n if (loggerInstance) {\n loggerInstance.warn(\n `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n `The old field will be removed in a future major version.`\n )\n }\n return config[oldField]\n }\n\n return defaultValue\n}\n","import { DisplaySurveyOptions, DisplaySurveyType, Survey, SurveyType } from '../posthog-surveys-types'\nimport { createLogger } from '../utils/logger'\n\nexport const SURVEY_LOGGER = createLogger('[Surveys]')\n\nexport function isSurveyRunning(survey: Survey): boolean {\n return !!(survey.start_date && !survey.end_date)\n}\n\nexport function doesSurveyActivateByEvent(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.events?.values?.length\n}\n\nexport function doesSurveyActivateByAction(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.actions?.values?.length\n}\n\nexport const SURVEY_SEEN_PREFIX = 'seenSurvey_'\nexport const SURVEY_IN_PROGRESS_PREFIX = 'inProgressSurvey_'\nexport const SURVEY_ABANDONED_PREFIX = 'abandonedSurvey_'\n\nexport const getSurveyInteractionProperty = (\n survey: Pick<Survey, 'id' | 'current_iteration'>,\n action: 'responded' | 'dismissed'\n): string => {\n let surveyProperty = `$survey_${action}/${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n surveyProperty = `$survey_${action}/${survey.id}/${survey.current_iteration}`\n }\n\n return surveyProperty\n}\n\nconst getSurveyStorageKey = (prefix: string, survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n let key = `${prefix}${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n key = `${prefix}${survey.id}_${survey.current_iteration}`\n }\n return key\n}\n\nexport const getSurveySeenKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_SEEN_PREFIX, survey)\n}\n\nexport const getSurveyAbandonedKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_ABANDONED_PREFIX, survey)\n}\n\nexport const setSurveySeenOnLocalStorage = (survey: Pick<Survey, 'id' | 'current_iteration'>) => {\n const isSurveySeen = localStorage.getItem(getSurveySeenKey(survey))\n // if survey is already seen, no need to set it again\n if (isSurveySeen) {\n return\n }\n\n localStorage.setItem(getSurveySeenKey(survey), 'true')\n}\n\n// These surveys are relevant for the getActiveMatchingSurveys method. They are used to\n// display surveys in our customer's application. Any new in-app survey type should be added here.\nexport const IN_APP_SURVEY_TYPES = [SurveyType.Popover, SurveyType.Widget, SurveyType.API]\n\nexport const DEFAULT_DISPLAY_SURVEY_OPTIONS: DisplaySurveyOptions = {\n ignoreConditions: false,\n ignoreDelay: false,\n displayType: DisplaySurveyType.Popover,\n}\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private _timestamp = 0\n private _counter = 0\n private readonly _random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (!isUndefined(value)) {\n return value\n } else {\n // reset state and resume\n this._timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (isUndefined(valueAfterReset)) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this._timestamp) {\n this._timestamp = ts\n this._resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this._counter++\n if (this._counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this._timestamp++\n this._resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this._timestamp,\n Math.trunc(this._counter / 2 ** 30),\n this._counter & (2 ** 30 - 1),\n this._random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private _resetCounter(): void {\n this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n // TRICKY: don't use the isUndefined method here as can't pass the reference\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly _buffer = new Uint32Array(8)\n private _cursor = Infinity\n nextUint32(): number {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer)\n this._cursor = 0\n }\n return this._buffer[this._cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n // remove hyphens\n const hex = uuid.replace(/-/g, '')\n // ensure that it's a version 7 UUID\n if (hex.length !== 32) {\n throw new Error('Not a valid UUID')\n }\n if (hex[12] !== '7') {\n throw new Error('Not a UUIDv7')\n }\n // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n return parseInt(hex.substring(0, 12), 16)\n}\n","import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart\n estimatedSize: number\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n const updatedSearch =\n search?.split('&').map((pair) => {\n const [key, origValue] = pair.split('=')\n const value = replace ? (newParams[key] ?? origValue) : origValue\n delete newParams[key]\n return `${key}=${value}`\n }) ?? []\n\n const remaining = formDataToQuery(newParams)\n if (remaining) {\n updatedSearch.push(remaining)\n }\n\n return `${baseUrl}?${updatedSearch.join('&')}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n // see https://github.com/PostHog/posthog-js/issues/1440\n // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n // would not be able to operate on these numerically anyway.\n return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = ({ data, compression }: RequestWithOptions): EncodedBody | undefined => {\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n const blob = new Blob([gzipData], { type: CONTENT_TYPE_PLAIN })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: blob,\n estimatedSize: blob.size,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const req = new XMLHttpRequest!()\n req.open(options.method || 'GET', options.url, true)\n const { contentType, body } = encodePostData(options) ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n if (!options.disableXHRCredentials) {\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n // eslint-disable-next-line compat/compat\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n const url = options.url\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => controller.abort(), options.timeout),\n }\n }\n\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch((error) => {\n logger.error(error)\n options.callback?.({ statusCode: 0, text: error })\n })\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n const url = extendURLParams(options.url, {\n beacon: '1',\n })\n\n try {\n const { contentType, body } = encodePostData(options) ?? {}\n // sendBeacon requires a blob so we convert it\n const sendBeaconBody = typeof body === 'string' ? new Blob([body], { type: contentType }) : body\n navigator!.sendBeacon!(url, sendBeaconBody)\n } catch {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options = { ..._options }\n options.timeout = options.timeout || 60000\n\n options.url = extendURLParams(options.url, {\n _: new Date().getTime().toString(),\n ver: Config.LIB_VERSION,\n compression: options.compression,\n })\n\n const transport = options.transport ?? 'fetch'\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n transportMethod(options)\n}\n","export const isValidRegex = function (str: string): boolean {\n try {\n new RegExp(str)\n } catch {\n return false\n }\n return true\n}\n\nexport const isMatchingRegex = function (value: string, pattern: string): boolean {\n if (!isValidRegex(pattern)) return false\n\n try {\n return new RegExp(pattern).test(value)\n } catch {\n return false\n }\n}\n","import { isNull, isUndefined } from '@posthog/core'\nimport { jsonStringify } from '../request'\nimport { PropertyFilters, PropertyOperator } from '../posthog-surveys-types'\nimport type { Properties } from '../types'\nimport { isMatchingRegex } from './regex-utils'\n\nexport function getPersonPropertiesHash(\n distinct_id: string,\n userPropertiesToSet?: Properties,\n userPropertiesToSetOnce?: Properties\n): string {\n return jsonStringify({ distinct_id, userPropertiesToSet, userPropertiesToSetOnce })\n}\n\nexport const propertyComparisons: Record<PropertyOperator, (targets: string[], values: string[]) => boolean> = {\n exact: (targets, values) => values.some((value) => targets.some((target) => value === target)),\n is_not: (targets, values) => values.every((value) => targets.every((target) => value !== target)),\n regex: (targets, values) => values.some((value) => targets.some((target) => isMatchingRegex(value, target))),\n not_regex: (targets, values) => values.every((value) => targets.every((target) => !isMatchingRegex(value, target))),\n icontains: (targets, values) =>\n values.map(toLowerCase).some((value) => targets.map(toLowerCase).some((target) => value.includes(target))),\n not_icontains: (targets, values) =>\n values.map(toLowerCase).every((value) => targets.map(toLowerCase).every((target) => !value.includes(target))),\n gt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue > parseFloat(t))\n }),\n lt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue < parseFloat(t))\n }),\n}\n\nconst toLowerCase = (v: string): string => v.toLowerCase()\n\nexport function matchPropertyFilters(\n propertyFilters: PropertyFilters | undefined,\n eventProperties: Properties | undefined\n): boolean {\n // if there are no property filters, it means we're only matching on event name\n if (!propertyFilters) {\n return true\n }\n\n return Object.entries(propertyFilters).every(([propertyName, filter]) => {\n const eventPropertyValue = eventProperties?.[propertyName]\n\n if (isUndefined(eventPropertyValue) || isNull(eventPropertyValue)) {\n return false\n }\n\n // convert event property to string array for comparison\n const eventValues = [String(eventPropertyValue)]\n\n const comparisonFunction = propertyComparisons[filter.operator]\n if (!comparisonFunction) {\n return false\n }\n\n return comparisonFunction(filter.values, eventValues)\n })\n}\n","import { PostHog } from '../../posthog-core'\nimport { createLogger } from '../../utils/logger'\n\nconst logger = createLogger('[Stylesheet Loader]')\n\nexport const prepareStylesheet = (document: Document, innerText: string, posthog?: PostHog) => {\n // Forcing the existence of `document` requires this function to be called in a browser environment\n let stylesheet: HTMLStyleElement | null = document.createElement('style')\n stylesheet.innerText = innerText\n\n if (posthog?.config?.prepare_external_dependency_stylesheet) {\n stylesheet = posthog.config.prepare_external_dependency_stylesheet(stylesheet)\n }\n\n if (!stylesheet) {\n logger.error('prepare_external_dependency_stylesheet returned null')\n return null\n }\n\n return stylesheet\n}\n","import { VNode, cloneElement, createContext, type JSX } from 'preact'\nimport { PostHog } from '../../posthog-core'\nimport {\n MultipleSurveyQuestion,\n Survey,\n SurveyAppearance,\n SurveyEventName,\n SurveyEventProperties,\n SurveyPosition,\n SurveyQuestion,\n SurveySchedule,\n SurveyType,\n SurveyWidgetType,\n} from '../../posthog-surveys-types'\nimport { document as _document, window as _window, userAgent } from '../../utils/globals'\nimport {\n getSurveyInteractionProperty,\n getSurveySeenKey,\n getSurveyAbandonedKey,\n SURVEY_LOGGER as logger,\n setSurveySeenOnLocalStorage,\n SURVEY_IN_PROGRESS_PREFIX,\n} from '../../utils/survey-utils'\nimport { isArray, isNullish } from '@posthog/core'\n\nimport { detectDeviceType } from '@posthog/core'\nimport { propertyComparisons } from '../../utils/property-utils'\nimport { PropertyMatchType } from '../../types'\nimport { prepareStylesheet } from '../utils/stylesheet-loader'\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\nimport surveyStyles from './survey.css'\nimport { useContext } from 'preact/hooks'\n\nexport function getFontFamily(fontFamily?: string): string {\n if (fontFamily === 'inherit') {\n return 'inherit'\n }\n\n const defaultFontStack =\n 'BlinkMacSystemFont, \"Inter\", \"Segoe UI\", \"Roboto\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"'\n return fontFamily ? `${fontFamily}, ${defaultFontStack}` : `-apple-system, ${defaultFontStack}`\n}\n\nexport function getSurveyResponseKey(questionId: string) {\n return `$survey_response_${questionId}`\n}\n\nconst BLACK_TEXT_COLOR = '#020617' // Maps out to text-slate-950 from tailwind colors. Intended for text use outside interactive elements like buttons\n\n// Keep in sync with defaultSurveyAppearance on the main app\nexport const defaultSurveyAppearance = {\n fontFamily: 'inherit',\n backgroundColor: '#eeeded',\n submitButtonColor: 'black',\n submitButtonTextColor: 'white',\n ratingButtonColor: 'white',\n ratingButtonActiveColor: 'black',\n borderColor: '#c9c6c6',\n placeholder: 'Start typing...',\n whiteLabel: false,\n displayThankYouMessage: true,\n thankYouMessageHeader: 'Thank you for your feedback!',\n position: SurveyPosition.Right,\n widgetType: SurveyWidgetType.Tab,\n widgetLabel: 'Feedback',\n widgetColor: 'black',\n zIndex: '2147483647',\n disabledButtonOpacity: '0.6',\n maxWidth: '300px',\n textSubtleColor: '#939393',\n boxPadding: '20px 24px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n borderRadius: '10px',\n shuffleQuestions: false,\n surveyPopupDelaySeconds: undefined,\n // Not customizable atm\n outlineColor: 'rgba(59, 130, 246, 0.8)',\n inputBackground: 'white',\n inputTextColor: BLACK_TEXT_COLOR,\n scrollbarThumbColor: 'var(--ph-survey-border-color)',\n scrollbarTrackColor: 'var(--ph-survey-background-color)',\n} as const\n\nexport const addSurveyCSSVariablesToElement = (\n element: HTMLElement,\n type: SurveyType,\n appearance?: SurveyAppearance | null\n) => {\n const effectiveAppearance = { ...defaultSurveyAppearance, ...appearance }\n const hostStyle = element.style\n\n const surveyHasBottomBorder =\n ![SurveyPosition.Center, SurveyPosition.Left, SurveyPosition.Right].includes(effectiveAppearance.position) ||\n (type === SurveyType.Widget && appearance?.widgetType === SurveyWidgetType.Tab)\n\n hostStyle.setProperty('--ph-survey-font-family', getFontFamily(effectiveAppearance.fontFamily))\n hostStyle.setProperty('--ph-survey-box-padding', effectiveAppearance.boxPadding)\n hostStyle.setProperty('--ph-survey-max-width', effectiveAppearance.maxWidth)\n hostStyle.setProperty('--ph-survey-z-index', effectiveAppearance.zIndex)\n hostStyle.setProperty('--ph-survey-border-color', effectiveAppearance.borderColor)\n // Non-bottom surveys or tab surveys have the border bottom\n if (surveyHasBottomBorder) {\n hostStyle.setProperty('--ph-survey-border-radius', effectiveAppearance.borderRadius)\n hostStyle.setProperty('--ph-survey-border-bottom', '1.5px solid var(--ph-survey-border-color)')\n } else {\n hostStyle.setProperty('--ph-survey-border-bottom', 'none')\n hostStyle.setProperty(\n '--ph-survey-border-radius',\n `${effectiveAppearance.borderRadius} ${effectiveAppearance.borderRadius} 0 0`\n )\n }\n hostStyle.setProperty('--ph-survey-background-color', effectiveAppearance.backgroundColor)\n hostStyle.setProperty('--ph-survey-box-shadow', effectiveAppearance.boxShadow)\n hostStyle.setProperty('--ph-survey-disabled-button-opacity', effectiveAppearance.disabledButtonOpacity)\n hostStyle.setProperty('--ph-survey-submit-button-color', effectiveAppearance.submitButtonColor)\n hostStyle.setProperty(\n '--ph-survey-submit-button-text-color',\n appearance?.submitButtonTextColor || getContrastingTextColor(effectiveAppearance.submitButtonColor)\n )\n hostStyle.setProperty('--ph-survey-rating-bg-color', effectiveAppearance.ratingButtonColor)\n hostStyle.setProperty('--ph-survey-rating-active-bg-color', effectiveAppearance.ratingButtonActiveColor)\n // Active rating text is always auto-calculated for contrast with active background\n hostStyle.setProperty(\n '--ph-survey-rating-active-text-color',\n getContrastingTextColor(effectiveAppearance.ratingButtonActiveColor)\n )\n // Primary text color: use override if provided, otherwise auto-calculate from background\n hostStyle.setProperty(\n '--ph-survey-text-primary-color',\n appearance?.textColor || getContrastingTextColor(effectiveAppearance.backgroundColor)\n )\n hostStyle.setProperty('--ph-survey-text-subtle-color', effectiveAppearance.textSubtleColor)\n hostStyle.setProperty('--ph-widget-color', effectiveAppearance.widgetColor)\n hostStyle.setProperty('--ph-widget-text-color', getContrastingTextColor(effectiveAppearance.widgetColor))\n hostStyle.setProperty('--ph-widget-z-index', effectiveAppearance.zIndex)\n\n // Use user-provided inputBackground (or deprecated inputBackgroundColor for backwards compat)\n // Fallback to internal default, with slight adjustment for white backgrounds\n const userInputBg = appearance?.inputBackground || appearance?.inputBackgroundColor\n let inputBgColor = userInputBg || effectiveAppearance.inputBackground\n if (!userInputBg && effectiveAppearance.backgroundColor === 'white') {\n inputBgColor = '#f8f8f8'\n }\n hostStyle.setProperty('--ph-survey-input-background', inputBgColor)\n // Input text color applies to both text inputs and inactive rating buttons\n const inputTextColor = appearance?.inputTextColor || getContrastingTextColor(inputBgColor)\n hostStyle.setProperty('--ph-survey-input-text-color', inputTextColor)\n hostStyle.setProperty('--ph-survey-rating-text-color', inputTextColor)\n hostStyle.setProperty('--ph-survey-scrollbar-thumb-color', effectiveAppearance.scrollbarThumbColor)\n hostStyle.setProperty('--ph-survey-scrollbar-track-color', effectiveAppearance.scrollbarTrackColor)\n hostStyle.setProperty('--ph-survey-outline-color', effectiveAppearance.outlineColor)\n}\n\nfunction nameToHex(name: string) {\n return {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n 'indianred ': '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgrey: '#d3d3d3',\n lightgreen: '#90ee90',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370d8',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#d87093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n }[name.toLowerCase()]\n}\n\nexport function hex2rgb(c: string): string {\n if (c.startsWith('#')) {\n let hexColor = c.replace(/^#/, '')\n // Handle 3-character shorthand (e.g., #111 -> #111111, #abc -> #aabbcc)\n if (/^[0-9A-Fa-f]{3}$/.test(hexColor)) {\n hexColor = hexColor[0] + hexColor[0] + hexColor[1] + hexColor[1] + hexColor[2] + hexColor[2]\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(hexColor)) {\n return 'rgb(255, 255, 255)'\n }\n const r = parseInt(hexColor.slice(0, 2), 16)\n const g = parseInt(hexColor.slice(2, 4), 16)\n const b = parseInt(hexColor.slice(4, 6), 16)\n return `rgb(${r},${g},${b})`\n }\n return 'rgb(255, 255, 255)'\n}\n\nexport function hexToRgba(hex: string, opacity: number): string {\n const rgb = hex2rgb(hex)\n const match = rgb.match(/^rgb\\((\\d+),(\\d+),(\\d+)\\)$/)\n if (!match) {\n return hex\n }\n return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${opacity})`\n}\n\nexport function getContrastingTextColor(color: string = defaultSurveyAppearance.backgroundColor) {\n let rgb\n if (color[0] === '#') {\n rgb = hex2rgb(color)\n }\n if (color.startsWith('rgb')) {\n rgb = color\n }\n // otherwise it's a color name\n const nameColorToHex = nameToHex(color)\n if (nameColorToHex) {\n rgb = hex2rgb(nameColorToHex)\n }\n if (!rgb) {\n return BLACK_TEXT_COLOR\n }\n const colorMatch = rgb.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/)\n if (colorMatch) {\n const r = parseInt(colorMatch[1])\n const g = parseInt(colorMatch[2])\n const b = parseInt(colorMatch[3])\n const hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b))\n return hsp > 127.5 ? BLACK_TEXT_COLOR : 'white'\n }\n return BLACK_TEXT_COLOR\n}\n\nexport function getSurveyStylesheet(posthog?: PostHog) {\n const stylesheet = prepareStylesheet(document, typeof surveyStyles === 'string' ? surveyStyles : '', posthog)\n stylesheet?.setAttribute('data-ph-survey-style', 'true')\n return stylesheet\n}\n\nexport const retrieveSurveyShadow = (\n survey: Pick<Survey, 'id' | 'appearance' | 'type'>,\n posthog?: PostHog,\n element?: Element\n) => {\n const widgetClassName = getSurveyContainerClass(survey)\n const existingDiv = document.querySelector(`.${widgetClassName}`)\n\n if (existingDiv && existingDiv.shadowRoot) {\n return {\n shadow: existingDiv.shadowRoot,\n isNewlyCreated: false,\n }\n }\n\n // If it doesn't exist, create it\n const div = document.createElement('div')\n addSurveyCSSVariablesToElement(div, survey.type, survey.appearance)\n div.className = widgetClassName\n const shadow = div.attachShadow({ mode: 'open' })\n const stylesheet = getSurveyStylesheet(posthog)\n if (stylesheet) {\n const existingStylesheet = shadow.querySelector('style')\n if (existingStylesheet) {\n shadow.removeChild(existingStylesheet)\n }\n shadow.appendChild(stylesheet)\n }\n ;(element ? element : document.body).appendChild(div)\n return {\n shadow,\n isNewlyCreated: true,\n }\n}\n\ninterface SendSurveyEventArgs {\n responses: Record<string, string | number | string[] | null>\n survey: Survey\n surveySubmissionId: string\n isSurveyCompleted: boolean\n posthog?: PostHog\n}\n\nconst getSurveyResponseValue = (responses: Record<string, string | number | string[] | null>, questionId?: string) => {\n if (!questionId) {\n return null\n }\n const response = responses[getSurveyResponseKey(questionId)]\n if (isArray(response)) {\n return [...response]\n }\n return response\n}\n\nexport const sendSurveyEvent = ({\n responses,\n survey,\n surveySubmissionId,\n posthog,\n isSurveyCompleted,\n}: SendSurveyEventArgs) => {\n if (!posthog) {\n logger.error('[survey sent] event not captured, PostHog instance not found.')\n return\n }\n setSurveySeenOnLocalStorage(survey)\n posthog.capture(SurveyEventName.SENT, {\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n [SurveyEventProperties.SURVEY_QUESTIONS]: survey.questions.map((question) => ({\n id: question.id,\n question: question.question,\n response: getSurveyResponseValue(responses, question.id),\n })),\n [SurveyEventProperties.SURVEY_SUBMISSION_ID]: surveySubmissionId,\n [SurveyEventProperties.SURVEY_COMPLETED]: isSurveyCompleted,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n ...responses,\n $set: {\n [getSurveyInteractionProperty(survey, 'responded')]: true,\n },\n })\n if (isSurveyCompleted) {\n // Only dispatch PHSurveySent if the survey is completed, as that removes the survey from focus\n window.dispatchEvent(new CustomEvent('PHSurveySent', { detail: { surveyId: survey.id } }))\n clearInProgressSurveyState(survey)\n }\n}\n\nconst _surveyHasResponses = (inProgressSurvey: InProgressSurveyState | null) => {\n return Object.values(inProgressSurvey?.responses || {}).filter((resp) => !isNullish(resp)).length > 0\n}\n\nconst _buildSurveyEventProperties = (\n survey: Survey,\n inProgressSurvey: InProgressSurveyState | null,\n posthog: PostHog\n) => ({\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n [SurveyEventProperties.SURVEY_PARTIALLY_COMPLETED]: _surveyHasResponses(inProgressSurvey),\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n ...inProgressSurvey?.responses,\n [SurveyEventProperties.SURVEY_SUBMISSION_ID]: inProgressSurvey?.surveySubmissionId,\n [SurveyEventProperties.SURVEY_QUESTIONS]: survey.questions.map((question) => ({\n id: question.id,\n question: question.question,\n response: getSurveyResponseValue(inProgressSurvey?.responses || {}, question.id),\n })),\n})\n\nexport const dismissedSurveyEvent = (survey: Survey, posthog?: PostHog, readOnly?: boolean) => {\n if (!posthog) {\n logger.error('[survey dismissed] event not captured, PostHog instance not found.')\n return\n }\n if (readOnly) {\n return\n }\n\n const inProgressSurvey = getInProgressSurveyState(survey)\n posthog.capture(SurveyEventName.DISMISSED, {\n ..._buildSurveyEventProperties(survey, inProgressSurvey, posthog),\n $set: {\n [getSurveyInteractionProperty(survey, 'dismissed')]: true,\n },\n })\n clearInProgressSurveyState(survey)\n setSurveySeenOnLocalStorage(survey)\n window.dispatchEvent(new CustomEvent('PHSurveyClosed', { detail: { surveyId: survey.id } }))\n}\n\nexport const sendSurveyAbandonedEvent = (survey: Survey, posthog?: PostHog) => {\n if (!posthog) {\n logger.error('[survey abandoned] event not captured, PostHog instance not found.')\n return\n }\n\n const abandonedKey = getSurveyAbandonedKey(survey)\n try {\n if (localStorage.getItem(abandonedKey) === 'true') {\n return\n }\n } catch {\n // localStorage not available\n return\n }\n\n const inProgressSurvey = getInProgressSurveyState(survey)\n if (!inProgressSurvey) {\n return\n }\n\n try {\n localStorage.setItem(abandonedKey, 'true')\n } catch {\n // localStorage not available\n }\n\n posthog.capture(SurveyEventName.ABANDONED, _buildSurveyEventProperties(survey, inProgressSurvey, posthog), {\n transport: 'sendBeacon',\n })\n}\n\n// Use the Fisher-yates algorithm to shuffle this array\n// https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\nexport const shuffle = (array: any[]) => {\n return array\n .map((a) => ({ sort: Math.floor(Math.random() * 10), value: a }))\n .sort((a, b) => a.sort - b.sort)\n .map((a) => a.value)\n}\n\nconst reverseIfUnshuffled = (unshuffled: any[], shuffled: any[]): any[] => {\n if (unshuffled.length === shuffled.length && unshuffled.every((val, index) => val === shuffled[index])) {\n return shuffled.reverse()\n }\n\n return shuffled\n}\n\nexport const getDisplayOrderChoices = (question: MultipleSurveyQuestion): string[] => {\n if (!question.shuffleOptions) {\n return question.choices\n }\n\n const displayOrderChoices = question.choices\n let openEndedChoice = ''\n if (question.hasOpenChoice) {\n // if the question has an open-ended choice, its always the last element in the choices array.\n openEndedChoice = displayOrderChoices.pop()!\n }\n\n const shuffledOptions = reverseIfUnshuffled(displayOrderChoices, shuffle(displayOrderChoices))\n\n if (question.hasOpenChoice) {\n question.choices.push(openEndedChoice)\n shuffledOptions.push(openEndedChoice)\n }\n\n return shuffledOptions\n}\n\nexport const getDisplayOrderQuestions = (survey: Survey): SurveyQuestion[] => {\n if (!survey.appearance || !survey.appearance.shuffleQuestions || survey.enable_partial_responses) {\n return survey.questions\n }\n\n return reverseIfUnshuffled(survey.questions, shuffle(survey.questions))\n}\n\nexport const hasEvents = (survey: Pick<Survey, 'conditions'>): boolean => {\n return survey.conditions?.events?.values?.length != undefined && survey.conditions?.events?.values?.length > 0\n}\n\nexport const canActivateRepeatedly = (\n survey: Pick<Survey, 'schedule' | 'conditions' | 'id' | 'current_iteration'>\n): boolean => {\n return (\n !!(survey.conditions?.events?.repeatedActivation && hasEvents(survey)) ||\n survey.schedule === SurveySchedule.Always ||\n isSurveyInProgress(survey)\n )\n}\n\n/**\n * getSurveySeen checks local storage for the surveySeen Key a\n * and overrides this value if the survey can be repeatedly activated by its events.\n * @param survey\n */\nexport const getSurveySeen = (survey: Survey): boolean => {\n const surveySeen = localStorage.getItem(getSurveySeenKey(survey))\n if (surveySeen) {\n // if a survey has already been seen,\n // we will override it with the event repeated activation value.\n return !canActivateRepeatedly(survey)\n }\n\n return false\n}\n\nconst LAST_SEEN_SURVEY_DATE_KEY = 'lastSeenSurveyDate'\n\nexport const hasWaitPeriodPassed = (waitPeriodInDays: number | undefined): boolean => {\n const lastSeenSurveyDate = localStorage.getItem(LAST_SEEN_SURVEY_DATE_KEY)\n if (!waitPeriodInDays || !lastSeenSurveyDate) {\n return true\n }\n\n const today = new Date()\n const diff = Math.abs(today.getTime() - new Date(lastSeenSurveyDate).getTime())\n const diffDaysFromToday = Math.ceil(diff / (1000 * 3600 * 24))\n return diffDaysFromToday > waitPeriodInDays\n}\n\ninterface SurveyContextProps {\n isPreviewMode: boolean\n previewPageIndex: number | undefined\n onPopupSurveyDismissed: () => void\n isPopup: boolean\n onPreviewSubmit: (res: string | string[] | number | null) => void\n surveySubmissionId: string\n}\n\nexport const SurveyContext = createContext<SurveyContextProps>({\n isPreviewMode: false,\n previewPageIndex: 0,\n onPopupSurveyDismissed: () => {},\n isPopup: true,\n onPreviewSubmit: () => {},\n surveySubmissionId: '',\n})\n\nexport const useSurveyContext = () => {\n return useContext(SurveyContext)\n}\n\ninterface RenderProps {\n component: VNode<{ className: string }>\n children: string\n renderAsHtml?: boolean\n style?: JSX.CSSProperties\n}\n\nexport const renderChildrenAsTextOrHtml = ({ component, children, renderAsHtml, style }: RenderProps) => {\n return renderAsHtml\n ? cloneElement(component, {\n dangerouslySetInnerHTML: { __html: children },\n style,\n })\n : cloneElement(component, {\n children,\n style,\n })\n}\n\nfunction defaultMatchType(matchType?: PropertyMatchType): PropertyMatchType {\n return matchType ?? 'icontains'\n}\n\n// use urlMatchType to validate url condition, fallback to contains for backwards compatibility\nexport function doesSurveyUrlMatch(survey: Pick<Survey, 'conditions'>): boolean {\n if (!survey.conditions?.url) {\n return true\n }\n // if we dont know the url, assume it is not a match\n const href = window?.location?.href\n if (!href) {\n return false\n }\n const targets = [survey.conditions.url]\n const matchType = defaultMatchType(survey.conditions?.urlMatchType)\n return propertyComparisons[matchType](targets, [href])\n}\n\nexport function doesSurveyDeviceTypesMatch(survey: Survey): boolean {\n if (!survey.conditions?.deviceTypes || survey.conditions?.deviceTypes.length === 0) {\n return true\n }\n // if we dont know the device type, assume it is not a match\n if (!userAgent) {\n return false\n }\n\n const deviceType = detectDeviceType(userAgent)\n return propertyComparisons[defaultMatchType(survey.conditions?.deviceTypesMatchType)](\n survey.conditions.deviceTypes,\n [deviceType]\n )\n}\n\nexport function doesSurveyMatchSelector(survey: Survey): boolean {\n if (!survey.conditions?.selector) {\n return true\n }\n return !!document?.querySelector(survey.conditions.selector)\n}\n\ninterface InProgressSurveyState {\n surveySubmissionId: string\n lastQuestionIndex: number\n responses: Record<string, string | number | string[] | null>\n}\n\nconst getInProgressSurveyStateKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n let key = `${SURVEY_IN_PROGRESS_PREFIX}${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n key = `${SURVEY_IN_PROGRESS_PREFIX}${survey.id}_${survey.current_iteration}`\n }\n return key\n}\n\nexport const setInProgressSurveyState = (\n survey: Pick<Survey, 'id' | 'current_iteration'>,\n state: InProgressSurveyState\n): void => {\n try {\n localStorage.setItem(getInProgressSurveyStateKey(survey), JSON.stringify(state))\n } catch (e) {\n logger.error('Error setting in-progress survey state in localStorage', e)\n }\n}\n\nexport const getInProgressSurveyState = (\n survey: Pick<Survey, 'id' | 'current_iteration'>\n): InProgressSurveyState | null => {\n try {\n const stateString = localStorage.getItem(getInProgressSurveyStateKey(survey))\n if (stateString) {\n return JSON.parse(stateString) as InProgressSurveyState\n }\n } catch (e) {\n logger.error('Error getting in-progress survey state from localStorage', e)\n }\n return null\n}\n\nexport const isSurveyInProgress = (survey: Pick<Survey, 'id' | 'current_iteration'>): boolean => {\n const state = getInProgressSurveyState(survey)\n return !isNullish(state?.surveySubmissionId)\n}\n\nexport const clearInProgressSurveyState = (survey: Pick<Survey, 'id' | 'current_iteration'>): void => {\n try {\n localStorage.removeItem(getInProgressSurveyStateKey(survey))\n } catch (e) {\n logger.error('Error clearing in-progress survey state from localStorage', e)\n }\n}\n\nexport function getSurveyContainerClass(survey: Pick<Survey, 'id'>, asSelector = false): string {\n const className = `PostHogSurvey-${survey.id}`\n return asSelector ? `.${className}` : className\n}\n","export const satisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm146 272q66 0 121.5-35.5T682-393h-52q-23 40-63 61.5T480.5-310q-46.5 0-87-21T331-393h-53q26 61 81 96.5T480-261Zm0 181q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const neutralEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm20 194h253v-49H354v49ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const dissatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M626-533q22.5 0 38.25-15.75T680-587q0-22.5-15.75-38.25T626-641q-22.5 0-38.25 15.75T572-587q0 22.5 15.75 38.25T626-533Zm-292 0q22.5 0 38.25-15.75T388-587q0-22.5-15.75-38.25T334-641q-22.5 0-38.25 15.75T280-587q0 22.5 15.75 38.25T334-533Zm146.174 116Q413-417 358.5-379.5T278-280h53q22-42 62.173-65t87.5-23Q528-368 567.5-344.5T630-280h52q-25-63-79.826-100-54.826-37-122-37ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const veryDissatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M480-417q-67 0-121.5 37.5T278-280h404q-25-63-80-100t-122-37Zm-183-72 50-45 45 45 31-36-45-45 45-45-31-36-45 45-50-45-31 36 45 45-45 45 31 36Zm272 0 44-45 51 45 31-36-45-45 45-45-31-36-51 45-44-45-31 36 44 45-44 45 31 36ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142 0 241-99t99-241q0-142-99-241t-241-99q-142 0-241 99t-99 241q0 142 99 241t241 99Z\" />\n </svg>\n)\nexport const verySatisfiedEmoji = (\n <svg className=\"emoji-svg\" xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M479.504-261Q537-261 585.5-287q48.5-26 78.5-72.4 6-11.6-.75-22.6-6.75-11-20.25-11H316.918Q303-393 296.5-382t-.5 22.6q30 46.4 78.5 72.4 48.5 26 105.004 26ZM347-578l27 27q7.636 8 17.818 8Q402-543 410-551q8-8 8-18t-8-18l-42-42q-8.8-9-20.9-9-12.1 0-21.1 9l-42 42q-8 7.636-8 17.818Q276-559 284-551q8 8 18 8t18-8l27-27Zm267 0 27 27q7.714 8 18 8t18-8q8-7.636 8-17.818Q685-579 677-587l-42-42q-8.8-9-20.9-9-12.1 0-21.1 9l-42 42q-8 7.714-8 18t8 18q7.636 8 17.818 8Q579-543 587-551l27-27ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-400Zm0 340q142.375 0 241.188-98.812Q820-337.625 820-480t-98.812-241.188Q622.375-820 480-820t-241.188 98.812Q140-622.375 140-480t98.812 241.188Q337.625-140 480-140Z\" />\n </svg>\n)\nexport const cancelSVG = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-labelledby=\"close-survey-title\"\n >\n <title id=\"close-survey-title\">Close survey</title>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M0.164752 0.164752C0.384422 -0.0549175 0.740578 -0.0549175 0.960248 0.164752L6 5.20451L11.0398 0.164752C11.2594 -0.0549175 11.6156 -0.0549175 11.8352 0.164752C12.0549 0.384422 12.0549 0.740578 11.8352 0.960248L6.79549 6L11.8352 11.0398C12.0549 11.2594 12.0549 11.6156 11.8352 11.8352C11.6156 12.0549 11.2594 12.0549 11.0398 11.8352L6 6.79549L0.960248 11.8352C0.740578 12.0549 0.384422 12.0549 0.164752 11.8352C-0.0549175 11.6156 -0.0549175 11.2594 0.164752 11.0398L5.20451 6L0.164752 0.960248C-0.0549175 0.740578 -0.0549175 0.384422 0.164752 0.164752Z\"\n fill=\"black\"\n />\n </svg>\n)\nexport const IconPosthogLogo = (\n <svg width=\"77\" height=\"14\" viewBox=\"0 0 77 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_2415_6911)\">\n <mask\n id=\"mask0_2415_6911\"\n style={{ maskType: 'luminance' }}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"77\"\n height=\"14\"\n >\n <path d=\"M0.5 0H76.5V14H0.5V0Z\" fill=\"white\" />\n </mask>\n <g mask=\"url(#mask0_2415_6911)\">\n <path\n d=\"M5.77226 8.02931C5.59388 8.37329 5.08474 8.37329 4.90634 8.02931L4.4797 7.20672C4.41155 7.07535 4.41155 6.9207 4.4797 6.78933L4.90634 5.96669C5.08474 5.62276 5.59388 5.62276 5.77226 5.96669L6.19893 6.78933C6.26709 6.9207 6.26709 7.07535 6.19893 7.20672L5.77226 8.02931ZM5.77226 12.6946C5.59388 13.0386 5.08474 13.0386 4.90634 12.6946L4.4797 11.872C4.41155 11.7406 4.41155 11.586 4.4797 11.4546L4.90634 10.632C5.08474 10.288 5.59388 10.288 5.77226 10.632L6.19893 11.4546C6.26709 11.586 6.26709 11.7406 6.19893 11.872L5.77226 12.6946Z\"\n fill=\"#1D4AFF\"\n />\n <path\n d=\"M0.5 10.9238C0.5 10.508 1.02142 10.2998 1.32637 10.5938L3.54508 12.7327C3.85003 13.0267 3.63405 13.5294 3.20279 13.5294H0.984076C0.716728 13.5294 0.5 13.3205 0.5 13.0627V10.9238ZM0.5 8.67083C0.5 8.79459 0.551001 8.91331 0.641783 9.00081L5.19753 13.3927C5.28831 13.4802 5.41144 13.5294 5.53982 13.5294H8.0421C8.47337 13.5294 8.68936 13.0267 8.3844 12.7327L1.32637 5.92856C1.02142 5.63456 0.5 5.84278 0.5 6.25854V8.67083ZM0.5 4.00556C0.5 4.12932 0.551001 4.24802 0.641783 4.33554L10.0368 13.3927C10.1276 13.4802 10.2508 13.5294 10.3791 13.5294H12.8814C13.3127 13.5294 13.5287 13.0267 13.2237 12.7327L1.32637 1.26329C1.02142 0.969312 0.5 1.17752 0.5 1.59327V4.00556ZM5.33931 4.00556C5.33931 4.12932 5.39033 4.24802 5.4811 4.33554L14.1916 12.7327C14.4965 13.0267 15.0179 12.8185 15.0179 12.4028V9.99047C15.0179 9.86671 14.9669 9.74799 14.8762 9.66049L6.16568 1.26329C5.86071 0.969307 5.33931 1.17752 5.33931 1.59327V4.00556ZM11.005 1.26329C10.7 0.969307 10.1786 1.17752 10.1786 1.59327V4.00556C10.1786 4.12932 10.2296 4.24802 10.3204 4.33554L14.1916 8.06748C14.4965 8.36148 15.0179 8.15325 15.0179 7.7375V5.3252C15.0179 5.20144 14.9669 5.08272 14.8762 4.99522L11.005 1.26329Z\"\n fill=\"#F9BD2B\"\n />\n <path\n d=\"M21.0852 10.981L16.5288 6.58843C16.2238 6.29443 15.7024 6.50266 15.7024 6.91841V13.0627C15.7024 13.3205 15.9191 13.5294 16.1865 13.5294H23.2446C23.5119 13.5294 23.7287 13.3205 23.7287 13.0627V12.5032C23.7287 12.2455 23.511 12.0396 23.2459 12.0063C22.4323 11.9042 21.6713 11.546 21.0852 10.981ZM18.0252 12.0365C17.5978 12.0365 17.251 11.7021 17.251 11.2901C17.251 10.878 17.5978 10.5436 18.0252 10.5436C18.4527 10.5436 18.7996 10.878 18.7996 11.2901C18.7996 11.7021 18.4527 12.0365 18.0252 12.0365Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M0.5 13.0627C0.5 13.3205 0.716728 13.5294 0.984076 13.5294H3.20279C3.63405 13.5294 3.85003 13.0267 3.54508 12.7327L1.32637 10.5938C1.02142 10.2998 0.5 10.508 0.5 10.9238V13.0627ZM5.33931 5.13191L1.32637 1.26329C1.02142 0.969306 0.5 1.17752 0.5 1.59327V4.00556C0.5 4.12932 0.551001 4.24802 0.641783 4.33554L5.33931 8.86412V5.13191ZM1.32637 5.92855C1.02142 5.63455 0.5 5.84278 0.5 6.25853V8.67083C0.5 8.79459 0.551001 8.91331 0.641783 9.00081L5.33931 13.5294V9.79717L1.32637 5.92855Z\"\n fill=\"#1D4AFF\"\n />\n <path\n d=\"M10.1787 5.3252C10.1787 5.20144 10.1277 5.08272 10.0369 4.99522L6.16572 1.26329C5.8608 0.969306 5.33936 1.17752 5.33936 1.59327V4.00556C5.33936 4.12932 5.39037 4.24802 5.48114 4.33554L10.1787 8.86412V5.3252ZM5.33936 13.5294H8.04214C8.47341 13.5294 8.6894 13.0267 8.38443 12.7327L5.33936 9.79717V13.5294ZM5.33936 5.13191V8.67083C5.33936 8.79459 5.39037 8.91331 5.48114 9.00081L10.1787 13.5294V9.99047C10.1787 9.86671 10.1277 9.74803 10.0369 9.66049L5.33936 5.13191Z\"\n fill=\"#F54E00\"\n />\n <path\n d=\"M29.375 11.6667H31.3636V8.48772H33.0249C34.8499 8.48772 36.0204 7.4443 36.0204 5.83052C36.0204 4.21681 34.8499 3.17334 33.0249 3.17334H29.375V11.6667ZM31.3636 6.84972V4.81136H32.8236C33.5787 4.81136 34.0318 5.19958 34.0318 5.83052C34.0318 6.4615 33.5787 6.84972 32.8236 6.84972H31.3636ZM39.618 11.7637C41.5563 11.7637 42.9659 10.429 42.9659 8.60905C42.9659 6.78905 41.5563 5.45438 39.618 5.45438C37.6546 5.45438 36.2701 6.78905 36.2701 8.60905C36.2701 10.429 37.6546 11.7637 39.618 11.7637ZM38.1077 8.60905C38.1077 7.63838 38.7118 6.97105 39.618 6.97105C40.5116 6.97105 41.1157 7.63838 41.1157 8.60905C41.1157 9.57972 40.5116 10.2471 39.618 10.2471C38.7118 10.2471 38.1077 9.57972 38.1077 8.60905ZM46.1482 11.7637C47.6333 11.7637 48.6402 10.8658 48.6402 9.81025C48.6402 7.33505 45.2294 8.13585 45.2294 7.16518C45.2294 6.8983 45.5189 6.72843 45.9342 6.72843C46.3622 6.72843 46.8782 6.98318 47.0418 7.54132L48.527 6.94678C48.2375 6.06105 47.1677 5.45438 45.8713 5.45438C44.4743 5.45438 43.6058 6.25518 43.6058 7.21372C43.6058 9.53118 46.9663 8.88812 46.9663 9.84665C46.9663 10.1864 46.6391 10.417 46.1482 10.417C45.4434 10.417 44.9525 9.94376 44.8015 9.3735L43.3164 9.93158C43.6436 10.8537 44.6001 11.7637 46.1482 11.7637ZM53.4241 11.606L53.2982 10.0651C53.0843 10.1743 52.8074 10.2106 52.5808 10.2106C52.1278 10.2106 51.8257 9.89523 51.8257 9.34918V7.03172H53.3612V5.55145H51.8257V3.78001H49.9755V5.55145H48.9687V7.03172H49.9755V9.57972C49.9755 11.06 51.0202 11.7637 52.3921 11.7637C52.7696 11.7637 53.122 11.7031 53.4241 11.606ZM59.8749 3.17334V6.47358H56.376V3.17334H54.3874V11.6667H56.376V8.11158H59.8749V11.6667H61.8761V3.17334H59.8749ZM66.2899 11.7637C68.2281 11.7637 69.6378 10.429 69.6378 8.60905C69.6378 6.78905 68.2281 5.45438 66.2899 5.45438C64.3265 5.45438 62.942 6.78905 62.942 8.60905C62.942 10.429 64.3265 11.7637 66.2899 11.7637ZM64.7796 8.60905C64.7796 7.63838 65.3837 6.97105 66.2899 6.97105C67.1835 6.97105 67.7876 7.63838 67.7876 8.60905C67.7876 9.57972 67.1835 10.2471 66.2899 10.2471C65.3837 10.2471 64.7796 9.57972 64.7796 8.60905ZM73.2088 11.4725C73.901 11.4725 74.5177 11.242 74.845 10.8416V11.424C74.845 12.1034 74.2786 12.5767 73.4102 12.5767C72.7935 12.5767 72.2523 12.2854 72.1642 11.788L70.4776 12.0428C70.7042 13.1955 71.925 13.972 73.4102 13.972C75.361 13.972 76.6574 12.8679 76.6574 11.2298V5.55145H74.8324V6.07318C74.4926 5.69705 73.9136 5.45438 73.171 5.45438C71.409 5.45438 70.3014 6.61918 70.3014 8.46345C70.3014 10.3077 71.409 11.4725 73.2088 11.4725ZM72.1012 8.46345C72.1012 7.55345 72.655 6.97105 73.5109 6.97105C74.3793 6.97105 74.9331 7.55345 74.9331 8.46345C74.9331 9.37345 74.3793 9.95585 73.5109 9.95585C72.655 9.95585 72.1012 9.37345 72.1012 8.46345Z\"\n fill=\"currentColor\"\n />\n </g>\n </g>\n <defs>\n <clipPath id=\"clip0_2415_6911\">\n <rect width=\"76\" height=\"14\" fill=\"white\" transform=\"translate(0.5)\" />\n </clipPath>\n </defs>\n </svg>\n)\nexport const checkSVG = (\n <svg width=\"16\" height=\"12\" viewBox=\"0 0 16 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.30769 10.6923L4.77736 11.2226C4.91801 11.3633 5.10878 11.4423 5.30769 11.4423C5.5066 11.4423 5.69737 11.3633 5.83802 11.2226L5.30769 10.6923ZM15.5303 1.53033C15.8232 1.23744 15.8232 0.762563 15.5303 0.46967C15.2374 0.176777 14.7626 0.176777 14.4697 0.46967L15.5303 1.53033ZM1.53033 5.85429C1.23744 5.56139 0.762563 5.56139 0.46967 5.85429C0.176777 6.14718 0.176777 6.62205 0.46967 6.91495L1.53033 5.85429ZM5.83802 11.2226L15.5303 1.53033L14.4697 0.46967L4.77736 10.162L5.83802 11.2226ZM0.46967 6.91495L4.77736 11.2226L5.83802 10.162L1.53033 5.85429L0.46967 6.91495Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n","import { IconPosthogLogo } from '../icons'\n\nexport function PostHogLogo() {\n return (\n <a href=\"https://posthog.com/surveys\" target=\"_blank\" rel=\"noopener\" className=\"footer-branding\">\n Survey by {IconPosthogLogo}\n </a>\n )\n}\n","import { window } from '../../../utils/globals'\n\nimport { SurveyAppearance } from '../../../posthog-surveys-types'\n\nimport { useContext } from 'preact/hooks'\nimport { SurveyContext } from '../surveys-extension-utils'\nimport { PostHogLogo } from './PostHogLogo'\n\nexport function BottomSection({\n text,\n submitDisabled,\n appearance,\n onSubmit,\n link,\n onPreviewSubmit,\n skipSubmitButton,\n}: {\n text: string\n submitDisabled: boolean\n appearance: SurveyAppearance\n onSubmit: () => void\n link?: string | null\n onPreviewSubmit?: () => void\n skipSubmitButton?: boolean\n}) {\n const { isPreviewMode } = useContext(SurveyContext)\n return (\n <div className=\"bottom-section\">\n {!skipSubmitButton && (\n <button\n className=\"form-submit\"\n disabled={submitDisabled}\n aria-label=\"Submit survey\"\n type=\"button\"\n onClick={() => {\n if (link) {\n window?.open(link)\n }\n if (isPreviewMode) {\n onPreviewSubmit?.()\n } else {\n onSubmit()\n }\n }}\n >\n {text}\n </button>\n )}\n {!appearance.whiteLabel && <PostHogLogo />}\n </div>\n )\n}\n","import { h } from 'preact'\nimport { useContext } from 'preact/hooks'\nimport { SurveyQuestion, SurveyQuestionType } from '../../../posthog-surveys-types'\nimport { cancelSVG } from '../icons'\nimport { SurveyContext, renderChildrenAsTextOrHtml } from '../surveys-extension-utils'\n\nexport function QuestionHeader({\n question,\n forceDisableHtml,\n htmlFor,\n}: {\n question: Pick<SurveyQuestion, 'question' | 'description' | 'descriptionContentType' | 'type'>\n forceDisableHtml: boolean\n htmlFor?: string\n}) {\n const TitleComponent = question.type === SurveyQuestionType.Open ? 'label' : 'h3'\n return (\n <div class=\"question-header\">\n <TitleComponent className=\"survey-question\" htmlFor={htmlFor}>\n {question.question}\n </TitleComponent>\n {question.description &&\n renderChildrenAsTextOrHtml({\n component: h('p', { className: 'survey-question-description' }),\n children: question.description,\n renderAsHtml: !forceDisableHtml && question.descriptionContentType !== 'text',\n })}\n </div>\n )\n}\n\nexport function Cancel({ onClick }: { onClick: () => void }) {\n const { isPreviewMode } = useContext(SurveyContext)\n\n return (\n <button\n className=\"form-cancel\"\n onClick={onClick}\n disabled={isPreviewMode}\n aria-label=\"Close survey\"\n type=\"button\"\n >\n {cancelSVG}\n </button>\n )\n}\n","import { h } from 'preact'\nimport { SurveyAppearance, SurveyQuestionDescriptionContentType } from '../../../posthog-surveys-types'\nimport { renderChildrenAsTextOrHtml } from '../surveys-extension-utils'\nimport { BottomSection } from './BottomSection'\nimport { Cancel } from './QuestionHeader'\n\nimport { useContext, useEffect } from 'preact/hooks'\nimport { SurveyContext } from '../surveys-extension-utils'\nimport { addEventListener } from '../../../utils'\nimport { window as _window } from '../../../utils/globals'\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window\n\nexport function ConfirmationMessage({\n header,\n description,\n contentType,\n forceDisableHtml,\n appearance,\n onClose,\n}: {\n header: string\n description: string\n forceDisableHtml: boolean\n contentType?: SurveyQuestionDescriptionContentType\n appearance: SurveyAppearance\n onClose: () => void\n}) {\n const { isPopup } = useContext(SurveyContext)\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault()\n onClose()\n }\n }\n addEventListener(window, 'keydown', handleKeyDown as EventListener)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [onClose])\n\n const renderCancelButton = isPopup && appearance.hideCancelButton !== true\n\n return (\n <div className=\"thank-you-message\" role=\"status\" tabIndex={0} aria-atomic=\"true\">\n {renderCancelButton && <Cancel onClick={() => onClose()} />}\n <h3 className=\"thank-you-message-header\">{header}</h3>\n {description &&\n renderChildrenAsTextOrHtml({\n component: h('p', { className: 'thank-you-message-body' }),\n children: description,\n renderAsHtml: !forceDisableHtml && contentType !== 'text',\n })}\n {isPopup && (\n <BottomSection\n text={appearance.thankYouMessageCloseButtonText || 'Close'}\n submitDisabled={false}\n appearance={appearance}\n onSubmit={() => onClose()}\n />\n )}\n </div>\n )\n}\n","import { Fragment, type JSX } from 'preact'\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport {\n BasicSurveyQuestion,\n LinkSurveyQuestion,\n MultipleSurveyQuestion,\n RatingSurveyQuestion,\n SurveyAppearance,\n SurveyQuestionType,\n} from '../../../posthog-surveys-types'\nimport { isArray, isNull, isNumber, isString } from '@posthog/core'\nimport { dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, veryDissatisfiedEmoji, verySatisfiedEmoji } from '../icons'\nimport { getDisplayOrderChoices, useSurveyContext } from '../surveys-extension-utils'\nimport { BottomSection } from './BottomSection'\nimport { QuestionHeader } from './QuestionHeader'\n\nexport interface CommonQuestionProps {\n forceDisableHtml: boolean\n appearance: SurveyAppearance\n onSubmit: (res: string | string[] | number | null) => void\n onPreviewSubmit: (res: string | string[] | number | null) => void\n initialValue?: string | string[] | number | null\n displayQuestionIndex: number\n}\n\ninterface OpenEndedInputState {\n isSelected: boolean\n inputValue: string\n}\n\nconst isValidStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every((item) => isString(item))\n}\n\nconst initializeSelectedChoices = (\n initialValue: string | string[] | number | null | undefined,\n questionType: SurveyQuestionType\n): string | string[] | null => {\n if (isString(initialValue)) {\n return initialValue\n }\n if (isValidStringArray(initialValue)) {\n return initialValue\n }\n return questionType === SurveyQuestionType.SingleChoice ? null : []\n}\n\nconst initializeOpenEndedState = (\n initialValue: string | string[] | number | null | undefined,\n choices: string[]\n): OpenEndedInputState => {\n if (isString(initialValue) && !choices.includes(initialValue)) {\n return {\n isSelected: true,\n inputValue: initialValue,\n }\n }\n if (isValidStringArray(initialValue)) {\n const openEndedValue = initialValue.find((choice) => !choices.includes(choice))\n if (openEndedValue) {\n return {\n isSelected: true,\n inputValue: openEndedValue,\n }\n }\n }\n return {\n isSelected: false,\n inputValue: '',\n }\n}\n\nexport function OpenTextQuestion({\n question,\n forceDisableHtml,\n appearance,\n onSubmit,\n onPreviewSubmit,\n displayQuestionIndex,\n initialValue,\n}: CommonQuestionProps & {\n question: BasicSurveyQuestion\n}) {\n const { isPreviewMode } = useSurveyContext()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const [text, setText] = useState<string>(() => {\n if (isString(initialValue)) {\n return initialValue\n }\n return ''\n })\n\n useEffect(() => {\n setTimeout(() => {\n if (!isPreviewMode) {\n inputRef.current?.focus()\n }\n }, 100)\n }, [isPreviewMode])\n\n const htmlFor = `surveyQuestion${displayQuestionIndex}`\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} htmlFor={htmlFor} />\n <textarea\n ref={inputRef}\n id={htmlFor}\n rows={4}\n placeholder={appearance?.placeholder}\n onInput={(e) => {\n setText(e.currentTarget.value)\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n }}\n value={text}\n />\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={!text && !question.optional}\n appearance={appearance}\n onSubmit={() => onSubmit(text)}\n onPreviewSubmit={() => onPreviewSubmit(text)}\n />\n </Fragment>\n )\n}\n\nexport function LinkQuestion({\n question,\n forceDisableHtml,\n appearance,\n onSubmit,\n onPreviewSubmit,\n}: CommonQuestionProps & {\n question: LinkSurveyQuestion\n}) {\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={false}\n link={question.link}\n appearance={appearance}\n onSubmit={() => onSubmit('link clicked')}\n onPreviewSubmit={() => onPreviewSubmit('link clicked')}\n />\n </Fragment>\n )\n}\n\nexport function RatingQuestion({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: CommonQuestionProps & {\n question: RatingSurveyQuestion\n}) {\n const scale = question.scale\n const starting = question.scale === 10 ? 0 : 1\n const [rating, setRating] = useState<number | null>(() => {\n if (isNumber(initialValue)) {\n return initialValue\n }\n if (isArray(initialValue) && initialValue.length > 0 && isNumber(parseInt(initialValue[0]))) {\n return parseInt(initialValue[0])\n }\n if (isString(initialValue) && isNumber(parseInt(initialValue))) {\n return parseInt(initialValue)\n }\n return null\n })\n\n const { isPreviewMode } = useSurveyContext()\n\n const handleSubmit = (num: number) => {\n if (isPreviewMode) {\n return onPreviewSubmit(num)\n }\n return onSubmit(num)\n }\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n <div className=\"rating-section\">\n <div className=\"rating-options\">\n {question.display === 'emoji' && (\n <div className=\"rating-options-emoji\">\n {(question.scale === 3 ? threeScaleEmojis : fiveScaleEmojis).map((emoji, idx) => {\n const active = idx + 1 === rating\n return (\n <button\n aria-label={`Rate ${idx + 1}`}\n className={`ratings-emoji question-${displayQuestionIndex}-rating-${idx} ${\n active ? 'rating-active' : ''\n }`}\n value={idx + 1}\n key={idx}\n type=\"button\"\n onClick={() => {\n const response = idx + 1\n setRating(response)\n if (question.skipSubmitButton) {\n handleSubmit(response)\n }\n }}\n >\n {emoji}\n </button>\n )\n })}\n </div>\n )}\n {question.display === 'number' && (\n <div\n className=\"rating-options-number\"\n style={{ gridTemplateColumns: `repeat(${scale - starting + 1}, minmax(0, 1fr))` }}\n >\n {getScaleNumbers(question.scale).map((number, idx) => {\n const active = rating === number\n return (\n <RatingButton\n key={idx}\n displayQuestionIndex={displayQuestionIndex}\n active={active}\n appearance={appearance}\n num={number}\n setActiveNumber={(response) => {\n setRating(response)\n if (question.skipSubmitButton) {\n handleSubmit(response)\n }\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n <div className=\"rating-text\">\n <div>{question.lowerBoundLabel}</div>\n <div>{question.upperBoundLabel}</div>\n </div>\n </div>\n </div>\n <BottomSection\n text={question.buttonText || appearance?.submitButtonText || 'Submit'}\n submitDisabled={isNull(rating) && !question.optional}\n appearance={appearance}\n onSubmit={() => onSubmit(rating)}\n onPreviewSubmit={() => onPreviewSubmit(rating)}\n skipSubmitButton={question.skipSubmitButton}\n />\n </Fragment>\n )\n}\n\nexport function RatingButton({\n num,\n active,\n displayQuestionIndex,\n setActiveNumber,\n}: {\n num: number\n active: boolean\n displayQuestionIndex: number\n appearance: SurveyAppearance\n setActiveNumber: (num: number) => void\n}) {\n return (\n <button\n aria-label={`Rate ${num}`}\n className={`ratings-number question-${displayQuestionIndex}-rating-${num} ${active ? 'rating-active' : ''}`}\n type=\"button\"\n onClick={() => {\n setActiveNumber(num)\n }}\n >\n {num}\n </button>\n )\n}\n\nexport function MultipleChoiceQuestion({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: CommonQuestionProps & {\n question: MultipleSurveyQuestion\n}) {\n const openChoiceInputRef = useRef<HTMLInputElement>(null)\n const choices = useMemo(() => getDisplayOrderChoices(question), [question])\n const [selectedChoices, setSelectedChoices] = useState<string | string[] | null>(() =>\n initializeSelectedChoices(initialValue, question.type)\n )\n const [openEndedState, setOpenEndedState] = useState<OpenEndedInputState>(() =>\n initializeOpenEndedState(initialValue, choices)\n )\n\n const { isPreviewMode } = useSurveyContext()\n\n const isSingleChoiceQuestion = question.type === SurveyQuestionType.SingleChoice\n const isMultipleChoiceQuestion = question.type === SurveyQuestionType.MultipleChoice\n\n const shouldSkipSubmit = question.skipSubmitButton && isSingleChoiceQuestion && !question.hasOpenChoice\n\n const handleChoiceChange = (val: string, isOpenChoice: boolean) => {\n if (isOpenChoice) {\n const newOpenSelected = !openEndedState.isSelected\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: newOpenSelected,\n inputValue: newOpenSelected ? prev.inputValue : '',\n }))\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices('')\n }\n\n // Focus the input when open choice is selected, slight delay because of the animation\n if (newOpenSelected) {\n setTimeout(() => openChoiceInputRef.current?.focus(), 75)\n }\n return\n }\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices(val)\n // Deselect open choice when selecting another option\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: false,\n inputValue: '',\n }))\n\n if (shouldSkipSubmit) {\n onSubmit(val)\n if (isPreviewMode) {\n onPreviewSubmit(val)\n }\n }\n return\n }\n\n if (isMultipleChoiceQuestion && isArray(selectedChoices)) {\n if (selectedChoices.includes(val)) {\n setSelectedChoices(selectedChoices.filter((choice) => choice !== val))\n } else {\n setSelectedChoices([...selectedChoices, val])\n }\n }\n }\n\n const handleOpenEndedInputChange = (e: JSX.TargetedEvent<HTMLInputElement>) => {\n e.stopPropagation()\n const newValue = e.currentTarget.value\n\n setOpenEndedState((prev) => ({\n ...prev,\n inputValue: newValue,\n }))\n\n if (isSingleChoiceQuestion) {\n setSelectedChoices(newValue)\n }\n }\n\n const handleOpenEndedKeyDown = (e: JSX.TargetedKeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation()\n\n // Handle Enter key to submit form if valid\n if (e.key === 'Enter' && !isSubmitDisabled()) {\n e.preventDefault()\n handleSubmit()\n }\n\n // Handle Escape key to clear input and deselect\n if (e.key === 'Escape') {\n e.preventDefault()\n setOpenEndedState((prev) => ({\n ...prev,\n isSelected: false,\n inputValue: '',\n }))\n if (isSingleChoiceQuestion) {\n setSelectedChoices(null)\n }\n }\n }\n\n const isSubmitDisabled = (): boolean => {\n if (question.optional) {\n return false\n }\n if (isNull(selectedChoices)) {\n return true\n }\n if (isArray(selectedChoices)) {\n if (!openEndedState.isSelected && selectedChoices.length === 0) {\n return true\n }\n }\n if (openEndedState.isSelected && openEndedState.inputValue.trim() === '') {\n return true\n }\n return false\n }\n\n const handleSubmit = () => {\n if (openEndedState.isSelected && isMultipleChoiceQuestion) {\n if (isArray(selectedChoices)) {\n isPreviewMode\n ? onPreviewSubmit([...selectedChoices, openEndedState.inputValue])\n : onSubmit([...selectedChoices, openEndedState.inputValue])\n }\n } else {\n isPreviewMode ? onPreviewSubmit(selectedChoices) : onSubmit(selectedChoices)\n }\n }\n\n return (\n <Fragment>\n <div className=\"question-container\">\n <QuestionHeader question={question} forceDisableHtml={forceDisableHtml} />\n <fieldset className=\"multiple-choice-options limit-height\">\n <legend className=\"sr-only\">\n {isMultipleChoiceQuestion ? ' Select all that apply' : ' Select one'}\n </legend>\n {choices.map((choice: string, idx: number) => {\n const isOpenChoice = !!question.hasOpenChoice && idx === question.choices.length - 1\n const inputId = `surveyQuestion${displayQuestionIndex}Choice${idx}`\n const openInputId = `${inputId}Open`\n\n const isChecked = isOpenChoice\n ? openEndedState.isSelected\n : isSingleChoiceQuestion\n ? selectedChoices === choice\n : isArray(selectedChoices) && selectedChoices.includes(choice)\n\n return (\n <label className={isOpenChoice ? 'choice-option-open' : ''} key={idx}>\n <div className=\"response-choice\">\n <input\n type={isSingleChoiceQuestion ? 'radio' : 'checkbox'}\n name={inputId}\n checked={isChecked}\n onChange={() => handleChoiceChange(choice, isOpenChoice)}\n id={inputId}\n aria-controls={openInputId}\n />\n <span>{isOpenChoice ? `${choice}:` : choice}</span>\n </div>\n {isOpenChoice && (\n <input\n type=\"text\"\n ref={openChoiceInputRef}\n id={openInputId}\n name={`question${displayQuestionIndex}Open`}\n value={openEndedState.inputValue}\n onKeyDown={handleOpenEndedKeyDown}\n onInput={handleOpenEndedInputChange}\n onClick={(e) => {\n // Ensure the checkbox/radio gets checked when clicking the input\n if (!openEndedState.isSelected) {\n handleChoiceChange(choice, true)\n }\n e.stopPropagation()\n }}\n aria-label={`${choice} - please specify`}\n />\n )}\n </label>\n )\n })}\n </fieldset>\n </div>\n <BottomSection\n text={question.buttonText || 'Submit'}\n submitDisabled={isSubmitDisabled()}\n appearance={appearance}\n onSubmit={handleSubmit}\n onPreviewSubmit={handleSubmit}\n skipSubmitButton={shouldSkipSubmit}\n />\n </Fragment>\n )\n}\n\nconst threeScaleEmojis = [dissatisfiedEmoji, neutralEmoji, satisfiedEmoji]\nconst fiveScaleEmojis = [veryDissatisfiedEmoji, dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, verySatisfiedEmoji]\nconst fiveScaleNumbers = [1, 2, 3, 4, 5]\nconst sevenScaleNumbers = [1, 2, 3, 4, 5, 6, 7]\nconst tenScaleNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\nfunction getScaleNumbers(scale: number): number[] {\n switch (scale) {\n case 5:\n return fiveScaleNumbers\n case 7:\n return sevenScaleNumbers\n case 10:\n return tenScaleNumbers\n default:\n return fiveScaleNumbers\n }\n}\n","import { Survey, SurveyQuestionBranchingType, SurveyQuestionType } from '../posthog-surveys-types'\nimport { createLogger } from './logger'\n\nconst logger = createLogger('[Surveys]')\n\n/**\n * Get the rating bucket (detractors/passives/promoters or negative/neutral/positive)\n * based on the response value and scale.\n */\nexport function getRatingBucketForResponseValue(responseValue: number, scale: number): string {\n if (scale === 3) {\n if (responseValue < 1 || responseValue > 3) {\n throw new Error('The response must be in range 1-3')\n }\n\n return responseValue === 1 ? 'negative' : responseValue === 2 ? 'neutral' : 'positive'\n } else if (scale === 5) {\n if (responseValue < 1 || responseValue > 5) {\n throw new Error('The response must be in range 1-5')\n }\n\n return responseValue <= 2 ? 'negative' : responseValue === 3 ? 'neutral' : 'positive'\n } else if (scale === 7) {\n if (responseValue < 1 || responseValue > 7) {\n throw new Error('The response must be in range 1-7')\n }\n\n return responseValue <= 3 ? 'negative' : responseValue === 4 ? 'neutral' : 'positive'\n } else if (scale === 10) {\n if (responseValue < 0 || responseValue > 10) {\n throw new Error('The response must be in range 0-10')\n }\n\n return responseValue <= 6 ? 'detractors' : responseValue <= 8 ? 'passives' : 'promoters'\n }\n\n throw new Error('The scale must be one of: 3, 5, 7, 10')\n}\n\n/**\n * Determine the next survey step based on branching configuration.\n * Returns the next question index, or SurveyQuestionBranchingType.End if the survey should end.\n */\nexport function getNextSurveyStep(\n survey: Survey,\n currentQuestionIndex: number,\n response: string | string[] | number | null\n): number | SurveyQuestionBranchingType.End {\n const question = survey.questions[currentQuestionIndex]\n const nextQuestionIndex = currentQuestionIndex + 1\n\n if (!question.branching?.type) {\n if (currentQuestionIndex === survey.questions.length - 1) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n\n if (question.branching.type === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n } else if (question.branching.type === SurveyQuestionBranchingType.SpecificQuestion) {\n if (Number.isInteger(question.branching.index)) {\n return question.branching.index\n }\n } else if (question.branching.type === SurveyQuestionBranchingType.ResponseBased) {\n // Single choice\n if (question.type === SurveyQuestionType.SingleChoice) {\n // KLUDGE: for now, look up the choiceIndex based on the response\n // TODO: once QuestionTypes.MultipleChoiceQuestion is refactored, pass the selected choiceIndex into this method\n let selectedChoiceIndex = question.choices.indexOf(`${response}`)\n\n if (selectedChoiceIndex === -1 && question.hasOpenChoice) {\n // if the response is not found in the choices, it must be the open choice,\n // which is always the last choice\n selectedChoiceIndex = question.choices.length - 1\n }\n\n if (question.branching?.responseValues?.hasOwnProperty(selectedChoiceIndex)) {\n const nextStep = question.branching.responseValues[selectedChoiceIndex]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n } else if (question.type === SurveyQuestionType.Rating) {\n if (typeof response !== 'number' || !Number.isInteger(response)) {\n throw new Error('The response type must be an integer')\n }\n\n const ratingBucket = getRatingBucketForResponseValue(response, question.scale)\n\n if (question.branching?.responseValues?.hasOwnProperty(ratingBucket)) {\n const nextStep = question.branching.responseValues[ratingBucket]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n }\n\n return nextQuestionIndex\n }\n\n logger.warn('Falling back to next question index due to unexpected branching type')\n return nextQuestionIndex\n}\n","import { type JSX, type RefObject, render, Fragment } from 'preact'\nimport { useContext, useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport { PostHog } from '../posthog-core'\nimport {\n Survey,\n SurveyCallback,\n SurveyEventName,\n SurveyEventProperties,\n SurveyPosition,\n SurveyQuestion,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveySchedule,\n SurveyTabPosition,\n SurveyType,\n SurveyWidgetType,\n SurveyWithTypeAndAppearance,\n} from '../posthog-surveys-types'\nimport { addEventListener } from '../utils'\nimport { document as _document, window as _window } from '../utils/globals'\nimport {\n doesSurveyActivateByAction,\n doesSurveyActivateByEvent,\n IN_APP_SURVEY_TYPES,\n isSurveyRunning,\n SURVEY_LOGGER as logger,\n} from '../utils/survey-utils'\nimport { isNull, isUndefined } from '@posthog/core'\nimport { SURVEYS } from '../constants'\nimport { uuidv7 } from '../uuidv7'\nimport { ConfirmationMessage } from './surveys/components/ConfirmationMessage'\nimport { Cancel } from './surveys/components/QuestionHeader'\nimport {\n CommonQuestionProps,\n LinkQuestion,\n MultipleChoiceQuestion,\n OpenTextQuestion,\n RatingQuestion,\n} from './surveys/components/QuestionTypes'\nimport {\n canActivateRepeatedly,\n retrieveSurveyShadow,\n defaultSurveyAppearance,\n dismissedSurveyEvent,\n doesSurveyDeviceTypesMatch,\n doesSurveyMatchSelector,\n doesSurveyUrlMatch,\n getDisplayOrderQuestions,\n getInProgressSurveyState,\n getSurveyContainerClass,\n getSurveyResponseKey,\n getSurveySeen,\n hasWaitPeriodPassed,\n isSurveyInProgress,\n sendSurveyEvent,\n sendSurveyAbandonedEvent,\n setInProgressSurveyState,\n SurveyContext,\n getSurveyStylesheet,\n addSurveyCSSVariablesToElement,\n} from './surveys/surveys-extension-utils'\nimport {\n extractPrefillParamsFromUrl,\n convertPrefillToResponses,\n calculatePrefillStartIndex,\n} from '../utils/survey-url-prefill'\nimport { getNextSurveyStep } from '../utils/survey-branching'\n\n// Re-export for surveys-preview entrypoint\nexport { getNextSurveyStep }\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\n\nconst DISPATCH_FEEDBACK_WIDGET_EVENT = 'ph:show_survey_widget'\nconst WIDGET_LISTENER_ATTRIBUTE = 'PHWidgetSurveyClickListener'\n\nconst SURVEY_NEXT_TO_TRIGGER_PARAMS = {\n ESTIMATED_MIN_HEIGHT: 250,\n HORIZONTAL_PADDING: 20,\n TRIGGER_SPACING: 12,\n} as const\n\nfunction getNextToTriggerPosition(target: HTMLElement, surveyWidth: number): JSX.CSSProperties | null {\n try {\n const buttonRect = target.getBoundingClientRect()\n const viewportHeight = window.innerHeight\n const viewportWidth = window.innerWidth\n const estimatedMinSurveyHeight = SURVEY_NEXT_TO_TRIGGER_PARAMS.ESTIMATED_MIN_HEIGHT\n const buttonCenterX = buttonRect.left + buttonRect.width / 2\n let left = buttonCenterX - surveyWidth / 2\n const horizontalPadding = SURVEY_NEXT_TO_TRIGGER_PARAMS.HORIZONTAL_PADDING\n if (left + surveyWidth > viewportWidth - horizontalPadding) {\n left = viewportWidth - surveyWidth - horizontalPadding\n }\n if (left < horizontalPadding) {\n left = horizontalPadding\n }\n const spacing = SURVEY_NEXT_TO_TRIGGER_PARAMS.TRIGGER_SPACING\n const spaceBelow = viewportHeight - buttonRect.bottom\n const spaceAbove = buttonRect.top\n const showAbove = spaceBelow < estimatedMinSurveyHeight && spaceAbove > spaceBelow\n\n return {\n position: 'fixed',\n top: showAbove ? 'auto' : `${buttonRect.bottom + spacing}px`,\n left: `${left}px`,\n right: 'auto',\n bottom: showAbove ? `${viewportHeight - buttonRect.top + spacing}px` : 'auto',\n zIndex: defaultSurveyAppearance.zIndex,\n } satisfies JSX.CSSProperties\n } catch (error) {\n logger.warn('Failed to calculate trigger position:', error)\n return null\n }\n}\n\n// Keep in sync with posthog/constants.py on main repo\nconst SURVEY_TARGETING_FLAG_PREFIX = 'survey-targeting-'\n\nexport class SurveyManager {\n private _posthog: PostHog\n private _surveyInFocus: string | null\n private _surveyTimeouts: Map<string, NodeJS.Timeout> = new Map()\n private _widgetSelectorListeners: Map<string, { element: Element; listener: EventListener; survey: Survey }> =\n new Map()\n private _prefillHandledSurveys: Set<string> = new Set()\n\n constructor(posthog: PostHog) {\n this._posthog = posthog\n // This is used to track the survey that is currently in focus. We only show one survey at a time.\n this._surveyInFocus = null\n }\n\n public handlePageUnload = (): void => {\n // we don't use getSurveys to avoid adding extra API calls here.\n // if no surveys are cached, there's nothing to do anyways\n const surveys = this._posthog.get_property(SURVEYS) as Survey[] | undefined\n if (!surveys) {\n return\n }\n for (const survey of surveys) {\n if (isSurveyInProgress(survey)) {\n sendSurveyAbandonedEvent(survey, this._posthog)\n }\n }\n }\n\n private _clearSurveyTimeout(surveyId: string) {\n const timeout = this._surveyTimeouts.get(surveyId)\n if (timeout) {\n clearTimeout(timeout)\n this._surveyTimeouts.delete(surveyId)\n }\n }\n\n /**\n * cancel a \"pending\" survey, i.e. one that is waiting to be displayed in\n * the _surveyTimeouts queue\n */\n public cancelSurvey(surveyId: string): void {\n // only works for surveys in the _surveyTimeouts queue...\n if (!this._surveyTimeouts.has(surveyId)) {\n return\n }\n\n logger.info(`Cancelled pending survey ${surveyId}`)\n this._clearSurveyTimeout(surveyId)\n\n // release focus - it was claimed when the delay timer started.\n // \"focus\" != \"survey is displayed\"\n if (this._surveyInFocus === surveyId) {\n this._surveyInFocus = null\n }\n }\n\n public handlePopoverSurvey = (survey: Survey): void => {\n this._clearSurveyTimeout(survey.id)\n this._addSurveyToFocus(survey)\n const delaySeconds = survey.appearance?.surveyPopupDelaySeconds || 0\n const { shadow } = retrieveSurveyShadow(survey, this._posthog)\n if (delaySeconds <= 0) {\n return render(\n <SurveyPopup\n posthog={this._posthog}\n survey={survey}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n />,\n shadow\n )\n }\n const timeoutId = setTimeout(() => {\n // remove survey to keep `_surveyTimeouts` as a true list of \"pending\" surveys\n this._surveyTimeouts.delete(survey.id)\n\n if (!doesSurveyUrlMatch(survey)) {\n return this._removeSurveyFromFocus(survey)\n }\n // rendering with surveyPopupDelaySeconds = 0 because we're already handling the timeout here\n render(\n <SurveyPopup\n posthog={this._posthog}\n survey={{ ...survey, appearance: { ...survey.appearance, surveyPopupDelaySeconds: 0 } }}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n />,\n shadow\n )\n }, delaySeconds * 1000)\n this._surveyTimeouts.set(survey.id, timeoutId)\n }\n\n private _handleWidget = (survey: Survey): void => {\n // Ensure widget container exists if it doesn't\n const { shadow, isNewlyCreated } = retrieveSurveyShadow(survey, this._posthog)\n\n // If the widget is already rendered, do nothing. Otherwise the widget will be re-rendered every second\n if (!isNewlyCreated) {\n return\n }\n\n render(<FeedbackWidget posthog={this._posthog} survey={survey} key={survey.id} />, shadow)\n }\n\n private _removeWidgetSelectorListener = (survey: Pick<Survey, 'id' | 'type' | 'appearance'>): void => {\n this._removeSurveyFromDom(survey)\n const existing = this._widgetSelectorListeners.get(survey.id)\n if (existing) {\n existing.element.removeEventListener('click', existing.listener)\n existing.element.removeAttribute(WIDGET_LISTENER_ATTRIBUTE)\n this._widgetSelectorListeners.delete(survey.id)\n logger.info(`Removed click listener for survey ${survey.id}`)\n }\n }\n\n private _manageWidgetSelectorListener = (survey: Survey, selector: string): void => {\n const currentElement = document.querySelector(selector)\n const existingListenerData = this._widgetSelectorListeners.get(survey.id)\n\n if (!currentElement) {\n if (existingListenerData) {\n this._removeWidgetSelectorListener(survey)\n }\n return\n }\n\n this._handleWidget(survey)\n\n if (existingListenerData) {\n // Listener exists, check if element changed\n if (currentElement !== existingListenerData.element) {\n logger.info(`Selector element changed for survey ${survey.id}. Re-attaching listener.`)\n this._removeWidgetSelectorListener(survey)\n // Continue to attach listener to the new element below\n } else {\n // Element is the same, listener already attached, do nothing\n return\n }\n }\n\n // Element found, and no listener attached (or it was just removed from old element)\n if (!currentElement.hasAttribute(WIDGET_LISTENER_ATTRIBUTE)) {\n const listener = (event: Event) => {\n event.stopPropagation() // Prevent bubbling\n\n const positionStyles =\n survey.appearance?.position === SurveyPosition.NextToTrigger\n ? getNextToTriggerPosition(\n event.currentTarget as HTMLElement,\n parseInt(survey.appearance?.maxWidth || defaultSurveyAppearance.maxWidth)\n )\n : {}\n\n window.dispatchEvent(\n new CustomEvent(DISPATCH_FEEDBACK_WIDGET_EVENT, {\n detail: { surveyId: survey.id, position: positionStyles },\n })\n )\n }\n\n addEventListener(currentElement, 'click', listener)\n currentElement.setAttribute(WIDGET_LISTENER_ATTRIBUTE, 'true')\n this._widgetSelectorListeners.set(survey.id, { element: currentElement, listener, survey })\n logger.info(`Attached click listener for feedback button survey ${survey.id}`)\n }\n }\n\n /**\n * Sorts surveys by their appearance delay in ascending order. If a survey does not have an appearance delay,\n * it is considered to have a delay of 0.\n * @param surveys\n * @returns The surveys sorted by their appearance delay\n */\n private _sortSurveysByAppearanceDelay(surveys: Survey[]): Survey[] {\n return surveys.sort((a, b) => {\n const isSurveyInProgressA = isSurveyInProgress(a)\n const isSurveyInProgressB = isSurveyInProgress(b)\n if (isSurveyInProgressA && !isSurveyInProgressB) {\n return -1 // a comes before b (in progress surveys first)\n }\n if (!isSurveyInProgressA && isSurveyInProgressB) {\n return 1 // a comes after b (in progress surveys first)\n }\n const aIsAlways = a.schedule === SurveySchedule.Always\n const bIsAlways = b.schedule === SurveySchedule.Always\n\n if (aIsAlways && !bIsAlways) {\n return 1 // a comes after b\n }\n if (!aIsAlways && bIsAlways) {\n return -1 // a comes before b\n }\n // If both are Always or neither is Always, sort by delay\n return (a.appearance?.surveyPopupDelaySeconds || 0) - (b.appearance?.surveyPopupDelaySeconds || 0)\n })\n }\n\n public renderPopover = (survey: Survey): void => {\n const { shadow } = retrieveSurveyShadow(survey, this._posthog)\n render(\n <SurveyPopup posthog={this._posthog} survey={survey} removeSurveyFromFocus={this._removeSurveyFromFocus} />,\n shadow\n )\n }\n\n public renderSurvey = (survey: Survey, selector: Element): void => {\n if (this._posthog.config?.surveys?.prefillFromUrl) {\n this._handleUrlPrefill(survey)\n }\n\n render(\n <SurveyPopup\n posthog={this._posthog}\n survey={survey}\n removeSurveyFromFocus={this._removeSurveyFromFocus}\n isPopup={false}\n />,\n selector\n )\n }\n\n private _handleUrlPrefill(survey: Survey): void {\n // Only handle prefill once per survey session to avoid overwriting in-progress responses\n if (this._prefillHandledSurveys.has(survey.id)) {\n return\n }\n\n try {\n const { params } = extractPrefillParamsFromUrl(window.location.search)\n\n if (Object.keys(params).length === 0) {\n return\n }\n\n logger.info('[Survey Prefill] Detected URL prefill parameters')\n\n const responses = convertPrefillToResponses(survey, params)\n\n if (Object.keys(responses).length === 0) {\n logger.warn('[Survey Prefill] No valid responses after conversion')\n return\n }\n\n const submissionId = uuidv7()\n\n // calculate which question to start at based on prefilled questions\n const prefilledIndices = Object.keys(params).map((k) => parseInt(k, 10))\n const { startQuestionIndex, skippedResponses } = calculatePrefillStartIndex(\n survey,\n prefilledIndices,\n responses\n )\n const isSurveyCompleted = startQuestionIndex >= survey.questions.length\n\n setInProgressSurveyState(survey, {\n surveySubmissionId: submissionId,\n responses: responses,\n lastQuestionIndex: isSurveyCompleted ? survey.questions.length - 1 : startQuestionIndex,\n })\n\n logger.info('[Survey Prefill] Stored prefilled responses in localStorage')\n\n /**\n * auto-submit some survey events on pageload only if:\n * 1) survey is complete, OR\n * 2) partial responses are enabled AND the skipped questions were set to auto-submit\n */\n const shouldAutoSubmitPrefilled =\n Object.keys(skippedResponses).length > 0 && survey.enable_partial_responses\n if (shouldAutoSubmitPrefilled || isSurveyCompleted) {\n sendSurveyEvent({\n responses: isSurveyCompleted ? responses : skippedResponses,\n survey,\n surveySubmissionId: submissionId,\n posthog: this._posthog,\n isSurveyCompleted,\n })\n }\n\n // Mark this survey as having been prefilled\n this._prefillHandledSurveys.add(survey.id)\n } catch (error) {\n logger.error('[Survey Prefill] Error handling URL prefill:', error)\n }\n }\n\n private _isSurveyFeatureFlagEnabled(flagKey: string | null, flagVariant: string | undefined = undefined) {\n if (!flagKey) {\n return true\n }\n const isFeatureEnabled = !!this._posthog.featureFlags.isFeatureEnabled(flagKey, {\n send_event: !flagKey.startsWith(SURVEY_TARGETING_FLAG_PREFIX),\n })\n let flagVariantCheck = true\n if (flagVariant) {\n const flagVariantValue = this._posthog.featureFlags.getFeatureFlag(flagKey, { send_event: false })\n flagVariantCheck = flagVariantValue === flagVariant || flagVariant === 'any'\n }\n return isFeatureEnabled && flagVariantCheck\n }\n\n private _isSurveyConditionMatched(survey: Survey): boolean {\n if (!survey.conditions) {\n return true\n }\n return doesSurveyUrlMatch(survey) && doesSurveyDeviceTypesMatch(survey) && doesSurveyMatchSelector(survey)\n }\n\n private _internalFlagCheckSatisfied(survey: Survey): boolean {\n return (\n canActivateRepeatedly(survey) ||\n this._isSurveyFeatureFlagEnabled(survey.internal_targeting_flag_key) ||\n isSurveyInProgress(survey)\n )\n }\n\n public checkSurveyEligibility(survey: Survey): { eligible: boolean; reason?: string } {\n const eligibility = { eligible: true, reason: undefined as string | undefined }\n\n if (!isSurveyRunning(survey)) {\n eligibility.eligible = false\n eligibility.reason = `Survey is not running. It was completed on ${survey.end_date}`\n return eligibility\n }\n\n if (!IN_APP_SURVEY_TYPES.includes(survey.type)) {\n eligibility.eligible = false\n eligibility.reason = `Surveys of type ${survey.type} are never eligible to be shown in the app`\n return eligibility\n }\n\n const linkedFlagVariant = survey.conditions?.linkedFlagVariant\n if (!this._isSurveyFeatureFlagEnabled(survey.linked_flag_key, linkedFlagVariant)) {\n eligibility.eligible = false\n if (!linkedFlagVariant) {\n eligibility.reason = `Survey linked feature flag is not enabled`\n } else {\n eligibility.reason = `Survey linked feature flag is not enabled for variant ${linkedFlagVariant}`\n }\n return eligibility\n }\n\n if (!this._isSurveyFeatureFlagEnabled(survey.targeting_flag_key)) {\n eligibility.eligible = false\n eligibility.reason = `Survey targeting feature flag is not enabled`\n return eligibility\n }\n\n if (!this._internalFlagCheckSatisfied(survey)) {\n eligibility.eligible = false\n eligibility.reason =\n 'Survey internal targeting flag is not enabled and survey cannot activate repeatedly and survey is not in progress'\n return eligibility\n }\n\n if (!hasWaitPeriodPassed(survey.conditions?.seenSurveyWaitPeriodInDays)) {\n eligibility.eligible = false\n eligibility.reason = `Survey wait period has not passed`\n return eligibility\n }\n\n if (getSurveySeen(survey)) {\n eligibility.eligible = false\n eligibility.reason = `Survey has already been seen and it can't be activated again`\n return eligibility\n }\n\n return eligibility\n }\n\n /**\n * Surveys can be activated by events or actions. This method checks if the survey has events and actions,\n * and if so, it checks if the survey has been activated.\n * @param survey\n */\n private _hasActionOrEventTriggeredSurvey(survey: Survey): boolean {\n if (!doesSurveyActivateByEvent(survey) && !doesSurveyActivateByAction(survey)) {\n // If survey doesn't depend on events/actions, it's considered \"triggered\" by default\n return true\n }\n const surveysActivatedByEventsOrActions: string[] | undefined =\n this._posthog.surveys._surveyEventReceiver?.getSurveys()\n return !!surveysActivatedByEventsOrActions?.includes(survey.id)\n }\n\n private _checkFlags(survey: Survey): boolean {\n if (!survey.feature_flag_keys?.length) {\n return true\n }\n\n return survey.feature_flag_keys.every(({ key, value }) => {\n if (!key || !value) {\n return true\n }\n return this._isSurveyFeatureFlagEnabled(value)\n })\n }\n\n public getActiveMatchingSurveys = (callback: SurveyCallback, forceReload = false): void => {\n this._posthog?.surveys.getSurveys((surveys) => {\n const targetingMatchedSurveys = surveys.filter((survey) => {\n const eligibility = this.checkSurveyEligibility(survey)\n return (\n eligibility.eligible &&\n this._isSurveyConditionMatched(survey) &&\n this._hasActionOrEventTriggeredSurvey(survey) &&\n this._checkFlags(survey)\n )\n })\n\n callback(targetingMatchedSurveys)\n }, forceReload)\n }\n\n public callSurveysAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getActiveMatchingSurveys((surveys) => {\n const inAppSurveysWithDisplayLogic = surveys.filter(\n (survey) => survey.type === SurveyType.Popover || survey.type === SurveyType.Widget\n )\n\n // Create a queue of surveys sorted by their appearance delay. We will evaluate the display logic\n // for each survey in the queue in order, and only display one survey at a time.\n const inAppSurveysQueue = this._sortSurveysByAppearanceDelay(inAppSurveysWithDisplayLogic)\n\n // Keep track of surveys processed this cycle to remove listeners for inactive ones\n const activeSelectorSurveys = new Set<string>()\n\n inAppSurveysQueue.forEach((survey) => {\n // Widget Type Logic\n if (survey.type === SurveyType.Widget) {\n if (survey.appearance?.widgetType === SurveyWidgetType.Tab) {\n this._handleWidget(survey)\n return\n }\n\n // For selector widget types, we need to manage the listener attachment/detachment dynamically\n if (\n survey.appearance?.widgetType === SurveyWidgetType.Selector &&\n survey.appearance?.widgetSelector\n ) {\n activeSelectorSurveys.add(survey.id)\n this._manageWidgetSelectorListener(survey, survey.appearance?.widgetSelector)\n }\n }\n\n // Popover Type Logic (only one shown at a time)\n if (isNull(this._surveyInFocus) && survey.type === SurveyType.Popover) {\n this.handlePopoverSurvey(survey)\n }\n })\n\n // Clean up listeners for surveys that are no longer active or matched\n this._widgetSelectorListeners.forEach(({ survey }) => {\n if (!activeSelectorSurveys.has(survey.id)) {\n this._removeWidgetSelectorListener(survey)\n }\n })\n }, forceReload)\n }\n\n private _addSurveyToFocus = (survey: Pick<Survey, 'id'>): void => {\n if (!isNull(this._surveyInFocus)) {\n logger.error(`Survey ${this._surveyInFocus} already in focus. Cannot add survey ${survey.id}.`)\n }\n this._surveyInFocus = survey.id\n }\n\n private _removeSurveyFromDom(survey: Pick<Survey, 'id' | 'type' | 'appearance'>): void {\n try {\n const shadowContainer = document.querySelector(getSurveyContainerClass(survey, true))\n if (shadowContainer?.shadowRoot) {\n render(null, shadowContainer.shadowRoot)\n }\n shadowContainer?.remove()\n } catch (error) {\n logger.warn(`Failed to remove survey ${survey.id} from DOM:`, error)\n }\n }\n\n private _removeSurveyFromFocus = (survey: SurveyWithTypeAndAppearance): void => {\n if (this._surveyInFocus !== survey.id) {\n logger.error(`Survey ${survey.id} is not in focus. Cannot remove survey ${survey.id}.`)\n }\n this._clearSurveyTimeout(survey.id)\n this._surveyInFocus = null\n this._removeSurveyFromDom(survey)\n }\n\n // Expose internal state and methods for testing\n public getTestAPI() {\n return {\n addSurveyToFocus: this._addSurveyToFocus,\n removeSurveyFromFocus: this._removeSurveyFromFocus,\n surveyInFocus: this._surveyInFocus,\n surveyTimeouts: this._surveyTimeouts,\n handleWidget: this._handleWidget,\n handlePopoverSurvey: this.handlePopoverSurvey,\n manageWidgetSelectorListener: this._manageWidgetSelectorListener,\n sortSurveysByAppearanceDelay: this._sortSurveysByAppearanceDelay,\n checkFlags: this._checkFlags.bind(this),\n isSurveyFeatureFlagEnabled: this._isSurveyFeatureFlagEnabled.bind(this),\n }\n }\n}\n\nconst DEFAULT_PREVIEW_POSITION_STYLES: JSX.CSSProperties = {\n position: 'relative',\n left: 'unset',\n right: 'unset',\n top: 'unset',\n bottom: 'unset',\n transform: 'unset',\n}\n\nexport const renderSurveysPreview = ({\n survey,\n parentElement,\n previewPageIndex,\n forceDisableHtml,\n onPreviewSubmit,\n positionStyles = DEFAULT_PREVIEW_POSITION_STYLES,\n}: {\n survey: Survey\n parentElement: HTMLElement\n previewPageIndex: number\n forceDisableHtml?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n posthog?: PostHog\n positionStyles?: JSX.CSSProperties\n}) => {\n const currentStyle = parentElement.querySelector('style[data-ph-survey-style]')\n if (currentStyle) {\n currentStyle.remove()\n }\n const stylesheet = getSurveyStylesheet()\n if (stylesheet) {\n parentElement.appendChild(stylesheet)\n addSurveyCSSVariablesToElement(parentElement, survey.type, survey.appearance)\n }\n render(\n <SurveyPopup\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={positionStyles}\n onPreviewSubmit={onPreviewSubmit}\n previewPageIndex={previewPageIndex}\n removeSurveyFromFocus={() => {}}\n />,\n parentElement\n )\n}\n\nexport const renderFeedbackWidgetPreview = ({\n survey,\n root,\n forceDisableHtml,\n}: {\n survey: Survey\n root: HTMLElement\n forceDisableHtml?: boolean\n}) => {\n const stylesheet = getSurveyStylesheet()\n if (stylesheet) {\n root.appendChild(stylesheet)\n addSurveyCSSVariablesToElement(root, survey.type, survey.appearance)\n }\n\n render(<FeedbackWidget forceDisableHtml={forceDisableHtml} survey={survey} readOnly={true} />, root)\n}\n\n// This is the main exported function\nexport function generateSurveys(posthog: PostHog, isSurveysEnabled: boolean | undefined) {\n // NOTE: Important to ensure we never try and run surveys without a window environment\n if (!document || !window) {\n return\n }\n\n const surveyManager = new SurveyManager(posthog)\n if (posthog.config.disable_surveys_automatic_display) {\n logger.info('Surveys automatic display is disabled. Skipping call surveys and evaluate display logic.')\n return surveyManager\n }\n\n // NOTE: The `generateSurveys` function used to accept just a single parameter, without any `isSurveysEnabled` parameter.\n // To keep compatibility with old clients, we'll consider `undefined` the same as `true`\n if (isSurveysEnabled === false) {\n logger.info('There are no surveys to load or Surveys is disabled in the project settings.')\n return surveyManager\n }\n\n surveyManager.callSurveysAndEvaluateDisplayLogic(true)\n\n let intervalId: number | undefined\n\n const startInterval = () => {\n if (!isUndefined(intervalId)) {\n return\n }\n intervalId = setInterval(() => {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n }, 1000) as unknown as number\n }\n\n const stopInterval = () => {\n if (!isUndefined(intervalId)) {\n clearInterval(intervalId)\n intervalId = undefined\n }\n }\n\n startInterval()\n\n addEventListener(document, 'visibilitychange', () => {\n if (document.hidden) {\n stopInterval()\n } else {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n startInterval()\n }\n })\n\n return surveyManager\n}\n\ntype UseHideSurveyOnURLChangeProps = {\n survey: Pick<Survey, 'id' | 'conditions' | 'type' | 'appearance'>\n removeSurveyFromFocus?: (survey: SurveyWithTypeAndAppearance) => void\n setSurveyVisible: (visible: boolean) => void\n isPreviewMode?: boolean\n}\n\n/**\n * This hook handles URL-based survey visibility after the initial mount.\n * The initial URL check is handled by the `getActiveMatchingSurveys` method in the `PostHogSurveys` class,\n * which ensures the URL matches before displaying a survey for the first time.\n * That is the method that is called every second to see if there's a matching survey.\n *\n * This separation of concerns means:\n * 1. Initial URL matching is done by `getActiveMatchingSurveys` before displaying the survey\n * 2. Subsequent URL changes are handled here to hide the survey as the user navigates\n */\nexport function useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus = () => {},\n setSurveyVisible,\n isPreviewMode = false,\n}: UseHideSurveyOnURLChangeProps) {\n useEffect(() => {\n if (isPreviewMode || !survey.conditions?.url) {\n return\n }\n\n const checkUrlMatch = () => {\n const isSurveyTypeWidget = survey.type === SurveyType.Widget\n const doesSurveyMatchUrlCondition = doesSurveyUrlMatch(survey)\n const isSurveyWidgetTypeTab = survey.appearance?.widgetType === SurveyWidgetType.Tab && isSurveyTypeWidget\n\n if (doesSurveyMatchUrlCondition) {\n if (isSurveyWidgetTypeTab) {\n logger.info(`Showing survey ${survey.id} because it is a feedback button tab and URL matches`)\n setSurveyVisible(true)\n }\n return\n }\n\n logger.info(`Hiding survey ${survey.id} because URL does not match`)\n setSurveyVisible(false)\n return removeSurveyFromFocus(survey)\n }\n\n // Listen for browser back/forward browser history changes\n addEventListener(window, 'popstate', checkUrlMatch)\n // Listen for hash changes, for SPA frameworks that use hash-based routing\n // The hashchange event is fired when the fragment identifier of the URL has changed (the part of the URL beginning with and following the # symbol).\n addEventListener(window, 'hashchange', checkUrlMatch)\n\n // Listen for SPA navigation\n const originalPushState = window.history.pushState\n const originalReplaceState = window.history.replaceState\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args)\n checkUrlMatch()\n }\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args)\n checkUrlMatch()\n }\n\n return () => {\n window.removeEventListener('popstate', checkUrlMatch)\n window.removeEventListener('hashchange', checkUrlMatch)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [isPreviewMode, survey, removeSurveyFromFocus, setSurveyVisible])\n}\n\nexport function usePopupVisibility(\n survey: Survey,\n posthog: PostHog | undefined,\n millisecondDelay: number,\n isPreviewMode: boolean,\n removeSurveyFromFocus: (survey: SurveyWithTypeAndAppearance) => void,\n isPopup: boolean,\n surveyContainerRef?: RefObject<HTMLDivElement>\n) {\n const [isPopupVisible, setIsPopupVisible] = useState(\n isPreviewMode || millisecondDelay === 0 || survey.type === SurveyType.ExternalSurvey\n )\n const [isSurveySent, setIsSurveySent] = useState(false)\n\n const hidePopupWithViewTransition = () => {\n const removeDOMAndHidePopup = () => {\n if (isPopup) {\n removeSurveyFromFocus(survey)\n }\n setIsPopupVisible(false)\n }\n\n if (!document.startViewTransition) {\n removeDOMAndHidePopup()\n return\n }\n\n const transition = document.startViewTransition(() => {\n surveyContainerRef?.current?.remove()\n })\n\n transition.finished.then(() => {\n setTimeout(() => {\n removeDOMAndHidePopup()\n }, 100)\n })\n }\n\n const handleSurveyClosed = (event: CustomEvent) => {\n if (event.detail.surveyId !== survey.id) {\n return\n }\n hidePopupWithViewTransition()\n }\n\n useEffect(() => {\n if (!posthog) {\n logger.error('usePopupVisibility hook called without a PostHog instance.')\n return\n }\n if (isPreviewMode) {\n return\n }\n\n const handleSurveySent = (event: CustomEvent) => {\n if (event.detail.surveyId !== survey.id) {\n return\n }\n if (!survey.appearance?.displayThankYouMessage) {\n return hidePopupWithViewTransition()\n }\n setIsSurveySent(true)\n if (survey.appearance?.autoDisappear) {\n setTimeout(() => {\n hidePopupWithViewTransition()\n }, 5000)\n }\n }\n\n const showSurvey = () => {\n // check if the url is still matching, necessary for delayed surveys, as the URL may have changed\n if (!doesSurveyUrlMatch(survey)) {\n return\n }\n setIsPopupVisible(true)\n window.dispatchEvent(new Event('PHSurveyShown'))\n posthog.capture(SurveyEventName.SHOWN, {\n [SurveyEventProperties.SURVEY_NAME]: survey.name,\n [SurveyEventProperties.SURVEY_ID]: survey.id,\n [SurveyEventProperties.SURVEY_ITERATION]: survey.current_iteration,\n [SurveyEventProperties.SURVEY_ITERATION_START_DATE]: survey.current_iteration_start_date,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n })\n localStorage.setItem('lastSeenSurveyDate', new Date().toISOString())\n }\n\n addEventListener(window, 'PHSurveyClosed', handleSurveyClosed as EventListener)\n addEventListener(window, 'PHSurveySent', handleSurveySent as EventListener)\n\n if (millisecondDelay > 0) {\n // This path is only used for direct usage of SurveyPopup,\n // not for surveys managed by SurveyManager\n const timeoutId = setTimeout(showSurvey, millisecondDelay)\n return () => {\n clearTimeout(timeoutId)\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed as EventListener)\n window.removeEventListener('PHSurveySent', handleSurveySent as EventListener)\n }\n } else {\n // This is the path used for surveys managed by SurveyManager\n showSurvey()\n return () => {\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed as EventListener)\n window.removeEventListener('PHSurveySent', handleSurveySent as EventListener)\n }\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsPopupVisible,\n isPreviewMode,\n })\n\n return { isPopupVisible, isSurveySent, setIsPopupVisible, hidePopupWithViewTransition }\n}\n\ninterface SurveyPopupProps {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n style?: JSX.CSSProperties\n previewPageIndex?: number | undefined\n removeSurveyFromFocus?: (survey: SurveyWithTypeAndAppearance) => void\n isPopup?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n onPopupSurveyDismissed?: () => void\n onCloseConfirmationMessage?: () => void\n}\n\nfunction getPopoverPosition(\n type: SurveyType,\n position: SurveyPosition = SurveyPosition.Right,\n surveyWidgetType?: SurveyWidgetType\n) {\n if (type === SurveyType.ExternalSurvey) {\n return {}\n }\n\n switch (position) {\n case SurveyPosition.TopLeft:\n return { top: '0', left: '0', transform: 'translate(30px, 30px)' }\n case SurveyPosition.TopRight:\n return { top: '0', right: '0', transform: 'translate(-30px, 30px)' }\n case SurveyPosition.TopCenter:\n return { top: '0', left: '50%', transform: 'translate(-50%, 30px)' }\n case SurveyPosition.MiddleLeft:\n return { top: '50%', left: '0', transform: 'translate(30px, -50%)' }\n case SurveyPosition.MiddleRight:\n return { top: '50%', right: '0', transform: 'translate(-30px, -50%)' }\n case SurveyPosition.MiddleCenter:\n return { top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n case SurveyPosition.Left:\n return { left: '30px' }\n case SurveyPosition.Center:\n return {\n left: '50%',\n transform: 'translateX(-50%)',\n }\n default:\n case SurveyPosition.Right:\n return { right: type === SurveyType.Widget && surveyWidgetType === SurveyWidgetType.Tab ? '60px' : '30px' }\n }\n}\n\nfunction getTabPositionStyles(position: SurveyTabPosition = SurveyTabPosition.Right): JSX.CSSProperties {\n switch (position) {\n case SurveyTabPosition.Top:\n return { top: '0', left: '50%', transform: 'translateX(-50%)' }\n case SurveyTabPosition.Left:\n return { top: '50%', left: '0', transform: 'rotate(90deg) translateY(-100%)', transformOrigin: 'left top' }\n case SurveyTabPosition.Bottom: // bottom center\n return { bottom: '0', left: '50%', transform: 'translateX(-50%)' }\n default:\n case SurveyTabPosition.Right:\n // not perfectly centered vertically, to avoid a \"breaking\" change\n return {\n top: '50%',\n right: '0',\n transform: 'rotate(-90deg) translateY(-100%)',\n transformOrigin: 'right top',\n }\n }\n}\n\nexport function SurveyPopup({\n survey,\n forceDisableHtml,\n posthog,\n style = {},\n previewPageIndex,\n removeSurveyFromFocus = () => {},\n isPopup = true,\n onPreviewSubmit = () => {},\n onPopupSurveyDismissed = () => {},\n onCloseConfirmationMessage = () => {},\n}: SurveyPopupProps) {\n const surveyContainerRef = useRef<HTMLDivElement>(null)\n const isPreviewMode = Number.isInteger(previewPageIndex)\n // NB: The client-side code passes the millisecondDelay in seconds, but setTimeout expects milliseconds, so we multiply by 1000\n const surveyPopupDelayMilliseconds = survey.appearance?.surveyPopupDelaySeconds\n ? survey.appearance.surveyPopupDelaySeconds * 1000\n : 0\n const { isPopupVisible, isSurveySent, hidePopupWithViewTransition } = usePopupVisibility(\n survey,\n posthog,\n surveyPopupDelayMilliseconds,\n isPreviewMode,\n removeSurveyFromFocus,\n isPopup,\n surveyContainerRef\n )\n\n const shouldShowConfirmation = isSurveySent || previewPageIndex === survey.questions.length\n const surveyContextValue = useMemo(() => {\n const getInProgressSurvey = getInProgressSurveyState(survey)\n return {\n isPreviewMode,\n previewPageIndex: previewPageIndex,\n onPopupSurveyDismissed: () => {\n dismissedSurveyEvent(survey, posthog, isPreviewMode)\n onPopupSurveyDismissed()\n },\n isPopup: isPopup || false,\n surveySubmissionId: getInProgressSurvey?.surveySubmissionId || uuidv7(),\n onPreviewSubmit,\n posthog,\n }\n }, [isPreviewMode, previewPageIndex, isPopup, posthog, survey, onPopupSurveyDismissed, onPreviewSubmit])\n\n if (!isPopupVisible) {\n return null\n }\n\n return (\n <SurveyContext.Provider value={surveyContextValue}>\n <div\n className=\"ph-survey\"\n style={{\n ...getPopoverPosition(survey.type, survey.appearance?.position, survey.appearance?.widgetType),\n ...style,\n }}\n ref={surveyContainerRef}\n >\n {!shouldShowConfirmation ? (\n <Questions survey={survey} forceDisableHtml={!!forceDisableHtml} posthog={posthog} />\n ) : (\n <ConfirmationMessage\n header={survey.appearance?.thankYouMessageHeader || 'Thank you!'}\n description={survey.appearance?.thankYouMessageDescription || ''}\n forceDisableHtml={!!forceDisableHtml}\n contentType={survey.appearance?.thankYouMessageDescriptionContentType}\n appearance={survey.appearance || defaultSurveyAppearance}\n onClose={() => {\n hidePopupWithViewTransition()\n onCloseConfirmationMessage()\n }}\n />\n )}\n </div>\n </SurveyContext.Provider>\n )\n}\n\nexport function Questions({\n survey,\n forceDisableHtml,\n posthog,\n}: {\n survey: Survey\n forceDisableHtml: boolean\n posthog?: PostHog\n}) {\n // Initialize responses from localStorage or empty object\n const [questionsResponses, setQuestionsResponses] = useState(() => {\n const inProgressSurveyData = getInProgressSurveyState(survey)\n if (inProgressSurveyData?.responses) {\n logger.info('Survey is already in progress, filling in initial responses')\n }\n return inProgressSurveyData?.responses || {}\n })\n const { previewPageIndex, onPopupSurveyDismissed, isPopup, onPreviewSubmit, surveySubmissionId, isPreviewMode } =\n useContext(SurveyContext)\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(() => {\n const inProgressSurveyData = getInProgressSurveyState(survey)\n return previewPageIndex || inProgressSurveyData?.lastQuestionIndex || 0\n })\n const surveyQuestions = useMemo(() => getDisplayOrderQuestions(survey), [survey])\n\n // Sync preview state\n useEffect(() => {\n if (isPreviewMode && !isUndefined(previewPageIndex)) {\n setCurrentQuestionIndex(previewPageIndex)\n }\n }, [previewPageIndex, isPreviewMode])\n\n const onNextButtonClick = ({\n res,\n displayQuestionIndex,\n questionId,\n }: {\n res: string | string[] | number | null\n displayQuestionIndex: number\n questionId?: string\n }) => {\n if (!posthog) {\n logger.error('onNextButtonClick called without a PostHog instance.')\n return\n }\n\n if (!questionId) {\n logger.error('onNextButtonClick called without a questionId.')\n return\n }\n\n const responseKey = getSurveyResponseKey(questionId)\n\n const newResponses = { ...questionsResponses, [responseKey]: res }\n setQuestionsResponses(newResponses)\n\n const nextStep = getNextSurveyStep(survey, displayQuestionIndex, res)\n const isSurveyCompleted = nextStep === SurveyQuestionBranchingType.End\n\n if (!isSurveyCompleted) {\n setCurrentQuestionIndex(nextStep)\n setInProgressSurveyState(survey, {\n surveySubmissionId: surveySubmissionId,\n responses: newResponses,\n lastQuestionIndex: nextStep,\n })\n }\n\n // If partial responses are enabled, send the survey sent event with with the responses,\n // otherwise only send the event when the survey is completed\n if (survey.enable_partial_responses || isSurveyCompleted) {\n sendSurveyEvent({\n responses: newResponses,\n survey,\n surveySubmissionId,\n isSurveyCompleted,\n posthog,\n })\n }\n }\n\n const currentQuestion = surveyQuestions.at(currentQuestionIndex)\n\n if (!currentQuestion) {\n return null\n }\n\n const renderCancelButton = isPopup && survey.appearance?.hideCancelButton !== true\n\n return (\n <form className=\"survey-form\" name=\"surveyForm\">\n {renderCancelButton && (\n <Cancel\n onClick={() => {\n onPopupSurveyDismissed()\n }}\n />\n )}\n <div className=\"survey-box\">\n {getQuestionComponent({\n question: currentQuestion,\n forceDisableHtml,\n displayQuestionIndex: currentQuestionIndex,\n appearance: survey.appearance || defaultSurveyAppearance,\n onSubmit: (res) =>\n onNextButtonClick({\n res,\n displayQuestionIndex: currentQuestionIndex,\n questionId: currentQuestion.id,\n }),\n onPreviewSubmit,\n initialValue: currentQuestion.id\n ? questionsResponses[getSurveyResponseKey(currentQuestion.id)]\n : undefined,\n })}\n </div>\n </form>\n )\n}\n\nexport function FeedbackWidget({\n survey,\n forceDisableHtml,\n posthog,\n readOnly,\n}: {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n readOnly?: boolean\n}): JSX.Element | null {\n const [isFeedbackButtonVisible, setIsFeedbackButtonVisible] = useState(true)\n const [showSurvey, setShowSurvey] = useState(false)\n const [styleOverrides, setStyleOverrides] = useState<JSX.CSSProperties>({})\n\n const toggleSurvey = () => {\n setShowSurvey(!showSurvey)\n }\n\n useEffect(() => {\n if (!posthog) {\n logger.error('FeedbackWidget called without a PostHog instance.')\n return\n }\n if (readOnly) {\n return\n }\n\n if (survey.appearance?.widgetType === 'tab') {\n setStyleOverrides({\n top: '50%',\n bottom: 'auto',\n })\n }\n const handleShowSurvey = (event: Event) => {\n const customEvent = event as CustomEvent\n // Check if the event is for this specific survey instance\n if (customEvent.detail?.surveyId === survey.id) {\n logger.info(`Received show event for feedback button survey ${survey.id}`)\n setStyleOverrides(customEvent.detail.position || {})\n toggleSurvey()\n }\n }\n\n addEventListener(window, DISPATCH_FEEDBACK_WIDGET_EVENT, handleShowSurvey)\n\n // Cleanup listener on component unmount\n return () => {\n window.removeEventListener(DISPATCH_FEEDBACK_WIDGET_EVENT, handleShowSurvey)\n }\n }, [\n posthog,\n readOnly,\n survey.id,\n survey.appearance?.widgetType,\n survey.appearance?.widgetSelector,\n survey.appearance?.borderColor,\n ])\n\n useHideSurveyOnURLChange({\n survey,\n setSurveyVisible: setIsFeedbackButtonVisible,\n })\n\n if (!isFeedbackButtonVisible) {\n return null\n }\n\n const resetShowSurvey = () => {\n // hide the feedback button after answering or closing the survey if it's not always show\n if (survey.schedule !== SurveySchedule.Always) {\n setIsFeedbackButtonVisible(false)\n }\n // important so our view transition has time to run\n setTimeout(() => {\n setShowSurvey(false)\n }, 200)\n }\n\n return (\n <Fragment>\n {survey.appearance?.widgetType === 'tab' && (\n <button\n className={`ph-survey-widget-tab ${survey.appearance?.tabPosition === SurveyTabPosition.Top ? 'widget-tab-top' : ''}`}\n onClick={toggleSurvey}\n disabled={readOnly}\n style={getTabPositionStyles(survey.appearance?.tabPosition)}\n >\n {survey.appearance?.widgetLabel || ''}\n </button>\n )}\n {showSurvey && (\n <SurveyPopup\n posthog={posthog}\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={styleOverrides}\n onPopupSurveyDismissed={resetShowSurvey}\n onCloseConfirmationMessage={resetShowSurvey}\n />\n )}\n </Fragment>\n )\n}\n\ninterface GetQuestionComponentProps extends CommonQuestionProps {\n question: SurveyQuestion\n displayQuestionIndex: number\n}\n\nconst getQuestionComponent = ({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n initialValue,\n}: GetQuestionComponentProps): JSX.Element | null => {\n const baseProps = {\n forceDisableHtml,\n appearance,\n onPreviewSubmit: (res: string | string[] | number | null) => {\n onPreviewSubmit(res)\n },\n onSubmit: (res: string | string[] | number | null) => {\n onSubmit(res)\n },\n initialValue,\n displayQuestionIndex,\n }\n\n switch (question.type) {\n case SurveyQuestionType.Open:\n return <OpenTextQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.Link:\n return <LinkQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.Rating:\n return <RatingQuestion {...baseProps} question={question} key={question.id} />\n case SurveyQuestionType.SingleChoice:\n case SurveyQuestionType.MultipleChoice:\n return <MultipleChoiceQuestion {...baseProps} question={question} key={question.id} />\n default:\n logger.error(`Unsupported question type: ${(question as any).type}`)\n return null\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n // Conversations keys (defined in lazy-loaded extension)\n '$conversations_widget_session_id',\n '$conversations_ticket_id',\n '$conversations_widget_state',\n '$conversations_user_traits',\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n","import { Survey, SurveyQuestion, SurveyQuestionBranchingType, SurveyQuestionType } from '../posthog-surveys-types'\nimport { getSurveyResponseKey } from '../extensions/surveys/surveys-extension-utils'\nimport { logger } from './logger'\nimport { isUndefined } from '@posthog/core'\nimport { getNextSurveyStep } from './survey-branching'\n\n/**\n * Extracted URL prefill parameters by question index\n */\nexport interface PrefillParams {\n [questionIndex: number]: string[]\n}\n\n/**\n * Extract prefill parameters from URL search string\n * Format: ?q0=1&q1=8&q2=0&q2=2&auto_submit=true\n * NOTE: Manual parsing for IE11/op_mini compatibility (no URLSearchParams)\n */\nexport function extractPrefillParamsFromUrl(searchString: string): {\n params: PrefillParams\n autoSubmit: boolean\n} {\n const params: PrefillParams = {}\n let autoSubmit = false\n\n // Remove leading ? if present\n const cleanSearch = searchString.replace(/^\\?/, '')\n if (!cleanSearch) {\n return { params, autoSubmit }\n }\n\n // Split by & to get key-value pairs\n const pairs = cleanSearch.split('&')\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n if (!key || isUndefined(value)) {\n continue\n }\n\n const decodedKey = decodeURIComponent(key)\n const decodedValue = decodeURIComponent(value)\n\n // Check for auto_submit parameter\n if (decodedKey === 'auto_submit' && decodedValue === 'true') {\n autoSubmit = true\n continue\n }\n\n // Check for question parameters (q0, q1, etc.)\n const match = decodedKey.match(/^q(\\d+)$/)\n if (match) {\n const questionIndex = parseInt(match[1], 10)\n if (!params[questionIndex]) {\n params[questionIndex] = []\n }\n params[questionIndex].push(decodedValue)\n }\n }\n\n return { params, autoSubmit }\n}\n\n/**\n * Convert URL prefill values to SDK response format\n */\nexport function convertPrefillToResponses(survey: Survey, prefillParams: PrefillParams): Record<string, any> {\n const responses: Record<string, any> = {}\n\n survey.questions.forEach((question: SurveyQuestion, index: number) => {\n if (!prefillParams[index] || !question.id) {\n return\n }\n\n const values = prefillParams[index]\n const responseKey = getSurveyResponseKey(question.id)\n\n try {\n switch (question.type) {\n case SurveyQuestionType.SingleChoice: {\n if (!question.choices || question.choices.length === 0) {\n logger.warn(`[Survey Prefill] Question ${index} has no choices`)\n return\n }\n const choiceIndex = parseInt(values[0], 10)\n if (isNaN(choiceIndex) || choiceIndex < 0 || choiceIndex >= question.choices.length) {\n logger.warn(`[Survey Prefill] Invalid choice index for q${index}: ${values[0]}`)\n return\n }\n responses[responseKey] = question.choices[choiceIndex]\n break\n }\n\n case SurveyQuestionType.MultipleChoice: {\n if (!question.choices || question.choices.length === 0) {\n logger.warn(`[Survey Prefill] Question ${index} has no choices`)\n return\n }\n const choiceIndices = values\n .map((v) => parseInt(v, 10))\n .filter((i) => !isNaN(i) && i >= 0 && i < question.choices.length)\n\n if (choiceIndices.length === 0) {\n logger.warn(`[Survey Prefill] No valid choices for q${index}`)\n return\n }\n\n // Remove duplicates and map to choice values\n const uniqueChoices = [...new Set(choiceIndices.map((i) => question.choices[i]))]\n if (uniqueChoices.length < choiceIndices.length) {\n logger.warn(`[Survey Prefill] Removed duplicate choices for q${index}`)\n }\n responses[responseKey] = uniqueChoices\n break\n }\n\n case SurveyQuestionType.Rating: {\n const rating = parseInt(values[0], 10)\n const scale = question.scale || 10\n\n if (isNaN(rating) || rating < 0 || rating > scale) {\n logger.warn(`[Survey Prefill] Invalid rating for q${index}: ${values[0]} (scale: 0-${scale})`)\n return\n }\n responses[responseKey] = rating\n break\n }\n\n default:\n logger.info(`[Survey Prefill] Question type ${question.type} does not support prefill`)\n }\n } catch (error) {\n logger.error(`[Survey Prefill] Error converting q${index}:`, error)\n }\n })\n\n return responses\n}\n\n/**\n * Calculate which question index to start at based on prefilled questions.\n * Advances past consecutive prefilled questions (starting from index 0)\n * that have skipSubmitButton enabled, respecting any branching logic configured\n * on those questions.\n *\n * @param survey - The full survey object (needed for branching logic)\n * @param prefilledIndices - Array of question indices that have been prefilled\n * @param responses - Map of response keys to response values\n * @returns Object with startQuestionIndex and map of questions which have been skipped\n */\nexport function calculatePrefillStartIndex(\n survey: Survey,\n prefilledIndices: number[],\n responses: Record<string, any>\n): { startQuestionIndex: number; skippedResponses: Record<string, any> } {\n let currentIndex = 0\n const skippedResponses: Record<string, any> = {}\n\n const MAX_ITERATIONS = survey.questions.length + 1\n const iterations = 0\n while (currentIndex < survey.questions.length && iterations < MAX_ITERATIONS) {\n // Stop if current question is not prefilled\n if (!prefilledIndices.includes(currentIndex)) {\n break\n }\n\n const question = survey.questions[currentIndex]\n\n // Only advance if the prefilled question has skipSubmitButton\n if (!question || !('skipSubmitButton' in question) || !question.skipSubmitButton) {\n // Show question if skipSubmitButton is false, even if prefilled\n break\n }\n\n // Record the skipped response\n if (question.id) {\n const responseKey = getSurveyResponseKey(question.id)\n if (!isUndefined(responses[responseKey])) {\n skippedResponses[responseKey] = responses[responseKey]\n }\n }\n\n // Use branching logic to determine the next question\n const response = question.id ? responses[getSurveyResponseKey(question.id)] : null\n const nextStep = getNextSurveyStep(survey, currentIndex, response)\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n // Survey is complete - return questions.length to indicate completion\n return { startQuestionIndex: survey.questions.length, skippedResponses }\n }\n\n // Move to the next question (respecting branching)\n currentIndex = nextStep\n }\n\n return { startQuestionIndex: currentIndex, skippedResponses }\n}\n","import { generateSurveys } from '../extensions/surveys'\n\nimport { assignableWindow } from '../utils/globals'\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.generateSurveys = generateSurveys\n\n// this used to be directly on window, but we moved it to __PosthogExtensions__\n// it is still on window for backwards compatibility\nassignableWindow.extendPostHogWithSurveys = generateSurveys\n\nexport default generateSurveys\n"],"names":["c","s","a","t","r","u","i","o","f","e","n","__b","__r","v","diffed","l","__c","m","unmount","d","__h","__H","__","length","push","__V","h","B","__N","setState","filter","every","call","this","forEach","props","shouldComponentUpdate","componentWillUpdate","__e","p","__s","z","_","F","current","q","context","sub","value","b","shift","__P","k","w","__v","requestAnimationFrame","j","some","g","clearTimeout","cancelAnimationFrame","setTimeout","SurveyWidgetType","SurveyPosition","SurveyTabPosition","SurveyType","SurveyQuestionType","SurveyQuestionBranchingType","SurveySchedule","SurveyEventName","SurveyEventProperties","win","window","undefined","global","globalThis","self","File","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","nativeIsArray","Array","isArray","type_utils_toString","Object","prototype","toString","obj","isUndefined","x","isString","isNull","isNullish","isNumber","MOBILE","ANDROID","TABLET","ANDROID_TABLET","IPAD","APPLE_WATCH","APPLE","BLACKBERRY","NINTENDO","PLAYSTATION","XBOX","WINDOWS_PHONE","WINDOWS","NOKIA","OUYA","GENERIC","GENERIC_MOBILE","toLowerCase","GENERIC_TABLET","XBOX_REGEX","RegExp","PLAYSTATION_REGEX","NINTENDO_REGEX","BLACKBERRY_REGEX","detectDeviceType","user_agent","device","test","detectDevice","_createLogger","prefix","_temp","debugEnabled","logger","_log","level","POSTHOG_DEBUG","console","consoleLog","_len","arguments","args","_key","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_len5","_key5","uninitializedWarning","methodName","createLogger","additionalPrefix","options","addEventListener","element","event","callback","capture","passive","SURVEY_LOGGER","SURVEY_IN_PROGRESS_PREFIX","getSurveyInteractionProperty","survey","action","surveyProperty","id","current_iteration","getSurveyStorageKey","key","getSurveySeenKey","setSurveySeenOnLocalStorage","localStorage","getItem","setItem","IN_APP_SURVEY_TYPES","Popover","Widget","API","Math","trunc","ceil","floor","Number","isInteger","isFinite","DIGITS","UUID","constructor","bytes","TypeError","fromFieldsV7","unixTsMs","randA","randBHi","randBLo","RangeError","Uint8Array","pow","text","charAt","Error","clone","slice","equals","other","compareTo","diff","sign","V7Generator","_timestamp","_counter","_random","DefaultRandom","generate","generateOrAbort","valueAfterReset","ts","Date","now","_resetCounter","nextUint32","defaultGenerator","getRandomValues","buffer","UUIDV7_DENY_WEAK_RNG","random","crypto","_buffer","Uint32Array","_cursor","Infinity","uuidv7","uuidv7obj","sendBeacon","isMatchingRegex","pattern","str","_unused","isValidRegex","_unused2","propertyComparisons","exact","targets","values","target","is_not","regex","not_regex","icontains","map","includes","not_icontains","gt","numValue","parseFloat","isNaN","lt","_window","_document","getSurveyResponseKey","questionId","BLACK_TEXT_COLOR","defaultSurveyAppearance","fontFamily","backgroundColor","submitButtonColor","submitButtonTextColor","ratingButtonColor","ratingButtonActiveColor","borderColor","placeholder","whiteLabel","displayThankYouMessage","thankYouMessageHeader","position","Right","widgetType","Tab","widgetLabel","widgetColor","zIndex","disabledButtonOpacity","maxWidth","textSubtleColor","boxPadding","boxShadow","borderRadius","shuffleQuestions","surveyPopupDelaySeconds","outlineColor","inputBackground","inputTextColor","scrollbarThumbColor","scrollbarTrackColor","hex2rgb","startsWith","hexColor","replace","parseInt","getContrastingTextColor","color","rgb","nameColorToHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","colorMatch","match","sqrt","getSurveyStylesheet","posthog","stylesheet","prepareStylesheet","innerText","_posthog$config","createElement","config","prepare_external_dependency_stylesheet","setAttribute","retrieveSurveyShadow","widgetClassName","getSurveyContainerClass","existingDiv","querySelector","shadowRoot","shadow","isNewlyCreated","div","addSurveyCSSVariablesToElement","type","appearance","effectiveAppearance","_extends","hostStyle","style","surveyHasBottomBorder","Center","Left","setProperty","defaultFontStack","getFontFamily","textColor","userInputBg","inputBackgroundColor","inputBgColor","className","attachShadow","mode","existingStylesheet","removeChild","appendChild","getSurveyResponseValue","responses","response","sendSurveyEvent","_ref","surveySubmissionId","isSurveyCompleted","SENT","SURVEY_NAME","name","SURVEY_ID","SURVEY_ITERATION","SURVEY_ITERATION_START_DATE","current_iteration_start_date","SURVEY_QUESTIONS","questions","question","SURVEY_SUBMISSION_ID","SURVEY_COMPLETED","sessionRecordingUrl","get_session_replay_url","$set","dispatchEvent","CustomEvent","detail","surveyId","clearInProgressSurveyState","_surveyHasResponses","inProgressSurvey","resp","_buildSurveyEventProperties","SURVEY_PARTIALLY_COMPLETED","dismissedSurveyEvent","readOnly","getInProgressSurveyState","DISMISSED","sendSurveyAbandonedEvent","abandonedKey","getSurveyAbandonedKey","ABANDONED","transport","shuffle","array","sort","reverseIfUnshuffled","unshuffled","shuffled","val","index","reverse","getDisplayOrderQuestions","enable_partial_responses","canActivateRepeatedly","_survey$conditions3","conditions","events","repeatedActivation","_survey$conditions","_survey$conditions2","hasEvents","schedule","Always","isSurveyInProgress","SurveyContext","createContext","isPreviewMode","previewPageIndex","onPopupSurveyDismissed","isPopup","onPreviewSubmit","useSurveyContext","useContext","renderChildrenAsTextOrHtml","_ref2","component","children","renderAsHtml","cloneElement","dangerouslySetInnerHTML","__html","defaultMatchType","matchType","doesSurveyUrlMatch","_survey$conditions4","_window$location","_survey$conditions5","url","href","urlMatchType","getInProgressSurveyStateKey","setInProgressSurveyState","state","JSON","stringify","stateString","parse","removeItem","asSelector","satisfiedEmoji","_jsx","xmlns","height","viewBox","width","neutralEmoji","dissatisfiedEmoji","veryDissatisfiedEmoji","verySatisfiedEmoji","cancelSVG","_jsxs","fill","IconPosthogLogo","maskType","maskUnits","y","mask","transform","PostHogLogo","rel","BottomSection","submitDisabled","onSubmit","link","skipSubmitButton","disabled","onClick","open","QuestionHeader","forceDisableHtml","htmlFor","class","Open","description","descriptionContentType","Cancel","ConfirmationMessage","header","contentType","onClose","useEffect","handleKeyDown","preventDefault","removeEventListener","role","tabIndex","hideCancelButton","thankYouMessageCloseButtonText","isValidStringArray","item","OpenTextQuestion","displayQuestionIndex","initialValue","inputRef","useRef","setText","useState","_inputRef$current","focus","Fragment","ref","rows","onInput","currentTarget","stopPropagation","onKeyDown","buttonText","optional","LinkQuestion","RatingQuestion","_ref3","scale","starting","rating","setRating","handleSubmit","num","display","threeScaleEmojis","fiveScaleEmojis","emoji","idx","gridTemplateColumns","getScaleNumbers","number","RatingButton","active","setActiveNumber","lowerBoundLabel","upperBoundLabel","submitButtonText","_ref4","MultipleChoiceQuestion","_ref5","openChoiceInputRef","choices","useMemo","shuffleOptions","displayOrderChoices","openEndedChoice","hasOpenChoice","pop","shuffledOptions","getDisplayOrderChoices","selectedChoices","setSelectedChoices","initializeSelectedChoices","questionType","SingleChoice","openEndedState","setOpenEndedState","initializeOpenEndedState","isSelected","inputValue","openEndedValue","find","choice","isSingleChoiceQuestion","isMultipleChoiceQuestion","MultipleChoice","shouldSkipSubmit","handleChoiceChange","isOpenChoice","newOpenSelected","prev","_openChoiceInputRef$c","handleOpenEndedInputChange","newValue","handleOpenEndedKeyDown","isSubmitDisabled","trim","inputId","openInputId","isChecked","checked","onChange","fiveScaleNumbers","sevenScaleNumbers","tenScaleNumbers","getNextSurveyStep","currentQuestionIndex","_question$branching","nextQuestionIndex","branching","End","SpecificQuestion","ResponseBased","_question$branching2","selectedChoiceIndex","indexOf","responseValues","hasOwnProperty","nextStep","Rating","_question$branching3","ratingBucket","responseValue","getRatingBucketForResponseValue","DISPATCH_FEEDBACK_WIDGET_EVENT","WIDGET_LISTENER_ATTRIBUTE","SURVEY_NEXT_TO_TRIGGER_PARAMS","SurveyManager","_this","_surveyTimeouts","Map","_widgetSelectorListeners","_prefillHandledSurveys","Set","handlePageUnload","surveys","_posthog","get_property","handlePopoverSurvey","_survey$appearance","_clearSurveyTimeout","_addSurveyToFocus","delaySeconds","render","SurveyPopup","removeSurveyFromFocus","_removeSurveyFromFocus","timeoutId","delete","set","_handleWidget","FeedbackWidget","_removeWidgetSelectorListener","_removeSurveyFromDom","existing","get","listener","removeAttribute","_manageWidgetSelectorListener","selector","currentElement","existingListenerData","hasAttribute","_survey$appearance2","_survey$appearance3","positionStyles","NextToTrigger","surveyWidth","buttonRect","getBoundingClientRect","viewportHeight","innerHeight","viewportWidth","innerWidth","estimatedMinSurveyHeight","left","spacing","spaceBelow","bottom","spaceAbove","top","showAbove","right","getNextToTriggerPosition","renderPopover","renderSurvey","_this$_posthog$config","prefillFromUrl","_handleUrlPrefill","getActiveMatchingSurveys","forceReload","_this$_posthog","getSurveys","targetingMatchedSurveys","checkSurveyEligibility","eligible","_isSurveyConditionMatched","_hasActionOrEventTriggeredSurvey","_checkFlags","callSurveysAndEvaluateDisplayLogic","inAppSurveysWithDisplayLogic","inAppSurveysQueue","_sortSurveysByAppearanceDelay","activeSelectorSurveys","_survey$appearance4","_survey$appearance5","_survey$appearance6","_survey$appearance7","Selector","widgetSelector","add","_surveyInFocus","has","timeout","cancelSurvey","_a$appearance","_b$appearance","isSurveyInProgressA","isSurveyInProgressB","aIsAlways","bIsAlways","params","searchString","autoSubmit","cleanSearch","pairs","split","pair","decodedKey","decodeURIComponent","decodedValue","questionIndex","extractPrefillParamsFromUrl","search","keys","prefillParams","responseKey","choiceIndex","choiceIndices","uniqueChoices","convertPrefillToResponses","submissionId","prefilledIndices","startQuestionIndex","skippedResponses","currentIndex","MAX_ITERATIONS","calculatePrefillStartIndex","lastQuestionIndex","_isSurveyFeatureFlagEnabled","flagKey","flagVariant","isFeatureEnabled","featureFlags","send_event","flagVariantCheck","getFeatureFlag","_survey$conditions6","_survey$conditions7","_survey$conditions8","deviceTypes","deviceType","deviceTypesMatchType","doesSurveyDeviceTypesMatch","_survey$conditions9","doesSurveyMatchSelector","_internalFlagCheckSatisfied","internal_targeting_flag_key","eligibility","reason","start_date","end_date","isSurveyRunning","linkedFlagVariant","linked_flag_key","targeting_flag_key","waitPeriodInDays","lastSeenSurveyDate","today","abs","getTime","hasWaitPeriodPassed","seenSurveyWaitPeriodInDays","getSurveySeen","_this$_posthog$survey","doesSurveyActivateByEvent","actions","doesSurveyActivateByAction","surveysActivatedByEventsOrActions","_surveyEventReceiver","_survey$feature_flag_","feature_flag_keys","shadowContainer","remove","getTestAPI","addSurveyToFocus","surveyInFocus","surveyTimeouts","handleWidget","manageWidgetSelectorListener","sortSurveysByAppearanceDelay","checkFlags","bind","isSurveyFeatureFlagEnabled","generateSurveys","isSurveysEnabled","intervalId","surveyManager","disable_surveys_automatic_display","startInterval","setInterval","hidden","clearInterval","useHideSurveyOnURLChange","setSurveyVisible","checkUrlMatch","_survey$appearance8","isSurveyTypeWidget","doesSurveyMatchUrlCondition","isSurveyWidgetTypeTab","originalPushState","history","pushState","originalReplaceState","replaceState","apply","getPopoverPosition","surveyWidgetType","ExternalSurvey","TopLeft","TopRight","TopCenter","MiddleLeft","MiddleRight","MiddleCenter","getTabPositionStyles","Top","transformOrigin","Bottom","_ref6","_survey$appearance1","_survey$appearance10","_survey$appearance11","_survey$appearance12","_survey$appearance13","_survey$appearance14","onCloseConfirmationMessage","surveyContainerRef","surveyPopupDelayMilliseconds","isPopupVisible","isSurveySent","hidePopupWithViewTransition","millisecondDelay","setIsPopupVisible","setIsSurveySent","removeDOMAndHidePopup","startViewTransition","_surveyContainerRef$c","finished","then","handleSurveyClosed","handleSurveySent","_survey$appearance9","_survey$appearance0","autoDisappear","showSurvey","Event","SHOWN","toISOString","usePopupVisibility","shouldShowConfirmation","surveyContextValue","getInProgressSurvey","Provider","thankYouMessageDescription","thankYouMessageDescriptionContentType","Questions","_ref7","_survey$appearance15","questionsResponses","setQuestionsResponses","inProgressSurveyData","setCurrentQuestionIndex","surveyQuestions","currentQuestion","at","getQuestionComponent","res","_ref8","newResponses","onNextButtonClick","_ref9","_survey$appearance17","_survey$appearance18","_survey$appearance19","_survey$appearance20","_survey$appearance21","_survey$appearance22","_survey$appearance23","isFeedbackButtonVisible","setIsFeedbackButtonVisible","setShowSurvey","styleOverrides","setStyleOverrides","toggleSurvey","_survey$appearance16","handleShowSurvey","_customEvent$detail","customEvent","resetShowSurvey","tabPosition","_ref0","baseProps","_createElement","Link","__PosthogExtensions__","extendPostHogWithSurveys"],"mappings":"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","x_google_ignoreList":[0,1]}
|