@agentuity/frontend 0.0.111 → 0.0.112
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/analytics/beacon.d.ts +15 -0
- package/dist/analytics/beacon.d.ts.map +1 -0
- package/dist/analytics/beacon.js +177 -0
- package/dist/analytics/beacon.js.map +1 -0
- package/dist/analytics/collectors/clicks.d.ts +10 -0
- package/dist/analytics/collectors/clicks.d.ts.map +1 -0
- package/dist/analytics/collectors/clicks.js +84 -0
- package/dist/analytics/collectors/clicks.js.map +1 -0
- package/dist/analytics/collectors/errors.d.ts +5 -0
- package/dist/analytics/collectors/errors.d.ts.map +1 -0
- package/dist/analytics/collectors/errors.js +43 -0
- package/dist/analytics/collectors/errors.js.map +1 -0
- package/dist/analytics/collectors/forms.d.ts +5 -0
- package/dist/analytics/collectors/forms.d.ts.map +1 -0
- package/dist/analytics/collectors/forms.js +55 -0
- package/dist/analytics/collectors/forms.js.map +1 -0
- package/dist/analytics/collectors/pageview.d.ts +15 -0
- package/dist/analytics/collectors/pageview.d.ts.map +1 -0
- package/dist/analytics/collectors/pageview.js +64 -0
- package/dist/analytics/collectors/pageview.js.map +1 -0
- package/dist/analytics/collectors/scroll.d.ts +17 -0
- package/dist/analytics/collectors/scroll.d.ts.map +1 -0
- package/dist/analytics/collectors/scroll.js +93 -0
- package/dist/analytics/collectors/scroll.js.map +1 -0
- package/dist/analytics/collectors/spa.d.ts +10 -0
- package/dist/analytics/collectors/spa.d.ts.map +1 -0
- package/dist/analytics/collectors/spa.js +53 -0
- package/dist/analytics/collectors/spa.js.map +1 -0
- package/dist/analytics/collectors/visibility.d.ts +18 -0
- package/dist/analytics/collectors/visibility.d.ts.map +1 -0
- package/dist/analytics/collectors/visibility.js +81 -0
- package/dist/analytics/collectors/visibility.js.map +1 -0
- package/dist/analytics/collectors/webvitals.d.ts +6 -0
- package/dist/analytics/collectors/webvitals.d.ts.map +1 -0
- package/dist/analytics/collectors/webvitals.js +111 -0
- package/dist/analytics/collectors/webvitals.js.map +1 -0
- package/dist/analytics/events.d.ts +18 -0
- package/dist/analytics/events.d.ts.map +1 -0
- package/dist/analytics/events.js +126 -0
- package/dist/analytics/events.js.map +1 -0
- package/dist/analytics/index.d.ts +12 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +12 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/offline.d.ts +19 -0
- package/dist/analytics/offline.d.ts.map +1 -0
- package/dist/analytics/offline.js +145 -0
- package/dist/analytics/offline.js.map +1 -0
- package/dist/analytics/types.d.ts +113 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +2 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/utils/storage.d.ts +13 -0
- package/dist/analytics/utils/storage.d.ts.map +1 -0
- package/dist/analytics/utils/storage.js +63 -0
- package/dist/analytics/utils/storage.js.map +1 -0
- package/dist/analytics/utils/utm.d.ts +12 -0
- package/dist/analytics/utils/utm.d.ts.map +1 -0
- package/dist/analytics/utils/utm.js +27 -0
- package/dist/analytics/utils/utm.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/analytics/beacon.ts +203 -0
- package/src/analytics/collectors/clicks.ts +100 -0
- package/src/analytics/collectors/errors.ts +49 -0
- package/src/analytics/collectors/forms.ts +64 -0
- package/src/analytics/collectors/pageview.ts +76 -0
- package/src/analytics/collectors/scroll.ts +112 -0
- package/src/analytics/collectors/spa.ts +60 -0
- package/src/analytics/collectors/visibility.ts +94 -0
- package/src/analytics/collectors/webvitals.ts +129 -0
- package/src/analytics/events.ts +144 -0
- package/src/analytics/index.ts +21 -0
- package/src/analytics/offline.ts +163 -0
- package/src/analytics/types.ts +139 -0
- package/src/analytics/utils/storage.ts +64 -0
- package/src/analytics/utils/utm.ts +36 -0
- package/src/index.ts +18 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnalyticsClient } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Initialize the analytics beacon
|
|
4
|
+
* Called automatically when the script loads
|
|
5
|
+
*/
|
|
6
|
+
export declare function initBeacon(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Get the analytics client instance
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAnalytics(): AnalyticsClient;
|
|
11
|
+
/**
|
|
12
|
+
* Convenience function to track a custom event
|
|
13
|
+
*/
|
|
14
|
+
export declare function track(eventName: string, properties?: Record<string, unknown>): void;
|
|
15
|
+
//# sourceMappingURL=beacon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../src/analytics/beacon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,eAAe,EAAE,MAAM,SAAS,CAAC;AA6BpE;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAoBjC;AA6HD;;GAEG;AACH,wBAAgB,YAAY,IAAI,eAAe,CAK9C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEnF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { initEventQueue, queueEvent, flushEvents } from './events';
|
|
2
|
+
import { initPageviewTracking, createBaseEvent, trackPageview } from './collectors/pageview';
|
|
3
|
+
import { initSPATracking } from './collectors/spa';
|
|
4
|
+
import { initClickTracking, initOutboundLinkTracking } from './collectors/clicks';
|
|
5
|
+
import { initScrollTracking } from './collectors/scroll';
|
|
6
|
+
import { initErrorTracking } from './collectors/errors';
|
|
7
|
+
import { initVisibilityTracking } from './collectors/visibility';
|
|
8
|
+
import { initFormTracking } from './collectors/forms';
|
|
9
|
+
import { initWebVitalsTracking } from './collectors/webvitals';
|
|
10
|
+
import { isOptedOut, setOptOut } from './utils/storage';
|
|
11
|
+
import { initOfflineSupport, getAndClearOfflineEvents } from './offline';
|
|
12
|
+
let initialized = false;
|
|
13
|
+
let trackingStarted = false;
|
|
14
|
+
let analyticsEnabled = true;
|
|
15
|
+
let consentRequired = false;
|
|
16
|
+
let consentGiven = false;
|
|
17
|
+
/**
|
|
18
|
+
* Check if analytics should run
|
|
19
|
+
*/
|
|
20
|
+
function shouldTrack() {
|
|
21
|
+
if (!analyticsEnabled)
|
|
22
|
+
return false;
|
|
23
|
+
if (isOptedOut())
|
|
24
|
+
return false;
|
|
25
|
+
if (consentRequired && !consentGiven)
|
|
26
|
+
return false;
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the analytics beacon
|
|
31
|
+
* Called automatically when the script loads
|
|
32
|
+
*/
|
|
33
|
+
export function initBeacon() {
|
|
34
|
+
if (initialized) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const config = window.__AGENTUITY_ANALYTICS__;
|
|
38
|
+
if (!config || !config.enabled) {
|
|
39
|
+
analyticsEnabled = false;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
initialized = true;
|
|
43
|
+
consentRequired = config.requireConsent ?? false;
|
|
44
|
+
// If consent is required and not given, wait for optIn
|
|
45
|
+
if (consentRequired && !consentGiven) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
startTracking(config);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start all tracking based on config
|
|
52
|
+
*/
|
|
53
|
+
function startTracking(config) {
|
|
54
|
+
if (trackingStarted) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
trackingStarted = true;
|
|
58
|
+
// Initialize event queue
|
|
59
|
+
initEventQueue(config);
|
|
60
|
+
// Initialize offline support
|
|
61
|
+
initOfflineSupport(async () => {
|
|
62
|
+
// Flush offline events when coming back online
|
|
63
|
+
const offlineEvents = await getAndClearOfflineEvents();
|
|
64
|
+
for (const event of offlineEvents) {
|
|
65
|
+
queueEvent(event);
|
|
66
|
+
}
|
|
67
|
+
flushEvents();
|
|
68
|
+
});
|
|
69
|
+
// Always track pageviews
|
|
70
|
+
initPageviewTracking();
|
|
71
|
+
// Initialize visibility tracking (for time on page)
|
|
72
|
+
initVisibilityTracking();
|
|
73
|
+
// Conditional tracking based on config (all default to true except requireConsent)
|
|
74
|
+
if (config.trackSPANavigation !== false) {
|
|
75
|
+
initSPATracking();
|
|
76
|
+
}
|
|
77
|
+
if (config.trackClicks !== false) {
|
|
78
|
+
initClickTracking();
|
|
79
|
+
}
|
|
80
|
+
if (config.trackOutboundLinks !== false) {
|
|
81
|
+
initOutboundLinkTracking();
|
|
82
|
+
}
|
|
83
|
+
if (config.trackScroll !== false) {
|
|
84
|
+
initScrollTracking();
|
|
85
|
+
}
|
|
86
|
+
if (config.trackErrors !== false) {
|
|
87
|
+
initErrorTracking();
|
|
88
|
+
}
|
|
89
|
+
if (config.trackForms !== false) {
|
|
90
|
+
initFormTracking();
|
|
91
|
+
}
|
|
92
|
+
if (config.trackWebVitals !== false) {
|
|
93
|
+
initWebVitalsTracking();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create the analytics client API
|
|
98
|
+
*/
|
|
99
|
+
function createClient() {
|
|
100
|
+
return {
|
|
101
|
+
track(eventName, properties) {
|
|
102
|
+
if (!shouldTrack())
|
|
103
|
+
return;
|
|
104
|
+
const event = createBaseEvent('custom');
|
|
105
|
+
event.event_name = eventName;
|
|
106
|
+
if (properties) {
|
|
107
|
+
event.event_data = properties;
|
|
108
|
+
}
|
|
109
|
+
queueEvent(event);
|
|
110
|
+
},
|
|
111
|
+
identify(userId, traits) {
|
|
112
|
+
if (!shouldTrack())
|
|
113
|
+
return;
|
|
114
|
+
const event = createBaseEvent('custom');
|
|
115
|
+
event.event_name = 'identify';
|
|
116
|
+
event.event_data = {
|
|
117
|
+
user_id: userId,
|
|
118
|
+
...traits,
|
|
119
|
+
};
|
|
120
|
+
queueEvent(event);
|
|
121
|
+
},
|
|
122
|
+
pageview(path) {
|
|
123
|
+
if (!shouldTrack())
|
|
124
|
+
return;
|
|
125
|
+
trackPageview(path);
|
|
126
|
+
},
|
|
127
|
+
async flush() {
|
|
128
|
+
flushEvents();
|
|
129
|
+
},
|
|
130
|
+
optOut() {
|
|
131
|
+
setOptOut(true);
|
|
132
|
+
analyticsEnabled = false;
|
|
133
|
+
},
|
|
134
|
+
optIn() {
|
|
135
|
+
setOptOut(false);
|
|
136
|
+
analyticsEnabled = true;
|
|
137
|
+
consentGiven = true;
|
|
138
|
+
// If consent was required and now given, start tracking
|
|
139
|
+
if (consentRequired && !trackingStarted) {
|
|
140
|
+
const config = window.__AGENTUITY_ANALYTICS__;
|
|
141
|
+
if (config) {
|
|
142
|
+
startTracking(config);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
isEnabled() {
|
|
147
|
+
return shouldTrack();
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Singleton client instance
|
|
152
|
+
let clientInstance = null;
|
|
153
|
+
/**
|
|
154
|
+
* Get the analytics client instance
|
|
155
|
+
*/
|
|
156
|
+
export function getAnalytics() {
|
|
157
|
+
if (!clientInstance) {
|
|
158
|
+
clientInstance = createClient();
|
|
159
|
+
}
|
|
160
|
+
return clientInstance;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Convenience function to track a custom event
|
|
164
|
+
*/
|
|
165
|
+
export function track(eventName, properties) {
|
|
166
|
+
getAnalytics().track(eventName, properties);
|
|
167
|
+
}
|
|
168
|
+
// Auto-initialize when script loads
|
|
169
|
+
if (typeof window !== 'undefined') {
|
|
170
|
+
if (document.readyState === 'loading') {
|
|
171
|
+
document.addEventListener('DOMContentLoaded', initBeacon);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
initBeacon();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=beacon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../src/analytics/beacon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize click tracking
|
|
3
|
+
* Tracks clicks on elements with data-analytics attribute
|
|
4
|
+
*/
|
|
5
|
+
export declare function initClickTracking(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Initialize outbound link tracking
|
|
8
|
+
*/
|
|
9
|
+
export declare function initOutboundLinkTracking(): void;
|
|
10
|
+
//# sourceMappingURL=clicks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clicks.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/clicks.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAgDxC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAuC/C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createBaseEvent } from './pageview';
|
|
2
|
+
import { queueEvent } from '../events';
|
|
3
|
+
/**
|
|
4
|
+
* Initialize click tracking
|
|
5
|
+
* Tracks clicks on elements with data-analytics attribute
|
|
6
|
+
*/
|
|
7
|
+
export function initClickTracking() {
|
|
8
|
+
if (typeof document === 'undefined') {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
document.addEventListener('click', (e) => {
|
|
12
|
+
const target = e.target;
|
|
13
|
+
if (!target)
|
|
14
|
+
return;
|
|
15
|
+
// Find closest element with data-analytics attribute
|
|
16
|
+
const analyticsElement = target.closest('[data-analytics]');
|
|
17
|
+
if (!analyticsElement)
|
|
18
|
+
return;
|
|
19
|
+
const eventName = analyticsElement.getAttribute('data-analytics');
|
|
20
|
+
if (!eventName)
|
|
21
|
+
return;
|
|
22
|
+
const event = createBaseEvent('click');
|
|
23
|
+
event.event_name = eventName;
|
|
24
|
+
// Collect additional data attributes
|
|
25
|
+
const eventData = {};
|
|
26
|
+
for (const attr of Array.from(analyticsElement.attributes)) {
|
|
27
|
+
if (attr.name.startsWith('data-analytics-')) {
|
|
28
|
+
const key = attr.name.replace('data-analytics-', '');
|
|
29
|
+
eventData[key] = attr.value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Add element info
|
|
33
|
+
eventData.tag = analyticsElement.tagName.toLowerCase();
|
|
34
|
+
if (analyticsElement.id) {
|
|
35
|
+
eventData.id = analyticsElement.id;
|
|
36
|
+
}
|
|
37
|
+
const text = analyticsElement.innerText?.slice(0, 100);
|
|
38
|
+
if (text) {
|
|
39
|
+
eventData.text = text;
|
|
40
|
+
}
|
|
41
|
+
if (Object.keys(eventData).length > 0) {
|
|
42
|
+
event.event_data = eventData;
|
|
43
|
+
}
|
|
44
|
+
queueEvent(event);
|
|
45
|
+
}, { capture: true, passive: true });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize outbound link tracking
|
|
49
|
+
*/
|
|
50
|
+
export function initOutboundLinkTracking() {
|
|
51
|
+
if (typeof document === 'undefined') {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
document.addEventListener('click', (e) => {
|
|
55
|
+
const target = e.target;
|
|
56
|
+
if (!target)
|
|
57
|
+
return;
|
|
58
|
+
const link = target.closest('a');
|
|
59
|
+
if (!link)
|
|
60
|
+
return;
|
|
61
|
+
const href = link.href;
|
|
62
|
+
if (!href)
|
|
63
|
+
return;
|
|
64
|
+
// Check if it's an outbound link
|
|
65
|
+
try {
|
|
66
|
+
const url = new URL(href, window.location.origin);
|
|
67
|
+
if (url.hostname === window.location.hostname) {
|
|
68
|
+
return; // Same domain, not outbound
|
|
69
|
+
}
|
|
70
|
+
const event = createBaseEvent('outbound_link');
|
|
71
|
+
event.event_name = 'outbound_link';
|
|
72
|
+
event.event_data = {
|
|
73
|
+
href,
|
|
74
|
+
hostname: url.hostname,
|
|
75
|
+
text: link.innerText?.slice(0, 100) || '',
|
|
76
|
+
};
|
|
77
|
+
queueEvent(event);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Invalid URL, ignore
|
|
81
|
+
}
|
|
82
|
+
}, { capture: true, passive: true });
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=clicks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clicks.js","sourceRoot":"","sources":["../../../src/analytics/collectors/clicks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/errors.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA0CxC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createBaseEvent } from './pageview';
|
|
2
|
+
import { queueEvent } from '../events';
|
|
3
|
+
/**
|
|
4
|
+
* Initialize JavaScript error tracking
|
|
5
|
+
*/
|
|
6
|
+
export function initErrorTracking() {
|
|
7
|
+
if (typeof window === 'undefined') {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Handle uncaught errors
|
|
11
|
+
window.addEventListener('error', (e) => {
|
|
12
|
+
const event = createBaseEvent('error');
|
|
13
|
+
event.event_name = 'js_error';
|
|
14
|
+
event.event_data = {
|
|
15
|
+
message: e.message || 'Unknown error',
|
|
16
|
+
filename: e.filename || '',
|
|
17
|
+
lineno: e.lineno || 0,
|
|
18
|
+
colno: e.colno || 0,
|
|
19
|
+
stack: e.error?.stack?.slice(0, 1000) || '',
|
|
20
|
+
};
|
|
21
|
+
queueEvent(event);
|
|
22
|
+
});
|
|
23
|
+
// Handle unhandled promise rejections
|
|
24
|
+
window.addEventListener('unhandledrejection', (e) => {
|
|
25
|
+
const event = createBaseEvent('error');
|
|
26
|
+
event.event_name = 'unhandled_rejection';
|
|
27
|
+
let message = 'Unhandled Promise Rejection';
|
|
28
|
+
let stack = '';
|
|
29
|
+
if (e.reason instanceof Error) {
|
|
30
|
+
message = e.reason.message;
|
|
31
|
+
stack = e.reason.stack?.slice(0, 1000) || '';
|
|
32
|
+
}
|
|
33
|
+
else if (typeof e.reason === 'string') {
|
|
34
|
+
message = e.reason;
|
|
35
|
+
}
|
|
36
|
+
event.event_data = {
|
|
37
|
+
message,
|
|
38
|
+
stack,
|
|
39
|
+
};
|
|
40
|
+
queueEvent(event);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/analytics/collectors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;IACR,CAAC;IAED,yBAAyB;IACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9B,KAAK,CAAC,UAAU,GAAG;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,eAAe;YACrC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;SAC3C,CAAC;QAEF,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,CAAC,UAAU,GAAG,qBAAqB,CAAC;QAEzC,IAAI,OAAO,GAAG,6BAA6B,CAAC;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,UAAU,GAAG;YAClB,OAAO;YACP,KAAK;SACL,CAAC;QAEF,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/forms.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAyDvC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createBaseEvent } from './pageview';
|
|
2
|
+
import { queueEvent } from '../events';
|
|
3
|
+
/**
|
|
4
|
+
* Initialize form submission tracking
|
|
5
|
+
*/
|
|
6
|
+
export function initFormTracking() {
|
|
7
|
+
if (typeof document === 'undefined') {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
document.addEventListener('submit', (e) => {
|
|
11
|
+
const form = e.target;
|
|
12
|
+
if (!form || form.tagName !== 'FORM') {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const event = createBaseEvent('form_submit');
|
|
16
|
+
event.event_name = 'form_submit';
|
|
17
|
+
const eventData = {};
|
|
18
|
+
// Form identification
|
|
19
|
+
if (form.id) {
|
|
20
|
+
eventData.form_id = form.id;
|
|
21
|
+
}
|
|
22
|
+
if (form.name) {
|
|
23
|
+
eventData.form_name = form.name;
|
|
24
|
+
}
|
|
25
|
+
if (form.action) {
|
|
26
|
+
eventData.form_action = form.action;
|
|
27
|
+
}
|
|
28
|
+
eventData.form_method = form.method || 'get';
|
|
29
|
+
// Count form fields (don't capture values for privacy)
|
|
30
|
+
const inputs = form.querySelectorAll('input, select, textarea');
|
|
31
|
+
eventData.field_count = inputs.length;
|
|
32
|
+
// Check for common form types
|
|
33
|
+
const hasEmail = form.querySelector('input[type="email"]') !== null;
|
|
34
|
+
const hasPassword = form.querySelector('input[type="password"]') !== null;
|
|
35
|
+
const hasSearch = form.querySelector('input[type="search"]') !== null;
|
|
36
|
+
if (hasEmail && hasPassword) {
|
|
37
|
+
eventData.form_type = 'auth';
|
|
38
|
+
}
|
|
39
|
+
else if (hasEmail) {
|
|
40
|
+
eventData.form_type = 'email';
|
|
41
|
+
}
|
|
42
|
+
else if (hasSearch) {
|
|
43
|
+
eventData.form_type = 'search';
|
|
44
|
+
}
|
|
45
|
+
else if (hasPassword) {
|
|
46
|
+
eventData.form_type = 'password';
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
eventData.form_type = 'other';
|
|
50
|
+
}
|
|
51
|
+
event.event_data = eventData;
|
|
52
|
+
queueEvent(event);
|
|
53
|
+
}, { capture: true });
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=forms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/analytics/collectors/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC/B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO;IACR,CAAC;IAED,QAAQ,CAAC,gBAAgB,CACxB,QAAQ,EACR,CAAC,CAAC,EAAE,EAAE;QACL,MAAM,IAAI,GAAG,CAAC,CAAC,MAAgC,CAAC;QAChD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACtC,OAAO;QACR,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7C,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;QAEjC,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,sBAAsB;QACtB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;QACrC,CAAC;QACD,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QAE7C,uDAAuD;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;QAChE,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAEtC,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,KAAK,IAAI,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,KAAK,IAAI,CAAC;QAEtE,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC7B,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC;QAC9B,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACrB,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;QAC/B,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,SAAS,GAAG,QAAQ,CAAC;QAChC,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACxB,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC;QAClC,CAAC;aAAM,CAAC;YACP,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE7B,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnalyticsEvent } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Create a base event with common properties
|
|
4
|
+
*/
|
|
5
|
+
export declare function createBaseEvent(eventType: AnalyticsEvent['event_type']): AnalyticsEvent;
|
|
6
|
+
/**
|
|
7
|
+
* Track a pageview event
|
|
8
|
+
*/
|
|
9
|
+
export declare function trackPageview(customPath?: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize pageview tracking
|
|
12
|
+
* Tracks initial pageview when called
|
|
13
|
+
*/
|
|
14
|
+
export declare function initPageviewTracking(): void;
|
|
15
|
+
//# sourceMappingURL=pageview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageview.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/pageview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC,GAAG,cAAc,CA2BvF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAqBvD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAS3C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { queueEvent } from '../events';
|
|
2
|
+
import { getUTMParams } from '../utils/utm';
|
|
3
|
+
/**
|
|
4
|
+
* Create a base event with common properties
|
|
5
|
+
*/
|
|
6
|
+
export function createBaseEvent(eventType) {
|
|
7
|
+
const utm = getUTMParams();
|
|
8
|
+
return {
|
|
9
|
+
id: crypto.randomUUID
|
|
10
|
+
? crypto.randomUUID()
|
|
11
|
+
: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
12
|
+
timestamp: Date.now(),
|
|
13
|
+
timezone_offset: new Date().getTimezoneOffset(),
|
|
14
|
+
event_type: eventType,
|
|
15
|
+
url: window.location.href,
|
|
16
|
+
path: window.location.pathname,
|
|
17
|
+
referrer: document.referrer || '',
|
|
18
|
+
title: document.title || '',
|
|
19
|
+
screen_width: window.screen?.width || 0,
|
|
20
|
+
screen_height: window.screen?.height || 0,
|
|
21
|
+
viewport_width: window.innerWidth || 0,
|
|
22
|
+
viewport_height: window.innerHeight || 0,
|
|
23
|
+
device_pixel_ratio: window.devicePixelRatio || 1,
|
|
24
|
+
user_agent: navigator.userAgent || '',
|
|
25
|
+
language: navigator.language || '',
|
|
26
|
+
...utm,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Track a pageview event
|
|
31
|
+
*/
|
|
32
|
+
export function trackPageview(customPath) {
|
|
33
|
+
const event = createBaseEvent('pageview');
|
|
34
|
+
if (customPath) {
|
|
35
|
+
event.path = customPath;
|
|
36
|
+
event.url = window.location.origin + customPath;
|
|
37
|
+
}
|
|
38
|
+
// Add performance timing if available
|
|
39
|
+
if (typeof performance !== 'undefined') {
|
|
40
|
+
const timing = performance.getEntriesByType('navigation')[0];
|
|
41
|
+
if (timing) {
|
|
42
|
+
event.load_time = Math.round(timing.loadEventEnd - timing.startTime);
|
|
43
|
+
event.dom_ready = Math.round(timing.domContentLoadedEventEnd - timing.startTime);
|
|
44
|
+
event.ttfb = Math.round(timing.responseStart - timing.requestStart);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
queueEvent(event);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Initialize pageview tracking
|
|
51
|
+
* Tracks initial pageview when called
|
|
52
|
+
*/
|
|
53
|
+
export function initPageviewTracking() {
|
|
54
|
+
// Track initial pageview after DOM is ready
|
|
55
|
+
if (document.readyState === 'complete') {
|
|
56
|
+
trackPageview();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
window.addEventListener('load', () => {
|
|
60
|
+
trackPageview();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=pageview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageview.js","sourceRoot":"","sources":["../../../src/analytics/collectors/pageview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAuC;IACtE,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAE3B,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,UAAU;YACpB,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;YACrB,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC7D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE;QAE/C,UAAU,EAAE,SAAS;QAErB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QACzB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;QAC9B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;QACjC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;QAE3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;QACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;QACzC,cAAc,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;QACtC,eAAe,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;QACxC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,IAAI,CAAC;QAChD,UAAU,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;QACrC,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;QAElC,GAAG,GAAG;KACN,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAmB;IAChD,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;QACxB,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAE/C,CAAC;QACb,IAAI,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACrE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACjF,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACrE,CAAC;IACF,CAAC;IAED,UAAU,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACxC,aAAa,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YACpC,aAAa,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize scroll depth tracking
|
|
3
|
+
*/
|
|
4
|
+
export declare function initScrollTracking(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Remove scroll tracking listener
|
|
7
|
+
*/
|
|
8
|
+
export declare function removeScrollTracking(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Get max scroll depth (for time on page events)
|
|
11
|
+
*/
|
|
12
|
+
export declare function getMaxScrollDepth(): number;
|
|
13
|
+
/**
|
|
14
|
+
* Reset tracked milestones (for SPA navigation)
|
|
15
|
+
*/
|
|
16
|
+
export declare function resetScrollTracking(): void;
|
|
17
|
+
//# sourceMappingURL=scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/scroll.ts"],"names":[],"mappings":"AAoDA;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CA8BzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createBaseEvent } from './pageview';
|
|
2
|
+
import { queueEvent } from '../events';
|
|
3
|
+
const SCROLL_MILESTONES = [25, 50, 75, 100];
|
|
4
|
+
let trackedMilestones = new Set();
|
|
5
|
+
let maxScrollDepth = 0;
|
|
6
|
+
let isScrollTrackingInitialized = false;
|
|
7
|
+
let scrollHandler = null;
|
|
8
|
+
/**
|
|
9
|
+
* Calculate current scroll depth percentage
|
|
10
|
+
*/
|
|
11
|
+
function getScrollDepth() {
|
|
12
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
const scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
16
|
+
const scrollHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
|
|
17
|
+
if (scrollHeight <= 0) {
|
|
18
|
+
return 100; // Page doesn't scroll
|
|
19
|
+
}
|
|
20
|
+
return Math.min(100, Math.round((scrollTop / scrollHeight) * 100));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handle scroll event
|
|
24
|
+
*/
|
|
25
|
+
function handleScroll() {
|
|
26
|
+
const depth = getScrollDepth();
|
|
27
|
+
if (depth > maxScrollDepth) {
|
|
28
|
+
maxScrollDepth = depth;
|
|
29
|
+
}
|
|
30
|
+
// Check for milestone crossings
|
|
31
|
+
for (const milestone of SCROLL_MILESTONES) {
|
|
32
|
+
if (depth >= milestone && !trackedMilestones.has(milestone)) {
|
|
33
|
+
trackedMilestones.add(milestone);
|
|
34
|
+
const event = createBaseEvent('scroll');
|
|
35
|
+
event.event_name = `scroll_${milestone}`;
|
|
36
|
+
event.scroll_depth = milestone;
|
|
37
|
+
queueEvent(event);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize scroll depth tracking
|
|
43
|
+
*/
|
|
44
|
+
export function initScrollTracking() {
|
|
45
|
+
if (typeof window === 'undefined') {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (isScrollTrackingInitialized) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
isScrollTrackingInitialized = true;
|
|
52
|
+
// Reset on page load
|
|
53
|
+
trackedMilestones = new Set();
|
|
54
|
+
maxScrollDepth = 0;
|
|
55
|
+
// Throttled scroll handler
|
|
56
|
+
let ticking = false;
|
|
57
|
+
scrollHandler = () => {
|
|
58
|
+
if (!ticking) {
|
|
59
|
+
requestAnimationFrame(() => {
|
|
60
|
+
handleScroll();
|
|
61
|
+
ticking = false;
|
|
62
|
+
});
|
|
63
|
+
ticking = true;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
window.addEventListener('scroll', scrollHandler, { passive: true });
|
|
67
|
+
// Check initial scroll position (for pages that load scrolled)
|
|
68
|
+
handleScroll();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Remove scroll tracking listener
|
|
72
|
+
*/
|
|
73
|
+
export function removeScrollTracking() {
|
|
74
|
+
if (scrollHandler) {
|
|
75
|
+
window.removeEventListener('scroll', scrollHandler);
|
|
76
|
+
scrollHandler = null;
|
|
77
|
+
}
|
|
78
|
+
isScrollTrackingInitialized = false;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get max scroll depth (for time on page events)
|
|
82
|
+
*/
|
|
83
|
+
export function getMaxScrollDepth() {
|
|
84
|
+
return maxScrollDepth;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reset tracked milestones (for SPA navigation)
|
|
88
|
+
*/
|
|
89
|
+
export function resetScrollTracking() {
|
|
90
|
+
trackedMilestones = new Set();
|
|
91
|
+
maxScrollDepth = 0;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../../src/analytics/collectors/scroll.ts"],"names":[],"mappings":"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"}
|