/** * Heatmap Tracking Manager for Grain Analytics * Tracks click interactions and scroll depth across all pages */ import type { HeatmapTrackingOptions } from './types/heatmap-tracking'; import type { ActivityDetector } from './activity'; export interface SendEventOptions { flush?: boolean; } export interface HeatmapTracker { trackSystemEvent(eventName: string, properties?: Record, options?: SendEventOptions): void | Promise; hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean; getActivityDetector(): ActivityDetector; getConfigAsync(key: string): Promise; getEffectiveUserId(): string; log(...args: unknown[]): void; } export declare class HeatmapTrackingManager { private tracker; private options; private isDestroyed; private currentScrollState; private pendingClicks; private pendingScrolls; private scrollDebounceTimer; private batchTimer; private scrollTrackingTimer; private periodicScrollTimer; private lastScrollPosition; private lastScrollTime; private readonly SPLIT_DURATION; private attentionQuality; private snapshotCaptured; private snapshotEnabled; private deviceType; constructor(tracker: HeatmapTracker, options?: Partial); /** * Initialize heatmap tracking */ private initialize; /** * Check remote config for snapshot capture enablement */ /** * Detect device type based on viewport width and user agent * Mobile: width < 768px OR mobile user agent * Desktop: width >= 768px AND non-mobile user agent */ private detectDeviceType; /** * Normalize URL by removing query params and hash, and stripping www prefix * This ensures heatmap data is aggregated by page, not by URL variations * Subdomains (other than www) are preserved: api.example.com != app.example.com */ private normalizeUrl; private checkSnapshotConfig; /** * Capture DOM snapshot using rrweb-snapshot */ private captureSnapshot; /** * Upload snapshot to backend */ private uploadSnapshot; /** * Check if snapshot can be uploaded based on daily limits * - Max 5 snapshots per user per day * - Same URL (without query params) can't be uploaded twice in same day */ private canUploadSnapshot; /** * Record a successful snapshot upload */ private recordSnapshotUpload; /** * Strip query parameters from URL for comparison */ private stripQueryParams; /** * Get API URL from tracker configuration */ private getApiUrl; /** * Get tenant ID from tracker configuration */ private getTenantId; /** * Get auth headers from tracker */ private getAuthHeaders; /** * Setup click event tracking */ private setupClickTracking; /** * Setup scroll event tracking */ private setupScrollTracking; /** * Start periodic scroll state tracking */ private startScrollTracking; /** * Start periodic scroll tracking (sends events every 3 seconds) */ private startPeriodicScrollTracking; /** * Setup page unload handler to beacon remaining data */ private setupUnloadHandler; /** * Handle click event */ private handleClick; /** * Handle scroll event */ private handleScroll; /** * Update current scroll state */ private updateScrollState; /** * Generate CSS selector for an element (for element-relative positioning) */ private generateCSSSelector; /** * Generate XPath for an element */ private generateXPath; /** * Consider flushing batched events */ private considerBatchFlush; /** * Flush pending events */ private flushPendingEvents; /** * Flush pending events with beacon (for page unload) */ private flushPendingEventsWithBeacon; /** * Log debug message */ private log; /** * Destroy the tracking manager */ destroy(): void; } //# sourceMappingURL=heatmap-tracking.d.ts.map