@grainql/analytics-web 2.5.4 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/activity.js +1 -1
- package/dist/attention-quality.d.ts +128 -0
- package/dist/attention-quality.d.ts.map +1 -0
- package/dist/attention-quality.js +246 -0
- package/dist/cjs/activity.js +1 -1
- package/dist/cjs/activity.js.map +1 -1
- package/dist/cjs/attention-quality.d.ts +128 -0
- package/dist/cjs/attention-quality.d.ts.map +1 -0
- package/dist/cjs/attention-quality.js +246 -0
- package/dist/cjs/attention-quality.js.map +1 -0
- package/dist/cjs/consent.js +4 -4
- package/dist/cjs/consent.js.map +1 -1
- package/dist/cjs/heartbeat.d.ts.map +1 -1
- package/dist/cjs/heartbeat.js +0 -6
- package/dist/cjs/heartbeat.js.map +1 -1
- package/dist/cjs/heatmap-tracking.d.ts +93 -0
- package/dist/cjs/heatmap-tracking.d.ts.map +1 -0
- package/dist/cjs/heatmap-tracking.js +499 -0
- package/dist/cjs/heatmap-tracking.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interaction-tracking.d.ts.map +1 -1
- package/dist/cjs/interaction-tracking.js +9 -18
- package/dist/cjs/interaction-tracking.js.map +1 -1
- package/dist/cjs/page-tracking.d.ts.map +1 -1
- package/dist/cjs/page-tracking.js +0 -9
- package/dist/cjs/page-tracking.js.map +1 -1
- package/dist/cjs/section-tracking.d.ts +3 -0
- package/dist/cjs/section-tracking.d.ts.map +1 -1
- package/dist/cjs/section-tracking.js +30 -7
- package/dist/cjs/section-tracking.js.map +1 -1
- package/dist/cjs/types/auto-tracking.d.ts +3 -0
- package/dist/cjs/types/auto-tracking.d.ts.map +1 -1
- package/dist/cjs/types/heatmap-tracking.d.ts +44 -0
- package/dist/cjs/types/heatmap-tracking.d.ts.map +1 -0
- package/dist/cjs/types/heatmap-tracking.js +6 -0
- package/dist/cjs/types/heatmap-tracking.js.map +1 -0
- package/dist/consent.js +4 -4
- package/dist/esm/activity.js +1 -1
- package/dist/esm/activity.js.map +1 -1
- package/dist/esm/attention-quality.d.ts +128 -0
- package/dist/esm/attention-quality.d.ts.map +1 -0
- package/dist/esm/attention-quality.js +242 -0
- package/dist/esm/attention-quality.js.map +1 -0
- package/dist/esm/consent.js +4 -4
- package/dist/esm/consent.js.map +1 -1
- package/dist/esm/heartbeat.d.ts.map +1 -1
- package/dist/esm/heartbeat.js +0 -6
- package/dist/esm/heartbeat.js.map +1 -1
- package/dist/esm/heatmap-tracking.d.ts +93 -0
- package/dist/esm/heatmap-tracking.d.ts.map +1 -0
- package/dist/esm/heatmap-tracking.js +495 -0
- package/dist/esm/heatmap-tracking.js.map +1 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interaction-tracking.d.ts.map +1 -1
- package/dist/esm/interaction-tracking.js +9 -18
- package/dist/esm/interaction-tracking.js.map +1 -1
- package/dist/esm/page-tracking.d.ts.map +1 -1
- package/dist/esm/page-tracking.js +0 -9
- package/dist/esm/page-tracking.js.map +1 -1
- package/dist/esm/section-tracking.d.ts +3 -0
- package/dist/esm/section-tracking.d.ts.map +1 -1
- package/dist/esm/section-tracking.js +30 -7
- package/dist/esm/section-tracking.js.map +1 -1
- package/dist/esm/types/auto-tracking.d.ts +3 -0
- package/dist/esm/types/auto-tracking.d.ts.map +1 -1
- package/dist/esm/types/heatmap-tracking.d.ts +44 -0
- package/dist/esm/types/heatmap-tracking.d.ts.map +1 -0
- package/dist/esm/types/heatmap-tracking.js +5 -0
- package/dist/esm/types/heatmap-tracking.js.map +1 -0
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +0 -6
- package/dist/heatmap-tracking.d.ts +93 -0
- package/dist/heatmap-tracking.d.ts.map +1 -0
- package/dist/heatmap-tracking.js +499 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.global.dev.js +801 -80
- package/dist/index.global.dev.js.map +4 -4
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +4 -4
- package/dist/index.js +70 -38
- package/dist/index.mjs +70 -38
- package/dist/interaction-tracking.d.ts.map +1 -1
- package/dist/interaction-tracking.js +9 -18
- package/dist/page-tracking.d.ts.map +1 -1
- package/dist/page-tracking.js +0 -9
- package/dist/section-tracking.d.ts +3 -0
- package/dist/section-tracking.d.ts.map +1 -1
- package/dist/section-tracking.js +30 -7
- package/dist/types/auto-tracking.d.ts +3 -0
- package/dist/types/auto-tracking.d.ts.map +1 -1
- package/dist/types/heatmap-tracking.d.ts +44 -0
- package/dist/types/heatmap-tracking.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/E,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,kBAAkB,IAAI,MAAM,CAAC;IAC7B,qBAAqB,IAAI,MAAM,CAAC;IAChC,YAAY,IAAI,MAAM,CAAC;IACvB,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,+BAA+B,IAAI,MAAM,CAAC;IAC1C,iCAAiC,IAAI,IAAI,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,wBAAwB,CAAS;gBAGvC,OAAO,EAAE,gBAAgB,EACzB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,eAAe;IAezB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/E,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,kBAAkB,IAAI,MAAM,CAAC;IAC7B,qBAAqB,IAAI,MAAM,CAAC;IAChC,YAAY,IAAI,MAAM,CAAC;IACvB,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,+BAA+B,IAAI,MAAM,CAAC;IAC1C,iCAAiC,IAAI,IAAI,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,wBAAwB,CAAS;gBAGvC,OAAO,EAAE,gBAAgB,EACzB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,eAAe;IAezB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,IAAI,IAAI;CAUhB"}
|
package/dist/esm/heartbeat.js
CHANGED
|
@@ -93,9 +93,6 @@ export class HeartbeatManager {
|
|
|
93
93
|
// Track the heartbeat event
|
|
94
94
|
this.tracker.trackSystemEvent('_grain_heartbeat', properties);
|
|
95
95
|
this.lastHeartbeatTime = now;
|
|
96
|
-
if (this.config.debug) {
|
|
97
|
-
console.log('[Heartbeat] Sent heartbeat:', properties);
|
|
98
|
-
}
|
|
99
96
|
}
|
|
100
97
|
/**
|
|
101
98
|
* Destroy the heartbeat manager
|
|
@@ -108,9 +105,6 @@ export class HeartbeatManager {
|
|
|
108
105
|
this.heartbeatTimer = null;
|
|
109
106
|
}
|
|
110
107
|
this.isDestroyed = true;
|
|
111
|
-
if (this.config.debug) {
|
|
112
|
-
console.log('[Heartbeat] Destroyed');
|
|
113
|
-
}
|
|
114
108
|
}
|
|
115
109
|
}
|
|
116
110
|
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heatmap Tracking Manager for Grain Analytics
|
|
3
|
+
* Tracks click interactions and scroll depth across all pages
|
|
4
|
+
*/
|
|
5
|
+
import type { HeatmapTrackingOptions } from './types/heatmap-tracking';
|
|
6
|
+
import type { ActivityDetector } from './activity';
|
|
7
|
+
export interface SendEventOptions {
|
|
8
|
+
flush?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface HeatmapTracker {
|
|
11
|
+
trackSystemEvent(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;
|
|
12
|
+
hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;
|
|
13
|
+
getActivityDetector(): ActivityDetector;
|
|
14
|
+
log(...args: unknown[]): void;
|
|
15
|
+
}
|
|
16
|
+
export declare class HeatmapTrackingManager {
|
|
17
|
+
private tracker;
|
|
18
|
+
private options;
|
|
19
|
+
private isDestroyed;
|
|
20
|
+
private currentScrollState;
|
|
21
|
+
private pendingClicks;
|
|
22
|
+
private pendingScrolls;
|
|
23
|
+
private scrollDebounceTimer;
|
|
24
|
+
private batchTimer;
|
|
25
|
+
private scrollTrackingTimer;
|
|
26
|
+
private periodicScrollTimer;
|
|
27
|
+
private lastScrollPosition;
|
|
28
|
+
private lastScrollTime;
|
|
29
|
+
private readonly SPLIT_DURATION;
|
|
30
|
+
private attentionQuality;
|
|
31
|
+
constructor(tracker: HeatmapTracker, options?: Partial<HeatmapTrackingOptions>);
|
|
32
|
+
/**
|
|
33
|
+
* Initialize heatmap tracking
|
|
34
|
+
*/
|
|
35
|
+
private initialize;
|
|
36
|
+
/**
|
|
37
|
+
* Setup click event tracking
|
|
38
|
+
*/
|
|
39
|
+
private setupClickTracking;
|
|
40
|
+
/**
|
|
41
|
+
* Setup scroll event tracking
|
|
42
|
+
*/
|
|
43
|
+
private setupScrollTracking;
|
|
44
|
+
/**
|
|
45
|
+
* Start periodic scroll state tracking
|
|
46
|
+
*/
|
|
47
|
+
private startScrollTracking;
|
|
48
|
+
/**
|
|
49
|
+
* Start periodic scroll tracking (sends events every 3 seconds)
|
|
50
|
+
*/
|
|
51
|
+
private startPeriodicScrollTracking;
|
|
52
|
+
/**
|
|
53
|
+
* Setup page unload handler to beacon remaining data
|
|
54
|
+
*/
|
|
55
|
+
private setupUnloadHandler;
|
|
56
|
+
/**
|
|
57
|
+
* Handle click event
|
|
58
|
+
*/
|
|
59
|
+
private handleClick;
|
|
60
|
+
/**
|
|
61
|
+
* Handle scroll event
|
|
62
|
+
*/
|
|
63
|
+
private handleScroll;
|
|
64
|
+
/**
|
|
65
|
+
* Update current scroll state
|
|
66
|
+
*/
|
|
67
|
+
private updateScrollState;
|
|
68
|
+
/**
|
|
69
|
+
* Generate XPath for an element
|
|
70
|
+
*/
|
|
71
|
+
private generateXPath;
|
|
72
|
+
/**
|
|
73
|
+
* Consider flushing batched events
|
|
74
|
+
*/
|
|
75
|
+
private considerBatchFlush;
|
|
76
|
+
/**
|
|
77
|
+
* Flush pending events
|
|
78
|
+
*/
|
|
79
|
+
private flushPendingEvents;
|
|
80
|
+
/**
|
|
81
|
+
* Flush pending events with beacon (for page unload)
|
|
82
|
+
*/
|
|
83
|
+
private flushPendingEventsWithBeacon;
|
|
84
|
+
/**
|
|
85
|
+
* Log debug message
|
|
86
|
+
*/
|
|
87
|
+
private log;
|
|
88
|
+
/**
|
|
89
|
+
* Destroy the tracking manager
|
|
90
|
+
*/
|
|
91
|
+
destroy(): void;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=heatmap-tracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../src/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5H,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,mBAAmB,IAAI,gBAAgB,CAAC;IACxC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AASD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,cAAc,CAA2B;IAGjD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAGvC,OAAO,CAAC,gBAAgB,CAA0B;gBAGhD,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IA0B/C;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAwEnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAwDnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqDzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqD1B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA6CpC;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,IAAI,IAAI;CA8BhB"}
|
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heatmap Tracking Manager for Grain Analytics
|
|
3
|
+
* Tracks click interactions and scroll depth across all pages
|
|
4
|
+
*/
|
|
5
|
+
import { AttentionQualityManager } from './attention-quality';
|
|
6
|
+
const DEFAULT_OPTIONS = {
|
|
7
|
+
scrollDebounceDelay: 100,
|
|
8
|
+
batchDelay: 2000,
|
|
9
|
+
maxBatchSize: 20,
|
|
10
|
+
debug: false,
|
|
11
|
+
};
|
|
12
|
+
export class HeatmapTrackingManager {
|
|
13
|
+
constructor(tracker, options = {}) {
|
|
14
|
+
this.isDestroyed = false;
|
|
15
|
+
// Tracking state
|
|
16
|
+
this.currentScrollState = null;
|
|
17
|
+
this.pendingClicks = [];
|
|
18
|
+
this.pendingScrolls = [];
|
|
19
|
+
// Timers
|
|
20
|
+
this.scrollDebounceTimer = null;
|
|
21
|
+
this.batchTimer = null;
|
|
22
|
+
this.scrollTrackingTimer = null;
|
|
23
|
+
this.periodicScrollTimer = null;
|
|
24
|
+
// Scroll tracking
|
|
25
|
+
this.lastScrollPosition = 0;
|
|
26
|
+
this.lastScrollTime = Date.now();
|
|
27
|
+
this.SPLIT_DURATION = 3000; // 3 seconds - same as section tracking
|
|
28
|
+
this.tracker = tracker;
|
|
29
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
30
|
+
// Initialize attention quality manager
|
|
31
|
+
this.attentionQuality = new AttentionQualityManager(tracker.getActivityDetector(), {
|
|
32
|
+
maxSectionDuration: 9000, // 9 seconds per viewport section
|
|
33
|
+
minScrollDistance: 100, // 100 pixels
|
|
34
|
+
idleThreshold: 30000, // 30 seconds
|
|
35
|
+
debug: this.options.debug,
|
|
36
|
+
});
|
|
37
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
38
|
+
// Initialize after DOM is ready
|
|
39
|
+
if (document.readyState === 'loading') {
|
|
40
|
+
document.addEventListener('DOMContentLoaded', () => this.initialize());
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
setTimeout(() => this.initialize(), 0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize heatmap tracking
|
|
49
|
+
*/
|
|
50
|
+
initialize() {
|
|
51
|
+
if (this.isDestroyed)
|
|
52
|
+
return;
|
|
53
|
+
this.log('Initializing heatmap tracking');
|
|
54
|
+
// Setup click tracking
|
|
55
|
+
this.setupClickTracking();
|
|
56
|
+
// Setup scroll tracking
|
|
57
|
+
this.setupScrollTracking();
|
|
58
|
+
// Start periodic scroll state tracking
|
|
59
|
+
this.startScrollTracking();
|
|
60
|
+
// Setup page unload handler for beaconing
|
|
61
|
+
this.setupUnloadHandler();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Setup click event tracking
|
|
65
|
+
*/
|
|
66
|
+
setupClickTracking() {
|
|
67
|
+
if (typeof document === 'undefined')
|
|
68
|
+
return;
|
|
69
|
+
const clickHandler = (event) => {
|
|
70
|
+
if (this.isDestroyed)
|
|
71
|
+
return;
|
|
72
|
+
if (!this.tracker.hasConsent('analytics'))
|
|
73
|
+
return;
|
|
74
|
+
this.handleClick(event);
|
|
75
|
+
};
|
|
76
|
+
document.addEventListener('click', clickHandler, { passive: true, capture: true });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Setup scroll event tracking
|
|
80
|
+
*/
|
|
81
|
+
setupScrollTracking() {
|
|
82
|
+
if (typeof window === 'undefined')
|
|
83
|
+
return;
|
|
84
|
+
const scrollHandler = () => {
|
|
85
|
+
if (this.scrollDebounceTimer !== null) {
|
|
86
|
+
clearTimeout(this.scrollDebounceTimer);
|
|
87
|
+
}
|
|
88
|
+
this.scrollDebounceTimer = window.setTimeout(() => {
|
|
89
|
+
this.handleScroll();
|
|
90
|
+
this.scrollDebounceTimer = null;
|
|
91
|
+
}, this.options.scrollDebounceDelay);
|
|
92
|
+
};
|
|
93
|
+
window.addEventListener('scroll', scrollHandler, { passive: true });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Start periodic scroll state tracking
|
|
97
|
+
*/
|
|
98
|
+
startScrollTracking() {
|
|
99
|
+
if (typeof window === 'undefined')
|
|
100
|
+
return;
|
|
101
|
+
// Track initial scroll position
|
|
102
|
+
this.updateScrollState();
|
|
103
|
+
// Update scroll state every 500ms (for detecting section changes)
|
|
104
|
+
this.scrollTrackingTimer = window.setInterval(() => {
|
|
105
|
+
if (this.isDestroyed)
|
|
106
|
+
return;
|
|
107
|
+
this.updateScrollState();
|
|
108
|
+
}, 500);
|
|
109
|
+
// Start periodic 3-second scroll duration tracking
|
|
110
|
+
this.startPeriodicScrollTracking();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Start periodic scroll tracking (sends events every 3 seconds)
|
|
114
|
+
*/
|
|
115
|
+
startPeriodicScrollTracking() {
|
|
116
|
+
if (typeof window === 'undefined')
|
|
117
|
+
return;
|
|
118
|
+
this.periodicScrollTimer = window.setInterval(() => {
|
|
119
|
+
if (this.isDestroyed || !this.currentScrollState)
|
|
120
|
+
return;
|
|
121
|
+
if (!this.tracker.hasConsent('analytics'))
|
|
122
|
+
return;
|
|
123
|
+
// Check attention quality policies
|
|
124
|
+
if (!this.attentionQuality.shouldTrack()) {
|
|
125
|
+
this.log('Scroll tracking paused:', this.attentionQuality.getLastFilterReason());
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const currentTime = Date.now();
|
|
129
|
+
const duration = currentTime - this.currentScrollState.entryTime;
|
|
130
|
+
// Only send if meaningful duration (> 1 second)
|
|
131
|
+
if (duration > 1000) {
|
|
132
|
+
const scrollY = window.scrollY || window.pageYOffset;
|
|
133
|
+
const viewportHeight = window.innerHeight;
|
|
134
|
+
const pageHeight = document.documentElement.scrollHeight;
|
|
135
|
+
// Check section-specific attention quality
|
|
136
|
+
const sectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;
|
|
137
|
+
const attentionCheck = this.attentionQuality.shouldTrackSection(sectionKey, scrollY);
|
|
138
|
+
// If attention was reset due to scroll, reset our entry time
|
|
139
|
+
if (attentionCheck.resetAttention) {
|
|
140
|
+
this.log(`Viewport section ${this.currentScrollState.viewportSection}: Attention reset`);
|
|
141
|
+
this.currentScrollState.entryTime = currentTime;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// If max duration reached for this viewport section
|
|
145
|
+
if (!attentionCheck.shouldTrack) {
|
|
146
|
+
this.log(`Viewport section ${this.currentScrollState.viewportSection}: ${attentionCheck.reason}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const scrollData = {
|
|
150
|
+
pageUrl: window.location.href,
|
|
151
|
+
viewportSection: this.currentScrollState.viewportSection,
|
|
152
|
+
scrollDepthPx: scrollY,
|
|
153
|
+
durationMs: duration,
|
|
154
|
+
entryTimestamp: this.currentScrollState.entryTime,
|
|
155
|
+
exitTimestamp: currentTime,
|
|
156
|
+
pageHeight,
|
|
157
|
+
viewportHeight,
|
|
158
|
+
};
|
|
159
|
+
// Send immediately using beacon to ensure delivery
|
|
160
|
+
this.tracker.trackSystemEvent('_grain_heatmap_scroll', {
|
|
161
|
+
page_url: scrollData.pageUrl,
|
|
162
|
+
viewport_section: scrollData.viewportSection,
|
|
163
|
+
scroll_depth_px: scrollData.scrollDepthPx,
|
|
164
|
+
duration_ms: scrollData.durationMs,
|
|
165
|
+
entry_timestamp: scrollData.entryTimestamp,
|
|
166
|
+
exit_timestamp: scrollData.exitTimestamp,
|
|
167
|
+
page_height: scrollData.pageHeight,
|
|
168
|
+
viewport_height: scrollData.viewportHeight,
|
|
169
|
+
is_split: true, // Flag to indicate periodic tracking, not final exit
|
|
170
|
+
}, { flush: true });
|
|
171
|
+
// Update attention quality duration tracker
|
|
172
|
+
this.attentionQuality.updateSectionDuration(sectionKey, duration);
|
|
173
|
+
// Reset entry time for next period
|
|
174
|
+
this.currentScrollState.entryTime = currentTime;
|
|
175
|
+
}
|
|
176
|
+
}, this.SPLIT_DURATION);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Setup page unload handler to beacon remaining data
|
|
180
|
+
*/
|
|
181
|
+
setupUnloadHandler() {
|
|
182
|
+
if (typeof window === 'undefined')
|
|
183
|
+
return;
|
|
184
|
+
const unloadHandler = () => {
|
|
185
|
+
// Finalize current scroll state
|
|
186
|
+
if (this.currentScrollState) {
|
|
187
|
+
const currentTime = Date.now();
|
|
188
|
+
const duration = currentTime - this.currentScrollState.entryTime;
|
|
189
|
+
if (duration > 100) {
|
|
190
|
+
const scrollData = {
|
|
191
|
+
pageUrl: window.location.href,
|
|
192
|
+
viewportSection: this.currentScrollState.viewportSection,
|
|
193
|
+
scrollDepthPx: this.currentScrollState.scrollDepthPx,
|
|
194
|
+
durationMs: duration,
|
|
195
|
+
entryTimestamp: this.currentScrollState.entryTime,
|
|
196
|
+
exitTimestamp: currentTime,
|
|
197
|
+
pageHeight: document.documentElement.scrollHeight,
|
|
198
|
+
viewportHeight: window.innerHeight,
|
|
199
|
+
};
|
|
200
|
+
this.pendingScrolls.push(scrollData);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Flush all pending events with beacon
|
|
204
|
+
this.flushPendingEventsWithBeacon();
|
|
205
|
+
};
|
|
206
|
+
// Use both events for better compatibility
|
|
207
|
+
window.addEventListener('beforeunload', unloadHandler);
|
|
208
|
+
window.addEventListener('pagehide', unloadHandler);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle click event
|
|
212
|
+
*/
|
|
213
|
+
handleClick(event) {
|
|
214
|
+
if (!this.tracker.hasConsent('analytics'))
|
|
215
|
+
return;
|
|
216
|
+
const element = event.target;
|
|
217
|
+
if (!element)
|
|
218
|
+
return;
|
|
219
|
+
const pageUrl = window.location.href;
|
|
220
|
+
const xpath = this.generateXPath(element);
|
|
221
|
+
// Get viewport coordinates
|
|
222
|
+
const viewportX = Math.round(event.clientX);
|
|
223
|
+
const viewportY = Math.round(event.clientY);
|
|
224
|
+
// Get page coordinates (including scroll offset)
|
|
225
|
+
const pageX = Math.round(event.pageX);
|
|
226
|
+
const pageY = Math.round(event.pageY);
|
|
227
|
+
const elementTag = element.tagName?.toLowerCase() || 'unknown';
|
|
228
|
+
const elementText = element.textContent?.trim().substring(0, 100);
|
|
229
|
+
const clickData = {
|
|
230
|
+
pageUrl,
|
|
231
|
+
xpath,
|
|
232
|
+
viewportX,
|
|
233
|
+
viewportY,
|
|
234
|
+
pageX,
|
|
235
|
+
pageY,
|
|
236
|
+
elementTag,
|
|
237
|
+
elementText: elementText || undefined,
|
|
238
|
+
timestamp: Date.now(),
|
|
239
|
+
};
|
|
240
|
+
// Check if this is a navigation link
|
|
241
|
+
const isNavigationLink = element instanceof HTMLAnchorElement && element.href;
|
|
242
|
+
// Send immediately with beacon for navigation links to ensure delivery
|
|
243
|
+
if (isNavigationLink) {
|
|
244
|
+
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
245
|
+
page_url: clickData.pageUrl,
|
|
246
|
+
xpath: clickData.xpath,
|
|
247
|
+
viewport_x: clickData.viewportX,
|
|
248
|
+
viewport_y: clickData.viewportY,
|
|
249
|
+
page_x: clickData.pageX,
|
|
250
|
+
page_y: clickData.pageY,
|
|
251
|
+
element_tag: clickData.elementTag,
|
|
252
|
+
element_text: clickData.elementText,
|
|
253
|
+
timestamp: clickData.timestamp,
|
|
254
|
+
}, { flush: true });
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
this.pendingClicks.push(clickData);
|
|
258
|
+
// Check if we should flush
|
|
259
|
+
this.considerBatchFlush();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Handle scroll event
|
|
264
|
+
*/
|
|
265
|
+
handleScroll() {
|
|
266
|
+
if (!this.tracker.hasConsent('analytics'))
|
|
267
|
+
return;
|
|
268
|
+
this.updateScrollState();
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Update current scroll state
|
|
272
|
+
*/
|
|
273
|
+
updateScrollState() {
|
|
274
|
+
if (typeof window === 'undefined')
|
|
275
|
+
return;
|
|
276
|
+
if (!this.tracker.hasConsent('analytics'))
|
|
277
|
+
return;
|
|
278
|
+
const currentTime = Date.now();
|
|
279
|
+
const scrollY = window.scrollY || window.pageYOffset;
|
|
280
|
+
const viewportHeight = window.innerHeight;
|
|
281
|
+
const pageHeight = document.documentElement.scrollHeight;
|
|
282
|
+
// Calculate which viewport section we're in
|
|
283
|
+
const viewportSection = Math.floor(scrollY / viewportHeight);
|
|
284
|
+
// If we're in a new section, record the previous one
|
|
285
|
+
if (this.currentScrollState && this.currentScrollState.viewportSection !== viewportSection) {
|
|
286
|
+
const duration = currentTime - this.currentScrollState.entryTime;
|
|
287
|
+
// Only record if duration is meaningful (> 100ms)
|
|
288
|
+
if (duration > 100) {
|
|
289
|
+
const scrollData = {
|
|
290
|
+
pageUrl: window.location.href,
|
|
291
|
+
viewportSection: this.currentScrollState.viewportSection,
|
|
292
|
+
scrollDepthPx: this.currentScrollState.scrollDepthPx,
|
|
293
|
+
durationMs: duration,
|
|
294
|
+
entryTimestamp: this.currentScrollState.entryTime,
|
|
295
|
+
exitTimestamp: currentTime,
|
|
296
|
+
pageHeight,
|
|
297
|
+
viewportHeight,
|
|
298
|
+
};
|
|
299
|
+
this.pendingScrolls.push(scrollData);
|
|
300
|
+
}
|
|
301
|
+
// Reset attention for previous viewport section
|
|
302
|
+
const prevSectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;
|
|
303
|
+
this.attentionQuality.resetSection(prevSectionKey);
|
|
304
|
+
}
|
|
305
|
+
// Update current state
|
|
306
|
+
if (!this.currentScrollState || this.currentScrollState.viewportSection !== viewportSection) {
|
|
307
|
+
this.currentScrollState = {
|
|
308
|
+
viewportSection,
|
|
309
|
+
entryTime: currentTime,
|
|
310
|
+
scrollDepthPx: scrollY,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
this.lastScrollPosition = scrollY;
|
|
314
|
+
this.lastScrollTime = currentTime;
|
|
315
|
+
// Check if we should flush
|
|
316
|
+
this.considerBatchFlush();
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Generate XPath for an element
|
|
320
|
+
*/
|
|
321
|
+
generateXPath(element) {
|
|
322
|
+
if (!element)
|
|
323
|
+
return '';
|
|
324
|
+
// If element has an ID, use that for simpler XPath
|
|
325
|
+
if (element.id) {
|
|
326
|
+
return `//*[@id="${element.id}"]`;
|
|
327
|
+
}
|
|
328
|
+
const paths = [];
|
|
329
|
+
let currentElement = element;
|
|
330
|
+
while (currentElement && currentElement.nodeType === Node.ELEMENT_NODE) {
|
|
331
|
+
let index = 0;
|
|
332
|
+
let sibling = currentElement;
|
|
333
|
+
// Count preceding siblings of the same tag
|
|
334
|
+
while (sibling) {
|
|
335
|
+
sibling = sibling.previousElementSibling;
|
|
336
|
+
if (sibling && sibling.nodeName === currentElement.nodeName) {
|
|
337
|
+
index++;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
const tagName = currentElement.nodeName.toLowerCase();
|
|
341
|
+
const pathIndex = index > 0 ? `[${index + 1}]` : '';
|
|
342
|
+
paths.unshift(`${tagName}${pathIndex}`);
|
|
343
|
+
currentElement = currentElement.parentElement;
|
|
344
|
+
}
|
|
345
|
+
return paths.length ? `/${paths.join('/')}` : '';
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Consider flushing batched events
|
|
349
|
+
*/
|
|
350
|
+
considerBatchFlush() {
|
|
351
|
+
const totalEvents = this.pendingClicks.length + this.pendingScrolls.length;
|
|
352
|
+
// Flush if we've hit the batch size
|
|
353
|
+
if (totalEvents >= this.options.maxBatchSize) {
|
|
354
|
+
this.flushPendingEvents();
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// Otherwise, schedule a batch flush
|
|
358
|
+
if (this.batchTimer === null && totalEvents > 0) {
|
|
359
|
+
this.batchTimer = window.setTimeout(() => {
|
|
360
|
+
this.flushPendingEvents();
|
|
361
|
+
this.batchTimer = null;
|
|
362
|
+
}, this.options.batchDelay);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Flush pending events
|
|
367
|
+
*/
|
|
368
|
+
flushPendingEvents() {
|
|
369
|
+
if (this.isDestroyed)
|
|
370
|
+
return;
|
|
371
|
+
if (!this.tracker.hasConsent('analytics')) {
|
|
372
|
+
// Clear pending events if consent is revoked
|
|
373
|
+
this.pendingClicks = [];
|
|
374
|
+
this.pendingScrolls = [];
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// Send click events
|
|
378
|
+
if (this.pendingClicks.length > 0) {
|
|
379
|
+
for (const clickData of this.pendingClicks) {
|
|
380
|
+
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
381
|
+
page_url: clickData.pageUrl,
|
|
382
|
+
xpath: clickData.xpath,
|
|
383
|
+
viewport_x: clickData.viewportX,
|
|
384
|
+
viewport_y: clickData.viewportY,
|
|
385
|
+
page_x: clickData.pageX,
|
|
386
|
+
page_y: clickData.pageY,
|
|
387
|
+
element_tag: clickData.elementTag,
|
|
388
|
+
element_text: clickData.elementText,
|
|
389
|
+
timestamp: clickData.timestamp,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
this.pendingClicks = [];
|
|
393
|
+
}
|
|
394
|
+
// Send scroll events
|
|
395
|
+
if (this.pendingScrolls.length > 0) {
|
|
396
|
+
for (const scrollData of this.pendingScrolls) {
|
|
397
|
+
this.tracker.trackSystemEvent('_grain_heatmap_scroll', {
|
|
398
|
+
page_url: scrollData.pageUrl,
|
|
399
|
+
viewport_section: scrollData.viewportSection,
|
|
400
|
+
scroll_depth_px: scrollData.scrollDepthPx,
|
|
401
|
+
duration_ms: scrollData.durationMs,
|
|
402
|
+
entry_timestamp: scrollData.entryTimestamp,
|
|
403
|
+
exit_timestamp: scrollData.exitTimestamp,
|
|
404
|
+
page_height: scrollData.pageHeight,
|
|
405
|
+
viewport_height: scrollData.viewportHeight,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
this.pendingScrolls = [];
|
|
409
|
+
}
|
|
410
|
+
// Clear batch timer
|
|
411
|
+
if (this.batchTimer !== null) {
|
|
412
|
+
clearTimeout(this.batchTimer);
|
|
413
|
+
this.batchTimer = null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Flush pending events with beacon (for page unload)
|
|
418
|
+
*/
|
|
419
|
+
flushPendingEventsWithBeacon() {
|
|
420
|
+
if (!this.tracker.hasConsent('analytics')) {
|
|
421
|
+
this.pendingClicks = [];
|
|
422
|
+
this.pendingScrolls = [];
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
// Send click events with beacon
|
|
426
|
+
if (this.pendingClicks.length > 0) {
|
|
427
|
+
for (const clickData of this.pendingClicks) {
|
|
428
|
+
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
429
|
+
page_url: clickData.pageUrl,
|
|
430
|
+
xpath: clickData.xpath,
|
|
431
|
+
viewport_x: clickData.viewportX,
|
|
432
|
+
viewport_y: clickData.viewportY,
|
|
433
|
+
page_x: clickData.pageX,
|
|
434
|
+
page_y: clickData.pageY,
|
|
435
|
+
element_tag: clickData.elementTag,
|
|
436
|
+
element_text: clickData.elementText,
|
|
437
|
+
timestamp: clickData.timestamp,
|
|
438
|
+
}, { flush: true });
|
|
439
|
+
}
|
|
440
|
+
this.pendingClicks = [];
|
|
441
|
+
}
|
|
442
|
+
// Send scroll events with beacon
|
|
443
|
+
if (this.pendingScrolls.length > 0) {
|
|
444
|
+
for (const scrollData of this.pendingScrolls) {
|
|
445
|
+
this.tracker.trackSystemEvent('_grain_heatmap_scroll', {
|
|
446
|
+
page_url: scrollData.pageUrl,
|
|
447
|
+
viewport_section: scrollData.viewportSection,
|
|
448
|
+
scroll_depth_px: scrollData.scrollDepthPx,
|
|
449
|
+
duration_ms: scrollData.durationMs,
|
|
450
|
+
entry_timestamp: scrollData.entryTimestamp,
|
|
451
|
+
exit_timestamp: scrollData.exitTimestamp,
|
|
452
|
+
page_height: scrollData.pageHeight,
|
|
453
|
+
viewport_height: scrollData.viewportHeight,
|
|
454
|
+
}, { flush: true });
|
|
455
|
+
}
|
|
456
|
+
this.pendingScrolls = [];
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Log debug message
|
|
461
|
+
*/
|
|
462
|
+
log(...args) {
|
|
463
|
+
if (this.options.debug) {
|
|
464
|
+
this.tracker.log('[Heatmap Tracking]', ...args);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Destroy the tracking manager
|
|
469
|
+
*/
|
|
470
|
+
destroy() {
|
|
471
|
+
this.isDestroyed = true;
|
|
472
|
+
// Clear timers
|
|
473
|
+
if (this.scrollDebounceTimer !== null) {
|
|
474
|
+
clearTimeout(this.scrollDebounceTimer);
|
|
475
|
+
this.scrollDebounceTimer = null;
|
|
476
|
+
}
|
|
477
|
+
if (this.batchTimer !== null) {
|
|
478
|
+
clearTimeout(this.batchTimer);
|
|
479
|
+
this.batchTimer = null;
|
|
480
|
+
}
|
|
481
|
+
if (this.scrollTrackingTimer !== null) {
|
|
482
|
+
clearInterval(this.scrollTrackingTimer);
|
|
483
|
+
this.scrollTrackingTimer = null;
|
|
484
|
+
}
|
|
485
|
+
if (this.periodicScrollTimer !== null) {
|
|
486
|
+
clearInterval(this.periodicScrollTimer);
|
|
487
|
+
this.periodicScrollTimer = null;
|
|
488
|
+
}
|
|
489
|
+
// Destroy attention quality manager
|
|
490
|
+
this.attentionQuality.destroy();
|
|
491
|
+
// Flush any remaining events
|
|
492
|
+
this.flushPendingEvents();
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
//# sourceMappingURL=heatmap-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap-tracking.js","sourceRoot":"","sources":["../../src/heatmap-tracking.ts"],"names":[],"mappings":"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"}
|