@li2/analytics 0.3.3 → 0.4.0-beta.1
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/auto-events.global.js +1 -1
- package/dist/auto-events.js +1 -1
- package/dist/auto-events.mjs +1 -1
- package/dist/chunk-4EC35KD3.mjs +1 -0
- package/dist/chunk-5TDT656N.mjs +0 -0
- package/dist/chunk-772JYJV2.mjs +1 -0
- package/dist/chunk-EO7Y3K6L.mjs +1 -0
- package/dist/chunk-FF6VDEL5.mjs +1 -1
- package/dist/chunk-GS2LGTLM.mjs +1 -0
- package/dist/chunk-HWKYLC4Q.mjs +1 -0
- package/dist/chunk-KZDID5T3.mjs +1 -0
- package/dist/chunk-LZDMBCUK.mjs +1 -1
- package/dist/chunk-MURA7RU5.mjs +0 -1
- package/dist/chunk-PGNNL26O.mjs +1 -0
- package/dist/chunk-PSKG2XOE.mjs +1 -0
- package/dist/click-tracker/index.d.mts +13 -0
- package/dist/click-tracker/index.d.ts +13 -0
- package/dist/click-tracker/index.global.js +1 -1
- package/dist/click-tracker/index.js +1 -1
- package/dist/click-tracker/index.mjs +1 -1
- package/dist/{index-B3dzYzIM.d.mts → index-BlPDBYpZ.d.mts} +9 -2
- package/dist/{index-B3dzYzIM.d.ts → index-BlPDBYpZ.d.ts} +9 -2
- package/dist/index.d.mts +28 -2
- package/dist/index.d.ts +28 -2
- package/dist/index.global.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/interaction-batch-sender-E3M77C4U.mjs +1 -0
- package/dist/interaction-batch-sender-GVPPBMES.mjs +1 -0
- package/dist/interaction-batch-sender-PLC6EBSJ.mjs +1 -0
- package/dist/interaction-batch-sender-S4752CBB.mjs +0 -0
- package/dist/outbound.global.js +1 -1
- package/dist/outbound.js +1 -1
- package/dist/outbound.mjs +1 -1
- package/dist/pageview/index.d.mts +1 -1
- package/dist/pageview/index.d.ts +1 -1
- package/dist/pageview/index.global.js +1 -1
- package/dist/pageview/index.js +1 -1
- package/dist/pageview/index.mjs +1 -1
- package/dist/scroll-tracker-YQKUW7A7.mjs +1 -0
- package/dist/toolbar/index.d.mts +4 -3
- package/dist/toolbar/index.d.ts +4 -3
- package/dist/toolbar/index.global.js +51 -2
- package/dist/toolbar/index.js +51 -2
- package/dist/toolbar/index.mjs +51 -2
- package/package.json +13 -12
package/dist/pageview/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as c}from"../chunk-772JYJV2.mjs";import{a as h}from"../chunk-EO7Y3K6L.mjs";import{a as g}from"../chunk-LZDMBCUK.mjs";var d={enabled:!0,spaMode:"auto",batchInterval:5e3,batchSize:50,excludePatterns:[],trackHashChanges:!1,sessionTimeout:30,cookieLessMode:!1,debug:!1,respectDnt:!0,cookiePath:"/",searchParams:["q","query","search","s","keyword"]};var r=class{constructor(e){this.started=!1;this.originalPushState=null;this.originalReplaceState=null;this.handlePopState=null;this.handleHashChange=null;this.config=e,this.currentUrl=window.location.href}start(){this.started||(this.started=!0,this.config.spaMode!=="disabled"&&(this.patchHistoryApi(),this.listenPopState()),this.config.trackHashChanges&&this.listenHashChange())}stop(){this.started&&(this.started=!1,this.restoreHistoryApi(),this.removeListeners())}patchHistoryApi(){let e=this;this.originalPushState=history.pushState.bind(history),this.originalReplaceState=history.replaceState.bind(history),history.pushState=function(...t){e.originalPushState(...t),e.checkUrlChange()},history.replaceState=function(...t){e.originalReplaceState(...t),e.checkUrlChange()}}restoreHistoryApi(){this.originalPushState&&(history.pushState=this.originalPushState,this.originalPushState=null),this.originalReplaceState&&(history.replaceState=this.originalReplaceState,this.originalReplaceState=null)}listenPopState(){this.handlePopState=()=>this.checkUrlChange(),window.addEventListener("popstate",this.handlePopState)}listenHashChange(){this.handleHashChange=()=>this.checkUrlChange(),window.addEventListener("hashchange",this.handleHashChange)}removeListeners(){this.handlePopState&&(window.removeEventListener("popstate",this.handlePopState),this.handlePopState=null),this.handleHashChange&&(window.removeEventListener("hashchange",this.handleHashChange),this.handleHashChange=null)}checkUrlChange(){requestAnimationFrame(()=>{let e=window.location.href;e!==this.currentUrl&&(this.currentUrl=e,this.config.onPageChange(e))})}};var o=class{constructor(e){this.buffer=[];this.timer=null;this.started=!1;this.handleBeforeUnload=null;this.handleVisibilityChange=null;this.config=e}start(){this.started||(this.started=!0,this.timer=setInterval(()=>this.flush(),this.config.batchInterval),this.handleBeforeUnload=()=>this.flush(!0),window.addEventListener("beforeunload",this.handleBeforeUnload),this.handleVisibilityChange=()=>{document.visibilityState==="hidden"&&this.flush(!0)},document.addEventListener("visibilitychange",this.handleVisibilityChange))}stop(){this.started&&(this.started=!1,this.flush(!0),this.timer&&(clearInterval(this.timer),this.timer=null),this.handleBeforeUnload&&(window.removeEventListener("beforeunload",this.handleBeforeUnload),this.handleBeforeUnload=null),this.handleVisibilityChange&&(document.removeEventListener("visibilitychange",this.handleVisibilityChange),this.handleVisibilityChange=null))}add(e){this.buffer.push(e),this.buffer.length>=this.config.batchSize&&this.flush()}getBufferSize(){return this.buffer.length}flush(e=!1){if(this.buffer.length===0)return;let t=this.buffer.splice(0,this.config.batchSize),i={pageviews:t},a=`${this.config.apiUrl}/api/v1/track/pageview`;if(e&&navigator.sendBeacon){let n={...i,sdk_version:h},s=`${a}?li2_key=${encodeURIComponent(this.config.publishableKey)}`,p=new Blob([JSON.stringify(n)],{type:"application/json"});navigator.sendBeacon(s,p)?this.log(`Beacon sent: ${t.length} pageviews`):this.sendViaFetch(a,JSON.stringify(i),t)}else{let n=JSON.stringify(i);this.sendViaFetch(a,n,t)}this.buffer.length>0&&this.flush(e)}sendViaFetch(e,t,i){fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Li2-Key":this.config.publishableKey,"X-Li2-SDK-Version":h},body:t,keepalive:!0}).then(a=>{a.ok?this.log(`Sent: ${i.length} pageviews`):(this.log(`Send failed: ${a.status}, re-queuing ${i.length} events`),this.buffer.unshift(...i))}).catch(()=>{this.log(`Network error, re-queuing ${i.length} events`),this.buffer.unshift(...i)})}log(...e){this.config.debug&&console.log("[Li2 BatchSender]",...e)}};var u=class{constructor(e){this.lastPageUrl=null;this.lastPageTimestamp=null;this.config={...d,...e},this.enabled=this.config.enabled,this.config.respectDnt&&navigator.doNotTrack==="1"&&(this.enabled=!1,this.log("DNT enabled, pageview tracking disabled")),this.sessionManager=new g({timeout:this.config.sessionTimeout,cookieLessMode:this.config.cookieLessMode,cookieDomain:this.config.cookieDomain,cookiePath:this.config.cookiePath}),this.batchSender=new o({apiUrl:this.config.apiUrl,publishableKey:this.config.publishableKey,batchInterval:this.config.batchInterval,batchSize:this.config.batchSize,debug:this.config.debug}),this.pageDetector=new r({spaMode:this.config.spaMode,trackHashChanges:this.config.trackHashChanges,onPageChange:t=>this.handlePageChange(t)})}start(){this.enabled&&(this.pageDetector.start(),this.batchSender.start(),this.trackCurrentPage(),this.log("PageviewTracker started"))}stop(){this.pageDetector.stop(),this.batchSender.stop(),this.enabled=!1,this.log("PageviewTracker stopped")}enable(){this.enabled=!0,this.start()}disable(){this.stop()}newSession(){this.sessionManager.createNewSession(),this.log("New session created")}trackPageview(e){if(!this.enabled)return;let t=e?.pageUrl||window.location.href;this.handlePageChange(t,e?.pageTitle)}trackEvent(e,t){if(!this.enabled)return;let i=this.buildPageviewEvent(window.location.href);i.event_name=e,t?.category&&(i.event_category=t.category),this.batchSender.add(i),this.sessionManager.touch(),this.log("Event tracked:",e)}handlePageChange(e,t){if(!this.enabled)return;let i=new URL(e,window.location.origin).pathname;if(!c(i,this.config.dataCollectionRules,this.config.debug)){this.log(`Path excluded from tracking: ${i}`);return}if(this.config.excludePatterns.length>0&&this.isExcluded(i)){this.log(`Excluded by pattern: ${i}`);return}let a=Date.now(),n=this.lastPageTimestamp?a-this.lastPageTimestamp:null,s=this.buildPageviewEvent(e,t,n);this.sessionManager.touch(),this.batchSender.add(s),this.lastPageUrl=e,this.lastPageTimestamp=a,this.log("Pageview tracked:",s.page_path),this.config.onRouteChange?.()}buildPageviewEvent(e,t,i){let a=new URL(e,window.location.origin);return{session_id:this.sessionManager.getSessionId(),visitor_id:this.sessionManager.getVisitorId(),li2_cid:this.getLi2Cid(),page_url:a.href,page_path:a.pathname,page_title:t||document.title,page_referrer:this.lastPageUrl||document.referrer,page_hash:a.hash,search_query:this.extractSearchQuery(a),timestamp:Date.now(),time_on_page:i??null,screen_width:window.screen.width,screen_height:window.screen.height,viewport_width:window.innerWidth,viewport_height:window.innerHeight}}trackCurrentPage(){this.handlePageChange(window.location.href)}isExcluded(e){return this.config.excludePatterns.some(t=>{let i=t.replace(/\*\*|\*/g,a=>a==="**"?".*":"[^/]*");return new RegExp(`^${i}$`).test(e)})}extractSearchQuery(e){for(let t of this.config.searchParams){let i=e.searchParams.get(t);if(i)return i}return null}getLi2Cid(){let t=new URL(window.location.href).searchParams.get("uid");if(t)return t;let i=document.cookie.match(/(^| )li_cid=([^;]+)/);if(i)return i[2];let a=document.cookie.match(/(^| )li2_id=([^;]+)/);return a?a[2]:null}log(...e){this.config.debug&&console.log("[Li2 Pageview]",...e)}};export{u as PageviewTracker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(_0x52633a,_0x5cd956){const _0x455c8f={_0x37c759:0x38a,_0x546e18:0x3b4,_0x39f4b2:0x3d4,_0x571255:0x37e,_0x243716:0x3a0,_0x291d75:0x375,_0x34f3cb:0x30f,_0x8e11be:0x2f5,_0x5aef55:0x34c,_0x3278c0:0x340,_0xa2496d:0x36b,_0x5ed4e8:0x351,_0xa964eb:0x3ab,_0x550f5a:0x3c0,_0x305b2c:0x3da,_0x208ac1:0x3b7,_0x201e0d:0x39b,_0x3928d4:0x3a8,_0x745645:0x36d,_0xea029a:0x38b,_0x41b34f:0x366,_0x56c78a:0x3a4},_0x4655be=_0x52633a();function _0x38aad1(_0x6a5903,_0x28c16a,_0x2ff5da,_0x2af9bd){return _0x2713(_0x2ff5da-0x271,_0x28c16a);}function _0x27bf6c(_0x3d2811,_0x1e9b9f,_0x51b1e5,_0x4009db){return _0x2713(_0x51b1e5-0x213,_0x1e9b9f);}while(!![]){try{const _0x578287=-parseInt(_0x38aad1(0x38a,_0x455c8f._0x37c759,_0x455c8f._0x546e18,0x38a))/(0x418+0x1f8b+0x23a2*-0x1)+-parseInt(_0x38aad1(_0x455c8f._0x39f4b2,_0x455c8f._0x571255,_0x455c8f._0x243716,_0x455c8f._0x291d75))/(0x180*-0x1a+-0xd3a+0x1a1e*0x2)*(parseInt(_0x27bf6c(0x322,0x312,_0x455c8f._0x34f3cb,_0x455c8f._0x8e11be))/(-0x239a+0x359*-0x1+0x2*0x137b))+-parseInt(_0x27bf6c(_0x455c8f._0x5aef55,_0x455c8f._0x3278c0,_0x455c8f._0xa2496d,0x362))/(-0x5*-0x349+-0x9c*-0x12+-0x1b61)+-parseInt(_0x27bf6c(0x350,0x32c,_0x455c8f._0x5ed4e8,0x327))/(-0xe40+0x23ae+-0x1569)*(parseInt(_0x38aad1(0x37e,0x3be,_0x455c8f._0xa964eb,0x387))/(0xab*0x4+-0x258d*0x1+0x22e7))+parseInt(_0x38aad1(_0x455c8f._0x550f5a,_0x455c8f._0x305b2c,_0x455c8f._0x208ac1,_0x455c8f._0x201e0d))/(-0x3*0x80d+0x261c+-0xdee)+parseInt(_0x38aad1(_0x455c8f._0x3928d4,0x399,0x3c2,_0x455c8f._0x3928d4))/(0x11d7+-0x1*0x1df9+0xc2a*0x1)*(parseInt(_0x27bf6c(_0x455c8f._0x745645,0x350,0x33d,0x361))/(0xb63+-0x135c+0x401*0x2))+-parseInt(_0x27bf6c(_0x455c8f._0xea029a,_0x455c8f._0x41b34f,0x362,0x37f))/(0x24ef+-0x1f33+0xa2*-0x9)*(-parseInt(_0x38aad1(_0x455c8f._0x56c78a,0x3d4,0x3bb,0x3af))/(-0x635*-0x6+0x1*0x15e9+-0x3b1c*0x1));if(_0x578287===_0x5cd956)break;else _0x4655be['push'](_0x4655be['shift']());}catch(_0x963065){_0x4655be['push'](_0x4655be['shift']());}}}(_0xcb42,0xcbb11+0x1f0b3+-0x1*0x5994a));import{a as _0x2cf2c6}from'./chunk-LZDMBCUK.mjs';var c=[-0x453+0xb*-0x17b+0x9*0x24d,-0xd5*0x1+0x2534+0xbd*-0x31,-0x15c5+-0x962+0x7*0x47e,0xb0f*0x3+-0x1cb6+-0x41d,-0x300+0x4*-0x515+0x4*0x5ee];function d(_0x2b4d68){const _0x315e6c={_0x3c2996:0x1f0,_0xbcc5b6:0x209,_0x56fbfd:0x1b9,_0x24eb46:0x1e2},_0x110d88={_0xf34b4d:0x27f},_0x5f4958={'OUMaj':function(_0x3484a4,_0x58af89){return _0x3484a4===_0x58af89;},'fKlWx':function(_0x45a8fb,_0x32bb55){return _0x45a8fb(_0x32bb55);}};let _0x23f8d2=null;return()=>{function _0x5ac3d7(_0x22191c,_0x2e9b4b,_0x28f53b,_0x3e2c3e){return _0x2713(_0x3e2c3e-0xdf,_0x2e9b4b);}function _0x2219ed(_0x546a8c,_0x5314e7,_0x5068a1,_0x675785){return _0x2713(_0x675785- -_0x110d88._0xf34b4d,_0x5068a1);}_0x5f4958[_0x5ac3d7(0x236,0x1d0,_0x315e6c._0x3c2996,0x204)](_0x23f8d2,null)&&(_0x23f8d2=_0x5f4958[_0x5ac3d7(_0x315e6c._0xbcc5b6,_0x315e6c._0x56fbfd,0x1b0,_0x315e6c._0x24eb46)](requestAnimationFrame,()=>{_0x2b4d68(),_0x23f8d2=null;}));};}function _0x2713(_0x545a04,_0x53422a){_0x545a04=_0x545a04-(-0xa81+0xa95+0xa*0x17);const _0x17f9f3=_0xcb42();let _0x33680c=_0x17f9f3[_0x545a04];if(_0x2713['LNzriJ']===undefined){var _0x11f194=function(_0x595fe8){const _0x34460f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x388a7a='',_0x834b58='';for(let _0x1d0c28=-0x245b+-0x448*0x4+0x1*0x357b,_0x2bcf78,_0x3a4cae,_0x504a0c=0x64c+-0x1bc9+0x1*0x157d;_0x3a4cae=_0x595fe8['charAt'](_0x504a0c++);~_0x3a4cae&&(_0x2bcf78=_0x1d0c28%(0xc5c+-0x1014+0x3bc)?_0x2bcf78*(0x12*0xb3+0x15d0+-0x2226)+_0x3a4cae:_0x3a4cae,_0x1d0c28++%(-0x1d2a*0x1+-0x57*0x27+-0x3*-0xe25))?_0x388a7a+=String['fromCharCode'](-0x6d+0xe73+-0x5*0x29b&_0x2bcf78>>(-(-0x39e+0x1a77+-0x16d7*0x1)*_0x1d0c28&0x1fca+0x1*-0x1e01+0x1c3*-0x1)):0x49*0xd+0x131e+-0x16d3){_0x3a4cae=_0x34460f['indexOf'](_0x3a4cae);}for(let _0x45acf4=0x10ad+-0x355+-0xd58,_0x5e6909=_0x388a7a['length'];_0x45acf4<_0x5e6909;_0x45acf4++){_0x834b58+='%'+('00'+_0x388a7a['charCodeAt'](_0x45acf4)['toString'](0x72c*-0x3+0x1ad3+0x11*-0x4f))['slice'](-(-0xfbb+-0x1*0x10d+0x2*0x865));}return decodeURIComponent(_0x834b58);};_0x2713['AgxuUE']=_0x11f194,_0x2713['YbOlZc']={},_0x2713['LNzriJ']=!![];}const _0x3c0dcb=_0x17f9f3[-0x1e69+0x19de+0x48b*0x1],_0x19f039=_0x545a04+_0x3c0dcb,_0x2fd81f=_0x2713['YbOlZc'][_0x19f039];return!_0x2fd81f?(_0x33680c=_0x2713['AgxuUE'](_0x33680c),_0x2713['YbOlZc'][_0x19f039]=_0x33680c):_0x33680c=_0x2fd81f,_0x33680c;}var a=class{constructor(_0x314e76,_0x4506fe){const _0x271a76={_0x22d825:0x3ed,_0x2888c3:0x401,_0x19b551:0x3f5,_0x482175:0x1d0,_0x355fe7:0x1e4,_0x4d49f2:0x203,_0x4c6892:0x420,_0x493ef8:0x3fc,_0x5a19ed:0x3b6,_0x4981e0:0x449,_0x5cf1de:0x42b,_0x16e374:0x429,_0x1c351f:0x45a,_0x9306bd:0x1ca,_0x27af87:0x1dc,_0x4c087c:0x1d4,_0x58ad05:0x1b2,_0x4c8ea6:0x1a3,_0x28bc3a:0x40d,_0x67840c:0x43e,_0x4eb2c0:0x1b4,_0x325d6b:0x1aa,_0x501d9d:0x1cb,_0x5bedb8:0x1fb,_0x30f725:0x228,_0x44a919:0x417,_0x41331e:0x3fb,_0x276847:0x1ce,_0x3c8016:0x1c4,_0x10b16d:0x1e9,_0x371e91:0x1df,_0x4f0faf:0x18c,_0x2dd21c:0x1d6,_0x18f153:0x1bd,_0x1a5a06:0x1f4,_0x2cc9fa:0x400,_0x48a0b4:0x426,_0x567dc9:0x411,_0x1c6218:0x1ad,_0x2c6718:0x1b3,_0x103001:0x1c5,_0xe2967f:0x1df,_0x283533:0x1d9,_0x762d5c:0x409,_0x238367:0x410,_0x4a2901:0x3ed,_0x13ca19:0x3d4,_0x2349b9:0x173,_0x4a0833:0x20b,_0x21726a:0x1fc,_0x538513:0x1c0,_0x2bcd23:0x191},_0x4d68f7={_0x18e358:0x2c9},_0x275470={_0x20bc5a:0x2f6},_0x1d2cda={};_0x1d2cda[_0x43a363(_0x271a76._0x22d825,_0x271a76._0x2888c3,0x420,_0x271a76._0x19b551)]=_0x5596a4(-_0x271a76._0x482175,-_0x271a76._0x355fe7,-0x1d5,-_0x271a76._0x4d49f2)+'6|4|2';function _0x5596a4(_0x5d61af,_0x15e9fe,_0x329bf8,_0x21efc5){return _0x2713(_0x15e9fe- -_0x275470._0x20bc5a,_0x329bf8);}function _0x43a363(_0x17c8e4,_0x2a55ed,_0x956ec4,_0x5ae1eb){return _0x2713(_0x956ec4-_0x4d68f7._0x18e358,_0x2a55ed);}const _0x47a522=_0x1d2cda,_0x5101a6=_0x47a522[_0x43a363(0x453,0x3f2,_0x271a76._0x4c6892,0x422)]['split']('|');let _0x1c8d2c=-0x1756+0x5*-0x482+-0xb78*-0x4;while(!![]){switch(_0x5101a6[_0x1c8d2c++]){case'0':this['lastMilest'+_0x43a363(_0x271a76._0x493ef8,_0x271a76._0x5a19ed,0x3ce,0x3d6)]=-0xe74+0x1*-0x1cac+0x2b20;continue;case'1':this[_0x43a363(_0x271a76._0x4981e0,_0x271a76._0x5cf1de,_0x271a76._0x16e374,_0x271a76._0x1c351f)+'ll']=null;continue;case'2':this[_0x5596a4(-_0x271a76._0x9306bd,-_0x271a76._0x27af87,-_0x271a76._0x4c087c,-0x208)]=_0x314e76,this[_0x5596a4(-0x1de,-_0x271a76._0x58ad05,-_0x271a76._0x355fe7,-_0x271a76._0x4c8ea6)]=(_0x314e76[_0x43a363(0x3f2,0x425,_0x271a76._0x28bc3a,_0x271a76._0x67840c)]||c)[_0x5596a4(-_0x271a76._0x4eb2c0,-0x197,-_0x271a76._0x325d6b,-_0x271a76._0x325d6b)]()[_0x5596a4(-_0x271a76._0x501d9d,-_0x271a76._0x5bedb8,-_0x271a76._0x30f725,-0x1fd)]((_0x20c110,_0x1dad3d)=>_0x20c110-_0x1dad3d),this[_0x43a363(0x3f5,_0x271a76._0x44a919,0x40e,0x432)+'r']=_0x4506fe,this[_0x43a363(0x3d5,_0x271a76._0x41331e,0x3e2,0x3b9)+'ager']=new _0x2cf2c6({'timeout':_0x314e76[_0x5596a4(-_0x271a76._0x276847,-0x1c6,-0x19f,-0x1e0)+_0x5596a4(-0x1b1,-0x1b6,-_0x271a76._0x3c8016,-_0x271a76._0x10b16d)],'cookieLessMode':_0x314e76['cookieLess'+_0x5596a4(-_0x271a76._0x371e91,-0x1c0,-0x1b3,-_0x271a76._0x4f0faf)],'cookieDomain':_0x314e76[_0x5596a4(-_0x271a76._0x2dd21c,-_0x271a76._0x2dd21c,-_0x271a76._0x18f153,-_0x271a76._0x1a5a06)+'in'],'cookiePath':_0x314e76[_0x43a363(0x43f,_0x271a76._0x2cc9fa,_0x271a76._0x48a0b4,_0x271a76._0x567dc9)]});continue;case'3':this[_0x5596a4(-_0x271a76._0x1c6218,-0x19c,-_0x271a76._0x2c6718,-0x1cc)+_0x5596a4(-0x1f5,-0x1c9,-_0x271a76._0x103001,-0x1c7)]=-0x1*0x16ee+-0x9*0x2f9+0xa1*0x4f;continue;case'4':this[_0x5596a4(-_0x271a76._0xe2967f,-_0x271a76._0x283533,-0x1c8,-0x1b2)+_0x43a363(_0x271a76._0x762d5c,0x3d4,0x3ef,_0x271a76._0x238367)]=null;continue;case'5':this[_0x5596a4(-0x1ef,-0x1bf,-0x1c8,-0x1ad)+_0x43a363(_0x271a76._0x4a2901,0x401,_0x271a76._0x13ca19,0x3e7)]=-0x13d6+0xa29+-0x9ad*-0x1;continue;case'6':this[_0x5596a4(-0x1cb,-0x1a6,-0x1a1,-_0x271a76._0x2349b9)+_0x5596a4(-_0x271a76._0x4a0833,-0x1e9,-_0x271a76._0x21726a,-0x1ff)+'ge']=null;continue;case'7':this[_0x5596a4(-_0x271a76._0x538513,-_0x271a76._0x103001,-_0x271a76._0x2bcd23,-0x1c9)]=!(-0x2f*-0x11+0x11c+0x43a*-0x1);continue;}break;}}[_0x59aeb3(-0x1a9,-0x185,-0x16b,-0x184)](){const _0x34dab1={_0x564227:0x161,_0x5986ae:0x165,_0xc2c93f:0x29,_0xe614d:0x63,_0x4eea87:0x5b,_0x308c3c:0x153,_0x4844d5:0x166,_0x41c0d2:0x135,_0x34cd26:0x62,_0xc08b21:0x54,_0x39e12b:0x50,_0x33289c:0x5a,_0x459f94:0x59,_0x396521:0x2e,_0x20e12e:0x5e,_0x3879b5:0x14f,_0x280d29:0x143,_0x5a4c13:0x128,_0x7eafb5:0x13d,_0x474a60:0x73,_0x36bac9:0x74,_0x27a69a:0x4f,_0x41560f:0x1a8,_0x1861f0:0x43,_0x36cdb7:0x15,_0x2b3696:0x30,_0x58f550:0x15d,_0x192b2d:0x149,_0x25797a:0x67,_0x51c9d9:0x4e,_0x314acc:0x171,_0x15c4f5:0x167,_0x3e8778:0x163,_0x2286cb:0x1f,_0x1665d0:0x3a,_0x1db78f:0x20,_0x116536:0x40,_0x10da4d:0x27,_0x4f2a14:0x27,_0xc78552:0x66,_0x489195:0x68,_0x54f24:0x7f,_0x582c8d:0x6b,_0x5464c2:0x58,_0x3c342c:0x46,_0x2dacf8:0x1d,_0x1d1c06:0x4d,_0x8d7ef1:0xa0,_0x1588e9:0x99,_0x443131:0x60,_0x516d59:0x7c},_0x9a7c74={_0x5d65a0:0x47b,_0xaeed4a:0x127,_0x1c3b87:0x143,_0x1ba707:0x14f},_0x41f989={_0x25ac27:0x1e1,_0x292511:0x1ab},_0x1bf083={_0x5afa57:0x2bd},_0x2dae92={'Onllt':_0x5c3c6b(0x177,0x148,_0x34dab1._0x564227,_0x34dab1._0x5986ae),'WOMDu':function(_0x24202e,_0x50e2cd){return _0x24202e(_0x50e2cd);},'sCFlZ':_0x22cd17(_0x34dab1._0xc2c93f,0x41,_0x34dab1._0xe614d,_0x34dab1._0x4eea87),'WqjPQ':'visibility'+_0x5c3c6b(_0x34dab1._0x308c3c,_0x34dab1._0x4844d5,_0x34dab1._0x41c0d2,0x175),'CYFUk':_0x22cd17(0x47,0x59,0x66,0x3e)+'ker\x20starte'+'d'};function _0x22cd17(_0x487fb0,_0x3f2558,_0xd63dda,_0x396786){return _0x59aeb3(_0x487fb0-0x65,_0x3f2558-0x161,_0xd63dda,_0x396786-0x1bf);}const _0x480107={};_0x480107['passive']=!(-0xdf1*0x1+-0x116f*-0x2+-0x14ed);function _0x5c3c6b(_0x5a203f,_0x36adc5,_0x184e18,_0x18a2b6){return _0x59aeb3(_0x5a203f-0xf9,_0x36adc5-0x11a,_0x184e18,_0x5a203f-_0x1bf083._0x5afa57);}this['started']||(this[_0x22cd17(_0x34dab1._0x34cd26,0x76,0x50,_0x34dab1._0xc08b21)]=!(0x1*-0x62e+0x2259+-0x1c2b),this['resetState'](),this[_0x22cd17(0x46,_0x34dab1._0x39e12b,0x66,_0x34dab1._0x33289c)+_0x22cd17(0x56,_0x34dab1._0x459f94,0x3f,_0x34dab1._0x396521)]=Date[_0x22cd17(0x62,0x47,0x89,_0x34dab1._0x20e12e)](),this['handleScro'+'ll']=_0x2dae92[_0x5c3c6b(_0x34dab1._0x3879b5,0x15e,_0x34dab1._0x280d29,_0x34dab1._0x5a4c13)](d,()=>this['onScroll']()),window['addEventLi'+_0x5c3c6b(0x15d,0x184,_0x34dab1._0x7eafb5,0x140)](_0x2dae92[_0x22cd17(_0x34dab1._0x474a60,_0x34dab1._0x36bac9,0x7d,_0x34dab1._0x27a69a)],this[_0x5c3c6b(0x181,_0x34dab1._0x41560f,0x184,0x1a5)+'ll'],_0x480107),this[_0x5c3c6b(0x171,0x19e,0x175,0x19e)+_0x22cd17(0x34,_0x34dab1._0x1861f0,_0x34dab1._0x36cdb7,_0x34dab1._0x2b3696)+'ge']=()=>{const _0x3ad7a0={_0x4b98ae:0x286,_0x2ba9f4:0x61};function _0x3e78a4(_0x1a91b6,_0x3e6abe,_0x4241df,_0x170800){return _0x5c3c6b(_0x3e6abe-0x331,_0x3e6abe-_0x41f989._0x25ac27,_0x1a91b6,_0x170800-_0x41f989._0x292511);}function _0x10f170(_0x199137,_0x15db9a,_0x4ba67d,_0x51dcf1){return _0x5c3c6b(_0x4ba67d- -_0x3ad7a0._0x4b98ae,_0x15db9a-_0x3ad7a0._0x2ba9f4,_0x199137,_0x51dcf1-0x199);}document['visibility'+'State']===_0x2dae92[_0x3e78a4(0x458,_0x9a7c74._0x5d65a0,0x460,0x4a2)]&&this[_0x10f170(-0x151,-_0x9a7c74._0xaeed4a,-_0x9a7c74._0x1c3b87,-_0x9a7c74._0x1ba707)+'nt'](!(0x1dd5*-0x1+-0x1*0x1c97+0x3a6c));},document[_0x5c3c6b(0x132,0x119,0x133,_0x34dab1._0x58f550)+_0x5c3c6b(0x15d,_0x34dab1._0x192b2d,0x130,_0x34dab1._0x308c3c)](_0x2dae92[_0x22cd17(_0x34dab1._0x25797a,_0x34dab1._0x1861f0,0x3d,_0x34dab1._0x51c9d9)],this[_0x5c3c6b(_0x34dab1._0x314acc,_0x34dab1._0x15c4f5,0x19e,_0x34dab1._0x3e8778)+'bilityChan'+'ge']),this[_0x22cd17(_0x34dab1._0x2286cb,_0x34dab1._0x1665d0,_0x34dab1._0x1db78f,_0x34dab1._0x116536)+_0x22cd17(0x69,0x2e,_0x34dab1._0x10da4d,0x49)]=()=>this[_0x22cd17(0x74,0x4f,0x15,0x45)+'nt'](!(-0xd*-0x1b1+-0x13a*0x9+0xaf3*-0x1)),window[_0x22cd17(_0x34dab1._0x4f2a14,_0x34dab1._0xc78552,_0x34dab1._0x489195,0x34)+_0x22cd17(_0x34dab1._0x54f24,0x65,0x42,0x5f)](_0x22cd17(0x1c,_0x34dab1._0x582c8d,_0x34dab1._0x5464c2,_0x34dab1._0x3c342c)+'ad',this['handleBefo'+_0x22cd17(_0x34dab1._0x2dacf8,_0x34dab1._0x1d1c06,0x4a,0x49)]),this[_0x22cd17(_0x34dab1._0x8d7ef1,_0x34dab1._0x1588e9,_0x34dab1._0x443131,_0x34dab1._0x516d59)](_0x2dae92['CYFUk']));}[_0x1d6706(0x337,0x354,0x368,0x33d)](){const _0x1dd5e6={_0x429e48:0x80,_0x557fe6:0x96,_0x15a61b:0x8d,_0x48ebc0:0x7d,_0x580368:0x1be,_0x193d71:0x199,_0x367186:0x1ad,_0x11f978:0x6a,_0x1bf642:0x78,_0x50e4f6:0x1b2,_0x569bb5:0x1bc,_0x32465e:0x47,_0x2f7cc7:0x78,_0x2afe81:0x37,_0x3e35fe:0x196,_0x35e452:0x16a,_0x426976:0x198,_0x3c6c32:0x18d,_0x39dd44:0x17a,_0x44ce5b:0x155,_0x4daef3:0x19d,_0x1fb363:0x79,_0xdcb818:0x19f,_0x5aca61:0x1c3,_0x1b1d73:0x1b7,_0x471247:0x1cf,_0x14a433:0x1ff,_0x48131d:0x1f8,_0x47a668:0xa3,_0x161b69:0x8b,_0x5bdf27:0x194,_0xb86108:0x161,_0x5f3030:0x1bd,_0x594944:0x1f1,_0x2d0367:0xae,_0x421707:0x1c9,_0x1109f3:0x1d1,_0x1dc746:0x1a1,_0x3d941d:0x192,_0x114da8:0x1fe,_0x409107:0x195,_0x379f02:0x65,_0x5e3d3c:0x4c,_0x513da5:0x89,_0x14bf99:0x65,_0x371d01:0x32,_0x562409:0x52,_0x216c42:0x83,_0x4bf4e6:0x1b6,_0xdb1549:0x9e,_0x1fb680:0x1db,_0xfc7345:0x1bb},_0x1b2075={_0x5f5bf2:0xdf},_0x40a628={_0xf603c2:0x113};function _0x2c196b(_0xbd74e2,_0x23fa0f,_0x4e4d0f,_0x3976b9){return _0x1d6706(_0xbd74e2- -0x291,_0x4e4d0f,_0x4e4d0f-_0x40a628._0xf603c2,_0x3976b9-0x1d5);}const _0x497028={};function _0x30d53a(_0x37646e,_0x48778d,_0x4b645c,_0x3d5ea4){return _0x59aeb3(_0x37646e-_0x1b2075._0x5f5bf2,_0x48778d-0x108,_0x4b645c,_0x48778d- -0x2e);}_0x497028[_0x2c196b(0x69,0x7f,0x4d,0x6f)]=_0x2c196b(_0x1dd5e6._0x429e48,_0x1dd5e6._0x557fe6,_0x1dd5e6._0x15a61b,_0x1dd5e6._0x48ebc0);const _0x3a3d38=_0x497028;this['started']&&(this[_0x30d53a(-_0x1dd5e6._0x580368,-_0x1dd5e6._0x193d71,-_0x1dd5e6._0x367186,-0x19b)]=!(0x1*0x61+-0xb1*0x1+0x51),this[_0x2c196b(_0x1dd5e6._0x11f978,0x8a,0x4f,_0x1dd5e6._0x1bf642)+'nt'](!(0xc1a+-0x120c+-0x5f2*-0x1)),this['handleScro'+'ll']&&(window[_0x30d53a(-_0x1dd5e6._0x50e4f6,-0x1c3,-_0x1dd5e6._0x569bb5,-0x1eb)+_0x2c196b(_0x1dd5e6._0x32465e,_0x1dd5e6._0x2f7cc7,0x2b,_0x1dd5e6._0x2afe81)](_0x3a3d38['aHLUO'],this[_0x30d53a(-_0x1dd5e6._0x3e35fe,-_0x1dd5e6._0x35e452,-0x14b,-_0x1dd5e6._0x426976)+'ll']),this['handleScro'+'ll']=null),this[_0x30d53a(-_0x1dd5e6._0x3c6c32,-_0x1dd5e6._0x39dd44,-_0x1dd5e6._0x44ce5b,-_0x1dd5e6._0x4daef3)+_0x2c196b(0x55,0x33,0x5b,_0x1dd5e6._0x1fb363)+'ge']&&(document[_0x30d53a(-_0x1dd5e6._0xdcb818,-_0x1dd5e6._0x5aca61,-_0x1dd5e6._0x1b1d73,-_0x1dd5e6._0x471247)+_0x30d53a(-_0x1dd5e6._0x14a433,-0x1cb,-_0x1dd5e6._0x48131d,-0x1b6)](_0x2c196b(0x67,0x94,0x8d,0x34)+_0x2c196b(0x7a,0x96,_0x1dd5e6._0x47a668,_0x1dd5e6._0x161b69),this[_0x30d53a(-0x169,-0x17a,-_0x1dd5e6._0x5bdf27,-_0x1dd5e6._0xb86108)+_0x30d53a(-0x1b4,-_0x1dd5e6._0x5f3030,-_0x1dd5e6._0x594944,-0x1a1)+'ge']),this[_0x2c196b(0x98,0x8e,_0x1dd5e6._0x2d0367,0xa1)+_0x30d53a(-_0x1dd5e6._0x421707,-0x1bd,-_0x1dd5e6._0x1109f3,-_0x1dd5e6._0x1dc746)+'ge']=null),this[_0x30d53a(-_0x1dd5e6._0x3d941d,-0x1ad,-0x188,-_0x1dd5e6._0x426976)+'reUnload']&&(window['removeEven'+_0x30d53a(-_0x1dd5e6._0x114da8,-0x1cb,-0x1c8,-_0x1dd5e6._0x14a433)](_0x30d53a(-_0x1dd5e6._0x569bb5,-0x1a7,-_0x1dd5e6._0x409107,-0x193)+'ad',this[_0x2c196b(_0x1dd5e6._0x379f02,_0x1dd5e6._0x5e3d3c,_0x1dd5e6._0x513da5,0x6b)+'reUnload']),this[_0x2c196b(_0x1dd5e6._0x14bf99,_0x1dd5e6._0x371d01,_0x1dd5e6._0x562409,_0x1dd5e6._0x216c42)+_0x30d53a(-0x19a,-0x1a4,-_0x1dd5e6._0x4bf4e6,-0x1ad)]=null),this[_0x2c196b(0xa1,0x81,_0x1dd5e6._0xdb1549,0x75)]('ScrollTrac'+_0x30d53a(-_0x1dd5e6._0x1fb680,-_0x1dd5e6._0xfc7345,-_0x1dd5e6._0x5aca61,-0x187)+'d'));}[_0x59aeb3(-0x16a,-0x171,-0x169,-0x189)](){const _0x304bfd={_0x37887e:0x1ed,_0x52b209:0x222,_0x479851:0x213,_0x5097bb:0x1d4,_0x368bc3:0x1a5,_0x8a2e50:0x1d9,_0xe134c2:0x1a5,_0x3cfb8b:0x205,_0x3f1d12:0x210,_0x36066b:0x233,_0x5d700a:0x22e,_0x5994be:0x1a3,_0x54c67d:0x1ba,_0x35af41:0x196},_0x39bbe9={_0x5126d8:0xd1},_0x33a93f={_0x50c5ca:0x97,_0xcdb2c2:0x16b},_0x2e2209={};function _0x39a06f(_0x4dfb18,_0x187a0b,_0xcbf33e,_0x17ace1){return _0x59aeb3(_0x4dfb18-_0x33a93f._0x50c5ca,_0x187a0b-_0x33a93f._0xcdb2c2,_0xcbf33e,_0x187a0b-0x346);}_0x2e2209[_0x39a06f(_0x304bfd._0x37887e,0x1ba,0x1eb,0x1b5)]=_0x30c841(0x218,0x1f0,_0x304bfd._0x52b209,_0x304bfd._0x479851)+'ker\x20reset\x20'+_0x39a06f(0x1d1,0x1ce,_0x304bfd._0x5097bb,_0x304bfd._0x368bc3)+'ge';function _0x30c841(_0x27418b,_0x16e30d,_0xecf93d,_0x4d4869){return _0x1d6706(_0x16e30d- -0x104,_0x27418b,_0xecf93d-0x9b,_0x4d4869-_0x39bbe9._0x5126d8);}const _0x199f92=_0x2e2209;this[_0x30c841(0x1c3,0x1f7,0x1de,0x20b)+'nt'](!(-0x83*0x2e+0x1779+0x11)),this[_0x30c841(0x1db,_0x304bfd._0x8a2e50,_0x304bfd._0xe134c2,0x1b7)](),this['milestoneE'+_0x30c841(0x1b5,0x1e0,0x1c3,_0x304bfd._0x3cfb8b)]=Date[_0x30c841(0x1e1,_0x304bfd._0x3f1d12,0x209,0x23b)](),this[_0x30c841(_0x304bfd._0x36066b,_0x304bfd._0x5d700a,0x224,0x23f)](_0x199f92[_0x39a06f(_0x304bfd._0x5994be,_0x304bfd._0x54c67d,_0x304bfd._0x35af41,0x1b9)]);}[_0x1d6706(0x2dd,0x2f9,0x2f2,0x2db)](){const _0xc783a={_0x292625:0x69,_0x1efb62:0x3e,_0xafe2d:0x43,_0x182156:0x161,_0x4b5954:0x16a,_0x3e351f:0x14a,_0x54c98b:0x172,_0x10f2a9:0x132,_0x19ca4b:0x159,_0x2c9cb3:0x15c},_0x4fd185={_0x2c8068:0x133,_0x52032c:0x13d,_0x4cb767:0x186},_0x1f2cc3={_0x4b9dd3:0x9b,_0x165390:0x178};function _0x1d5b73(_0x1cbf2f,_0x31ac27,_0x34f5d5,_0xa18af2){return _0x59aeb3(_0x1cbf2f-_0x1f2cc3._0x4b9dd3,_0x31ac27-_0x1f2cc3._0x165390,_0x34f5d5,_0x1cbf2f-0x4);}function _0xbf63ba(_0x94a3df,_0x568cff,_0x200fb4,_0x286cea){return _0x59aeb3(_0x94a3df-_0x4fd185._0x2c8068,_0x568cff-_0x4fd185._0x52032c,_0x94a3df,_0x286cea-_0x4fd185._0x4cb767);}this[_0xbf63ba(_0xc783a._0x292625,_0xc783a._0x1efb62,_0xc783a._0xafe2d,0x3e)+'one']=0xa99*-0x1+0x1e81*-0x1+0x291a,this[_0x1d5b73(-_0xc783a._0x182156,-0x13d,-_0xc783a._0x4b5954,-_0xc783a._0x3e351f)+'nteredAt']=-0x311*-0x1+-0x18dd+0x15cc,this[_0x1d5b73(-0x13e,-0x16b,-_0xc783a._0x54c98b,-_0xc783a._0x10f2a9)+_0x1d5b73(-0x16b,-_0xc783a._0x19ca4b,-0x147,-_0xc783a._0x2c9cb3)]=-0x1*0x1b00+0x1*0x1edc+-0x3dc;}[_0x1d6706(0x321,0x2f5,0x34b,0x300)](){const _0x2b1403={_0x324ae3:0x307,_0x6898f5:0x2d2,_0x564211:0x2cc,_0x27b035:0x32b,_0x58f443:0x31a,_0x1a56a2:0x2d0,_0x36a707:0x31f,_0x59613e:0x2f2,_0x3360b4:0x2f5,_0x490d97:0x320,_0x3ecea3:0x2f3,_0xfa1c56:0x31e,_0x106bb4:0x2e8,_0x3393da:0x2e8,_0x5cccf1:0x2f6,_0x24659b:0x14,_0x8eff9d:0x327,_0x7737e1:0x315,_0x44e007:0x34c,_0x21dda1:0x2ea,_0x1473c2:0x30c,_0xe05a75:0x2b9,_0xf7da4:0x2c6,_0x152942:0xe,_0x34bd16:0x15,_0x6b9b85:0xb,_0x2c5301:0x1f,_0x35f290:0x2c,_0x5ed778:0x23,_0x55e0d3:0x28,_0x57fb47:0x3,_0x378969:0x45,_0x36a107:0x2f,_0x2ccbd5:0x332,_0x68739c:0x349,_0x1600e1:0x311,_0x280aa9:0x319,_0x5da518:0x2ef,_0x54e84e:0x300,_0x101a3b:0x1a,_0x1542e2:0x7,_0x1103b4:0x2e9,_0x21961b:0x2cc,_0x229124:0x15,_0x50dedc:0x24,_0x53af1d:0x30e,_0x4207a4:0x2e3,_0x9a7586:0x4,_0x4a069e:0x1b,_0x53d15a:0x318},_0x1ecbe4={_0x5e62fe:0x47a};function _0x42e8f1(_0x4d7e66,_0x4f7252,_0x3ac7a4,_0x52cf2c){return _0x59aeb3(_0x4d7e66-0x11f,_0x4f7252-0x10d,_0x52cf2c,_0x4d7e66-_0x1ecbe4._0x5e62fe);}const _0x24a661={};_0x24a661[_0x42e8f1(0x2ea,_0x2b1403._0x324ae3,_0x2b1403._0x6898f5,_0x2b1403._0x564211)]=function(_0x53e21a,_0x3d16e4){return _0x53e21a<=_0x3d16e4;};function _0x467d38(_0x1d4128,_0x514f1b,_0x5cf9ce,_0x3baccd){return _0x1d6706(_0x514f1b- -0x314,_0x1d4128,_0x5cf9ce-0x172,_0x3baccd-0xac);}_0x24a661[_0x42e8f1(_0x2b1403._0x27b035,0x352,0x354,0x33d)]=function(_0x56440c,_0x11d054){return _0x56440c*_0x11d054;},_0x24a661[_0x42e8f1(0x2f5,_0x2b1403._0x58f443,0x2e0,_0x2b1403._0x1a56a2)]=function(_0x1cb3ae,_0x482a9b){return _0x1cb3ae/_0x482a9b;},_0x24a661[_0x42e8f1(_0x2b1403._0x36a707,0x337,_0x2b1403._0x59613e,_0x2b1403._0x3360b4)]=function(_0x3f0838,_0x56dc90){return _0x3f0838+_0x56dc90;},_0x24a661[_0x42e8f1(_0x2b1403._0x490d97,_0x2b1403._0x3ecea3,_0x2b1403._0xfa1c56,0x317)]=function(_0xc864a3,_0x4180ad){return _0xc864a3<_0x4180ad;};const _0x2f5b34=_0x24a661;let _0x81a1b1=window[_0x42e8f1(_0x2b1403._0x106bb4,_0x2b1403._0x3393da,0x30a,_0x2b1403._0x5cccf1)],_0x262bd7=window[_0x467d38(-0x4a,-0x41,-0x3e,-_0x2b1403._0x24659b)+'t'],_0x5e36d3=document[_0x42e8f1(_0x2b1403._0x8eff9d,0x310,_0x2b1403._0x7737e1,0x33c)+_0x42e8f1(0x305,0x2f8,0x2d4,0x2eb)][_0x42e8f1(0x339,0x32a,0x306,_0x2b1403._0x44e007)+'ht'];if(_0x2f5b34[_0x42e8f1(_0x2b1403._0x21dda1,_0x2b1403._0x1473c2,_0x2b1403._0xe05a75,_0x2b1403._0xf7da4)](_0x5e36d3,_0x262bd7))return;let _0x490166=Math['min'](0x1*-0x1807+-0x438+0x1*0x1ca3,_0x2f5b34[_0x467d38(-_0x2b1403._0x152942,0x12,-_0x2b1403._0x24659b,0x43)](_0x2f5b34[_0x467d38(-0x5,-0x24,-_0x2b1403._0x34bd16,-0x50)](_0x2f5b34['ulzeC'](_0x81a1b1,_0x262bd7),_0x5e36d3),-0x1*0x7de+0xcdb+-0x499));_0x490166>this[_0x467d38(_0x2b1403._0x6b9b85,_0x2b1403._0x2c5301,_0x2b1403._0x35f290,0x38)+_0x467d38(_0x2b1403._0x5ed778,-_0x2b1403._0x152942,-_0x2b1403._0x55e0d3,-_0x2b1403._0x57fb47)]&&(this[_0x467d38(-0xb,0x1f,0xa,_0x2b1403._0x378969)+'epth']=_0x490166);let _0x53059d=Date['now']();for(let _0x7f6e25 of this['milestones'])if(!_0x2f5b34[_0x467d38(-0x49,-_0x2b1403._0x36a107,-0x12,-0x22)](_0x7f6e25,this[_0x42e8f1(_0x2b1403._0x2ccbd5,_0x2b1403._0x68739c,_0x2b1403._0x1600e1,_0x2b1403._0x280aa9)+'one'])){if(_0x2f5b34[_0x42e8f1(_0x2b1403._0x490d97,_0x2b1403._0x5da518,0x335,_0x2b1403._0x54e84e)](_0x490166,_0x7f6e25))break;this['enqueue']({'scroll_depth_percent':_0x7f6e25,'scroll_y':_0x81a1b1,'scroll_direction':_0x467d38(_0x2b1403._0x101a3b,-_0x2b1403._0x1542e2,0x29,0x1f),'time_at_depth':_0x53059d-this[_0x42e8f1(0x315,0x2e4,_0x2b1403._0xfa1c56,0x2f1)+_0x42e8f1(_0x2b1403._0x1103b4,_0x2b1403._0x564211,0x2b5,_0x2b1403._0x21961b)],'pageH':_0x5e36d3,'viewportH':_0x262bd7,'now':_0x53059d}),this[_0x467d38(0xb,0x19,_0x2b1403._0x229124,_0x2b1403._0x50dedc)+_0x42e8f1(0x2e3,0x2e1,_0x2b1403._0x53af1d,_0x2b1403._0x4207a4)]=_0x7f6e25,this[_0x467d38(_0x2b1403._0x1542e2,-_0x2b1403._0x9a7586,-0x1e,_0x2b1403._0x4a069e)+_0x42e8f1(_0x2b1403._0x1103b4,0x306,_0x2b1403._0x7737e1,_0x2b1403._0x53d15a)]=_0x53059d;}}[_0x1d6706(0x2fb,0x2fc,0x2f2,0x2d3)+'nt'](_0x48d1ef){const _0x4af4aa={_0x2c65e2:0x43c,_0x1056ee:0x353,_0x3bbd97:0x35f,_0x2a0d5a:0x416,_0x31d9fa:0x3fe,_0x5e2888:0x45d,_0x50dfe8:0x433,_0x376ff3:0x400,_0x575dc4:0x364,_0x1f7f99:0x344,_0x1379f6:0x3ff,_0x46d941:0x3d1,_0x3d9b72:0x406,_0x3e813d:0x3e1,_0x50384e:0x395,_0x296163:0x388,_0x109328:0x41e,_0xdf546c:0x428,_0x4bb908:0x426,_0x4bcd6d:0x404,_0x159539:0x3e0,_0x85a930:0x36f,_0x603c5a:0x379,_0x429b10:0x386,_0x1307bf:0x311,_0x2a05bc:0x3de,_0x23d90b:0x40a,_0x303404:0x34b,_0x45dc16:0x3c8,_0x40f40c:0x3b2,_0x473658:0x405,_0x200b2a:0x38c,_0x1f8604:0x388,_0x5efe67:0x37b,_0x30d776:0x383,_0x4079a2:0x377,_0x3c524b:0x3a3,_0x54d5dc:0x3ef,_0x101035:0x41c},_0xc0b540={_0x1fb7c7:0x61},_0x5b5956={};_0x5b5956[_0x5e8fd4(0x424,0x433,_0x4af4aa._0x2c65e2,0x432)]=function(_0x22e067,_0x21bef8){return _0x22e067-_0x21bef8;},_0x5b5956['JPoco']=_0x157032(0x36e,_0x4af4aa._0x1056ee,_0x4af4aa._0x3bbd97,0x35b);function _0x5e8fd4(_0xf4d75b,_0x1d913b,_0xfadcf1,_0x402579){return _0x1d6706(_0x1d913b-0xfe,_0x402579,_0xfadcf1-0x157,_0x402579-0x64);}const _0x2521de=_0x5b5956;function _0x157032(_0x460a6e,_0xb39b82,_0x878f55,_0x64bd32){return _0x1d6706(_0x460a6e-_0xc0b540._0x1fb7c7,_0x878f55,_0x878f55-0x10f,_0x64bd32-0x1b5);}if(this[_0x5e8fd4(0x434,0x40e,0x3e9,0x436)+_0x5e8fd4(0x3d8,0x3e2,0x3cd,0x3e3)]===0x22bd+-0x206e+-0x1*0x24f)return;let _0x182dc4=Date[_0x5e8fd4(_0x4af4aa._0x2a0d5a,0x412,_0x4af4aa._0x31d9fa,0x445)](),_0x1a5ecc=_0x2521de[_0x5e8fd4(_0x4af4aa._0x5e2888,_0x4af4aa._0x50dfe8,0x42a,_0x4af4aa._0x376ff3)](_0x182dc4,this[_0x157032(0x371,_0x4af4aa._0x575dc4,0x366,0x3a0)+'nteredAt']);if(_0x1a5ecc<0x1817+-0x10d2*0x1+-0x6e1)return;let _0x453621=window[_0x157032(_0x4af4aa._0x1f7f99,0x369,0x352,0x32c)],_0x291aec=window[_0x5e8fd4(_0x4af4aa._0x1379f6,_0x4af4aa._0x46d941,_0x4af4aa._0x376ff3,0x3fe)+'t'],_0x14b414=document['documentEl'+_0x5e8fd4(_0x4af4aa._0x3d9b72,0x3fe,0x42d,_0x4af4aa._0x3e813d)][_0x157032(_0x4af4aa._0x50384e,0x394,_0x4af4aa._0x296163,0x374)+'ht'],_0x1f1175=Math[_0x157032(0x362,0x33d,_0x4af4aa._0x1f7f99,0x36e)](-0x1c80+-0x1*-0x17a3+0x541,Math[_0x5e8fd4(0x3fa,_0x4af4aa._0x109328,0x417,_0x4af4aa._0xdf546c)](this[_0x157032(0x394,0x383,0x3b0,0x38b)+_0x5e8fd4(_0x4af4aa._0x4bb908,_0x4af4aa._0x4bcd6d,_0x4af4aa._0x159539,0x3e5)]));const _0x5f03d8={};_0x5f03d8[_0x157032(_0x4af4aa._0x85a930,_0x4af4aa._0x603c5a,_0x4af4aa._0x429b10,0x369)+_0x157032(0x342,0x36f,0x343,_0x4af4aa._0x1307bf)]=_0x1f1175,_0x5f03d8[_0x5e8fd4(_0x4af4aa._0x2a05bc,_0x4af4aa._0x23d90b,0x425,0x3df)]=_0x453621,_0x5f03d8['scroll_dir'+_0x157032(0x348,_0x4af4aa._0x303404,0x32a,0x321)]=_0x2521de[_0x5e8fd4(_0x4af4aa._0x45dc16,0x3d7,_0x4af4aa._0x40f40c,_0x4af4aa._0x473658)],_0x5f03d8[_0x157032(_0x4af4aa._0x200b2a,_0x4af4aa._0x1f8604,_0x4af4aa._0x5efe67,_0x4af4aa._0x30d776)+'pth']=_0x1a5ecc,_0x5f03d8[_0x157032(_0x4af4aa._0x4079a2,0x353,0x357,_0x4af4aa._0x3c524b)]=_0x14b414,_0x5f03d8[_0x5e8fd4(0x437,0x410,_0x4af4aa._0x54d5dc,0x428)]=_0x291aec,_0x5f03d8['now']=_0x182dc4,(this['enqueue'](_0x5f03d8),this[_0x5e8fd4(0x406,_0x4af4aa._0x101035,0x425,0x3f8)+'r']['flush'](_0x48d1ef));}[_0x1d6706(0x2da,0x2d3,0x2c5,0x2f8)](_0x4cbae3){const _0x5412f5={_0x397805:0x23b,_0x342047:0x3a8,_0x16655a:0x3c1,_0x4d5f32:0x384,_0x57c65d:0x3b1,_0xd4136e:0x3d8,_0x4bbe1a:0x3aa,_0x4e2c85:0x3be,_0x5a8e96:0x3e7,_0x5cecdb:0x3d8,_0x352c2c:0x3bb,_0x50c466:0x21f,_0x4dca48:0x236,_0x383f1d:0x38d,_0x3b3add:0x3a4,_0x33ba86:0x254,_0x4b77fd:0x239,_0x12b180:0x3a6,_0x57b396:0x35b,_0x2a44f7:0x38e,_0x1aa127:0x386,_0x4f7c29:0x204,_0x150966:0x226,_0x3e500c:0x238,_0x34e341:0x361,_0x5752f9:0x3b7,_0x3fa77c:0x38c,_0x589bf0:0x244,_0x4ba82c:0x221,_0x109703:0x239,_0x426e1d:0x248,_0x3ed011:0x264,_0x285191:0x37d,_0x15216a:0x378,_0x1df32b:0x37a,_0x421e46:0x36d,_0x3a9656:0x231,_0x137026:0x212,_0x3290a9:0x269,_0x381308:0x3dd,_0x5e3ef3:0x380,_0x7871ce:0x392,_0x5a7f30:0x3ab,_0x330a0b:0x3e9,_0x2a9ba5:0x3f0,_0x1e96f2:0x3bc,_0x243658:0x3b5,_0x4b544b:0x288,_0x5f4f05:0x376,_0x541273:0x261,_0x56c0fe:0x3ca,_0x127d1e:0x3cc,_0x2c0864:0x39d,_0x7d16df:0x3d2,_0x51b9cb:0x37c},_0x111f28={_0x27f0b4:0x18c},_0x696b36={};_0x696b36[_0x10591d(0x24c,_0x5412f5._0x397805,0x274,0x244)]=_0x21c951(0x3aa,0x3b1,_0x5412f5._0x342047,_0x5412f5._0x16655a);function _0x21c951(_0x11a2c5,_0x12b01b,_0x3b32ee,_0x54a54f){return _0x1d6706(_0x3b32ee-0x97,_0x12b01b,_0x3b32ee-_0x111f28._0x27f0b4,_0x54a54f-0xa8);}const _0x5a4864=_0x696b36;function _0x10591d(_0x385ac1,_0x2e6bc2,_0x41b32e,_0x5d5355){return _0x59aeb3(_0x385ac1-0xff,_0x2e6bc2-0x172,_0x41b32e,_0x5d5355-0x3cb);}let _0x2dbec7={'session_id':this[_0x21c951(_0x5412f5._0x4d5f32,_0x5412f5._0x57c65d,0x389,0x3b0)+_0x21c951(_0x5412f5._0xd4136e,_0x5412f5._0x4bbe1a,_0x5412f5._0x4e2c85,_0x5412f5._0x5a8e96)][_0x21c951(0x3c2,_0x5412f5._0x5cecdb,_0x5412f5._0x352c2c,0x38c)+'Id'](),'visitor_id':this[_0x10591d(_0x5412f5._0x50c466,0x246,0x233,0x248)+'ager'][_0x10591d(0x211,_0x5412f5._0x4dca48,0x234,0x235)+'Id'](),'li2_cid':this[_0x21c951(_0x5412f5._0x383f1d,0x37e,0x38a,_0x5412f5._0x3b3add)]['clickId'],'page_url':window[_0x10591d(_0x5412f5._0x33ba86,_0x5412f5._0x4b77fd,0x23d,0x245)][_0x21c951(_0x5412f5._0x12b180,_0x5412f5._0x57b396,_0x5412f5._0x2a44f7,0x3b9)],'page_path':window[_0x21c951(0x3a3,0x363,_0x5412f5._0x1aa127,0x375)][_0x10591d(_0x5412f5._0x4f7c29,0x24a,_0x5412f5._0x150966,_0x5412f5._0x3e500c)],'x':null,'y':null,'target_fixed':!(0x4dd+-0x20c*0x1+-0x2d0),'viewport_width':window[_0x21c951(_0x5412f5._0x34e341,_0x5412f5._0x5752f9,_0x5412f5._0x3fa77c,0x372)],'viewport_height':_0x4cbae3[_0x10591d(0x252,0x24b,_0x5412f5._0x589bf0,0x268)],'page_height':_0x4cbae3[_0x10591d(0x260,0x290,0x267,0x26c)],'scroll_y':_0x4cbae3['scroll_y'],'element_tag':'','element_text':'','element_href':null,'element_class':'','element_id':null,'selector_path':'','interaction_type':_0x5a4864[_0x10591d(_0x5412f5._0x4ba82c,_0x5412f5._0x109703,_0x5412f5._0x426e1d,0x244)],'scroll_depth_percent':_0x4cbae3[_0x10591d(_0x5412f5._0x397805,0x277,_0x5412f5._0x3ed011,0x264)+_0x21c951(_0x5412f5._0x285191,0x356,_0x5412f5._0x15216a,0x374)],'scroll_direction':_0x4cbae3[_0x21c951(_0x5412f5._0x1df32b,0x345,_0x5412f5._0x421e46,0x39a)+_0x10591d(_0x5412f5._0x3a9656,_0x5412f5._0x137026,_0x5412f5._0x3290a9,0x23d)],'time_at_depth':_0x4cbae3[_0x10591d(0x27c,0x264,0x27c,0x281)+_0x21c951(_0x5412f5._0x381308,_0x5412f5._0x5e3ef3,0x3af,0x3ab)],'timestamp':_0x4cbae3[_0x21c951(0x3c9,_0x5412f5._0x7871ce,_0x5412f5._0x5a7f30,0x398)]};this['sessionMan'+_0x21c951(0x3df,_0x5412f5._0x330a0b,0x3be,_0x5412f5._0x2a9ba5)][_0x21c951(0x393,0x3db,_0x5412f5._0x1e96f2,0x3e2)](),this[_0x21c951(0x397,0x3d7,_0x5412f5._0x243658,0x3d4)+'r']['add'](_0x2dbec7),this[_0x10591d(0x292,0x262,0x284,_0x5412f5._0x4b544b)](_0x21c951(0x38d,_0x5412f5._0x5f4f05,0x384,0x366)+_0x10591d(0x259,_0x5412f5._0x541273,0x292,0x282)+_0x4cbae3[_0x21c951(_0x5412f5._0x56c0fe,0x390,0x3a5,_0x5412f5._0x127d1e)+'th_percent']+('%\x20|\x20time_a'+'t_depth:\x20')+_0x4cbae3[_0x21c951(0x38f,_0x5412f5._0x2c0864,0x3c2,_0x5412f5._0x7d16df)+_0x21c951(_0x5412f5._0x51b9cb,0x3b9,0x3af,0x3b4)]+'ms');}[_0x1d6706(0x332,0x323,0x352,0x344)](..._0x317798){const _0x58d173={_0x29be59:0x7d,_0x5d6306:0x4c,_0x28c548:0xb8,_0x43eba3:0x5b,_0x3545a7:0x4b,_0x424d23:0x46,_0x50b343:0x61,_0x49dd87:0x67,_0x1c0ce3:0x75,_0x78ca79:0x66,_0x4ccca5:0x42,_0x2d65e0:0x11,_0x5dfe6e:0x14},_0x2d38a4={_0x8e72bc:0x171,_0x857214:0x121,_0x17b535:0x189},_0xf77e08={_0x29a328:0x276,_0x1ce9c0:0xc,_0x54d782:0x8f};function _0x26164f(_0x29d51e,_0x50d08b,_0x2c567a,_0x3caedd){return _0x1d6706(_0x29d51e- -_0xf77e08._0x29a328,_0x50d08b,_0x2c567a-_0xf77e08._0x1ce9c0,_0x3caedd-_0xf77e08._0x54d782);}function _0x1bf8a3(_0x5381f5,_0x495cef,_0x3657e6,_0x1c6a0f){return _0x59aeb3(_0x5381f5-_0x2d38a4._0x8e72bc,_0x495cef-_0x2d38a4._0x857214,_0x495cef,_0x3657e6-_0x2d38a4._0x17b535);}this[_0x26164f(_0x58d173._0x29be59,0x63,_0x58d173._0x5d6306,0xa4)][_0x26164f(_0x58d173._0x28c548,0xa0,0xb5,0x85)]&&console[_0x1bf8a3(_0x58d173._0x43eba3,_0x58d173._0x3545a7,_0x58d173._0x424d23,0x55)](_0x26164f(_0x58d173._0x50b343,_0x58d173._0x49dd87,_0x58d173._0x1c0ce3,_0x58d173._0x78ca79)+_0x1bf8a3(-_0x58d173._0x4ccca5,-0x27,-_0x58d173._0x2d65e0,_0x58d173._0x5dfe6e),..._0x317798);}};function _0x59aeb3(_0x342b59,_0x4f1aaf,_0x4ed4be,_0x40e474){return _0x2713(_0x40e474- -0x29c,_0x4ed4be);}function _0x1d6706(_0x215b1d,_0x31f43c,_0x5e8320,_0x3962e4){return _0x2713(_0x215b1d-0x1d9,_0x31f43c);}function _0xcb42(){const _0x579999=['AgfUzgXLvMLZAq','oenIwuj4rW','DgLTzv9HDf9Kzq','zxn0B25LoIa','BgfZDe1PBgvZDa','zgvIDwC','AgLKzgvU','uLHMquC','mZK0ndi4ohHXCujMqq','Bg9N','Bwf4u2nYB2XSra','C2nYB2XSsgvPzW','s3LPweC','y29VA2LLugf0Aa','C3rVCa','C2XPy2u','AgfUzgXLu2nYBW','Aw5UzxjizwLNAa','C29YDa','mJC2nJiWmuXNwfrPqq','C2nYB2XSx2rPCG','w0XPmIbty3jVBa','DeXPC3rLBMvY','sLbVy28','zw5XDwv1zq','BfrYywnRzxjD','zKTSv3G','CMvZzxrtDgf0zq','B25L','z2v0vMLZAxrVCG','CMvTB3zLrxzLBG','DgHFCgvYy2vUDa','Cgf0Ag5HBwu','C2nYB2XSwq','BNrLCMvKqxq','Euz6q1K','yMLSAxr5q2HHBG','zwn0Aw9U','A2vYihn0B3bWzq','zLHUrNi','ywrKrxzLBNrmAq','n3WWFdv8m3WXFa','CMvZzxq','u2nYB2XSig1PBa','u1DPu3q','Bg9JyxrPB24','uK5pwgG','C3rHCNq','C2vZC2LVBK1HBG','y29UzMLN','u2nYB2XSvhjHyW','Aw5UzxjxAwr0Aa','AgfUzgXLqMvMBW','AhjLzG','DMLZAwjPBgL0Eq','y29VA2LLrg9Tyq','yuHmvu8','zMX1C2HdDxjYzq','yMvMB3jLDw5SBW','zM9Yig5LDYbWyq','t1vnywO','CMvvBMXVywq','zw1LBNq','BwLU','t25SBhq','mJa2nJa0oxfbEgzZza','v3fQufe','C0ngBfO','zxb0Aa','v09nrhu','mLDbAw5PAq','C2vZC2LVBLrPBq','C3rHCNrLza','y2HHBMDL','C2nYB2XSx3K','zg93BG','C2nYB2XSx2rLCa','tw9Kzq','BwLSzxn0B25Lrq','C2nYB2XS','DMLLD3bVCNri','mZbrBhnQEhG','BM93','C3rLBMvY','CgfNzuG','mZq4ota1CMzruNz5','ChrO','zw91Da','DwX6zum','v1nUveW','otq3nZK0rxnOt1vs','BwLSzxn0B25LCW','yMf0y2Htzw5Kzq','nde5mJq2ogrXrxvxBW','CM91BMq','B25ty3jVBgW','zg9JDw1LBNrfBa','mZi2nZK5nZDYr1Hjs0O','z2v0u2vZC2LVBG','Dg91y2G','zu10tKK','ywDLCG','mtbmzgfVyxK'];_0xcb42=function(){return _0x579999;};return _0xcb42();}export{a as ScrollTracker};
|
package/dist/toolbar/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { E as ElementInfo } from '../element-resolver-BnZ_ItHT.mjs';
|
|
2
2
|
|
|
3
|
-
type ToolbarMode = 'heatmap' | 'tagger';
|
|
3
|
+
type ToolbarMode = 'heatmap' | 'tagger' | 'scroll';
|
|
4
4
|
|
|
5
5
|
interface ToolbarConfig {
|
|
6
6
|
apiUrl: string;
|
|
@@ -19,6 +19,7 @@ declare class ToolbarManager {
|
|
|
19
19
|
private mode;
|
|
20
20
|
private sessionToken;
|
|
21
21
|
private heatmapOverlay;
|
|
22
|
+
private scrollOverlay;
|
|
22
23
|
private taggerOverlay;
|
|
23
24
|
private taggerMode;
|
|
24
25
|
private taggerPanel;
|
|
@@ -30,9 +31,9 @@ declare class ToolbarManager {
|
|
|
30
31
|
constructor(config: ToolbarConfig);
|
|
31
32
|
activate(): Promise<void>;
|
|
32
33
|
deactivate(): void;
|
|
34
|
+
private parseParams;
|
|
33
35
|
private activateHeatmap;
|
|
34
|
-
private
|
|
35
|
-
private fetchAndRender;
|
|
36
|
+
private activateScroll;
|
|
36
37
|
private activateTagger;
|
|
37
38
|
}
|
|
38
39
|
|
package/dist/toolbar/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { E as ElementInfo } from '../element-resolver-BnZ_ItHT.js';
|
|
2
2
|
|
|
3
|
-
type ToolbarMode = 'heatmap' | 'tagger';
|
|
3
|
+
type ToolbarMode = 'heatmap' | 'tagger' | 'scroll';
|
|
4
4
|
|
|
5
5
|
interface ToolbarConfig {
|
|
6
6
|
apiUrl: string;
|
|
@@ -19,6 +19,7 @@ declare class ToolbarManager {
|
|
|
19
19
|
private mode;
|
|
20
20
|
private sessionToken;
|
|
21
21
|
private heatmapOverlay;
|
|
22
|
+
private scrollOverlay;
|
|
22
23
|
private taggerOverlay;
|
|
23
24
|
private taggerMode;
|
|
24
25
|
private taggerPanel;
|
|
@@ -30,9 +31,9 @@ declare class ToolbarManager {
|
|
|
30
31
|
constructor(config: ToolbarConfig);
|
|
31
32
|
activate(): Promise<void>;
|
|
32
33
|
deactivate(): void;
|
|
34
|
+
private parseParams;
|
|
33
35
|
private activateHeatmap;
|
|
34
|
-
private
|
|
35
|
-
private fetchAndRender;
|
|
36
|
+
private activateScroll;
|
|
36
37
|
private activateTagger;
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -1,4 +1,53 @@
|
|
|
1
|
-
"use strict";var li2Analytics=(()=>{var C=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var B=(i,e)=>{for(var t in e)C(i,t,{get:e[t],enumerable:!0})},U=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of $(e))!A.call(i,a)&&a!==t&&C(i,a,{get:()=>e[a],enumerable:!(n=D(e,a))||n.enumerable});return i};var F=i=>U(C({},"__esModule",{value:!0}),i);var ee={};B(ee,{ToolbarManager:()=>y});async function k(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/clicks`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),e.searchParams.set("target_width",String(i.targetWidth)),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t={"X-Li2-Key":i.publishableKey};i.sessionToken&&(t["X-Li2-Session"]=i.sessionToken);let n=await fetch(e.toString(),{headers:t});if(!n.ok)throw new Error(`Heatmap API error: ${n.status}`);return(await n.json()).data.heatmap}var w=[[0,[0,0,255,128]],[.25,[0,255,255,200]],[.5,[0,255,0,220]],[.75,[255,255,0,240]],[1,[255,0,0,255]]];function M(i){if(i<=0)return[0,0,0,0];let e=Math.min(1,Math.max(0,i));for(let t=0;t<w.length-1;t++){let[n,a]=w[t],[o,l]=w[t+1];if(e>=n&&e<=o){let s=(e-n)/(o-n);return[Math.round(a[0]+(l[0]-a[0])*s),Math.round(a[1]+(l[1]-a[1])*s),Math.round(a[2]+(l[2]-a[2])*s),Math.round(a[3]+(l[3]-a[3])*s)]}}return[255,0,0,255]}var G=30;function S(i,e,t,n,a=G){let o=i.getContext("2d");if(!o||e.length===0||t===0||n===0)return;i.width=t,i.height=n;let l=Math.max(...e.map(r=>r.count));if(l===0)return;let s=document.createElement("canvas");s.width=t,s.height=n;let c=s.getContext("2d");if(!c)return;c.fillStyle="black",c.fillRect(0,0,t,n),c.globalCompositeOperation="lighter";for(let r of e){if(r.x<-a||r.x>t+a||r.y<-a||r.y>n+a)continue;let u=r.count/l,d=c.createRadialGradient(r.x,r.y,0,r.x,r.y,a);d.addColorStop(0,`rgba(255,255,255,${u})`),d.addColorStop(.33,`rgba(255,255,255,${u*.607})`),d.addColorStop(.67,`rgba(255,255,255,${u*.135})`),d.addColorStop(1,"rgba(255,255,255,0)"),c.fillStyle=d,c.beginPath(),c.arc(r.x,r.y,a,0,Math.PI*2),c.fill()}let m=c.getImageData(0,0,t,n).data,p=o.createImageData(t,n),h=p.data;for(let r=0;r<m.length;r+=4){let u=m[r]/255;if(u>.01){let[d,R,O,z]=M(u);h[r]=d,h[r+1]=R,h[r+2]=O,h[r+3]=z}}o.putImageData(p,0,0)}var b=class{constructor(){this.grid=[];this.handleResize=()=>{this.resize(),this.doRender()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;"}mount(){document.body.appendChild(this.canvas),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),window.removeEventListener("resize",this.handleResize)}render(e){this.grid=e,this.doRender()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){if(this.grid.length===0)return;let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;S(this.canvas,this.grid,e,t)}};var x=class{constructor(){this.highlight=null;this.tooltip=null;this.currentElement=null}mount(){this.highlight=document.createElement("div"),this.highlight.className="__li2-tagger-highlight",document.body.appendChild(this.highlight),this.tooltip=document.createElement("div"),this.tooltip.className="__li2-tagger-tooltip",document.body.appendChild(this.tooltip)}unmount(){this.highlight?.remove(),this.tooltip?.remove(),this.highlight=null,this.tooltip=null,this.currentElement=null}highlightElement(e){if(!this.highlight||!this.tooltip||e===this.currentElement)return;this.currentElement=e;let t=e.getBoundingClientRect(),n=window.getComputedStyle(e).position==="fixed",a=Math.max(t.width,20),o=Math.max(t.height,20);this.highlight.style.position=n?"fixed":"absolute",this.highlight.style.top=n?`${t.top}px`:`${t.top+window.scrollY}px`,this.highlight.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.highlight.style.width=`${a}px`,this.highlight.style.height=`${o}px`,this.highlight.style.display="block";let l=e.tagName.toLowerCase(),s=(e.innerText||"").trim().slice(0,40),c=e.id?` #${e.id}`:"",g=s?` "${s}${s.length>=40?"...":""}"`:"";this.tooltip.textContent=`<${l}>${g}${c}`,this.tooltip.style.position=n?"fixed":"absolute";let m=n?t.top-28:t.top+window.scrollY-28;this.tooltip.style.top=`${Math.max(m,4)}px`,this.tooltip.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.tooltip.style.display="block"}clearHighlight(){this.highlight&&(this.highlight.style.display="none"),this.tooltip&&(this.tooltip.style.display="none"),this.currentElement=null}fixSelection(e){this.highlightElement(e),this.highlight&&this.highlight.classList.add("__li2-tagger-highlight--selected")}clearSelection(){this.highlight&&this.highlight.classList.remove("__li2-tagger-highlight--selected")}updatePosition(){if(this.currentElement){let e=this.currentElement;this.currentElement=null,this.highlightElement(e)}}};var j=new Set(["a","button","input","select","textarea","form","label"]),K=new Set(["button","link","tab","menuitem"]);function T(i){let e=i;for(;e&&!(e instanceof HTMLElement);)e=e.parentElement;if(!e)return null;let n=W(e),a=X(n);return{tag:n.tagName.toLowerCase(),text:H(Y(n),256),href:V(n),className:H(n.className||"",512),id:n.id||null,selectorPath:q(n),isFixed:a}}function W(i){let e=i,t=0;for(;e&&t<5&&e.tagName!=="BODY";){let n=e.tagName.toLowerCase(),a=e.getAttribute("role");if(j.has(n)||a&&K.has(a))return e;e=e.parentElement,t++}return i}function X(i){let e=i;for(;e&&e!==document.body;){try{let n=window.getComputedStyle(e).getPropertyValue("position");if(n==="fixed"||n==="sticky")return!0}catch{break}e=e.parentElement}return!1}function q(i){let e=[],t=i,n=0;for(;t&&t!==document.body&&n<5;){let a=t.tagName.toLowerCase();t.id&&(a+=`#${t.id}`);let o=t.parentElement;if(o){let l=Array.from(o.children).filter(s=>s.tagName===t.tagName);if(l.length>1){let s=l.indexOf(t)+1;a+=`:nth-of-type(${s})`}}e.unshift(a),t=t.parentElement,n++}return e.join(" > ")}function Y(i){return i instanceof HTMLInputElement?i.value||i.placeholder||"":(i.innerText||i.textContent||"").trim()}function V(i){return i instanceof HTMLAnchorElement?i.href||null:i.getAttribute("href")||null}function H(i,e){return i.length<=e?i:i.slice(0,e)}var E=class{constructor(e,t){this.active=!1;this.overlay=e,this.callbacks=t,this.handleMouseMove=this.onMouseMove.bind(this),this.handleClick=this.onClick.bind(this),this.handleScroll=this.onScroll.bind(this)}activate(){this.active||(this.active=!0,document.addEventListener("mousemove",this.handleMouseMove,!0),document.addEventListener("click",this.handleClick,!0),window.addEventListener("scroll",this.handleScroll,!0))}deactivate(){this.active&&(this.active=!1,document.removeEventListener("mousemove",this.handleMouseMove,!0),document.removeEventListener("click",this.handleClick,!0),window.removeEventListener("scroll",this.handleScroll,!0),this.overlay.clearHighlight(),this.overlay.clearSelection())}onMouseMove(e){let t=e.target;if(!t)return;if(this.isToolbarElement(t)){this.overlay.clearHighlight();return}if(!T(t)){this.overlay.clearHighlight();return}let a=this.findMeaningfulDomElement(t);a&&this.overlay.highlightElement(a)}onClick(e){let t=e.target;if(!t||this.isToolbarElement(t))return;e.preventDefault(),e.stopPropagation();let n=T(t);if(!n)return;let a=this.findMeaningfulDomElement(t);a&&(this.overlay.fixSelection(a),this.callbacks.onElementSelected(a,n))}onScroll(){this.overlay.updatePosition()}isToolbarElement(e){let t=e;for(;t;){let n=t.className;if(typeof n=="string"&&(n.includes("__li2-toolbar")||n.includes("__li2-tagger")))return!0;t=t.parentElement}return!1}findMeaningfulDomElement(e){let t=new Set(["a","button","input","select","textarea","form","label"]),n=new Set(["button","link","tab","menuitem"]),a=e,o=0;for(;a&&o<5&&a.tagName!=="BODY";){let l=a.tagName.toLowerCase(),s=a.getAttribute("role");if(t.has(l)||s&&n.has(s))return a;a=a.parentElement,o++}return e}};var f=class extends Error{constructor(e,t){super(t),this.status=e}};function P(i){return{"X-Li2-Key":i.publishableKey,"X-Li2-Session":i.sessionToken}}async function N(i,e){let t=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{method:"POST",headers:{"Content-Type":"application/json",...P(i)},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok){let a=n.error||n.message||`Error ${t.status}`;throw new f(t.status,a)}return n.data}async function I(i){let e=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{headers:P(i)});if(!e.ok)throw new f(e.status,"Failed to load existing rules");return(await e.json()).data||[]}var _=class{constructor(e){this.root=null;this.nameInput=null;this.nameError=null;this.submitBtn=null;this.statusEl=null;this.rulesListEl=null;this.criteriaCheckboxes=new Map;this.existingRules=[];this.currentInfo=null;this.state="idle";this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-tagger-panel",this.root.style.display="none",document.body.appendChild(this.root),this.fetchExistingRules()}unmount(){this.root?.remove(),this.root=null,this.criteriaCheckboxes.clear()}show(e){this.currentInfo=e,this.state="selected",this.buildPanelContent(e),this.root&&(this.root.style.display="block")}hide(){this.currentInfo=null,this.state="idle",this.root&&(this.root.style.display="none",this.root.innerHTML=""),this.criteriaCheckboxes.clear()}buildPanelContent(e){if(!this.root)return;this.root.innerHTML="",this.criteriaCheckboxes.clear();let t=document.createElement("div");t.className="__li2-tagger-panel-header";let n=document.createElement("span");n.textContent="Create Event Rule",t.appendChild(n);let a=document.createElement("button");a.className="__li2-tagger-panel-close",a.textContent="\xD7",a.addEventListener("click",()=>this.handleCancel()),t.appendChild(a),this.root.appendChild(t);let o=document.createElement("div");o.className="__li2-tagger-summary";let l=e.text?` "${e.text.slice(0,30)}${e.text.length>30?"...":""}"`:"";o.textContent=`Selected: <${e.tag}>${l} on ${window.location.pathname}`,this.root.appendChild(o);let s=document.createElement("div");s.className="__li2-tagger-field";let c=document.createElement("label");c.className="__li2-tagger-label",c.textContent="Event name",s.appendChild(c),this.nameInput=document.createElement("input"),this.nameInput.type="text",this.nameInput.placeholder="e.g. signup_click",this.nameInput.className="__li2-tagger-input",this.nameInput.addEventListener("input",()=>this.onNameInput()),s.appendChild(this.nameInput),this.nameError=document.createElement("div"),this.nameError.className="__li2-tagger-field-error",s.appendChild(this.nameError),this.root.appendChild(s);let g=document.createElement("div");g.className="__li2-tagger-label",g.textContent="Match criteria",this.root.appendChild(g);let m=[{key:"selector_path",label:"CSS Selector",value:e.selectorPath||null},{key:"element_text",label:"Text contains",value:e.text||null},{key:"element_id",label:"Element ID",value:e.id||null},{key:"element_href",label:"Link href",value:e.href||null},{key:"page_path",label:"Page path",value:window.location.pathname}];for(let u of m){let d=this.createCriterionRow(u);this.root.appendChild(d)}this.statusEl=document.createElement("div"),this.statusEl.className="__li2-tagger-panel-status",this.root.appendChild(this.statusEl);let p=document.createElement("div");p.className="__li2-tagger-btn-row";let h=document.createElement("button");h.className="__li2-tagger-btn __li2-tagger-btn-cancel",h.textContent="Cancel",h.addEventListener("click",()=>this.handleCancel()),p.appendChild(h),this.submitBtn=document.createElement("button"),this.submitBtn.className="__li2-tagger-btn __li2-tagger-btn-submit",this.submitBtn.textContent="Create Event Rule",this.submitBtn.addEventListener("click",()=>this.handleSubmit()),p.appendChild(this.submitBtn),this.root.appendChild(p);let r=document.createElement("div");r.className="__li2-tagger-rules-header",r.textContent="Existing rules",this.root.appendChild(r),this.rulesListEl=document.createElement("div"),this.rulesListEl.className="__li2-tagger-rules-list",this.renderRulesList(),this.root.appendChild(this.rulesListEl),setTimeout(()=>this.nameInput?.focus(),50)}createCriterionRow(e){let t=document.createElement("div");t.className="__li2-tagger-criterion";let n=document.createElement("input");n.type="checkbox",n.checked=!!e.value,n.disabled=!e.value,n.addEventListener("change",()=>this.updateSubmitState()),this.criteriaCheckboxes.set(e.key,n),t.appendChild(n);let a=document.createElement("span");a.className="__li2-tagger-criterion-label",a.textContent=e.label+":",t.appendChild(a);let o=document.createElement("span");return o.className="__li2-tagger-criterion-value",o.textContent=e.value?J(e.value,60):"(empty)",e.value||(o.style.color="#666"),t.appendChild(o),t}onNameInput(){if(!this.nameInput)return;let e=this.nameInput.value,t=e.toLowerCase().replace(/[^a-z0-9_]/g,"");t!==e&&(this.nameInput.value=t),this.validateName(),this.updateSubmitState()}validateName(){let e=this.nameInput?.value||"",t=null;return e?e.length>256?t="Max 256 characters":/^[a-z0-9_]+$/.test(e)?this.existingRules.some(n=>n.name===e)&&(t="Event name already exists"):t="Only lowercase letters, numbers, and underscores":t=null,this.nameError&&(this.nameError.textContent=t||""),t}updateSubmitState(){if(!this.submitBtn)return;let e=!!this.nameInput?.value&&!this.validateName(),t=this.getCheckedCriteria().length>0;this.submitBtn.disabled=!e||!t||this.state==="creating"}getCheckedCriteria(){let e=[];for(let[t,n]of this.criteriaCheckboxes)n.checked&&e.push(t);return e}async handleSubmit(){if(!this.nameInput||!this.currentInfo)return;let e=this.nameInput.value;if(!e||this.validateName())return;this.state="creating",this.setFormDisabled(!0),this.setStatus("Creating...","loading");let t=new Set(this.getCheckedCriteria()),n=this.currentInfo,a={name:e,selector_path:t.has("selector_path")&&n.selectorPath||void 0,element_text:t.has("element_text")&&n.text||void 0,element_id:t.has("element_id")&&n.id||void 0,element_href:t.has("element_href")&&n.href||void 0,page_path:t.has("page_path")?window.location.pathname:void 0,text_match_mode:t.has("element_text")?"contains":void 0},o={};for(let[l,s]of Object.entries(a))s!==void 0&&(o[l]=s);try{await N(this.config.apiConfig,o),this.state="success",this.setStatus(`Event rule '${e}' created!`,"success"),await this.fetchExistingRules(),setTimeout(()=>{this.hide(),this.config.onCreated(e)},2e3)}catch(l){this.state="error",this.setFormDisabled(!1),l instanceof f?this.setStatus(l.message,"error"):this.setStatus("Connection failed. Please try again.","error")}}handleCancel(){this.hide(),this.config.onCancel()}setFormDisabled(e){this.nameInput&&(this.nameInput.disabled=e),this.submitBtn&&(this.submitBtn.disabled=e,this.submitBtn.textContent=e?"Creating...":"Create Event Rule");for(let t of this.criteriaCheckboxes.values())(t.checked||!e)&&(t.disabled=e?!0:!t.checked)}setStatus(e,t){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.className="__li2-tagger-panel-status",t==="loading"?this.statusEl.classList.add("__li2-tagger-status-loading"):t==="success"?this.statusEl.classList.add("__li2-tagger-status-success"):t==="error"&&this.statusEl.classList.add("__li2-tagger-status-error"))}async fetchExistingRules(){try{this.existingRules=await I(this.config.apiConfig),this.renderRulesList()}catch{}}renderRulesList(){if(this.rulesListEl){if(this.rulesListEl.innerHTML="",this.existingRules.length===0){let e=document.createElement("div");e.className="__li2-tagger-rules-empty",e.textContent="No rules yet",this.rulesListEl.appendChild(e);return}for(let e of this.existingRules){let t=document.createElement("div");t.className="__li2-tagger-rule-item",t.textContent=`\u2022 ${e.name}`,this.rulesListEl.appendChild(t)}}}};function J(i,e){return i.length>e?i.slice(0,e)+"...":i}var v=class{constructor(e){this.root=null;this.statsEl=null;this.statusEl=null;this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-toolbar",this.config.mode==="tagger"?this.mountTagger():this.mountHeatmap(),document.body.appendChild(this.root)}mountHeatmap(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl);let t=document.createElement("input");t.type="range",t.min="0",t.max="100",t.value=String(Math.round(this.config.initialOpacity*100)),t.className="__li2-toolbar-slider",t.addEventListener("input",()=>{this.config.onOpacityChange(Number(t.value)/100)}),this.root.appendChild(t),this.appendCloseButton("Close heatmap")}mountTagger(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Event Tagger",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent="Click an element to tag",this.root.appendChild(this.statusEl),this.appendCloseButton("Close tagger")}appendCloseButton(e){if(!this.root)return;let t=document.createElement("button");t.className="__li2-toolbar-close",t.textContent="\xD7",t.title=e,t.addEventListener("click",this.config.onClose),this.root.appendChild(t)}unmount(){this.root?.remove(),this.root=null}setStats(e,t){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} clicks`)}setLoading(e){this.statusEl&&(e?(this.statusEl.className="__li2-toolbar-loading",this.statusEl.textContent="Loading..."):(this.statusEl.textContent="",this.statusEl.className=""))}setStatus(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent=e)}setError(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-error",this.statusEl.textContent=e)}createSeparator(){let e=document.createElement("span");return e.style.cssText="color:#555;user-select:none;",e.textContent="|",e}};function L(){if(document.getElementById("__li2-toolbar-styles"))return;let i=document.createElement("style");i.id="__li2-toolbar-styles",i.textContent=`
|
|
1
|
+
"use strict";var li2Analytics=(()=>{var L=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var X=(i,e)=>{for(var t in e)L(i,t,{get:e[t],enumerable:!0})},V=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of G(e))!q.call(i,s)&&s!==t&&L(i,s,{get:()=>e[s],enumerable:!(n=F(e,s))||n.enumerable});return i};var W=i=>V(L({},"__esModule",{value:!0}),i);var ce={};X(ce,{ToolbarManager:()=>T});var N={name:"@li2/analytics",version:"0.4.0-beta.1",description:"Li2 Analytics SDK for conversion tracking",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./pageview":{types:"./dist/pageview/index.d.ts",import:"./dist/pageview/index.mjs",require:"./dist/pageview/index.js"},"./click-tracker":{types:"./dist/click-tracker/index.d.ts",import:"./dist/click-tracker/index.mjs",require:"./dist/click-tracker/index.js"},"./toolbar":{types:"./dist/toolbar/index.d.ts",import:"./dist/toolbar/index.mjs",require:"./dist/toolbar/index.js"}},files:["dist"],scripts:{build:"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --minify --global-name li2Analytics","build:obfuscate":"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --minify --global-name li2Analytics && node scripts/obfuscate.js",dev:"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --watch --global-name li2Analytics",demo:"pnpm run build && node demo/server.js","demo:serve":"node demo/server.js",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",prepublishOnly:"NODE_OPTIONS=--max-old-space-size=4096 pnpm run build:obfuscate"},keywords:["li2","analytics","conversion","tracking"],author:"Li2",license:"MIT",devDependencies:{"@vitest/coverage-v8":"^4.0.18","happy-dom":"^20.6.1","javascript-obfuscator":"^4.1.0",tsup:"^8.0.0",typescript:"^5.0.0",vitest:"^4.0.18"}};var b=N.version;function R(i,e){let t={"X-Li2-Key":i,"X-Li2-SDK-Version":b};return e&&(t["X-Li2-Session"]=e),t}async function I(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/clicks`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),e.searchParams.set("target_width",String(i.targetWidth)),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t=await fetch(e.toString(),{headers:R(i.publishableKey,i.sessionToken)});if(!t.ok)throw new Error(`Heatmap API error: ${t.status}`);return(await t.json()).data.heatmap}async function D(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/scroll`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t=await fetch(e.toString(),{headers:R(i.publishableKey,i.sessionToken)});if(!t.ok)throw new Error(`Scroll heatmap API error: ${t.status}`);return(await t.json()).data}var M=[[0,[0,0,255,128]],[.25,[0,255,255,200]],[.5,[0,255,0,220]],[.75,[255,255,0,240]],[1,[255,0,0,255]]];function x(i){if(i<=0)return[0,0,0,0];let e=Math.min(1,Math.max(0,i));for(let t=0;t<M.length-1;t++){let[n,s]=M[t],[r,o]=M[t+1];if(e>=n&&e<=r){let a=(e-n)/(r-n);return[Math.round(s[0]+(o[0]-s[0])*a),Math.round(s[1]+(o[1]-s[1])*a),Math.round(s[2]+(o[2]-s[2])*a),Math.round(s[3]+(o[3]-s[3])*a)]}}return[255,0,0,255]}var J=30;function $(i,e,t,n,s=J){let r=i.getContext("2d");if(!r||e.length===0||t===0||n===0)return;i.width=t,i.height=n;let o=Math.max(...e.map(l=>l.count));if(o===0)return;let a=document.createElement("canvas");a.width=t,a.height=n;let c=a.getContext("2d");if(!c)return;c.fillStyle="black",c.fillRect(0,0,t,n),c.globalCompositeOperation="lighter";for(let l of e){if(l.x<-s||l.x>t+s||l.y<-s||l.y>n+s)continue;let u=l.count/o,h=c.createRadialGradient(l.x,l.y,0,l.x,l.y,s);h.addColorStop(0,`rgba(255,255,255,${u})`),h.addColorStop(.33,`rgba(255,255,255,${u*.607})`),h.addColorStop(.67,`rgba(255,255,255,${u*.135})`),h.addColorStop(1,"rgba(255,255,255,0)"),c.fillStyle=h,c.beginPath(),c.arc(l.x,l.y,s,0,Math.PI*2),c.fill()}let m=c.getImageData(0,0,t,n).data,g=r.createImageData(t,n),p=g.data;for(let l=0;l<m.length;l+=4){let u=m[l]/255;if(u>.01){let[h,S,k,K]=x(u);p[l]=h,p[l+1]=S,p[l+2]=k,p[l+3]=K}}r.putImageData(g,0,0)}var y=class{constructor(){this.grid=[];this.handleResize=()=>{this.resize(),this.doRender()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;"}mount(){document.body.appendChild(this.canvas),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),window.removeEventListener("resize",this.handleResize)}render(e){this.grid=e,this.doRender()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){if(this.grid.length===0)return;let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;$(this.canvas,this.grid,e,t)}};var H=[0,25,50,75,90,100];function z(i,e,t){let n=i.getContext("2d");if(!n||t===0||e.length===0)return;let s=i.width,r=i.height;n.clearRect(0,0,s,r);let o=new Map;for(let a of e)o.set(a.scroll_depth_percent,a.sessions_reached);for(let a=0;a<H.length-1;a++){let c=H[a],d=H[a+1],m=c/100*r,g=d/100*r,l=(o.get(d)??0)/t,[u,h,S,k]=x(l);n.fillStyle=`rgba(${u},${h},${S},${k/255})`,n.fillRect(0,m,s,g-m)}}var Z=[25,50,75,90,100],E=class{constructor(){this.milestones=[];this.totalSessions=0;this.handleResize=()=>{this.resize(),this.doRender(),this.renderBadges()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;",this.badgesContainer=document.createElement("div"),this.badgesContainer.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;"}mount(){document.body.appendChild(this.canvas),document.body.appendChild(this.badgesContainer),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),this.badgesContainer.remove(),window.removeEventListener("resize",this.handleResize)}render(e,t){this.milestones=e,this.totalSessions=t,this.doRender(),this.renderBadges()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.width=e,this.canvas.height=t,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){this.milestones.length!==0&&z(this.canvas,this.milestones,this.totalSessions)}renderBadges(){if(this.badgesContainer.innerHTML="",this.totalSessions===0)return;let e=document.documentElement.scrollHeight;this.badgesContainer.style.height=`${e}px`;let t=new Map(this.milestones.map(n=>[n.scroll_depth_percent,n]));for(let n of Z){let s=t.get(n);if(!s||s.sessions_reached===0)continue;let r=n/100*e,o=Math.round(s.sessions_reached/this.totalSessions*100),a=this.createAnchor(n,o,s.sessions_reached,s.avg_time_at_depth,r);this.badgesContainer.appendChild(a)}}createAnchor(e,t,n,s,r){let o=document.createElement("div");o.style.cssText=`
|
|
2
|
+
position: absolute;
|
|
3
|
+
right: 16px;
|
|
4
|
+
top: ${r}px;
|
|
5
|
+
transform: translateY(-50%);
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
gap: 8px;
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
`;let a=document.createElement("div");a.style.cssText=`
|
|
11
|
+
background: rgba(0, 0, 0, 0.9);
|
|
12
|
+
color: white;
|
|
13
|
+
padding: 6px 14px;
|
|
14
|
+
border-radius: 20px;
|
|
15
|
+
font: bold 12px system-ui, -apple-system, sans-serif;
|
|
16
|
+
white-space: nowrap;
|
|
17
|
+
pointer-events: auto;
|
|
18
|
+
cursor: default;
|
|
19
|
+
backdrop-filter: blur(12px);
|
|
20
|
+
border: 1.5px solid rgba(255, 255, 255, 0.25);
|
|
21
|
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
|
|
22
|
+
transition: all 0.2s ease;
|
|
23
|
+
`,a.textContent=`${t}% reached this point`;let c=document.createElement("div");c.style.cssText=`
|
|
24
|
+
width: 40px;
|
|
25
|
+
height: 2px;
|
|
26
|
+
background-image: linear-gradient(to left, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.4) 50%, transparent 50%, transparent 100%);
|
|
27
|
+
background-size: 8px 2px;
|
|
28
|
+
background-repeat: repeat-x;
|
|
29
|
+
`;let d=this.createPopover(e,t,n,s);return a.appendChild(d),a.addEventListener("mouseenter",()=>{a.style.background="rgba(0, 0, 0, 0.98)",a.style.transform="scale(1.05)",a.style.borderColor="rgba(255, 255, 255, 0.4)",d.style.display="block"}),a.addEventListener("mouseleave",()=>{a.style.background="rgba(0, 0, 0, 0.9)",a.style.transform="scale(1)",a.style.borderColor="rgba(255, 255, 255, 0.25)",d.style.display="none"}),o.appendChild(a),o.appendChild(c),o}createPopover(e,t,n,s){let r=document.createElement("div");r.style.cssText=`
|
|
30
|
+
display: none;
|
|
31
|
+
position: absolute;
|
|
32
|
+
right: calc(100% + 12px);
|
|
33
|
+
top: 50%;
|
|
34
|
+
transform: translateY(-50%);
|
|
35
|
+
background: rgba(0, 0, 0, 0.95);
|
|
36
|
+
color: white;
|
|
37
|
+
padding: 12px 16px;
|
|
38
|
+
border-radius: 8px;
|
|
39
|
+
font: normal 12px system-ui, -apple-system, sans-serif;
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
border: 1.5px solid rgba(255, 255, 255, 0.15);
|
|
42
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
43
|
+
backdrop-filter: blur(12px);
|
|
44
|
+
z-index: 1;
|
|
45
|
+
`;let o=(s/1e3).toFixed(1);return r.innerHTML=`
|
|
46
|
+
<div style="margin-bottom: 6px; font-weight: 600; font-size: 13px;">Scroll Depth: ${e}%</div>
|
|
47
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Sessions: ${n.toLocaleString()}</div>
|
|
48
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Reach: ${t}% of total</div>
|
|
49
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Avg. time: ${o}s</div>
|
|
50
|
+
`,r}};var _=class{constructor(){this.highlight=null;this.tooltip=null;this.currentElement=null}mount(){this.highlight=document.createElement("div"),this.highlight.className="__li2-tagger-highlight",document.body.appendChild(this.highlight),this.tooltip=document.createElement("div"),this.tooltip.className="__li2-tagger-tooltip",document.body.appendChild(this.tooltip)}unmount(){this.highlight?.remove(),this.tooltip?.remove(),this.highlight=null,this.tooltip=null,this.currentElement=null}highlightElement(e){if(!this.highlight||!this.tooltip||e===this.currentElement)return;this.currentElement=e;let t=e.getBoundingClientRect(),n=window.getComputedStyle(e).position==="fixed",s=Math.max(t.width,20),r=Math.max(t.height,20);this.highlight.style.position=n?"fixed":"absolute",this.highlight.style.top=n?`${t.top}px`:`${t.top+window.scrollY}px`,this.highlight.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.highlight.style.width=`${s}px`,this.highlight.style.height=`${r}px`,this.highlight.style.display="block";let o=e.tagName.toLowerCase(),a=(e.innerText||"").trim().slice(0,40),c=e.id?` #${e.id}`:"",d=a?` "${a}${a.length>=40?"...":""}"`:"";this.tooltip.textContent=`<${o}>${d}${c}`,this.tooltip.style.position=n?"fixed":"absolute";let m=n?t.top-28:t.top+window.scrollY-28;this.tooltip.style.top=`${Math.max(m,4)}px`,this.tooltip.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.tooltip.style.display="block"}clearHighlight(){this.highlight&&(this.highlight.style.display="none"),this.tooltip&&(this.tooltip.style.display="none"),this.currentElement=null}fixSelection(e){this.highlightElement(e),this.highlight&&this.highlight.classList.add("__li2-tagger-highlight--selected")}clearSelection(){this.highlight&&this.highlight.classList.remove("__li2-tagger-highlight--selected")}updatePosition(){if(this.currentElement){let e=this.currentElement;this.currentElement=null,this.highlightElement(e)}}};var Q=new Set(["a","button","input","select","textarea","form","label"]),ee=new Set(["button","link","tab","menuitem"]);function P(i){let e=i;for(;e&&!(e instanceof HTMLElement);)e=e.parentElement;if(!e)return null;let n=te(e),s=ie(n);return{tag:n.tagName.toLowerCase(),text:j(se(n),256),href:ae(n),className:j(n.className||"",512),id:n.id||null,selectorPath:ne(n),isFixed:s}}function te(i){let e=i,t=0;for(;e&&t<5&&e.tagName!=="BODY";){let n=e.tagName.toLowerCase(),s=e.getAttribute("role");if(Q.has(n)||s&&ee.has(s))return e;e=e.parentElement,t++}return i}function ie(i){let e=i;for(;e&&e!==document.body;){try{let n=window.getComputedStyle(e).getPropertyValue("position");if(n==="fixed"||n==="sticky")return!0}catch{break}e=e.parentElement}return!1}function ne(i){let e=[],t=i,n=0;for(;t&&t!==document.body&&n<5;){let s=t.tagName.toLowerCase();t.id&&(s+=`#${t.id}`);let r=t.parentElement;if(r){let o=Array.from(r.children).filter(a=>a.tagName===t.tagName);if(o.length>1){let a=o.indexOf(t)+1;s+=`:nth-of-type(${a})`}}e.unshift(s),t=t.parentElement,n++}return e.join(" > ")}function se(i){return i instanceof HTMLInputElement?i.value||i.placeholder||"":(i.innerText||i.textContent||"").trim()}function ae(i){return i instanceof HTMLAnchorElement?i.href||null:i.getAttribute("href")||null}function j(i,e){return i.length<=e?i:i.slice(0,e)}var C=class{constructor(e,t){this.active=!1;this.overlay=e,this.callbacks=t,this.handleMouseMove=this.onMouseMove.bind(this),this.handleClick=this.onClick.bind(this),this.handleScroll=this.onScroll.bind(this)}activate(){this.active||(this.active=!0,document.addEventListener("mousemove",this.handleMouseMove,!0),document.addEventListener("click",this.handleClick,!0),window.addEventListener("scroll",this.handleScroll,!0))}deactivate(){this.active&&(this.active=!1,document.removeEventListener("mousemove",this.handleMouseMove,!0),document.removeEventListener("click",this.handleClick,!0),window.removeEventListener("scroll",this.handleScroll,!0),this.overlay.clearHighlight(),this.overlay.clearSelection())}onMouseMove(e){let t=e.target;if(!t)return;if(this.isToolbarElement(t)){this.overlay.clearHighlight();return}if(!P(t)){this.overlay.clearHighlight();return}let s=this.findMeaningfulDomElement(t);s&&this.overlay.highlightElement(s)}onClick(e){let t=e.target;if(!t||this.isToolbarElement(t))return;e.preventDefault(),e.stopPropagation();let n=P(t);if(!n)return;let s=this.findMeaningfulDomElement(t);s&&(this.overlay.fixSelection(s),this.callbacks.onElementSelected(s,n))}onScroll(){this.overlay.updatePosition()}isToolbarElement(e){let t=e;for(;t;){let n=t.className;if(typeof n=="string"&&(n.includes("__li2-toolbar")||n.includes("__li2-tagger")))return!0;t=t.parentElement}return!1}findMeaningfulDomElement(e){let t=new Set(["a","button","input","select","textarea","form","label"]),n=new Set(["button","link","tab","menuitem"]),s=e,r=0;for(;s&&r<5&&s.tagName!=="BODY";){let o=s.tagName.toLowerCase(),a=s.getAttribute("role");if(t.has(o)||a&&n.has(a))return s;s=s.parentElement,r++}return e}};var v=class extends Error{constructor(e,t){super(t),this.status=e}};function A(i){return{"X-Li2-Key":i.publishableKey,"X-Li2-Session":i.sessionToken,"X-Li2-SDK-Version":b}}async function U(i,e){let t=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{method:"POST",headers:{"Content-Type":"application/json",...A(i)},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok){let s=n.error||n.message||`Error ${t.status}`;throw new v(t.status,s)}return n.data}async function B(i){let e=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{headers:A(i)});if(!e.ok)throw new v(e.status,"Failed to load existing rules");return(await e.json()).data||[]}var w=class{constructor(e){this.root=null;this.nameInput=null;this.nameError=null;this.submitBtn=null;this.statusEl=null;this.rulesListEl=null;this.criteriaCheckboxes=new Map;this.existingRules=[];this.currentInfo=null;this.state="idle";this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-tagger-panel",this.root.style.display="none",document.body.appendChild(this.root),this.fetchExistingRules()}unmount(){this.root?.remove(),this.root=null,this.criteriaCheckboxes.clear()}show(e){this.currentInfo=e,this.state="selected",this.buildPanelContent(e),this.root&&(this.root.style.display="block")}hide(){this.currentInfo=null,this.state="idle",this.root&&(this.root.style.display="none",this.root.innerHTML=""),this.criteriaCheckboxes.clear()}buildPanelContent(e){if(!this.root)return;this.root.innerHTML="",this.criteriaCheckboxes.clear();let t=document.createElement("div");t.className="__li2-tagger-panel-header";let n=document.createElement("span");n.textContent="Create Event Rule",t.appendChild(n);let s=document.createElement("button");s.className="__li2-tagger-panel-close",s.textContent="\xD7",s.addEventListener("click",()=>this.handleCancel()),t.appendChild(s),this.root.appendChild(t);let r=document.createElement("div");r.className="__li2-tagger-summary";let o=e.text?` "${e.text.slice(0,30)}${e.text.length>30?"...":""}"`:"";r.textContent=`Selected: <${e.tag}>${o} on ${window.location.pathname}`,this.root.appendChild(r);let a=document.createElement("div");a.className="__li2-tagger-field";let c=document.createElement("label");c.className="__li2-tagger-label",c.textContent="Event name",a.appendChild(c),this.nameInput=document.createElement("input"),this.nameInput.type="text",this.nameInput.placeholder="e.g. signup_click",this.nameInput.className="__li2-tagger-input",this.nameInput.addEventListener("input",()=>this.onNameInput()),a.appendChild(this.nameInput),this.nameError=document.createElement("div"),this.nameError.className="__li2-tagger-field-error",a.appendChild(this.nameError),this.root.appendChild(a);let d=document.createElement("div");d.className="__li2-tagger-label",d.textContent="Match criteria",this.root.appendChild(d);let m=[{key:"selector_path",label:"CSS Selector",value:e.selectorPath||null},{key:"element_text",label:"Text contains",value:e.text||null},{key:"element_id",label:"Element ID",value:e.id||null},{key:"element_href",label:"Link href",value:e.href||null},{key:"page_path",label:"Page path",value:window.location.pathname}];for(let u of m){let h=this.createCriterionRow(u);this.root.appendChild(h)}this.statusEl=document.createElement("div"),this.statusEl.className="__li2-tagger-panel-status",this.root.appendChild(this.statusEl);let g=document.createElement("div");g.className="__li2-tagger-btn-row";let p=document.createElement("button");p.className="__li2-tagger-btn __li2-tagger-btn-cancel",p.textContent="Cancel",p.addEventListener("click",()=>this.handleCancel()),g.appendChild(p),this.submitBtn=document.createElement("button"),this.submitBtn.className="__li2-tagger-btn __li2-tagger-btn-submit",this.submitBtn.textContent="Create Event Rule",this.submitBtn.addEventListener("click",()=>this.handleSubmit()),g.appendChild(this.submitBtn),this.root.appendChild(g);let l=document.createElement("div");l.className="__li2-tagger-rules-header",l.textContent="Existing rules",this.root.appendChild(l),this.rulesListEl=document.createElement("div"),this.rulesListEl.className="__li2-tagger-rules-list",this.renderRulesList(),this.root.appendChild(this.rulesListEl),setTimeout(()=>this.nameInput?.focus(),50)}createCriterionRow(e){let t=document.createElement("div");t.className="__li2-tagger-criterion";let n=document.createElement("input");n.type="checkbox",n.checked=!!e.value,n.disabled=!e.value,n.addEventListener("change",()=>this.updateSubmitState()),this.criteriaCheckboxes.set(e.key,n),t.appendChild(n);let s=document.createElement("span");s.className="__li2-tagger-criterion-label",s.textContent=e.label+":",t.appendChild(s);let r=document.createElement("span");return r.className="__li2-tagger-criterion-value",r.textContent=e.value?re(e.value,60):"(empty)",e.value||(r.style.color="#666"),t.appendChild(r),t}onNameInput(){if(!this.nameInput)return;let e=this.nameInput.value,t=e.toLowerCase().replace(/[^a-z0-9_]/g,"");t!==e&&(this.nameInput.value=t),this.validateName(),this.updateSubmitState()}validateName(){let e=this.nameInput?.value||"",t=null;return e?e.length>256?t="Max 256 characters":/^[a-z0-9_]+$/.test(e)?this.existingRules.some(n=>n.name===e)&&(t="Event name already exists"):t="Only lowercase letters, numbers, and underscores":t=null,this.nameError&&(this.nameError.textContent=t||""),t}updateSubmitState(){if(!this.submitBtn)return;let e=!!this.nameInput?.value&&!this.validateName(),t=this.getCheckedCriteria().length>0;this.submitBtn.disabled=!e||!t||this.state==="creating"}getCheckedCriteria(){let e=[];for(let[t,n]of this.criteriaCheckboxes)n.checked&&e.push(t);return e}async handleSubmit(){if(!this.nameInput||!this.currentInfo)return;let e=this.nameInput.value;if(!e||this.validateName())return;this.state="creating",this.setFormDisabled(!0),this.setStatus("Creating...","loading");let t=new Set(this.getCheckedCriteria()),n=this.currentInfo,s={name:e,selector_path:t.has("selector_path")&&n.selectorPath||void 0,element_text:t.has("element_text")&&n.text||void 0,element_id:t.has("element_id")&&n.id||void 0,element_href:t.has("element_href")&&n.href||void 0,page_path:t.has("page_path")?window.location.pathname:void 0,text_match_mode:t.has("element_text")?"contains":void 0},r={};for(let[o,a]of Object.entries(s))a!==void 0&&(r[o]=a);try{await U(this.config.apiConfig,r),this.state="success",this.setStatus(`Event rule '${e}' created!`,"success"),await this.fetchExistingRules(),setTimeout(()=>{this.hide(),this.config.onCreated(e)},2e3)}catch(o){this.state="error",this.setFormDisabled(!1),o instanceof v?this.setStatus(o.message,"error"):this.setStatus("Connection failed. Please try again.","error")}}handleCancel(){this.hide(),this.config.onCancel()}setFormDisabled(e){this.nameInput&&(this.nameInput.disabled=e),this.submitBtn&&(this.submitBtn.disabled=e,this.submitBtn.textContent=e?"Creating...":"Create Event Rule");for(let t of this.criteriaCheckboxes.values())(t.checked||!e)&&(t.disabled=e?!0:!t.checked)}setStatus(e,t){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.className="__li2-tagger-panel-status",t==="loading"?this.statusEl.classList.add("__li2-tagger-status-loading"):t==="success"?this.statusEl.classList.add("__li2-tagger-status-success"):t==="error"&&this.statusEl.classList.add("__li2-tagger-status-error"))}async fetchExistingRules(){try{this.existingRules=await B(this.config.apiConfig),this.renderRulesList()}catch{}}renderRulesList(){if(this.rulesListEl){if(this.rulesListEl.innerHTML="",this.existingRules.length===0){let e=document.createElement("div");e.className="__li2-tagger-rules-empty",e.textContent="No rules yet",this.rulesListEl.appendChild(e);return}for(let e of this.existingRules){let t=document.createElement("div");t.className="__li2-tagger-rule-item",t.textContent=`\u2022 ${e.name}`,this.rulesListEl.appendChild(t)}}}};function re(i,e){return i.length>e?i.slice(0,e)+"...":i}var f=class{constructor(e){this.root=null;this.statsEl=null;this.statusEl=null;this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-toolbar",this.config.mode==="tagger"?this.mountTagger():this.config.mode==="scroll"?this.mountScroll():this.mountHeatmap(),document.body.appendChild(this.root)}createOpacitySlider(){let e=document.createElement("input");return e.type="range",e.min="0",e.max="100",e.value=String(Math.round(this.config.initialOpacity*100)),e.className="__li2-toolbar-slider",e.addEventListener("input",()=>{this.config.onOpacityChange(Number(e.value)/100)}),e}mountHeatmap(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl),this.root.appendChild(this.createOpacitySlider()),this.appendCloseButton("Close heatmap")}mountScroll(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Scroll Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl),this.root.appendChild(this.createOpacitySlider()),this.appendCloseButton("Close scroll heatmap")}mountTagger(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Event Tagger",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent="Click an element to tag",this.root.appendChild(this.statusEl),this.appendCloseButton("Close tagger")}appendCloseButton(e){if(!this.root)return;let t=document.createElement("button");t.className="__li2-toolbar-close",t.textContent="\xD7",t.title=e,t.addEventListener("click",this.config.onClose),this.root.appendChild(t)}unmount(){this.root?.remove(),this.root=null}setStats(e,t){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} clicks`)}setScrollStats(e){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} sessions`)}setLoading(e){this.statusEl&&(e?(this.statusEl.className="__li2-toolbar-loading",this.statusEl.textContent="Loading..."):(this.statusEl.textContent="",this.statusEl.className=""))}setStatus(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent=e)}setError(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-error",this.statusEl.textContent=e)}createSeparator(){let e=document.createElement("span");return e.style.cssText="color:#555;user-select:none;",e.textContent="|",e}};function O(){if(document.getElementById("__li2-toolbar-styles"))return;let i=document.createElement("style");i.id="__li2-toolbar-styles",i.textContent=`
|
|
2
51
|
.__li2-toolbar {
|
|
3
52
|
position: fixed; bottom: 20px; right: 20px; z-index: 99999;
|
|
4
53
|
background: #1a1a2e; color: #fff; border-radius: 12px;
|
|
@@ -110,4 +159,4 @@
|
|
|
110
159
|
}
|
|
111
160
|
.__li2-tagger-rules-empty { color: #64748b; font-size: 12px; padding: 4px 0; }
|
|
112
161
|
.__li2-tagger-rule-item { color: #94a3b8; font-size: 12px; padding: 2px 0; }
|
|
113
|
-
`,document.head.appendChild(i)}function
|
|
162
|
+
`,document.head.appendChild(i)}function oe(){let i=new Date;return i.setDate(i.getDate()-7),i.toISOString().slice(0,10)}function le(){return new Date().toISOString().slice(0,10)}var T=class{constructor(e){this.heatmapOverlay=null;this.scrollOverlay=null;this.taggerOverlay=null;this.taggerMode=null;this.taggerPanel=null;this.ui=null;this.selectedElement=null;this.onElementSelected=null;this.apiUrl=e.apiUrl,this.publishableKey=e.publishableKey,this.mode=e.mode||"heatmap",this.sessionToken=e.sessionToken}async activate(){if(!this.sessionToken){O(),this.ui=new f({mode:this.mode,initialOpacity:.6,onOpacityChange:()=>{},onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setError("Session expired. Please reopen from the dashboard.");return}O(),this.mode==="tagger"?this.activateTagger():this.mode==="scroll"?await this.activateScroll():await this.activateHeatmap()}deactivate(){this.heatmapOverlay?.unmount(),this.heatmapOverlay=null,this.scrollOverlay?.unmount(),this.scrollOverlay=null,this.taggerMode?.deactivate(),this.taggerMode=null,this.taggerPanel?.unmount(),this.taggerPanel=null,this.taggerOverlay?.unmount(),this.taggerOverlay=null,this.ui?.unmount(),this.ui=null,this.selectedElement=null;let e=new URL(window.location.href);e.searchParams.delete("li2_heatmap"),e.searchParams.delete("li2_scroll"),e.searchParams.delete("li2_tagger"),e.searchParams.delete("li2_session"),e.searchParams.delete("li2_from"),e.searchParams.delete("li2_to"),e.searchParams.delete("li2_device"),history.replaceState(null,"",e.toString())}parseParams(e){let t=new URL(window.location.href);return t.searchParams.has(e)?{from:t.searchParams.get("li2_from")??oe(),to:t.searchParams.get("li2_to")??le(),deviceType:t.searchParams.get("li2_device")??void 0}:null}async activateHeatmap(){let e=this.parseParams("li2_heatmap");if(e){this.heatmapOverlay=new y,this.heatmapOverlay.mount(),this.ui=new f({mode:"heatmap",initialOpacity:.6,onOpacityChange:t=>this.heatmapOverlay?.setOpacity(t),onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setLoading(!0);try{let t=await I({apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken,pagePath:window.location.pathname,from:e.from,to:e.to,deviceType:e.deviceType,targetWidth:window.innerWidth});this.heatmapOverlay?.render(t.grid),this.ui?.setStats(t.total_clicks,t.grid.length)}catch{this.ui?.setError("Failed to load heatmap data")}finally{this.ui?.setLoading(!1)}}}async activateScroll(){let e=this.parseParams("li2_scroll");if(e){this.scrollOverlay=new E,this.scrollOverlay.mount(),this.scrollOverlay.setOpacity(.35),this.ui=new f({mode:"scroll",initialOpacity:.35,onOpacityChange:t=>this.scrollOverlay?.setOpacity(t),onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setLoading(!0);try{let t=await D({apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken,pagePath:window.location.pathname,from:e.from,to:e.to,deviceType:e.deviceType});this.scrollOverlay?.render(t.milestones,t.total_sessions),this.ui?.setScrollStats(t.total_sessions)}catch{this.ui?.setError("Failed to load scroll heatmap data")}finally{this.ui?.setLoading(!1)}}}activateTagger(){this.taggerOverlay=new _,this.taggerOverlay.mount(),this.taggerPanel=new w({apiConfig:{apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken},onCancel:()=>{this.taggerOverlay?.clearHighlight(),this.taggerOverlay?.clearSelection(),this.selectedElement=null,this.ui?.setStatus("Click an element to tag")},onCreated:()=>{this.taggerOverlay?.clearHighlight(),this.taggerOverlay?.clearSelection(),this.selectedElement=null,this.ui?.setStatus("Click an element to tag")}}),this.taggerPanel.mount(),this.taggerMode=new C(this.taggerOverlay,{onElementSelected:(e,t)=>{this.selectedElement={element:e,info:t},this.ui?.setStatus("Element selected"),this.taggerPanel?.show(t),this.onElementSelected?.({element:e,info:t})}}),this.taggerMode.activate(),this.ui=new f({mode:"tagger",initialOpacity:.6,onOpacityChange:()=>{},onClose:()=>this.deactivate()}),this.ui.mount()}};if(typeof window<"u"&&window.__li2ToolbarConfig){let i=window.__li2ToolbarConfig;delete window.__li2ToolbarConfig;let e=new T(i);window.__li2Toolbar=e,e.activate()}return W(ce);})();
|
package/dist/toolbar/index.js
CHANGED
|
@@ -1,4 +1,53 @@
|
|
|
1
|
-
"use strict";var C=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var B=(i,e)=>{for(var t in e)C(i,t,{get:e[t],enumerable:!0})},U=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of $(e))!A.call(i,a)&&a!==t&&C(i,a,{get:()=>e[a],enumerable:!(n=D(e,a))||n.enumerable});return i};var F=i=>U(C({},"__esModule",{value:!0}),i);var ee={};B(ee,{ToolbarManager:()=>y});module.exports=F(ee);async function k(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/clicks`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),e.searchParams.set("target_width",String(i.targetWidth)),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t={"X-Li2-Key":i.publishableKey};i.sessionToken&&(t["X-Li2-Session"]=i.sessionToken);let n=await fetch(e.toString(),{headers:t});if(!n.ok)throw new Error(`Heatmap API error: ${n.status}`);return(await n.json()).data.heatmap}var w=[[0,[0,0,255,128]],[.25,[0,255,255,200]],[.5,[0,255,0,220]],[.75,[255,255,0,240]],[1,[255,0,0,255]]];function M(i){if(i<=0)return[0,0,0,0];let e=Math.min(1,Math.max(0,i));for(let t=0;t<w.length-1;t++){let[n,a]=w[t],[o,l]=w[t+1];if(e>=n&&e<=o){let s=(e-n)/(o-n);return[Math.round(a[0]+(l[0]-a[0])*s),Math.round(a[1]+(l[1]-a[1])*s),Math.round(a[2]+(l[2]-a[2])*s),Math.round(a[3]+(l[3]-a[3])*s)]}}return[255,0,0,255]}var G=30;function S(i,e,t,n,a=G){let o=i.getContext("2d");if(!o||e.length===0||t===0||n===0)return;i.width=t,i.height=n;let l=Math.max(...e.map(r=>r.count));if(l===0)return;let s=document.createElement("canvas");s.width=t,s.height=n;let c=s.getContext("2d");if(!c)return;c.fillStyle="black",c.fillRect(0,0,t,n),c.globalCompositeOperation="lighter";for(let r of e){if(r.x<-a||r.x>t+a||r.y<-a||r.y>n+a)continue;let u=r.count/l,d=c.createRadialGradient(r.x,r.y,0,r.x,r.y,a);d.addColorStop(0,`rgba(255,255,255,${u})`),d.addColorStop(.33,`rgba(255,255,255,${u*.607})`),d.addColorStop(.67,`rgba(255,255,255,${u*.135})`),d.addColorStop(1,"rgba(255,255,255,0)"),c.fillStyle=d,c.beginPath(),c.arc(r.x,r.y,a,0,Math.PI*2),c.fill()}let m=c.getImageData(0,0,t,n).data,p=o.createImageData(t,n),h=p.data;for(let r=0;r<m.length;r+=4){let u=m[r]/255;if(u>.01){let[d,R,O,z]=M(u);h[r]=d,h[r+1]=R,h[r+2]=O,h[r+3]=z}}o.putImageData(p,0,0)}var b=class{constructor(){this.grid=[];this.handleResize=()=>{this.resize(),this.doRender()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;"}mount(){document.body.appendChild(this.canvas),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),window.removeEventListener("resize",this.handleResize)}render(e){this.grid=e,this.doRender()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){if(this.grid.length===0)return;let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;S(this.canvas,this.grid,e,t)}};var x=class{constructor(){this.highlight=null;this.tooltip=null;this.currentElement=null}mount(){this.highlight=document.createElement("div"),this.highlight.className="__li2-tagger-highlight",document.body.appendChild(this.highlight),this.tooltip=document.createElement("div"),this.tooltip.className="__li2-tagger-tooltip",document.body.appendChild(this.tooltip)}unmount(){this.highlight?.remove(),this.tooltip?.remove(),this.highlight=null,this.tooltip=null,this.currentElement=null}highlightElement(e){if(!this.highlight||!this.tooltip||e===this.currentElement)return;this.currentElement=e;let t=e.getBoundingClientRect(),n=window.getComputedStyle(e).position==="fixed",a=Math.max(t.width,20),o=Math.max(t.height,20);this.highlight.style.position=n?"fixed":"absolute",this.highlight.style.top=n?`${t.top}px`:`${t.top+window.scrollY}px`,this.highlight.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.highlight.style.width=`${a}px`,this.highlight.style.height=`${o}px`,this.highlight.style.display="block";let l=e.tagName.toLowerCase(),s=(e.innerText||"").trim().slice(0,40),c=e.id?` #${e.id}`:"",g=s?` "${s}${s.length>=40?"...":""}"`:"";this.tooltip.textContent=`<${l}>${g}${c}`,this.tooltip.style.position=n?"fixed":"absolute";let m=n?t.top-28:t.top+window.scrollY-28;this.tooltip.style.top=`${Math.max(m,4)}px`,this.tooltip.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.tooltip.style.display="block"}clearHighlight(){this.highlight&&(this.highlight.style.display="none"),this.tooltip&&(this.tooltip.style.display="none"),this.currentElement=null}fixSelection(e){this.highlightElement(e),this.highlight&&this.highlight.classList.add("__li2-tagger-highlight--selected")}clearSelection(){this.highlight&&this.highlight.classList.remove("__li2-tagger-highlight--selected")}updatePosition(){if(this.currentElement){let e=this.currentElement;this.currentElement=null,this.highlightElement(e)}}};var j=new Set(["a","button","input","select","textarea","form","label"]),K=new Set(["button","link","tab","menuitem"]);function T(i){let e=i;for(;e&&!(e instanceof HTMLElement);)e=e.parentElement;if(!e)return null;let n=W(e),a=X(n);return{tag:n.tagName.toLowerCase(),text:H(Y(n),256),href:V(n),className:H(n.className||"",512),id:n.id||null,selectorPath:q(n),isFixed:a}}function W(i){let e=i,t=0;for(;e&&t<5&&e.tagName!=="BODY";){let n=e.tagName.toLowerCase(),a=e.getAttribute("role");if(j.has(n)||a&&K.has(a))return e;e=e.parentElement,t++}return i}function X(i){let e=i;for(;e&&e!==document.body;){try{let n=window.getComputedStyle(e).getPropertyValue("position");if(n==="fixed"||n==="sticky")return!0}catch{break}e=e.parentElement}return!1}function q(i){let e=[],t=i,n=0;for(;t&&t!==document.body&&n<5;){let a=t.tagName.toLowerCase();t.id&&(a+=`#${t.id}`);let o=t.parentElement;if(o){let l=Array.from(o.children).filter(s=>s.tagName===t.tagName);if(l.length>1){let s=l.indexOf(t)+1;a+=`:nth-of-type(${s})`}}e.unshift(a),t=t.parentElement,n++}return e.join(" > ")}function Y(i){return i instanceof HTMLInputElement?i.value||i.placeholder||"":(i.innerText||i.textContent||"").trim()}function V(i){return i instanceof HTMLAnchorElement?i.href||null:i.getAttribute("href")||null}function H(i,e){return i.length<=e?i:i.slice(0,e)}var E=class{constructor(e,t){this.active=!1;this.overlay=e,this.callbacks=t,this.handleMouseMove=this.onMouseMove.bind(this),this.handleClick=this.onClick.bind(this),this.handleScroll=this.onScroll.bind(this)}activate(){this.active||(this.active=!0,document.addEventListener("mousemove",this.handleMouseMove,!0),document.addEventListener("click",this.handleClick,!0),window.addEventListener("scroll",this.handleScroll,!0))}deactivate(){this.active&&(this.active=!1,document.removeEventListener("mousemove",this.handleMouseMove,!0),document.removeEventListener("click",this.handleClick,!0),window.removeEventListener("scroll",this.handleScroll,!0),this.overlay.clearHighlight(),this.overlay.clearSelection())}onMouseMove(e){let t=e.target;if(!t)return;if(this.isToolbarElement(t)){this.overlay.clearHighlight();return}if(!T(t)){this.overlay.clearHighlight();return}let a=this.findMeaningfulDomElement(t);a&&this.overlay.highlightElement(a)}onClick(e){let t=e.target;if(!t||this.isToolbarElement(t))return;e.preventDefault(),e.stopPropagation();let n=T(t);if(!n)return;let a=this.findMeaningfulDomElement(t);a&&(this.overlay.fixSelection(a),this.callbacks.onElementSelected(a,n))}onScroll(){this.overlay.updatePosition()}isToolbarElement(e){let t=e;for(;t;){let n=t.className;if(typeof n=="string"&&(n.includes("__li2-toolbar")||n.includes("__li2-tagger")))return!0;t=t.parentElement}return!1}findMeaningfulDomElement(e){let t=new Set(["a","button","input","select","textarea","form","label"]),n=new Set(["button","link","tab","menuitem"]),a=e,o=0;for(;a&&o<5&&a.tagName!=="BODY";){let l=a.tagName.toLowerCase(),s=a.getAttribute("role");if(t.has(l)||s&&n.has(s))return a;a=a.parentElement,o++}return e}};var f=class extends Error{constructor(e,t){super(t),this.status=e}};function P(i){return{"X-Li2-Key":i.publishableKey,"X-Li2-Session":i.sessionToken}}async function N(i,e){let t=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{method:"POST",headers:{"Content-Type":"application/json",...P(i)},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok){let a=n.error||n.message||`Error ${t.status}`;throw new f(t.status,a)}return n.data}async function I(i){let e=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{headers:P(i)});if(!e.ok)throw new f(e.status,"Failed to load existing rules");return(await e.json()).data||[]}var _=class{constructor(e){this.root=null;this.nameInput=null;this.nameError=null;this.submitBtn=null;this.statusEl=null;this.rulesListEl=null;this.criteriaCheckboxes=new Map;this.existingRules=[];this.currentInfo=null;this.state="idle";this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-tagger-panel",this.root.style.display="none",document.body.appendChild(this.root),this.fetchExistingRules()}unmount(){this.root?.remove(),this.root=null,this.criteriaCheckboxes.clear()}show(e){this.currentInfo=e,this.state="selected",this.buildPanelContent(e),this.root&&(this.root.style.display="block")}hide(){this.currentInfo=null,this.state="idle",this.root&&(this.root.style.display="none",this.root.innerHTML=""),this.criteriaCheckboxes.clear()}buildPanelContent(e){if(!this.root)return;this.root.innerHTML="",this.criteriaCheckboxes.clear();let t=document.createElement("div");t.className="__li2-tagger-panel-header";let n=document.createElement("span");n.textContent="Create Event Rule",t.appendChild(n);let a=document.createElement("button");a.className="__li2-tagger-panel-close",a.textContent="\xD7",a.addEventListener("click",()=>this.handleCancel()),t.appendChild(a),this.root.appendChild(t);let o=document.createElement("div");o.className="__li2-tagger-summary";let l=e.text?` "${e.text.slice(0,30)}${e.text.length>30?"...":""}"`:"";o.textContent=`Selected: <${e.tag}>${l} on ${window.location.pathname}`,this.root.appendChild(o);let s=document.createElement("div");s.className="__li2-tagger-field";let c=document.createElement("label");c.className="__li2-tagger-label",c.textContent="Event name",s.appendChild(c),this.nameInput=document.createElement("input"),this.nameInput.type="text",this.nameInput.placeholder="e.g. signup_click",this.nameInput.className="__li2-tagger-input",this.nameInput.addEventListener("input",()=>this.onNameInput()),s.appendChild(this.nameInput),this.nameError=document.createElement("div"),this.nameError.className="__li2-tagger-field-error",s.appendChild(this.nameError),this.root.appendChild(s);let g=document.createElement("div");g.className="__li2-tagger-label",g.textContent="Match criteria",this.root.appendChild(g);let m=[{key:"selector_path",label:"CSS Selector",value:e.selectorPath||null},{key:"element_text",label:"Text contains",value:e.text||null},{key:"element_id",label:"Element ID",value:e.id||null},{key:"element_href",label:"Link href",value:e.href||null},{key:"page_path",label:"Page path",value:window.location.pathname}];for(let u of m){let d=this.createCriterionRow(u);this.root.appendChild(d)}this.statusEl=document.createElement("div"),this.statusEl.className="__li2-tagger-panel-status",this.root.appendChild(this.statusEl);let p=document.createElement("div");p.className="__li2-tagger-btn-row";let h=document.createElement("button");h.className="__li2-tagger-btn __li2-tagger-btn-cancel",h.textContent="Cancel",h.addEventListener("click",()=>this.handleCancel()),p.appendChild(h),this.submitBtn=document.createElement("button"),this.submitBtn.className="__li2-tagger-btn __li2-tagger-btn-submit",this.submitBtn.textContent="Create Event Rule",this.submitBtn.addEventListener("click",()=>this.handleSubmit()),p.appendChild(this.submitBtn),this.root.appendChild(p);let r=document.createElement("div");r.className="__li2-tagger-rules-header",r.textContent="Existing rules",this.root.appendChild(r),this.rulesListEl=document.createElement("div"),this.rulesListEl.className="__li2-tagger-rules-list",this.renderRulesList(),this.root.appendChild(this.rulesListEl),setTimeout(()=>this.nameInput?.focus(),50)}createCriterionRow(e){let t=document.createElement("div");t.className="__li2-tagger-criterion";let n=document.createElement("input");n.type="checkbox",n.checked=!!e.value,n.disabled=!e.value,n.addEventListener("change",()=>this.updateSubmitState()),this.criteriaCheckboxes.set(e.key,n),t.appendChild(n);let a=document.createElement("span");a.className="__li2-tagger-criterion-label",a.textContent=e.label+":",t.appendChild(a);let o=document.createElement("span");return o.className="__li2-tagger-criterion-value",o.textContent=e.value?J(e.value,60):"(empty)",e.value||(o.style.color="#666"),t.appendChild(o),t}onNameInput(){if(!this.nameInput)return;let e=this.nameInput.value,t=e.toLowerCase().replace(/[^a-z0-9_]/g,"");t!==e&&(this.nameInput.value=t),this.validateName(),this.updateSubmitState()}validateName(){let e=this.nameInput?.value||"",t=null;return e?e.length>256?t="Max 256 characters":/^[a-z0-9_]+$/.test(e)?this.existingRules.some(n=>n.name===e)&&(t="Event name already exists"):t="Only lowercase letters, numbers, and underscores":t=null,this.nameError&&(this.nameError.textContent=t||""),t}updateSubmitState(){if(!this.submitBtn)return;let e=!!this.nameInput?.value&&!this.validateName(),t=this.getCheckedCriteria().length>0;this.submitBtn.disabled=!e||!t||this.state==="creating"}getCheckedCriteria(){let e=[];for(let[t,n]of this.criteriaCheckboxes)n.checked&&e.push(t);return e}async handleSubmit(){if(!this.nameInput||!this.currentInfo)return;let e=this.nameInput.value;if(!e||this.validateName())return;this.state="creating",this.setFormDisabled(!0),this.setStatus("Creating...","loading");let t=new Set(this.getCheckedCriteria()),n=this.currentInfo,a={name:e,selector_path:t.has("selector_path")&&n.selectorPath||void 0,element_text:t.has("element_text")&&n.text||void 0,element_id:t.has("element_id")&&n.id||void 0,element_href:t.has("element_href")&&n.href||void 0,page_path:t.has("page_path")?window.location.pathname:void 0,text_match_mode:t.has("element_text")?"contains":void 0},o={};for(let[l,s]of Object.entries(a))s!==void 0&&(o[l]=s);try{await N(this.config.apiConfig,o),this.state="success",this.setStatus(`Event rule '${e}' created!`,"success"),await this.fetchExistingRules(),setTimeout(()=>{this.hide(),this.config.onCreated(e)},2e3)}catch(l){this.state="error",this.setFormDisabled(!1),l instanceof f?this.setStatus(l.message,"error"):this.setStatus("Connection failed. Please try again.","error")}}handleCancel(){this.hide(),this.config.onCancel()}setFormDisabled(e){this.nameInput&&(this.nameInput.disabled=e),this.submitBtn&&(this.submitBtn.disabled=e,this.submitBtn.textContent=e?"Creating...":"Create Event Rule");for(let t of this.criteriaCheckboxes.values())(t.checked||!e)&&(t.disabled=e?!0:!t.checked)}setStatus(e,t){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.className="__li2-tagger-panel-status",t==="loading"?this.statusEl.classList.add("__li2-tagger-status-loading"):t==="success"?this.statusEl.classList.add("__li2-tagger-status-success"):t==="error"&&this.statusEl.classList.add("__li2-tagger-status-error"))}async fetchExistingRules(){try{this.existingRules=await I(this.config.apiConfig),this.renderRulesList()}catch{}}renderRulesList(){if(this.rulesListEl){if(this.rulesListEl.innerHTML="",this.existingRules.length===0){let e=document.createElement("div");e.className="__li2-tagger-rules-empty",e.textContent="No rules yet",this.rulesListEl.appendChild(e);return}for(let e of this.existingRules){let t=document.createElement("div");t.className="__li2-tagger-rule-item",t.textContent=`\u2022 ${e.name}`,this.rulesListEl.appendChild(t)}}}};function J(i,e){return i.length>e?i.slice(0,e)+"...":i}var v=class{constructor(e){this.root=null;this.statsEl=null;this.statusEl=null;this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-toolbar",this.config.mode==="tagger"?this.mountTagger():this.mountHeatmap(),document.body.appendChild(this.root)}mountHeatmap(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl);let t=document.createElement("input");t.type="range",t.min="0",t.max="100",t.value=String(Math.round(this.config.initialOpacity*100)),t.className="__li2-toolbar-slider",t.addEventListener("input",()=>{this.config.onOpacityChange(Number(t.value)/100)}),this.root.appendChild(t),this.appendCloseButton("Close heatmap")}mountTagger(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Event Tagger",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent="Click an element to tag",this.root.appendChild(this.statusEl),this.appendCloseButton("Close tagger")}appendCloseButton(e){if(!this.root)return;let t=document.createElement("button");t.className="__li2-toolbar-close",t.textContent="\xD7",t.title=e,t.addEventListener("click",this.config.onClose),this.root.appendChild(t)}unmount(){this.root?.remove(),this.root=null}setStats(e,t){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} clicks`)}setLoading(e){this.statusEl&&(e?(this.statusEl.className="__li2-toolbar-loading",this.statusEl.textContent="Loading..."):(this.statusEl.textContent="",this.statusEl.className=""))}setStatus(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent=e)}setError(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-error",this.statusEl.textContent=e)}createSeparator(){let e=document.createElement("span");return e.style.cssText="color:#555;user-select:none;",e.textContent="|",e}};function L(){if(document.getElementById("__li2-toolbar-styles"))return;let i=document.createElement("style");i.id="__li2-toolbar-styles",i.textContent=`
|
|
1
|
+
"use strict";var L=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var X=(i,e)=>{for(var t in e)L(i,t,{get:e[t],enumerable:!0})},V=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of G(e))!q.call(i,s)&&s!==t&&L(i,s,{get:()=>e[s],enumerable:!(n=F(e,s))||n.enumerable});return i};var W=i=>V(L({},"__esModule",{value:!0}),i);var ce={};X(ce,{ToolbarManager:()=>T});module.exports=W(ce);var N={name:"@li2/analytics",version:"0.4.0-beta.1",description:"Li2 Analytics SDK for conversion tracking",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./pageview":{types:"./dist/pageview/index.d.ts",import:"./dist/pageview/index.mjs",require:"./dist/pageview/index.js"},"./click-tracker":{types:"./dist/click-tracker/index.d.ts",import:"./dist/click-tracker/index.mjs",require:"./dist/click-tracker/index.js"},"./toolbar":{types:"./dist/toolbar/index.d.ts",import:"./dist/toolbar/index.mjs",require:"./dist/toolbar/index.js"}},files:["dist"],scripts:{build:"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --minify --global-name li2Analytics","build:obfuscate":"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --minify --global-name li2Analytics && node scripts/obfuscate.js",dev:"tsup src/index.ts src/outbound.ts src/auto-events.ts src/pageview/index.ts src/click-tracker/index.ts src/toolbar/index.ts --format cjs,esm,iife --dts --watch --global-name li2Analytics",demo:"pnpm run build && node demo/server.js","demo:serve":"node demo/server.js",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",prepublishOnly:"NODE_OPTIONS=--max-old-space-size=4096 pnpm run build:obfuscate"},keywords:["li2","analytics","conversion","tracking"],author:"Li2",license:"MIT",devDependencies:{"@vitest/coverage-v8":"^4.0.18","happy-dom":"^20.6.1","javascript-obfuscator":"^4.1.0",tsup:"^8.0.0",typescript:"^5.0.0",vitest:"^4.0.18"}};var b=N.version;function R(i,e){let t={"X-Li2-Key":i,"X-Li2-SDK-Version":b};return e&&(t["X-Li2-Session"]=e),t}async function I(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/clicks`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),e.searchParams.set("target_width",String(i.targetWidth)),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t=await fetch(e.toString(),{headers:R(i.publishableKey,i.sessionToken)});if(!t.ok)throw new Error(`Heatmap API error: ${t.status}`);return(await t.json()).data.heatmap}async function D(i){let e=new URL(`${i.apiUrl}/api/v1/track/heatmap/scroll`);e.searchParams.set("page_path",i.pagePath),e.searchParams.set("from",i.from),e.searchParams.set("to",i.to),i.deviceType&&e.searchParams.set("device_type",i.deviceType);let t=await fetch(e.toString(),{headers:R(i.publishableKey,i.sessionToken)});if(!t.ok)throw new Error(`Scroll heatmap API error: ${t.status}`);return(await t.json()).data}var M=[[0,[0,0,255,128]],[.25,[0,255,255,200]],[.5,[0,255,0,220]],[.75,[255,255,0,240]],[1,[255,0,0,255]]];function x(i){if(i<=0)return[0,0,0,0];let e=Math.min(1,Math.max(0,i));for(let t=0;t<M.length-1;t++){let[n,s]=M[t],[r,o]=M[t+1];if(e>=n&&e<=r){let a=(e-n)/(r-n);return[Math.round(s[0]+(o[0]-s[0])*a),Math.round(s[1]+(o[1]-s[1])*a),Math.round(s[2]+(o[2]-s[2])*a),Math.round(s[3]+(o[3]-s[3])*a)]}}return[255,0,0,255]}var J=30;function $(i,e,t,n,s=J){let r=i.getContext("2d");if(!r||e.length===0||t===0||n===0)return;i.width=t,i.height=n;let o=Math.max(...e.map(l=>l.count));if(o===0)return;let a=document.createElement("canvas");a.width=t,a.height=n;let c=a.getContext("2d");if(!c)return;c.fillStyle="black",c.fillRect(0,0,t,n),c.globalCompositeOperation="lighter";for(let l of e){if(l.x<-s||l.x>t+s||l.y<-s||l.y>n+s)continue;let u=l.count/o,h=c.createRadialGradient(l.x,l.y,0,l.x,l.y,s);h.addColorStop(0,`rgba(255,255,255,${u})`),h.addColorStop(.33,`rgba(255,255,255,${u*.607})`),h.addColorStop(.67,`rgba(255,255,255,${u*.135})`),h.addColorStop(1,"rgba(255,255,255,0)"),c.fillStyle=h,c.beginPath(),c.arc(l.x,l.y,s,0,Math.PI*2),c.fill()}let m=c.getImageData(0,0,t,n).data,g=r.createImageData(t,n),p=g.data;for(let l=0;l<m.length;l+=4){let u=m[l]/255;if(u>.01){let[h,S,k,K]=x(u);p[l]=h,p[l+1]=S,p[l+2]=k,p[l+3]=K}}r.putImageData(g,0,0)}var y=class{constructor(){this.grid=[];this.handleResize=()=>{this.resize(),this.doRender()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;"}mount(){document.body.appendChild(this.canvas),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),window.removeEventListener("resize",this.handleResize)}render(e){this.grid=e,this.doRender()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){if(this.grid.length===0)return;let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;$(this.canvas,this.grid,e,t)}};var H=[0,25,50,75,90,100];function z(i,e,t){let n=i.getContext("2d");if(!n||t===0||e.length===0)return;let s=i.width,r=i.height;n.clearRect(0,0,s,r);let o=new Map;for(let a of e)o.set(a.scroll_depth_percent,a.sessions_reached);for(let a=0;a<H.length-1;a++){let c=H[a],d=H[a+1],m=c/100*r,g=d/100*r,l=(o.get(d)??0)/t,[u,h,S,k]=x(l);n.fillStyle=`rgba(${u},${h},${S},${k/255})`,n.fillRect(0,m,s,g-m)}}var Z=[25,50,75,90,100],E=class{constructor(){this.milestones=[];this.totalSessions=0;this.handleResize=()=>{this.resize(),this.doRender(),this.renderBadges()};this.canvas=document.createElement("canvas"),this.canvas.style.cssText="position:absolute;top:0;left:0;pointer-events:none;z-index:99998;",this.badgesContainer=document.createElement("div"),this.badgesContainer.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;"}mount(){document.body.appendChild(this.canvas),document.body.appendChild(this.badgesContainer),this.resize(),window.addEventListener("resize",this.handleResize)}unmount(){this.canvas.remove(),this.badgesContainer.remove(),window.removeEventListener("resize",this.handleResize)}render(e,t){this.milestones=e,this.totalSessions=t,this.doRender(),this.renderBadges()}setOpacity(e){this.canvas.style.opacity=String(e)}resize(){let e=document.documentElement.scrollWidth,t=document.documentElement.scrollHeight;this.canvas.width=e,this.canvas.height=t,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`}doRender(){this.milestones.length!==0&&z(this.canvas,this.milestones,this.totalSessions)}renderBadges(){if(this.badgesContainer.innerHTML="",this.totalSessions===0)return;let e=document.documentElement.scrollHeight;this.badgesContainer.style.height=`${e}px`;let t=new Map(this.milestones.map(n=>[n.scroll_depth_percent,n]));for(let n of Z){let s=t.get(n);if(!s||s.sessions_reached===0)continue;let r=n/100*e,o=Math.round(s.sessions_reached/this.totalSessions*100),a=this.createAnchor(n,o,s.sessions_reached,s.avg_time_at_depth,r);this.badgesContainer.appendChild(a)}}createAnchor(e,t,n,s,r){let o=document.createElement("div");o.style.cssText=`
|
|
2
|
+
position: absolute;
|
|
3
|
+
right: 16px;
|
|
4
|
+
top: ${r}px;
|
|
5
|
+
transform: translateY(-50%);
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
gap: 8px;
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
`;let a=document.createElement("div");a.style.cssText=`
|
|
11
|
+
background: rgba(0, 0, 0, 0.9);
|
|
12
|
+
color: white;
|
|
13
|
+
padding: 6px 14px;
|
|
14
|
+
border-radius: 20px;
|
|
15
|
+
font: bold 12px system-ui, -apple-system, sans-serif;
|
|
16
|
+
white-space: nowrap;
|
|
17
|
+
pointer-events: auto;
|
|
18
|
+
cursor: default;
|
|
19
|
+
backdrop-filter: blur(12px);
|
|
20
|
+
border: 1.5px solid rgba(255, 255, 255, 0.25);
|
|
21
|
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
|
|
22
|
+
transition: all 0.2s ease;
|
|
23
|
+
`,a.textContent=`${t}% reached this point`;let c=document.createElement("div");c.style.cssText=`
|
|
24
|
+
width: 40px;
|
|
25
|
+
height: 2px;
|
|
26
|
+
background-image: linear-gradient(to left, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.4) 50%, transparent 50%, transparent 100%);
|
|
27
|
+
background-size: 8px 2px;
|
|
28
|
+
background-repeat: repeat-x;
|
|
29
|
+
`;let d=this.createPopover(e,t,n,s);return a.appendChild(d),a.addEventListener("mouseenter",()=>{a.style.background="rgba(0, 0, 0, 0.98)",a.style.transform="scale(1.05)",a.style.borderColor="rgba(255, 255, 255, 0.4)",d.style.display="block"}),a.addEventListener("mouseleave",()=>{a.style.background="rgba(0, 0, 0, 0.9)",a.style.transform="scale(1)",a.style.borderColor="rgba(255, 255, 255, 0.25)",d.style.display="none"}),o.appendChild(a),o.appendChild(c),o}createPopover(e,t,n,s){let r=document.createElement("div");r.style.cssText=`
|
|
30
|
+
display: none;
|
|
31
|
+
position: absolute;
|
|
32
|
+
right: calc(100% + 12px);
|
|
33
|
+
top: 50%;
|
|
34
|
+
transform: translateY(-50%);
|
|
35
|
+
background: rgba(0, 0, 0, 0.95);
|
|
36
|
+
color: white;
|
|
37
|
+
padding: 12px 16px;
|
|
38
|
+
border-radius: 8px;
|
|
39
|
+
font: normal 12px system-ui, -apple-system, sans-serif;
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
border: 1.5px solid rgba(255, 255, 255, 0.15);
|
|
42
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
43
|
+
backdrop-filter: blur(12px);
|
|
44
|
+
z-index: 1;
|
|
45
|
+
`;let o=(s/1e3).toFixed(1);return r.innerHTML=`
|
|
46
|
+
<div style="margin-bottom: 6px; font-weight: 600; font-size: 13px;">Scroll Depth: ${e}%</div>
|
|
47
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Sessions: ${n.toLocaleString()}</div>
|
|
48
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Reach: ${t}% of total</div>
|
|
49
|
+
<div style="color: rgba(255, 255, 255, 0.8);">Avg. time: ${o}s</div>
|
|
50
|
+
`,r}};var _=class{constructor(){this.highlight=null;this.tooltip=null;this.currentElement=null}mount(){this.highlight=document.createElement("div"),this.highlight.className="__li2-tagger-highlight",document.body.appendChild(this.highlight),this.tooltip=document.createElement("div"),this.tooltip.className="__li2-tagger-tooltip",document.body.appendChild(this.tooltip)}unmount(){this.highlight?.remove(),this.tooltip?.remove(),this.highlight=null,this.tooltip=null,this.currentElement=null}highlightElement(e){if(!this.highlight||!this.tooltip||e===this.currentElement)return;this.currentElement=e;let t=e.getBoundingClientRect(),n=window.getComputedStyle(e).position==="fixed",s=Math.max(t.width,20),r=Math.max(t.height,20);this.highlight.style.position=n?"fixed":"absolute",this.highlight.style.top=n?`${t.top}px`:`${t.top+window.scrollY}px`,this.highlight.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.highlight.style.width=`${s}px`,this.highlight.style.height=`${r}px`,this.highlight.style.display="block";let o=e.tagName.toLowerCase(),a=(e.innerText||"").trim().slice(0,40),c=e.id?` #${e.id}`:"",d=a?` "${a}${a.length>=40?"...":""}"`:"";this.tooltip.textContent=`<${o}>${d}${c}`,this.tooltip.style.position=n?"fixed":"absolute";let m=n?t.top-28:t.top+window.scrollY-28;this.tooltip.style.top=`${Math.max(m,4)}px`,this.tooltip.style.left=n?`${t.left}px`:`${t.left+window.scrollX}px`,this.tooltip.style.display="block"}clearHighlight(){this.highlight&&(this.highlight.style.display="none"),this.tooltip&&(this.tooltip.style.display="none"),this.currentElement=null}fixSelection(e){this.highlightElement(e),this.highlight&&this.highlight.classList.add("__li2-tagger-highlight--selected")}clearSelection(){this.highlight&&this.highlight.classList.remove("__li2-tagger-highlight--selected")}updatePosition(){if(this.currentElement){let e=this.currentElement;this.currentElement=null,this.highlightElement(e)}}};var Q=new Set(["a","button","input","select","textarea","form","label"]),ee=new Set(["button","link","tab","menuitem"]);function P(i){let e=i;for(;e&&!(e instanceof HTMLElement);)e=e.parentElement;if(!e)return null;let n=te(e),s=ie(n);return{tag:n.tagName.toLowerCase(),text:j(se(n),256),href:ae(n),className:j(n.className||"",512),id:n.id||null,selectorPath:ne(n),isFixed:s}}function te(i){let e=i,t=0;for(;e&&t<5&&e.tagName!=="BODY";){let n=e.tagName.toLowerCase(),s=e.getAttribute("role");if(Q.has(n)||s&&ee.has(s))return e;e=e.parentElement,t++}return i}function ie(i){let e=i;for(;e&&e!==document.body;){try{let n=window.getComputedStyle(e).getPropertyValue("position");if(n==="fixed"||n==="sticky")return!0}catch{break}e=e.parentElement}return!1}function ne(i){let e=[],t=i,n=0;for(;t&&t!==document.body&&n<5;){let s=t.tagName.toLowerCase();t.id&&(s+=`#${t.id}`);let r=t.parentElement;if(r){let o=Array.from(r.children).filter(a=>a.tagName===t.tagName);if(o.length>1){let a=o.indexOf(t)+1;s+=`:nth-of-type(${a})`}}e.unshift(s),t=t.parentElement,n++}return e.join(" > ")}function se(i){return i instanceof HTMLInputElement?i.value||i.placeholder||"":(i.innerText||i.textContent||"").trim()}function ae(i){return i instanceof HTMLAnchorElement?i.href||null:i.getAttribute("href")||null}function j(i,e){return i.length<=e?i:i.slice(0,e)}var C=class{constructor(e,t){this.active=!1;this.overlay=e,this.callbacks=t,this.handleMouseMove=this.onMouseMove.bind(this),this.handleClick=this.onClick.bind(this),this.handleScroll=this.onScroll.bind(this)}activate(){this.active||(this.active=!0,document.addEventListener("mousemove",this.handleMouseMove,!0),document.addEventListener("click",this.handleClick,!0),window.addEventListener("scroll",this.handleScroll,!0))}deactivate(){this.active&&(this.active=!1,document.removeEventListener("mousemove",this.handleMouseMove,!0),document.removeEventListener("click",this.handleClick,!0),window.removeEventListener("scroll",this.handleScroll,!0),this.overlay.clearHighlight(),this.overlay.clearSelection())}onMouseMove(e){let t=e.target;if(!t)return;if(this.isToolbarElement(t)){this.overlay.clearHighlight();return}if(!P(t)){this.overlay.clearHighlight();return}let s=this.findMeaningfulDomElement(t);s&&this.overlay.highlightElement(s)}onClick(e){let t=e.target;if(!t||this.isToolbarElement(t))return;e.preventDefault(),e.stopPropagation();let n=P(t);if(!n)return;let s=this.findMeaningfulDomElement(t);s&&(this.overlay.fixSelection(s),this.callbacks.onElementSelected(s,n))}onScroll(){this.overlay.updatePosition()}isToolbarElement(e){let t=e;for(;t;){let n=t.className;if(typeof n=="string"&&(n.includes("__li2-toolbar")||n.includes("__li2-tagger")))return!0;t=t.parentElement}return!1}findMeaningfulDomElement(e){let t=new Set(["a","button","input","select","textarea","form","label"]),n=new Set(["button","link","tab","menuitem"]),s=e,r=0;for(;s&&r<5&&s.tagName!=="BODY";){let o=s.tagName.toLowerCase(),a=s.getAttribute("role");if(t.has(o)||a&&n.has(a))return s;s=s.parentElement,r++}return e}};var v=class extends Error{constructor(e,t){super(t),this.status=e}};function A(i){return{"X-Li2-Key":i.publishableKey,"X-Li2-Session":i.sessionToken,"X-Li2-SDK-Version":b}}async function U(i,e){let t=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{method:"POST",headers:{"Content-Type":"application/json",...A(i)},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok){let s=n.error||n.message||`Error ${t.status}`;throw new v(t.status,s)}return n.data}async function B(i){let e=await fetch(`${i.apiUrl}/api/v1/track/event-rules`,{headers:A(i)});if(!e.ok)throw new v(e.status,"Failed to load existing rules");return(await e.json()).data||[]}var w=class{constructor(e){this.root=null;this.nameInput=null;this.nameError=null;this.submitBtn=null;this.statusEl=null;this.rulesListEl=null;this.criteriaCheckboxes=new Map;this.existingRules=[];this.currentInfo=null;this.state="idle";this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-tagger-panel",this.root.style.display="none",document.body.appendChild(this.root),this.fetchExistingRules()}unmount(){this.root?.remove(),this.root=null,this.criteriaCheckboxes.clear()}show(e){this.currentInfo=e,this.state="selected",this.buildPanelContent(e),this.root&&(this.root.style.display="block")}hide(){this.currentInfo=null,this.state="idle",this.root&&(this.root.style.display="none",this.root.innerHTML=""),this.criteriaCheckboxes.clear()}buildPanelContent(e){if(!this.root)return;this.root.innerHTML="",this.criteriaCheckboxes.clear();let t=document.createElement("div");t.className="__li2-tagger-panel-header";let n=document.createElement("span");n.textContent="Create Event Rule",t.appendChild(n);let s=document.createElement("button");s.className="__li2-tagger-panel-close",s.textContent="\xD7",s.addEventListener("click",()=>this.handleCancel()),t.appendChild(s),this.root.appendChild(t);let r=document.createElement("div");r.className="__li2-tagger-summary";let o=e.text?` "${e.text.slice(0,30)}${e.text.length>30?"...":""}"`:"";r.textContent=`Selected: <${e.tag}>${o} on ${window.location.pathname}`,this.root.appendChild(r);let a=document.createElement("div");a.className="__li2-tagger-field";let c=document.createElement("label");c.className="__li2-tagger-label",c.textContent="Event name",a.appendChild(c),this.nameInput=document.createElement("input"),this.nameInput.type="text",this.nameInput.placeholder="e.g. signup_click",this.nameInput.className="__li2-tagger-input",this.nameInput.addEventListener("input",()=>this.onNameInput()),a.appendChild(this.nameInput),this.nameError=document.createElement("div"),this.nameError.className="__li2-tagger-field-error",a.appendChild(this.nameError),this.root.appendChild(a);let d=document.createElement("div");d.className="__li2-tagger-label",d.textContent="Match criteria",this.root.appendChild(d);let m=[{key:"selector_path",label:"CSS Selector",value:e.selectorPath||null},{key:"element_text",label:"Text contains",value:e.text||null},{key:"element_id",label:"Element ID",value:e.id||null},{key:"element_href",label:"Link href",value:e.href||null},{key:"page_path",label:"Page path",value:window.location.pathname}];for(let u of m){let h=this.createCriterionRow(u);this.root.appendChild(h)}this.statusEl=document.createElement("div"),this.statusEl.className="__li2-tagger-panel-status",this.root.appendChild(this.statusEl);let g=document.createElement("div");g.className="__li2-tagger-btn-row";let p=document.createElement("button");p.className="__li2-tagger-btn __li2-tagger-btn-cancel",p.textContent="Cancel",p.addEventListener("click",()=>this.handleCancel()),g.appendChild(p),this.submitBtn=document.createElement("button"),this.submitBtn.className="__li2-tagger-btn __li2-tagger-btn-submit",this.submitBtn.textContent="Create Event Rule",this.submitBtn.addEventListener("click",()=>this.handleSubmit()),g.appendChild(this.submitBtn),this.root.appendChild(g);let l=document.createElement("div");l.className="__li2-tagger-rules-header",l.textContent="Existing rules",this.root.appendChild(l),this.rulesListEl=document.createElement("div"),this.rulesListEl.className="__li2-tagger-rules-list",this.renderRulesList(),this.root.appendChild(this.rulesListEl),setTimeout(()=>this.nameInput?.focus(),50)}createCriterionRow(e){let t=document.createElement("div");t.className="__li2-tagger-criterion";let n=document.createElement("input");n.type="checkbox",n.checked=!!e.value,n.disabled=!e.value,n.addEventListener("change",()=>this.updateSubmitState()),this.criteriaCheckboxes.set(e.key,n),t.appendChild(n);let s=document.createElement("span");s.className="__li2-tagger-criterion-label",s.textContent=e.label+":",t.appendChild(s);let r=document.createElement("span");return r.className="__li2-tagger-criterion-value",r.textContent=e.value?re(e.value,60):"(empty)",e.value||(r.style.color="#666"),t.appendChild(r),t}onNameInput(){if(!this.nameInput)return;let e=this.nameInput.value,t=e.toLowerCase().replace(/[^a-z0-9_]/g,"");t!==e&&(this.nameInput.value=t),this.validateName(),this.updateSubmitState()}validateName(){let e=this.nameInput?.value||"",t=null;return e?e.length>256?t="Max 256 characters":/^[a-z0-9_]+$/.test(e)?this.existingRules.some(n=>n.name===e)&&(t="Event name already exists"):t="Only lowercase letters, numbers, and underscores":t=null,this.nameError&&(this.nameError.textContent=t||""),t}updateSubmitState(){if(!this.submitBtn)return;let e=!!this.nameInput?.value&&!this.validateName(),t=this.getCheckedCriteria().length>0;this.submitBtn.disabled=!e||!t||this.state==="creating"}getCheckedCriteria(){let e=[];for(let[t,n]of this.criteriaCheckboxes)n.checked&&e.push(t);return e}async handleSubmit(){if(!this.nameInput||!this.currentInfo)return;let e=this.nameInput.value;if(!e||this.validateName())return;this.state="creating",this.setFormDisabled(!0),this.setStatus("Creating...","loading");let t=new Set(this.getCheckedCriteria()),n=this.currentInfo,s={name:e,selector_path:t.has("selector_path")&&n.selectorPath||void 0,element_text:t.has("element_text")&&n.text||void 0,element_id:t.has("element_id")&&n.id||void 0,element_href:t.has("element_href")&&n.href||void 0,page_path:t.has("page_path")?window.location.pathname:void 0,text_match_mode:t.has("element_text")?"contains":void 0},r={};for(let[o,a]of Object.entries(s))a!==void 0&&(r[o]=a);try{await U(this.config.apiConfig,r),this.state="success",this.setStatus(`Event rule '${e}' created!`,"success"),await this.fetchExistingRules(),setTimeout(()=>{this.hide(),this.config.onCreated(e)},2e3)}catch(o){this.state="error",this.setFormDisabled(!1),o instanceof v?this.setStatus(o.message,"error"):this.setStatus("Connection failed. Please try again.","error")}}handleCancel(){this.hide(),this.config.onCancel()}setFormDisabled(e){this.nameInput&&(this.nameInput.disabled=e),this.submitBtn&&(this.submitBtn.disabled=e,this.submitBtn.textContent=e?"Creating...":"Create Event Rule");for(let t of this.criteriaCheckboxes.values())(t.checked||!e)&&(t.disabled=e?!0:!t.checked)}setStatus(e,t){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.className="__li2-tagger-panel-status",t==="loading"?this.statusEl.classList.add("__li2-tagger-status-loading"):t==="success"?this.statusEl.classList.add("__li2-tagger-status-success"):t==="error"&&this.statusEl.classList.add("__li2-tagger-status-error"))}async fetchExistingRules(){try{this.existingRules=await B(this.config.apiConfig),this.renderRulesList()}catch{}}renderRulesList(){if(this.rulesListEl){if(this.rulesListEl.innerHTML="",this.existingRules.length===0){let e=document.createElement("div");e.className="__li2-tagger-rules-empty",e.textContent="No rules yet",this.rulesListEl.appendChild(e);return}for(let e of this.existingRules){let t=document.createElement("div");t.className="__li2-tagger-rule-item",t.textContent=`\u2022 ${e.name}`,this.rulesListEl.appendChild(t)}}}};function re(i,e){return i.length>e?i.slice(0,e)+"...":i}var f=class{constructor(e){this.root=null;this.statsEl=null;this.statusEl=null;this.config=e}mount(){this.root=document.createElement("div"),this.root.className="__li2-toolbar",this.config.mode==="tagger"?this.mountTagger():this.config.mode==="scroll"?this.mountScroll():this.mountHeatmap(),document.body.appendChild(this.root)}createOpacitySlider(){let e=document.createElement("input");return e.type="range",e.min="0",e.max="100",e.value=String(Math.round(this.config.initialOpacity*100)),e.className="__li2-toolbar-slider",e.addEventListener("input",()=>{this.config.onOpacityChange(Number(e.value)/100)}),e}mountHeatmap(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl),this.root.appendChild(this.createOpacitySlider()),this.appendCloseButton("Close heatmap")}mountScroll(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Scroll Heatmap",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statsEl=document.createElement("span"),this.statsEl.className="__li2-toolbar-stat",this.statsEl.textContent="...",this.root.appendChild(this.statsEl),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.root.appendChild(this.statusEl),this.root.appendChild(this.createOpacitySlider()),this.appendCloseButton("Close scroll heatmap")}mountTagger(){if(!this.root)return;let e=document.createElement("span");e.textContent="Li2 Event Tagger",this.root.appendChild(e),this.root.appendChild(this.createSeparator()),this.statusEl=document.createElement("span"),this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent="Click an element to tag",this.root.appendChild(this.statusEl),this.appendCloseButton("Close tagger")}appendCloseButton(e){if(!this.root)return;let t=document.createElement("button");t.className="__li2-toolbar-close",t.textContent="\xD7",t.title=e,t.addEventListener("click",this.config.onClose),this.root.appendChild(t)}unmount(){this.root?.remove(),this.root=null}setStats(e,t){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} clicks`)}setScrollStats(e){this.statsEl&&(this.statsEl.textContent=`${e.toLocaleString()} sessions`)}setLoading(e){this.statusEl&&(e?(this.statusEl.className="__li2-toolbar-loading",this.statusEl.textContent="Loading..."):(this.statusEl.textContent="",this.statusEl.className=""))}setStatus(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-status",this.statusEl.textContent=e)}setError(e){this.statusEl&&(this.statusEl.className="__li2-toolbar-error",this.statusEl.textContent=e)}createSeparator(){let e=document.createElement("span");return e.style.cssText="color:#555;user-select:none;",e.textContent="|",e}};function O(){if(document.getElementById("__li2-toolbar-styles"))return;let i=document.createElement("style");i.id="__li2-toolbar-styles",i.textContent=`
|
|
2
51
|
.__li2-toolbar {
|
|
3
52
|
position: fixed; bottom: 20px; right: 20px; z-index: 99999;
|
|
4
53
|
background: #1a1a2e; color: #fff; border-radius: 12px;
|
|
@@ -110,4 +159,4 @@
|
|
|
110
159
|
}
|
|
111
160
|
.__li2-tagger-rules-empty { color: #64748b; font-size: 12px; padding: 4px 0; }
|
|
112
161
|
.__li2-tagger-rule-item { color: #94a3b8; font-size: 12px; padding: 2px 0; }
|
|
113
|
-
`,document.head.appendChild(i)}function
|
|
162
|
+
`,document.head.appendChild(i)}function oe(){let i=new Date;return i.setDate(i.getDate()-7),i.toISOString().slice(0,10)}function le(){return new Date().toISOString().slice(0,10)}var T=class{constructor(e){this.heatmapOverlay=null;this.scrollOverlay=null;this.taggerOverlay=null;this.taggerMode=null;this.taggerPanel=null;this.ui=null;this.selectedElement=null;this.onElementSelected=null;this.apiUrl=e.apiUrl,this.publishableKey=e.publishableKey,this.mode=e.mode||"heatmap",this.sessionToken=e.sessionToken}async activate(){if(!this.sessionToken){O(),this.ui=new f({mode:this.mode,initialOpacity:.6,onOpacityChange:()=>{},onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setError("Session expired. Please reopen from the dashboard.");return}O(),this.mode==="tagger"?this.activateTagger():this.mode==="scroll"?await this.activateScroll():await this.activateHeatmap()}deactivate(){this.heatmapOverlay?.unmount(),this.heatmapOverlay=null,this.scrollOverlay?.unmount(),this.scrollOverlay=null,this.taggerMode?.deactivate(),this.taggerMode=null,this.taggerPanel?.unmount(),this.taggerPanel=null,this.taggerOverlay?.unmount(),this.taggerOverlay=null,this.ui?.unmount(),this.ui=null,this.selectedElement=null;let e=new URL(window.location.href);e.searchParams.delete("li2_heatmap"),e.searchParams.delete("li2_scroll"),e.searchParams.delete("li2_tagger"),e.searchParams.delete("li2_session"),e.searchParams.delete("li2_from"),e.searchParams.delete("li2_to"),e.searchParams.delete("li2_device"),history.replaceState(null,"",e.toString())}parseParams(e){let t=new URL(window.location.href);return t.searchParams.has(e)?{from:t.searchParams.get("li2_from")??oe(),to:t.searchParams.get("li2_to")??le(),deviceType:t.searchParams.get("li2_device")??void 0}:null}async activateHeatmap(){let e=this.parseParams("li2_heatmap");if(e){this.heatmapOverlay=new y,this.heatmapOverlay.mount(),this.ui=new f({mode:"heatmap",initialOpacity:.6,onOpacityChange:t=>this.heatmapOverlay?.setOpacity(t),onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setLoading(!0);try{let t=await I({apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken,pagePath:window.location.pathname,from:e.from,to:e.to,deviceType:e.deviceType,targetWidth:window.innerWidth});this.heatmapOverlay?.render(t.grid),this.ui?.setStats(t.total_clicks,t.grid.length)}catch{this.ui?.setError("Failed to load heatmap data")}finally{this.ui?.setLoading(!1)}}}async activateScroll(){let e=this.parseParams("li2_scroll");if(e){this.scrollOverlay=new E,this.scrollOverlay.mount(),this.scrollOverlay.setOpacity(.35),this.ui=new f({mode:"scroll",initialOpacity:.35,onOpacityChange:t=>this.scrollOverlay?.setOpacity(t),onClose:()=>this.deactivate()}),this.ui.mount(),this.ui.setLoading(!0);try{let t=await D({apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken,pagePath:window.location.pathname,from:e.from,to:e.to,deviceType:e.deviceType});this.scrollOverlay?.render(t.milestones,t.total_sessions),this.ui?.setScrollStats(t.total_sessions)}catch{this.ui?.setError("Failed to load scroll heatmap data")}finally{this.ui?.setLoading(!1)}}}activateTagger(){this.taggerOverlay=new _,this.taggerOverlay.mount(),this.taggerPanel=new w({apiConfig:{apiUrl:this.apiUrl,publishableKey:this.publishableKey,sessionToken:this.sessionToken},onCancel:()=>{this.taggerOverlay?.clearHighlight(),this.taggerOverlay?.clearSelection(),this.selectedElement=null,this.ui?.setStatus("Click an element to tag")},onCreated:()=>{this.taggerOverlay?.clearHighlight(),this.taggerOverlay?.clearSelection(),this.selectedElement=null,this.ui?.setStatus("Click an element to tag")}}),this.taggerPanel.mount(),this.taggerMode=new C(this.taggerOverlay,{onElementSelected:(e,t)=>{this.selectedElement={element:e,info:t},this.ui?.setStatus("Element selected"),this.taggerPanel?.show(t),this.onElementSelected?.({element:e,info:t})}}),this.taggerMode.activate(),this.ui=new f({mode:"tagger",initialOpacity:.6,onOpacityChange:()=>{},onClose:()=>this.deactivate()}),this.ui.mount()}};if(typeof window<"u"&&window.__li2ToolbarConfig){let i=window.__li2ToolbarConfig;delete window.__li2ToolbarConfig;let e=new T(i);window.__li2Toolbar=e,e.activate()}0&&(module.exports={ToolbarManager});
|