@kryptonhq/analytics 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
- "use strict";var KryptonAnalytics=(()=>{var Z=Object.defineProperty;var ke=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var be=Object.prototype.hasOwnProperty;var Ce=(e,t)=>{for(var r in t)Z(e,r,{get:t[r],enumerable:!0})},xe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Se(t))!be.call(e,i)&&i!==r&&Z(e,i,{get:()=>t[i],enumerable:!(n=ke(t,i))||n.enumerable});return e};var Ie=e=>xe(Z({},"__esModule",{value:!0}),e);var at={};Ce(at,{Krypton:()=>q,default:()=>it,init:()=>ye});var v;(function(e){e[e.Document=0]="Document",e[e.DocumentType=1]="DocumentType",e[e.Element=2]="Element",e[e.Text=3]="Text",e[e.CDATA=4]="CDATA",e[e.Comment=5]="Comment"})(v||(v={}));function Te(e){return e.nodeType===e.ELEMENT_NODE}function Ee(e){var t=e?.host;return t?.shadowRoot===e}function ee(e){return Object.prototype.toString.call(e)==="[object ShadowRoot]"}function Le(e){return e.includes(" background-clip: text;")&&!e.includes(" -webkit-background-clip: text;")&&(e=e.replace(" background-clip: text;"," -webkit-background-clip: text; background-clip: text;")),e}function te(e){try{var t=e.rules||e.cssRules;return t?Le(Array.from(t).map(Re).join("")):null}catch{return null}}function Re(e){var t=e.cssText;if(Ne(e))try{t=te(e.styleSheet)||t}catch{}return t}function Ne(e){return"styleSheet"in e}var _e=(function(){function e(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}return e.prototype.getId=function(t){var r;if(!t)return-1;var n=(r=this.getMeta(t))===null||r===void 0?void 0:r.id;return n??-1},e.prototype.getNode=function(t){return this.idNodeMap.get(t)||null},e.prototype.getIds=function(){return Array.from(this.idNodeMap.keys())},e.prototype.getMeta=function(t){return this.nodeMetaMap.get(t)||null},e.prototype.removeNodeFromMap=function(t){var r=this,n=this.getId(t);this.idNodeMap.delete(n),t.childNodes&&t.childNodes.forEach(function(i){return r.removeNodeFromMap(i)})},e.prototype.has=function(t){return this.idNodeMap.has(t)},e.prototype.hasNode=function(t){return this.nodeMetaMap.has(t)},e.prototype.add=function(t,r){var n=r.id;this.idNodeMap.set(n,t),this.nodeMetaMap.set(t,r)},e.prototype.replace=function(t,r){var n=this.getNode(t);if(n){var i=this.nodeMetaMap.get(n);i&&this.nodeMetaMap.set(r,i)}this.idNodeMap.set(t,r)},e.prototype.reset=function(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap},e})();function Ae(e){var t=e.maskInputOptions,r=e.tagName,n=e.type,i=e.value,a=e.maskInputFn,c=i||"";return(t[r.toLowerCase()]||t[n])&&(a?c=a(c):c="*".repeat(c.length)),c}var le="__rrweb_original__";function Me(e){var t=e.getContext("2d");if(!t)return!0;for(var r=50,n=0;n<e.width;n+=r)for(var i=0;i<e.height;i+=r){var a=t.getImageData,c=le in a?a[le]:a,u=new Uint32Array(c.call(t,n,i,Math.min(r,e.width-n),Math.min(r,e.height-i)).data.buffer);if(u.some(function(o){return o!==0}))return!1}return!0}var Oe=1,Pe=new RegExp("[^a-z0-9-_:]"),ue=-2;function De(){return Oe++}function Fe(e){if(e instanceof HTMLFormElement)return"form";var t=e.tagName.toLowerCase().trim();return Pe.test(t)?"div":t}function He(e){return e.cssRules?Array.from(e.cssRules).map(function(t){return t.cssText||""}).join(""):""}function Ue(e){var t="";return e.indexOf("//")>-1?t=e.split("/").slice(0,3).join("/"):t=e.split("/")[0],t=t.split("?")[0],t}var z,fe,We=/url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm,Be=/^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/|#).*/,Ke=/^(data:)([^,]*),(.*)/i;function G(e,t){return(e||"").replace(We,function(r,n,i,a,c,u){var o=i||c||u,f=n||a||"";if(!o)return r;if(!Be.test(o)||Ke.test(o))return"url(".concat(f).concat(o).concat(f,")");if(o[0]==="/")return"url(".concat(f).concat(Ue(t)+o).concat(f,")");var l=t.split("/"),p=o.split("/");l.pop();for(var b=0,w=p;b<w.length;b++){var k=w[b];k!=="."&&(k===".."?l.pop():l.push(k))}return"url(".concat(f).concat(l.join("/")).concat(f,")")})}var ze=/^[^ \t\n\r\u000c]+/,$e=/^[, \t\n\r\u000c]+/;function qe(e,t){if(t.trim()==="")return t;var r=0;function n(f){var l,p=f.exec(t.substring(r));return p?(l=p[0],r+=l.length,l):""}for(var i=[];n($e),!(r>=t.length);){var a=n(ze);if(a.slice(-1)===",")a=$(e,a.substring(0,a.length-1)),i.push(a);else{var c="";a=$(e,a);for(var u=!1;;){var o=t.charAt(r);if(o===""){i.push((a+c).trim());break}else if(u)o===")"&&(u=!1);else if(o===","){r+=1,i.push((a+c).trim());break}else o==="("&&(u=!0);c+=o,r+=1}}}return i.join(", ")}function $(e,t){if(!t||t.trim()==="")return t;var r=e.createElement("a");return r.href=t,r.href}function je(e){return!!(e.tagName==="svg"||e.ownerSVGElement)}function ne(){var e=document.createElement("a");return e.href="",e.href}function Qe(e,t,r,n){return r==="src"||r==="href"&&n&&!(t==="use"&&n[0]==="#")||r==="xlink:href"&&n&&n[0]!=="#"||r==="background"&&n&&(t==="table"||t==="td"||t==="th")?$(e,n):r==="srcset"&&n?qe(e,n):r==="style"&&n?G(n,ne()):t==="object"&&r==="data"&&n?$(e,n):n}function Ge(e,t,r){if(typeof t=="string"){if(e.classList.contains(t))return!0}else for(var n=e.classList.length;n--;){var i=e.classList[n];if(t.test(i))return!0}return r?e.matches(r):!1}function re(e,t,r){if(!e)return!1;if(e.nodeType!==e.ELEMENT_NODE)return r?re(e.parentNode,t,r):!1;for(var n=e.classList.length;n--;){var i=e.classList[n];if(t.test(i))return!0}return r?re(e.parentNode,t,r):!1}function Je(e,t,r){var n=e.nodeType===e.ELEMENT_NODE?e:e.parentElement;if(n===null)return!1;if(typeof t=="string"){if(n.classList.contains(t)||n.closest(".".concat(t)))return!0}else if(re(n,t,!0))return!0;return!!(r&&(n.matches(r)||n.closest(r)))}function Ve(e,t,r){var n=e.contentWindow;if(n){var i=!1,a;try{a=n.document.readyState}catch{return}if(a!=="complete"){var c=setTimeout(function(){i||(t(),i=!0)},r);e.addEventListener("load",function(){clearTimeout(c),i=!0,t()});return}var u="about:blank";if(n.location.href!==u||e.src===u||e.src==="")return setTimeout(t,0),e.addEventListener("load",t);e.addEventListener("load",t)}}function Ye(e,t,r){var n=!1,i;try{i=e.sheet}catch{return}if(!i){var a=setTimeout(function(){n||(t(),n=!0)},r);e.addEventListener("load",function(){clearTimeout(a),n=!0,t()})}}function Xe(e,t){var r=t.doc,n=t.mirror,i=t.blockClass,a=t.blockSelector,c=t.maskTextClass,u=t.maskTextSelector,o=t.inlineStylesheet,f=t.maskInputOptions,l=f===void 0?{}:f,p=t.maskTextFn,b=t.maskInputFn,w=t.dataURLOptions,k=w===void 0?{}:w,x=t.inlineImages,I=t.recordCanvas,T=t.keepIframeSrcFn,h=t.newlyAddedElement,s=h===void 0?!1:h,y=Ze(r,n);switch(e.nodeType){case e.DOCUMENT_NODE:return e.compatMode!=="CSS1Compat"?{type:v.Document,childNodes:[],compatMode:e.compatMode}:{type:v.Document,childNodes:[]};case e.DOCUMENT_TYPE_NODE:return{type:v.DocumentType,name:e.name,publicId:e.publicId,systemId:e.systemId,rootId:y};case e.ELEMENT_NODE:return tt(e,{doc:r,blockClass:i,blockSelector:a,inlineStylesheet:o,maskInputOptions:l,maskInputFn:b,dataURLOptions:k,inlineImages:x,recordCanvas:I,keepIframeSrcFn:T,newlyAddedElement:s,rootId:y});case e.TEXT_NODE:return et(e,{maskTextClass:c,maskTextSelector:u,maskTextFn:p,rootId:y});case e.CDATA_SECTION_NODE:return{type:v.CDATA,textContent:"",rootId:y};case e.COMMENT_NODE:return{type:v.Comment,textContent:e.textContent||"",rootId:y};default:return!1}}function Ze(e,t){if(t.hasNode(e)){var r=t.getId(e);return r===1?void 0:r}}function et(e,t){var r,n=t.maskTextClass,i=t.maskTextSelector,a=t.maskTextFn,c=t.rootId,u=e.parentNode&&e.parentNode.tagName,o=e.textContent,f=u==="STYLE"?!0:void 0,l=u==="SCRIPT"?!0:void 0;if(f&&o){try{e.nextSibling||e.previousSibling||!((r=e.parentNode.sheet)===null||r===void 0)&&r.cssRules&&(o=He(e.parentNode.sheet))}catch(p){console.warn("Cannot get CSS styles from text's parentNode. Error: ".concat(p),e)}o=G(o,ne())}return l&&(o="SCRIPT_PLACEHOLDER"),!f&&!l&&o&&Je(e,n,i)&&(o=a?a(o):o.replace(/[\S]/g,"*")),{type:v.Text,textContent:o||"",isStyle:f,rootId:c}}function tt(e,t){for(var r=t.doc,n=t.blockClass,i=t.blockSelector,a=t.inlineStylesheet,c=t.maskInputOptions,u=c===void 0?{}:c,o=t.maskInputFn,f=t.dataURLOptions,l=f===void 0?{}:f,p=t.inlineImages,b=t.recordCanvas,w=t.keepIframeSrcFn,k=t.newlyAddedElement,x=k===void 0?!1:k,I=t.rootId,T=Ge(e,n,i),h=Fe(e),s={},y=e.attributes.length,M=0;M<y;M++){var E=e.attributes[M];s[E.name]=Qe(r,h,E.name,E.value)}if(h==="link"&&a){var C=Array.from(r.styleSheets).find(function(R){return R.href===e.href}),m=null;C&&(m=te(C)),m&&(delete s.rel,delete s.href,s._cssText=G(m,C.href))}if(h==="style"&&e.sheet&&!(e.innerText||e.textContent||"").trim().length){var m=te(e.sheet);m&&(s._cssText=G(m,ne()))}if(h==="input"||h==="textarea"||h==="select"){var F=e.value,N=e.checked;s.type!=="radio"&&s.type!=="checkbox"&&s.type!=="submit"&&s.type!=="button"&&F?s.value=Ae({type:s.type,tagName:h,value:F,maskInputOptions:u,maskInputFn:o}):N&&(s.checked=N)}if(h==="option"&&(e.selected&&!u.select?s.selected=!0:delete s.selected),h==="canvas"&&b){if(e.__context==="2d")Me(e)||(s.rr_dataURL=e.toDataURL(l.type,l.quality));else if(!("__context"in e)){var L=e.toDataURL(l.type,l.quality),O=document.createElement("canvas");O.width=e.width,O.height=e.height;var P=O.toDataURL(l.type,l.quality);L!==P&&(s.rr_dataURL=L)}}if(h==="img"&&p){z||(z=r.createElement("canvas"),fe=z.getContext("2d"));var S=e,_=S.crossOrigin;S.crossOrigin="anonymous";var D=function(){try{z.width=S.naturalWidth,z.height=S.naturalHeight,fe.drawImage(S,0,0),s.rr_dataURL=z.toDataURL(l.type,l.quality)}catch(R){console.warn("Cannot inline img src=".concat(S.currentSrc,"! Error: ").concat(R))}_?s.crossOrigin=_:S.removeAttribute("crossorigin")};S.complete&&S.naturalWidth!==0?D():S.onload=D}if((h==="audio"||h==="video")&&(s.rr_mediaState=e.paused?"paused":"played",s.rr_mediaCurrentTime=e.currentTime),x||(e.scrollLeft&&(s.rr_scrollLeft=e.scrollLeft),e.scrollTop&&(s.rr_scrollTop=e.scrollTop)),T){var U=e.getBoundingClientRect(),W=U.width,A=U.height;s={class:s.class,rr_width:"".concat(W,"px"),rr_height:"".concat(A,"px")}}return h==="iframe"&&!w(s.src)&&(e.contentDocument||(s.rr_src=s.src),delete s.src),{type:v.Element,tagName:h,attributes:s,childNodes:[],isSVG:je(e)||void 0,needBlock:T,rootId:I}}function d(e){return e===void 0?"":e.toLowerCase()}function rt(e,t){if(t.comment&&e.type===v.Comment)return!0;if(e.type===v.Element){if(t.script&&(e.tagName==="script"||e.tagName==="link"&&e.attributes.rel==="preload"&&e.attributes.as==="script"||e.tagName==="link"&&e.attributes.rel==="prefetch"&&typeof e.attributes.href=="string"&&e.attributes.href.endsWith(".js")))return!0;if(t.headFavicon&&(e.tagName==="link"&&e.attributes.rel==="shortcut icon"||e.tagName==="meta"&&(d(e.attributes.name).match(/^msapplication-tile(image|color)$/)||d(e.attributes.name)==="application-name"||d(e.attributes.rel)==="icon"||d(e.attributes.rel)==="apple-touch-icon"||d(e.attributes.rel)==="shortcut icon")))return!0;if(e.tagName==="meta"){if(t.headMetaDescKeywords&&d(e.attributes.name).match(/^description|keywords$/))return!0;if(t.headMetaSocial&&(d(e.attributes.property).match(/^(og|twitter|fb):/)||d(e.attributes.name).match(/^(og|twitter):/)||d(e.attributes.name)==="pinterest"))return!0;if(t.headMetaRobots&&(d(e.attributes.name)==="robots"||d(e.attributes.name)==="googlebot"||d(e.attributes.name)==="bingbot"))return!0;if(t.headMetaHttpEquiv&&e.attributes["http-equiv"]!==void 0)return!0;if(t.headMetaAuthorship&&(d(e.attributes.name)==="author"||d(e.attributes.name)==="generator"||d(e.attributes.name)==="framework"||d(e.attributes.name)==="publisher"||d(e.attributes.name)==="progid"||d(e.attributes.property).match(/^article:/)||d(e.attributes.property).match(/^product:/)))return!0;if(t.headMetaVerification&&(d(e.attributes.name)==="google-site-verification"||d(e.attributes.name)==="yandex-verification"||d(e.attributes.name)==="csrf-token"||d(e.attributes.name)==="p:domain_verify"||d(e.attributes.name)==="verify-v1"||d(e.attributes.name)==="verification"||d(e.attributes.name)==="shopify-checkout-api-token"))return!0}}return!1}function Q(e,t){var r=t.doc,n=t.mirror,i=t.blockClass,a=t.blockSelector,c=t.maskTextClass,u=t.maskTextSelector,o=t.skipChild,f=o===void 0?!1:o,l=t.inlineStylesheet,p=l===void 0?!0:l,b=t.maskInputOptions,w=b===void 0?{}:b,k=t.maskTextFn,x=t.maskInputFn,I=t.slimDOMOptions,T=t.dataURLOptions,h=T===void 0?{}:T,s=t.inlineImages,y=s===void 0?!1:s,M=t.recordCanvas,E=M===void 0?!1:M,C=t.onSerialize,m=t.onIframeLoad,F=t.iframeLoadTimeout,N=F===void 0?5e3:F,L=t.onStylesheetLoad,O=t.stylesheetLoadTimeout,P=O===void 0?5e3:O,S=t.keepIframeSrcFn,_=S===void 0?function(){return!1}:S,D=t.newlyAddedElement,U=D===void 0?!1:D,W=t.preserveWhiteSpace,A=W===void 0?!0:W,R=Xe(e,{doc:r,mirror:n,blockClass:i,blockSelector:a,maskTextClass:c,maskTextSelector:u,inlineStylesheet:p,maskInputOptions:w,maskTextFn:k,maskInputFn:x,dataURLOptions:h,inlineImages:y,recordCanvas:E,keepIframeSrcFn:_,newlyAddedElement:U});if(!R)return console.warn(e,"not serialized"),null;var j;n.hasNode(e)?j=n.getId(e):rt(R,I)||!A&&R.type===v.Text&&!R.isStyle&&!R.textContent.replace(/^\s+|\s+$/gm,"").length?j=ue:j=De();var g=Object.assign(R,{id:j});if(n.add(e,g),j===ue)return null;C&&C(e);var J=!f;if(g.type===v.Element){J=J&&!g.needBlock,delete g.needBlock;var ie=e.shadowRoot;ie&&ee(ie)&&(g.isShadowHost=!0)}if((g.type===v.Document||g.type===v.Element)&&J){I.headWhitespace&&g.type===v.Element&&g.tagName==="head"&&(A=!1);for(var ae={doc:r,mirror:n,blockClass:i,blockSelector:a,maskTextClass:c,maskTextSelector:u,skipChild:f,inlineStylesheet:p,maskInputOptions:w,maskTextFn:k,maskInputFn:x,slimDOMOptions:I,dataURLOptions:h,inlineImages:y,recordCanvas:E,preserveWhiteSpace:A,onSerialize:C,onIframeLoad:m,iframeLoadTimeout:N,onStylesheetLoad:L,stylesheetLoadTimeout:P,keepIframeSrcFn:_},V=0,oe=Array.from(e.childNodes);V<oe.length;V++){var Y=oe[V],B=Q(Y,ae);B&&g.childNodes.push(B)}if(Te(e)&&e.shadowRoot)for(var X=0,se=Array.from(e.shadowRoot.childNodes);X<se.length;X++){var Y=se[X],B=Q(Y,ae);B&&(ee(e.shadowRoot)&&(B.isShadow=!0),g.childNodes.push(B))}}return e.parentNode&&Ee(e.parentNode)&&ee(e.parentNode)&&(g.isShadow=!0),g.type===v.Element&&g.tagName==="iframe"&&Ve(e,function(){var K=e.contentDocument;if(K&&m){var ce=Q(K,{doc:K,mirror:n,blockClass:i,blockSelector:a,maskTextClass:c,maskTextSelector:u,skipChild:!1,inlineStylesheet:p,maskInputOptions:w,maskTextFn:k,maskInputFn:x,slimDOMOptions:I,dataURLOptions:h,inlineImages:y,recordCanvas:E,preserveWhiteSpace:A,onSerialize:C,onIframeLoad:m,iframeLoadTimeout:N,onStylesheetLoad:L,stylesheetLoadTimeout:P,keepIframeSrcFn:_});ce&&m(e,ce)}},N),g.type===v.Element&&g.tagName==="link"&&g.attributes.rel==="stylesheet"&&Ye(e,function(){if(L){var K=Q(e,{doc:r,mirror:n,blockClass:i,blockSelector:a,maskTextClass:c,maskTextSelector:u,skipChild:!1,inlineStylesheet:p,maskInputOptions:w,maskTextFn:k,maskInputFn:x,slimDOMOptions:I,dataURLOptions:h,inlineImages:y,recordCanvas:E,preserveWhiteSpace:A,onSerialize:C,onIframeLoad:m,iframeLoadTimeout:N,onStylesheetLoad:L,stylesheetLoadTimeout:P,keepIframeSrcFn:_});K&&L(e,K)}},P),g}function de(e,t){var r=t||{},n=r.mirror,i=n===void 0?new _e:n,a=r.blockClass,c=a===void 0?"rr-block":a,u=r.blockSelector,o=u===void 0?null:u,f=r.maskTextClass,l=f===void 0?"rr-mask":f,p=r.maskTextSelector,b=p===void 0?null:p,w=r.inlineStylesheet,k=w===void 0?!0:w,x=r.inlineImages,I=x===void 0?!1:x,T=r.recordCanvas,h=T===void 0?!1:T,s=r.maskAllInputs,y=s===void 0?!1:s,M=r.maskTextFn,E=r.maskInputFn,C=r.slimDOM,m=C===void 0?!1:C,F=r.dataURLOptions,N=r.preserveWhiteSpace,L=r.onSerialize,O=r.onIframeLoad,P=r.iframeLoadTimeout,S=r.onStylesheetLoad,_=r.stylesheetLoadTimeout,D=r.keepIframeSrcFn,U=D===void 0?function(){return!1}:D,W=y===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:y===!1?{password:!0}:y,A=m===!0||m==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:m==="all",headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0}:m===!1?{}:m;return Q(e,{doc:e,mirror:i,blockClass:c,blockSelector:o,maskTextClass:l,maskTextSelector:b,skipChild:!1,inlineStylesheet:k,maskInputOptions:W,maskTextFn:M,maskInputFn:E,slimDOMOptions:A,dataURLOptions:F,inlineImages:I,recordCanvas:h,preserveWhiteSpace:N,onSerialize:L,onIframeLoad:O,iframeLoadTimeout:P,onStylesheetLoad:S,stylesheetLoadTimeout:_,keepIframeSrcFn:U,newlyAddedElement:!1})}var nt=/([^\\]):hover/,st=new RegExp(nt.source,"g");function H(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function he(){let e="_krypton_sid";try{if(typeof sessionStorage<"u"){let t=sessionStorage.getItem(e);return t||(t=H(),sessionStorage.setItem(e,t)),t}}catch{}return H()}function pe(){let e="_krypton_did";try{if(typeof localStorage<"u"){let t=localStorage.getItem(e);return t||(t=H(),localStorage.setItem(e,t)),t}}catch{}return H()}function me(){if(typeof window>"u")return{};let e=new URLSearchParams(window.location.search),t={};for(let r of["utm_source","utm_medium","utm_campaign","utm_term","utm_content"]){let n=e.get(r);n&&(t[r]=n)}return t}function ge(){if(typeof window>"u")return"unknown";let e=window.innerWidth;return e<768?"mobile":e<1024?"tablet":"desktop"}function ve(e){if(e.id)return`#${e.id}`;let t=[],r=e;for(;r&&r!==document.body;){let n=r.tagName.toLowerCase();if(r.id){t.unshift(`#${r.id}`);break}if(r.className&&typeof r.className=="string"){let i=r.className.trim().split(/\s+/).slice(0,2).join(".");i&&(n+=`.${i}`)}t.unshift(n),r=r.parentElement}return t.join(" > ")}var q=class{constructor(t){this.eventQueue=[];this.heatmapQueue=[];this.flushTimer=null;this.initialized=!1;this.lastSnapshotUrl=null;this.heatmapSetup=!1;this.serverConfig=null;this.configFetched=!1;this.logPrefix="[Krypton SDK]";this.config={autoPageview:!0,heatmap:!1,consentRequired:!1,showConsentBanner:!1,consentCategories:{},flushInterval:5e3,batchSize:20,debug:!1,disableConfigCache:!1,...t},this.distinctId=H(),this.sessionId=H(),this.consent=this.resolveInitialConsent(),this.canTrackAnalytics()&&this.promotePersistentIds(),this.init()}init(){this.initialized||(this.initialized=!0,this.fetchConfig().finally(()=>{try{this.setupTracking()}catch(t){this.warn("setupTracking failed",t)}try{this.config.consentRequired&&this.config.showConsentBanner&&!this.hasStoredConsent()?(this.debug("showing consent banner automatically",{consentRequired:this.config.consentRequired,showConsentBanner:this.config.showConsentBanner}),this.showConsentBannerWhenReady()):this.debug("skipping consent banner",{consentRequired:this.config.consentRequired,showConsentBanner:this.config.showConsentBanner,hasStoredConsent:this.hasStoredConsent()})}catch(t){this.warn("consent banner initialization failed",t)}}))}showConsentBannerWhenReady(t=12){if(!(typeof document>"u")&&!document.getElementById("krypton-consent-banner")){if(document.body){this.showConsentBanner();return}t<=0||setTimeout(()=>this.showConsentBannerWhenReady(t-1),50)}}resolveInitialConsent(){let t=this.loadStoredConsent();return t||{...this.config.consentRequired?{analytics:!1,heatmaps:!1}:{analytics:!0,heatmaps:!!this.config.heatmap},...this.config.consentCategories}}consentStorageKey(){return`_krypton_consent_${this.config.apiKey}`}hasStoredConsent(){try{return typeof localStorage>"u"?!1:!!localStorage.getItem(this.consentStorageKey())}catch{return!1}}loadStoredConsent(){try{if(typeof localStorage>"u")return null;let t=localStorage.getItem(this.consentStorageKey());if(!t)return null;let r=JSON.parse(t);return{analytics:!!r.analytics,heatmaps:!!r.heatmaps}}catch{return null}}persistConsent(){try{if(typeof localStorage>"u")return;localStorage.setItem(this.consentStorageKey(),JSON.stringify(this.consent))}catch{}}promotePersistentIds(){this.distinctId=pe(),this.sessionId=he()}canTrackAnalytics(){return!!this.consent.analytics}isHeatmapFeatureEnabled(){return!this.config.heatmap||this.configFetched&&!this.serverConfig?.heatmaps_enabled?!1:!!this.consent.heatmaps}async fetchConfig(){if(typeof window>"u")return;let t=`_krypton_config_${this.config.apiKey}`,r=null;if(!this.config.disableConfigCache)try{r=sessionStorage.getItem(t)}catch{r=null}if(r)try{let n=JSON.parse(r);if(n._ts&&Date.now()-n._ts<300*1e3){this.serverConfig=n,this.configFetched=!0,this.debug("config loaded from session cache",n);return}}catch{}try{let n=new AbortController,i=setTimeout(()=>n.abort(),5e3),a=await fetch(`${this.config.endpoint}/api/v1/config?api_key=${encodeURIComponent(this.config.apiKey)}`,{signal:n.signal});if(clearTimeout(i),a.ok){let c=await a.json();if(this.serverConfig=c,this.configFetched=!0,this.debug("config fetched from API",c),!this.config.disableConfigCache)try{sessionStorage.setItem(t,JSON.stringify({...c,_ts:Date.now()}))}catch{}}else this.warn(`Config fetch failed (${a.status})`,{endpoint:this.config.endpoint})}catch(n){this.warn("Config fetch failed",n)}}setupTracking(){if(this.flushTimer=setInterval(()=>{this.flush()},this.config.flushInterval),typeof window>"u")return;window.addEventListener("beforeunload",()=>{this.flush()}),this.config.autoPageview&&this.canTrackAnalytics()&&this.trackPageview();let t=history.pushState;history.pushState=(...n)=>{try{t.apply(history,n),this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0),this.isHeatmapFeatureEnabled()&&setTimeout(()=>this.captureSnapshot(),0)}catch(i){this.warn("pushState hook failed",i)}};let r=history.replaceState;history.replaceState=(...n)=>{try{r.apply(history,n),this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0),this.isHeatmapFeatureEnabled()&&setTimeout(()=>this.captureSnapshot(),0)}catch(i){this.warn("replaceState hook failed",i)}},window.addEventListener("popstate",()=>{try{this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0),this.isHeatmapFeatureEnabled()&&setTimeout(()=>this.captureSnapshot(),0)}catch(n){this.warn("popstate hook failed",n)}}),this.isHeatmapFeatureEnabled()&&this.setupHeatmap()}showConsentBanner(){if(typeof document>"u"||document.getElementById("krypton-consent-banner"))return;let t=document.createElement("div");t.id="krypton-consent-banner",t.style.cssText=["position:fixed","left:16px","right:16px","bottom:16px","z-index:2147483647","max-width:720px","margin:0 auto","background:#111827","color:#f9fafb","border-radius:12px","padding:16px","box-shadow:0 12px 30px rgba(0,0,0,0.35)","font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif","font-size:14px","line-height:1.4"].join(";");let r=a=>a?"checked":"";t.innerHTML=`
1
+ "use strict";var KryptonAnalytics=(()=>{var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var x=(s,e)=>{for(var n in e)l(s,n,{get:e[n],enumerable:!0})},b=(s,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of w(e))!v.call(s,i)&&i!==n&&l(s,i,{get:()=>e[i],enumerable:!(t=y(e,i))||t.enumerable});return s};var k=s=>b(l({},"__esModule",{value:!0}),s);var S={};x(S,{Krypton:()=>r,default:()=>C,init:()=>g});function a(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let e=Math.random()*16|0;return(s==="x"?e:e&3|8).toString(16)})}function d(){let s="_krypton_sid";try{if(typeof sessionStorage<"u"){let e=sessionStorage.getItem(s);return e||(e=a(),sessionStorage.setItem(s,e)),e}}catch{}return a()}function h(){let s="_krypton_did";try{if(typeof localStorage<"u"){let e=localStorage.getItem(s);return e||(e=a(),localStorage.setItem(s,e)),e}}catch{}return a()}function u(){if(typeof window>"u")return{};let s=new URLSearchParams(window.location.search),e={};for(let n of["utm_source","utm_medium","utm_campaign","utm_term","utm_content"]){let t=s.get(n);t&&(e[n]=t)}return e}function p(){if(typeof window>"u")return"unknown";let s=window.innerWidth;return s<768?"mobile":s<1024?"tablet":"desktop"}function f(s){if(s.id)return`#${s.id}`;let e=[],n=s;for(;n&&n!==document.body;){let t=n.tagName.toLowerCase();if(n.id){e.unshift(`#${n.id}`);break}if(n.className&&typeof n.className=="string"){let i=n.className.trim().split(/\s+/).slice(0,2).join(".");i&&(t+=`.${i}`)}e.unshift(t),n=n.parentElement}return e.join(" > ")}var r=class{constructor(e){this.eventQueue=[];this.heatmapQueue=[];this.flushTimer=null;this.initialized=!1;this.heatmapSetup=!1;this.serverConfig=null;this.configFetched=!1;this.logPrefix="[Krypton SDK]";this.config={autoPageview:!0,heatmap:!1,consentRequired:!1,showConsentBanner:!1,consentCategories:{},flushInterval:5e3,batchSize:20,debug:!1,disableConfigCache:!1,...e},this.distinctId=a(),this.sessionId=a(),this.consent=this.resolveInitialConsent(),this.canTrackAnalytics()&&this.promotePersistentIds(),this.init()}init(){this.initialized||(this.initialized=!0,this.fetchConfig().finally(()=>{try{this.setupTracking()}catch(e){this.warn("setupTracking failed",e)}try{this.config.consentRequired&&this.config.showConsentBanner&&!this.hasStoredConsent()?(this.debug("showing consent banner automatically",{consentRequired:this.config.consentRequired,showConsentBanner:this.config.showConsentBanner}),this.showConsentBannerWhenReady()):this.debug("skipping consent banner",{consentRequired:this.config.consentRequired,showConsentBanner:this.config.showConsentBanner,hasStoredConsent:this.hasStoredConsent()})}catch(e){this.warn("consent banner initialization failed",e)}}))}showConsentBannerWhenReady(e=12){if(!(typeof document>"u")&&!document.getElementById("krypton-consent-banner")){if(document.body){this.showConsentBanner();return}e<=0||setTimeout(()=>this.showConsentBannerWhenReady(e-1),50)}}resolveInitialConsent(){let e=this.loadStoredConsent();return e||{...this.config.consentRequired?{analytics:!1,heatmaps:!1}:{analytics:!0,heatmaps:!!this.config.heatmap},...this.config.consentCategories}}consentStorageKey(){return`_krypton_consent_${this.config.apiKey}`}hasStoredConsent(){try{return typeof localStorage>"u"?!1:!!localStorage.getItem(this.consentStorageKey())}catch{return!1}}loadStoredConsent(){try{if(typeof localStorage>"u")return null;let e=localStorage.getItem(this.consentStorageKey());if(!e)return null;let n=JSON.parse(e);return{analytics:!!n.analytics,heatmaps:!!n.heatmaps}}catch{return null}}persistConsent(){try{if(typeof localStorage>"u")return;localStorage.setItem(this.consentStorageKey(),JSON.stringify(this.consent))}catch{}}promotePersistentIds(){this.distinctId=h(),this.sessionId=d()}canTrackAnalytics(){return!!this.consent.analytics}isHeatmapFeatureEnabled(){return!this.config.heatmap||this.configFetched&&!this.serverConfig?.heatmaps_enabled?!1:!!this.consent.heatmaps}async fetchConfig(){if(typeof window>"u")return;let e=`_krypton_config_${this.config.apiKey}`,n=null;if(!this.config.disableConfigCache)try{n=sessionStorage.getItem(e)}catch{n=null}if(n)try{let t=JSON.parse(n);if(t._ts&&Date.now()-t._ts<300*1e3){this.serverConfig=t,this.configFetched=!0,this.debug("config loaded from session cache",t);return}}catch{}try{let t=new AbortController,i=setTimeout(()=>t.abort(),5e3),o=await fetch(`${this.config.endpoint}/api/v1/config?api_key=${encodeURIComponent(this.config.apiKey)}`,{signal:t.signal});if(clearTimeout(i),o.ok){let c=await o.json();if(this.serverConfig=c,this.configFetched=!0,this.debug("config fetched from API",c),!this.config.disableConfigCache)try{sessionStorage.setItem(e,JSON.stringify({...c,_ts:Date.now()}))}catch{}}else this.warn(`Config fetch failed (${o.status})`,{endpoint:this.config.endpoint})}catch(t){this.warn("Config fetch failed",t)}}setupTracking(){if(this.flushTimer=setInterval(()=>{this.flush()},this.config.flushInterval),typeof window>"u")return;window.addEventListener("beforeunload",()=>{this.flush()}),this.config.autoPageview&&this.canTrackAnalytics()&&this.trackPageview();let e=history.pushState;history.pushState=(...t)=>{try{e.apply(history,t),this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0)}catch(i){this.warn("pushState hook failed",i)}};let n=history.replaceState;history.replaceState=(...t)=>{try{n.apply(history,t),this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0)}catch(i){this.warn("replaceState hook failed",i)}},window.addEventListener("popstate",()=>{try{this.config.autoPageview&&this.canTrackAnalytics()&&setTimeout(()=>this.trackPageview(),0)}catch(t){this.warn("popstate hook failed",t)}}),this.isHeatmapFeatureEnabled()&&this.setupHeatmap()}showConsentBanner(){if(typeof document>"u"||document.getElementById("krypton-consent-banner"))return;let e=document.createElement("div");e.id="krypton-consent-banner",e.style.cssText=["position:fixed","left:16px","right:16px","bottom:16px","z-index:2147483647","max-width:720px","margin:0 auto","background:#111827","color:#f9fafb","border-radius:12px","padding:16px","box-shadow:0 12px 30px rgba(0,0,0,0.35)","font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif","font-size:14px","line-height:1.4"].join(";");let n=o=>o?"checked":"";e.innerHTML=`
2
2
  <div style="font-weight:600;margin-bottom:6px">Privacy preferences</div>
3
3
  <div style="opacity:0.9;margin-bottom:10px">Choose what data you allow us to collect.</div>
4
4
  <label style="display:flex;gap:8px;align-items:flex-start;margin:6px 0">
5
- <input type="checkbox" id="krypton-consent-analytics" ${r(this.consent.analytics)} />
5
+ <input type="checkbox" id="krypton-consent-analytics" ${n(this.consent.analytics)} />
6
6
  <span><strong>Analytics</strong> (pageviews and custom events)</span>
7
7
  </label>
8
8
  <label style="display:flex;gap:8px;align-items:flex-start;margin:6px 0">
9
- <input type="checkbox" id="krypton-consent-heatmaps" ${r(this.consent.heatmaps)} />
9
+ <input type="checkbox" id="krypton-consent-heatmaps" ${n(this.consent.heatmaps)} />
10
10
  <span><strong>Heatmaps</strong> (click and scroll interaction maps)</span>
11
11
  </label>
12
12
  <div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:12px">
@@ -14,4 +14,4 @@
14
14
  <button id="krypton-consent-all" style="border:0;background:#16a34a;color:#fff;padding:8px 12px;border-radius:8px;cursor:pointer">Accept all</button>
15
15
  <button id="krypton-consent-none" style="border:1px solid #4b5563;background:transparent;color:#f9fafb;padding:8px 12px;border-radius:8px;cursor:pointer">Reject all</button>
16
16
  </div>
17
- `;let n=()=>{t.remove();try{document.body&&(document.body.style.cursor=""),document.documentElement&&(document.documentElement.style.cursor="")}catch{}},i=a=>!!document.getElementById(a)?.checked;t.querySelector("#krypton-consent-save")?.addEventListener("click",()=>{let a={analytics:i("krypton-consent-analytics"),heatmaps:i("krypton-consent-heatmaps")};n(),setTimeout(()=>this.setConsent(a),0)}),t.querySelector("#krypton-consent-all")?.addEventListener("click",()=>{n(),setTimeout(()=>this.setConsent({analytics:!0,heatmaps:!0}),0)}),t.querySelector("#krypton-consent-none")?.addEventListener("click",()=>{n(),setTimeout(()=>this.setConsent({analytics:!1,heatmaps:!1}),0)}),document.body.appendChild(t)}setConsent(t,r=!0){try{let n={...this.consent};this.consent={analytics:t.analytics??n.analytics,heatmaps:t.heatmaps??n.heatmaps},r&&this.persistConsent(),!n.analytics&&this.consent.analytics&&(this.promotePersistentIds(),this.config.autoPageview&&this.trackPageview()),n.analytics&&!this.consent.analytics&&(this.eventQueue=[]),!n.heatmaps&&this.isHeatmapFeatureEnabled()&&(this.setupHeatmap(),this.captureSnapshot()),n.heatmaps&&!this.consent.heatmaps&&(this.heatmapQueue=[])}catch(n){this.warn("setConsent failed",n)}}getConsent(){return{...this.consent}}grantConsent(){this.setConsent({analytics:!0,heatmaps:!0})}revokeConsent(){this.setConsent({analytics:!1,heatmaps:!1}),this.eventQueue=[],this.heatmapQueue=[]}identify(t){try{if(this.distinctId=t,this.canTrackAnalytics())try{typeof localStorage<"u"&&localStorage.setItem("_krypton_did",t)}catch{}}catch(r){this.warn("identify failed",r)}}trackPageview(t){try{if(!this.canTrackAnalytics())return;this.track("$pageview",{...t})}catch(r){this.warn("trackPageview failed",r)}}track(t,r){try{if(!this.canTrackAnalytics())return;let n=me(),i={...r||{}},a={project_id:this.config.apiKey,distinct_id:this.distinctId,event_name:t,timestamp:new Date().toISOString(),properties:i,page_url:typeof window<"u"?window.location.href:"",page_title:typeof document<"u"?document.title:"",referrer:typeof document<"u"?document.referrer:"",utm_source:n.utm_source||"",utm_medium:n.utm_medium||"",utm_campaign:n.utm_campaign||"",utm_term:n.utm_term||"",utm_content:n.utm_content||"",device_type:ge(),browser:this.getBrowser(),screen_width:typeof window<"u"?window.screen.width:0,screen_height:typeof window<"u"?window.screen.height:0,session_id:this.sessionId};this.eventQueue.push(a),this.eventQueue.length>=this.config.batchSize&&this.flush()}catch(n){this.warn("track failed",n)}}async flush(){try{await Promise.all([this.flushEvents(),this.flushHeatmapEvents()])}catch(t){this.warn("flush failed",t)}}shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.flush()}async flushEvents(){if(this.eventQueue.length===0)return;let t=this.eventQueue.splice(0,this.eventQueue.length),r={api_key:this.config.apiKey,events:t};await this.safePost(`${this.config.endpoint}/api/v1/ingest/batch`,r)||this.eventQueue.length<this.config.batchSize*5&&this.eventQueue.unshift(...t)}async flushHeatmapEvents(){if(this.heatmapQueue.length===0)return;let t=this.heatmapQueue.splice(0,this.heatmapQueue.length),r={api_key:this.config.apiKey,events:t};await this.safePost(`${this.config.endpoint}/api/v1/heatmap`,r)||this.heatmapQueue.length<this.config.batchSize*5&&this.heatmapQueue.unshift(...t)}captureSnapshot(){if(typeof window>"u"||typeof document>"u"||!this.isHeatmapFeatureEnabled())return;let t=window.location.href;this.lastSnapshotUrl!==t&&(this.lastSnapshotUrl=t,setTimeout(()=>{try{let r=de(document,{maskAllInputs:!0,blockSelector:"[data-krypton-block]",inlineStylesheet:!0});if(!r)return;let n=JSON.stringify(r),i={api_key:this.config.apiKey,page_url:t,snapshot:n,viewport_width:window.innerWidth,viewport_height:window.innerHeight,page_width:document.documentElement.scrollWidth,page_height:document.documentElement.scrollHeight,timestamp:new Date().toISOString()};this.safePost(`${this.config.endpoint}/api/v1/snapshot`,i)}catch{}},1e3))}setupHeatmap(){if(typeof window>"u"||this.heatmapSetup)return;this.heatmapSetup=!0,this.captureSnapshot(),document.addEventListener("click",n=>{if(this.isHeatmapFeatureEnabled())try{let i=n.target;this.heatmapQueue.push({project_id:this.config.apiKey,distinct_id:this.distinctId,session_id:this.sessionId,timestamp:new Date().toISOString(),page_url:window.location.href,interaction_type:"click",x:n.clientX+window.scrollX,y:n.clientY+window.scrollY,viewport_width:window.innerWidth,viewport_height:window.innerHeight,page_width:document.documentElement.scrollWidth,page_height:document.documentElement.scrollHeight,selector:ve(i)})}catch(i){this.warn("heatmap click capture failed",i)}});let t=0,r=null;window.addEventListener("scroll",()=>{if(this.isHeatmapFeatureEnabled())try{let n=window.scrollY||document.documentElement.scrollTop,i=document.documentElement.scrollHeight-window.innerHeight,a=i>0?n/i*100:0;a>t&&(t=a),r&&clearTimeout(r),r=setTimeout(()=>{this.heatmapQueue.push({project_id:this.config.apiKey,distinct_id:this.distinctId,session_id:this.sessionId,timestamp:new Date().toISOString(),page_url:window.location.href,interaction_type:"scroll",scroll_depth:t,viewport_width:window.innerWidth,viewport_height:window.innerHeight,page_width:document.documentElement.scrollWidth,page_height:document.documentElement.scrollHeight})},500)}catch(n){this.warn("heatmap scroll capture failed",n)}})}async safePost(t,r){try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),keepalive:!0});return n.ok?!0:(this.warn(`API request failed (${n.status})`,{url:t}),!1)}catch(n){return this.warn("API request failed",{url:t,err:n}),!1}}warn(t,r){try{console.warn(`${this.logPrefix} ${t}`,r??"")}catch{}}debug(t,r){if(this.config.debug)try{console.log(`${this.logPrefix} ${t}`,r??"")}catch{}}getBrowser(){if(typeof navigator>"u")return"unknown";let t=navigator.userAgent;return t.includes("Firefox")?"Firefox":t.includes("Edg")?"Edge":t.includes("Chrome")?"Chrome":t.includes("Safari")?"Safari":"Other"}};function ye(e){return new q(e)}var we={Krypton:q,init:ye};typeof window<"u"&&(window.KryptonAnalytics=we);var it=we;return Ie(at);})();
17
+ `;let t=()=>{e.remove();try{document.body&&(document.body.style.cursor=""),document.documentElement&&(document.documentElement.style.cursor="")}catch{}},i=o=>!!document.getElementById(o)?.checked;e.querySelector("#krypton-consent-save")?.addEventListener("click",()=>{let o={analytics:i("krypton-consent-analytics"),heatmaps:i("krypton-consent-heatmaps")};t(),setTimeout(()=>this.setConsent(o),0)}),e.querySelector("#krypton-consent-all")?.addEventListener("click",()=>{t(),setTimeout(()=>this.setConsent({analytics:!0,heatmaps:!0}),0)}),e.querySelector("#krypton-consent-none")?.addEventListener("click",()=>{t(),setTimeout(()=>this.setConsent({analytics:!1,heatmaps:!1}),0)}),document.body.appendChild(e)}setConsent(e,n=!0){try{let t={...this.consent};this.consent={analytics:e.analytics??t.analytics,heatmaps:e.heatmaps??t.heatmaps},n&&this.persistConsent(),!t.analytics&&this.consent.analytics&&(this.promotePersistentIds(),this.config.autoPageview&&this.trackPageview()),t.analytics&&!this.consent.analytics&&(this.eventQueue=[]),!t.heatmaps&&this.isHeatmapFeatureEnabled()&&this.setupHeatmap(),t.heatmaps&&!this.consent.heatmaps&&(this.heatmapQueue=[])}catch(t){this.warn("setConsent failed",t)}}getConsent(){return{...this.consent}}grantConsent(){this.setConsent({analytics:!0,heatmaps:!0})}revokeConsent(){this.setConsent({analytics:!1,heatmaps:!1}),this.eventQueue=[],this.heatmapQueue=[]}identify(e){try{if(this.distinctId=e,this.canTrackAnalytics())try{typeof localStorage<"u"&&localStorage.setItem("_krypton_did",e)}catch{}}catch(n){this.warn("identify failed",n)}}trackPageview(e){try{if(!this.canTrackAnalytics())return;this.track("$pageview",{...e})}catch(n){this.warn("trackPageview failed",n)}}track(e,n){try{if(!this.canTrackAnalytics())return;let t=u(),i={...n||{}},o={project_id:this.config.apiKey,distinct_id:this.distinctId,event_name:e,timestamp:new Date().toISOString(),properties:i,page_url:typeof window<"u"?window.location.href:"",page_title:typeof document<"u"?document.title:"",referrer:typeof document<"u"?document.referrer:"",utm_source:t.utm_source||"",utm_medium:t.utm_medium||"",utm_campaign:t.utm_campaign||"",utm_term:t.utm_term||"",utm_content:t.utm_content||"",device_type:p(),browser:this.getBrowser(),screen_width:typeof window<"u"?window.screen.width:0,screen_height:typeof window<"u"?window.screen.height:0,session_id:this.sessionId};this.eventQueue.push(o),this.eventQueue.length>=this.config.batchSize&&this.flush()}catch(t){this.warn("track failed",t)}}async flush(){try{await Promise.all([this.flushEvents(),this.flushHeatmapEvents()])}catch(e){this.warn("flush failed",e)}}shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.flush()}async flushEvents(){if(this.eventQueue.length===0)return;let e=this.eventQueue.splice(0,this.eventQueue.length),n={api_key:this.config.apiKey,events:e};await this.safePost(`${this.config.endpoint}/api/v1/ingest/batch`,n)||this.eventQueue.length<this.config.batchSize*5&&this.eventQueue.unshift(...e)}async flushHeatmapEvents(){if(this.heatmapQueue.length===0)return;let e=this.heatmapQueue.splice(0,this.heatmapQueue.length),n={api_key:this.config.apiKey,events:e};await this.safePost(`${this.config.endpoint}/api/v1/heatmap`,n)||this.heatmapQueue.length<this.config.batchSize*5&&this.heatmapQueue.unshift(...e)}setupHeatmap(){if(typeof window>"u"||this.heatmapSetup)return;this.heatmapSetup=!0,document.addEventListener("click",t=>{if(this.isHeatmapFeatureEnabled())try{let i=t.target;this.heatmapQueue.push({project_id:this.config.apiKey,distinct_id:this.distinctId,session_id:this.sessionId,timestamp:new Date().toISOString(),page_url:window.location.href,interaction_type:"click",x:t.clientX+window.scrollX,y:t.clientY+window.scrollY,viewport_width:window.innerWidth,viewport_height:window.innerHeight,page_width:document.documentElement.scrollWidth,page_height:document.documentElement.scrollHeight,selector:f(i)})}catch(i){this.warn("heatmap click capture failed",i)}});let e=0,n=null;window.addEventListener("scroll",()=>{if(this.isHeatmapFeatureEnabled())try{let t=window.scrollY||document.documentElement.scrollTop,i=document.documentElement.scrollHeight-window.innerHeight,o=i>0?t/i*100:0;o>e&&(e=o),n&&clearTimeout(n),n=setTimeout(()=>{this.heatmapQueue.push({project_id:this.config.apiKey,distinct_id:this.distinctId,session_id:this.sessionId,timestamp:new Date().toISOString(),page_url:window.location.href,interaction_type:"scroll",scroll_depth:e,viewport_width:window.innerWidth,viewport_height:window.innerHeight,page_width:document.documentElement.scrollWidth,page_height:document.documentElement.scrollHeight})},500)}catch(t){this.warn("heatmap scroll capture failed",t)}})}async safePost(e,n,t=!0){try{let i=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),...t?{keepalive:!0}:{}});return i.ok?!0:(this.warn(`API request failed (${i.status})`,{url:e}),!1)}catch(i){return this.warn("API request failed",{url:e,err:i}),!1}}warn(e,n){try{console.warn(`${this.logPrefix} ${e}`,n??"")}catch{}}debug(e,n){if(this.config.debug)try{console.log(`${this.logPrefix} ${e}`,n??"")}catch{}}getBrowser(){if(typeof navigator>"u")return"unknown";let e=navigator.userAgent;return e.includes("Firefox")?"Firefox":e.includes("Edg")?"Edge":e.includes("Chrome")?"Chrome":e.includes("Safari")?"Safari":"Other"}};function g(s){return new r(s)}var m={Krypton:r,init:g};typeof window<"u"&&(window.KryptonAnalytics=m);var C=m;return k(S);})();
package/dist/index.d.mts CHANGED
@@ -75,7 +75,6 @@ declare class Krypton {
75
75
  private heatmapQueue;
76
76
  private flushTimer;
77
77
  private initialized;
78
- private lastSnapshotUrl;
79
78
  private heatmapSetup;
80
79
  private consent;
81
80
  private serverConfig;
@@ -113,7 +112,6 @@ declare class Krypton {
113
112
  shutdown(): void;
114
113
  private flushEvents;
115
114
  private flushHeatmapEvents;
116
- private captureSnapshot;
117
115
  private setupHeatmap;
118
116
  private safePost;
119
117
  private warn;
package/dist/index.d.ts CHANGED
@@ -75,7 +75,6 @@ declare class Krypton {
75
75
  private heatmapQueue;
76
76
  private flushTimer;
77
77
  private initialized;
78
- private lastSnapshotUrl;
79
78
  private heatmapSetup;
80
79
  private consent;
81
80
  private serverConfig;
@@ -113,7 +112,6 @@ declare class Krypton {
113
112
  shutdown(): void;
114
113
  private flushEvents;
115
114
  private flushHeatmapEvents;
116
- private captureSnapshot;
117
115
  private setupHeatmap;
118
116
  private safePost;
119
117
  private warn;
package/dist/index.js CHANGED
@@ -24,7 +24,6 @@ __export(index_exports, {
24
24
  createKrypton: () => createKrypton
25
25
  });
26
26
  module.exports = __toCommonJS(index_exports);
27
- var import_rrweb_snapshot = require("rrweb-snapshot");
28
27
 
29
28
  // src/utils.ts
30
29
  function generateId() {
@@ -111,7 +110,6 @@ var Krypton = class {
111
110
  this.heatmapQueue = [];
112
111
  this.flushTimer = null;
113
112
  this.initialized = false;
114
- this.lastSnapshotUrl = null;
115
113
  this.heatmapSetup = false;
116
114
  this.serverConfig = null;
117
115
  this.configFetched = false;
@@ -297,9 +295,6 @@ var Krypton = class {
297
295
  if (this.config.autoPageview && this.canTrackAnalytics()) {
298
296
  setTimeout(() => this.trackPageview(), 0);
299
297
  }
300
- if (this.isHeatmapFeatureEnabled()) {
301
- setTimeout(() => this.captureSnapshot(), 0);
302
- }
303
298
  } catch (err) {
304
299
  this.warn("pushState hook failed", err);
305
300
  }
@@ -311,9 +306,6 @@ var Krypton = class {
311
306
  if (this.config.autoPageview && this.canTrackAnalytics()) {
312
307
  setTimeout(() => this.trackPageview(), 0);
313
308
  }
314
- if (this.isHeatmapFeatureEnabled()) {
315
- setTimeout(() => this.captureSnapshot(), 0);
316
- }
317
309
  } catch (err) {
318
310
  this.warn("replaceState hook failed", err);
319
311
  }
@@ -323,9 +315,6 @@ var Krypton = class {
323
315
  if (this.config.autoPageview && this.canTrackAnalytics()) {
324
316
  setTimeout(() => this.trackPageview(), 0);
325
317
  }
326
- if (this.isHeatmapFeatureEnabled()) {
327
- setTimeout(() => this.captureSnapshot(), 0);
328
- }
329
318
  } catch (err) {
330
319
  this.warn("popstate hook failed", err);
331
320
  }
@@ -427,7 +416,6 @@ var Krypton = class {
427
416
  }
428
417
  if (!prev.heatmaps && this.isHeatmapFeatureEnabled()) {
429
418
  this.setupHeatmap();
430
- this.captureSnapshot();
431
419
  }
432
420
  if (prev.heatmaps && !this.consent.heatmaps) {
433
421
  this.heatmapQueue = [];
@@ -552,41 +540,10 @@ var Krypton = class {
552
540
  }
553
541
  }
554
542
  }
555
- captureSnapshot() {
556
- if (typeof window === "undefined" || typeof document === "undefined") return;
557
- if (!this.isHeatmapFeatureEnabled()) return;
558
- const currentUrl = window.location.href;
559
- if (this.lastSnapshotUrl === currentUrl) return;
560
- this.lastSnapshotUrl = currentUrl;
561
- setTimeout(() => {
562
- try {
563
- const node = (0, import_rrweb_snapshot.snapshot)(document, {
564
- maskAllInputs: true,
565
- blockSelector: "[data-krypton-block]",
566
- inlineStylesheet: true
567
- });
568
- if (!node) return;
569
- const snapshotJson = JSON.stringify(node);
570
- const payload = {
571
- api_key: this.config.apiKey,
572
- page_url: currentUrl,
573
- snapshot: snapshotJson,
574
- viewport_width: window.innerWidth,
575
- viewport_height: window.innerHeight,
576
- page_width: document.documentElement.scrollWidth,
577
- page_height: document.documentElement.scrollHeight,
578
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
579
- };
580
- void this.safePost(`${this.config.endpoint}/api/v1/snapshot`, payload);
581
- } catch {
582
- }
583
- }, 1e3);
584
- }
585
543
  setupHeatmap() {
586
544
  if (typeof window === "undefined") return;
587
545
  if (this.heatmapSetup) return;
588
546
  this.heatmapSetup = true;
589
- this.captureSnapshot();
590
547
  document.addEventListener("click", (e) => {
591
548
  if (!this.isHeatmapFeatureEnabled()) return;
592
549
  try {
@@ -642,13 +599,13 @@ var Krypton = class {
642
599
  }
643
600
  });
644
601
  }
645
- async safePost(url, payload) {
602
+ async safePost(url, payload, keepalive = true) {
646
603
  try {
647
604
  const res = await fetch(url, {
648
605
  method: "POST",
649
606
  headers: { "Content-Type": "application/json" },
650
607
  body: JSON.stringify(payload),
651
- keepalive: true
608
+ ...keepalive ? { keepalive: true } : {}
652
609
  });
653
610
  if (!res.ok) {
654
611
  this.warn(`API request failed (${res.status})`, { url });
package/dist/index.mjs CHANGED
@@ -1,6 +1,3 @@
1
- // src/index.ts
2
- import { snapshot as rrwebSnapshot } from "rrweb-snapshot";
3
-
4
1
  // src/utils.ts
5
2
  function generateId() {
6
3
  if (typeof crypto !== "undefined" && crypto.randomUUID) {
@@ -86,7 +83,6 @@ var Krypton = class {
86
83
  this.heatmapQueue = [];
87
84
  this.flushTimer = null;
88
85
  this.initialized = false;
89
- this.lastSnapshotUrl = null;
90
86
  this.heatmapSetup = false;
91
87
  this.serverConfig = null;
92
88
  this.configFetched = false;
@@ -272,9 +268,6 @@ var Krypton = class {
272
268
  if (this.config.autoPageview && this.canTrackAnalytics()) {
273
269
  setTimeout(() => this.trackPageview(), 0);
274
270
  }
275
- if (this.isHeatmapFeatureEnabled()) {
276
- setTimeout(() => this.captureSnapshot(), 0);
277
- }
278
271
  } catch (err) {
279
272
  this.warn("pushState hook failed", err);
280
273
  }
@@ -286,9 +279,6 @@ var Krypton = class {
286
279
  if (this.config.autoPageview && this.canTrackAnalytics()) {
287
280
  setTimeout(() => this.trackPageview(), 0);
288
281
  }
289
- if (this.isHeatmapFeatureEnabled()) {
290
- setTimeout(() => this.captureSnapshot(), 0);
291
- }
292
282
  } catch (err) {
293
283
  this.warn("replaceState hook failed", err);
294
284
  }
@@ -298,9 +288,6 @@ var Krypton = class {
298
288
  if (this.config.autoPageview && this.canTrackAnalytics()) {
299
289
  setTimeout(() => this.trackPageview(), 0);
300
290
  }
301
- if (this.isHeatmapFeatureEnabled()) {
302
- setTimeout(() => this.captureSnapshot(), 0);
303
- }
304
291
  } catch (err) {
305
292
  this.warn("popstate hook failed", err);
306
293
  }
@@ -402,7 +389,6 @@ var Krypton = class {
402
389
  }
403
390
  if (!prev.heatmaps && this.isHeatmapFeatureEnabled()) {
404
391
  this.setupHeatmap();
405
- this.captureSnapshot();
406
392
  }
407
393
  if (prev.heatmaps && !this.consent.heatmaps) {
408
394
  this.heatmapQueue = [];
@@ -527,41 +513,10 @@ var Krypton = class {
527
513
  }
528
514
  }
529
515
  }
530
- captureSnapshot() {
531
- if (typeof window === "undefined" || typeof document === "undefined") return;
532
- if (!this.isHeatmapFeatureEnabled()) return;
533
- const currentUrl = window.location.href;
534
- if (this.lastSnapshotUrl === currentUrl) return;
535
- this.lastSnapshotUrl = currentUrl;
536
- setTimeout(() => {
537
- try {
538
- const node = rrwebSnapshot(document, {
539
- maskAllInputs: true,
540
- blockSelector: "[data-krypton-block]",
541
- inlineStylesheet: true
542
- });
543
- if (!node) return;
544
- const snapshotJson = JSON.stringify(node);
545
- const payload = {
546
- api_key: this.config.apiKey,
547
- page_url: currentUrl,
548
- snapshot: snapshotJson,
549
- viewport_width: window.innerWidth,
550
- viewport_height: window.innerHeight,
551
- page_width: document.documentElement.scrollWidth,
552
- page_height: document.documentElement.scrollHeight,
553
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
554
- };
555
- void this.safePost(`${this.config.endpoint}/api/v1/snapshot`, payload);
556
- } catch {
557
- }
558
- }, 1e3);
559
- }
560
516
  setupHeatmap() {
561
517
  if (typeof window === "undefined") return;
562
518
  if (this.heatmapSetup) return;
563
519
  this.heatmapSetup = true;
564
- this.captureSnapshot();
565
520
  document.addEventListener("click", (e) => {
566
521
  if (!this.isHeatmapFeatureEnabled()) return;
567
522
  try {
@@ -617,13 +572,13 @@ var Krypton = class {
617
572
  }
618
573
  });
619
574
  }
620
- async safePost(url, payload) {
575
+ async safePost(url, payload, keepalive = true) {
621
576
  try {
622
577
  const res = await fetch(url, {
623
578
  method: "POST",
624
579
  headers: { "Content-Type": "application/json" },
625
580
  body: JSON.stringify(payload),
626
- keepalive: true
581
+ ...keepalive ? { keepalive: true } : {}
627
582
  });
628
583
  if (!res.ok) {
629
584
  this.warn(`API request failed (${res.status})`, { url });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kryptonhq/analytics",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Krypton Analytics JavaScript SDK — privacy-first analytics tracking",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -27,8 +27,5 @@
27
27
  "tsup": "^8.0.0",
28
28
  "typescript": "^5.4.0"
29
29
  },
30
- "license": "MIT",
31
- "dependencies": {
32
- "rrweb-snapshot": "^2.0.0-alpha.4"
33
- }
30
+ "license": "MIT"
34
31
  }