@grainql/analytics-web 2.6.0 → 2.7.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.
Files changed (79) hide show
  1. package/dist/attention-quality.d.ts +128 -0
  2. package/dist/attention-quality.d.ts.map +1 -0
  3. package/dist/attention-quality.js +246 -0
  4. package/dist/cjs/attention-quality.d.ts +128 -0
  5. package/dist/cjs/attention-quality.d.ts.map +1 -0
  6. package/dist/cjs/attention-quality.js +246 -0
  7. package/dist/cjs/attention-quality.js.map +1 -0
  8. package/dist/cjs/heatmap-tracking.d.ts +3 -0
  9. package/dist/cjs/heatmap-tracking.d.ts.map +1 -1
  10. package/dist/cjs/heatmap-tracking.js +36 -1
  11. package/dist/cjs/heatmap-tracking.js.map +1 -1
  12. package/dist/cjs/index.d.ts +5 -0
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/interaction-tracking.d.ts.map +1 -1
  16. package/dist/cjs/interaction-tracking.js +2 -1
  17. package/dist/cjs/interaction-tracking.js.map +1 -1
  18. package/dist/cjs/section-tracking.d.ts +3 -0
  19. package/dist/cjs/section-tracking.d.ts.map +1 -1
  20. package/dist/cjs/section-tracking.js +29 -0
  21. package/dist/cjs/section-tracking.js.map +1 -1
  22. package/dist/cjs/text-utils.d.ts +14 -0
  23. package/dist/cjs/text-utils.d.ts.map +1 -0
  24. package/dist/cjs/text-utils.js +49 -0
  25. package/dist/cjs/text-utils.js.map +1 -0
  26. package/dist/cjs/types/auto-tracking.d.ts +3 -0
  27. package/dist/cjs/types/auto-tracking.d.ts.map +1 -1
  28. package/dist/cjs/types/heatmap-tracking.d.ts +3 -0
  29. package/dist/cjs/types/heatmap-tracking.d.ts.map +1 -1
  30. package/dist/esm/attention-quality.d.ts +128 -0
  31. package/dist/esm/attention-quality.d.ts.map +1 -0
  32. package/dist/esm/attention-quality.js +242 -0
  33. package/dist/esm/attention-quality.js.map +1 -0
  34. package/dist/esm/heatmap-tracking.d.ts +3 -0
  35. package/dist/esm/heatmap-tracking.d.ts.map +1 -1
  36. package/dist/esm/heatmap-tracking.js +36 -1
  37. package/dist/esm/heatmap-tracking.js.map +1 -1
  38. package/dist/esm/index.d.ts +5 -0
  39. package/dist/esm/index.d.ts.map +1 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/interaction-tracking.d.ts.map +1 -1
  42. package/dist/esm/interaction-tracking.js +2 -1
  43. package/dist/esm/interaction-tracking.js.map +1 -1
  44. package/dist/esm/section-tracking.d.ts +3 -0
  45. package/dist/esm/section-tracking.d.ts.map +1 -1
  46. package/dist/esm/section-tracking.js +29 -0
  47. package/dist/esm/section-tracking.js.map +1 -1
  48. package/dist/esm/text-utils.d.ts +14 -0
  49. package/dist/esm/text-utils.d.ts.map +1 -0
  50. package/dist/esm/text-utils.js +45 -0
  51. package/dist/esm/text-utils.js.map +1 -0
  52. package/dist/esm/types/auto-tracking.d.ts +3 -0
  53. package/dist/esm/types/auto-tracking.d.ts.map +1 -1
  54. package/dist/esm/types/heatmap-tracking.d.ts +3 -0
  55. package/dist/esm/types/heatmap-tracking.d.ts.map +1 -1
  56. package/dist/heatmap-tracking.d.ts +3 -0
  57. package/dist/heatmap-tracking.d.ts.map +1 -1
  58. package/dist/heatmap-tracking.js +36 -1
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.global.dev.js +330 -11
  62. package/dist/index.global.dev.js.map +4 -4
  63. package/dist/index.global.js +2 -2
  64. package/dist/index.global.js.map +4 -4
  65. package/dist/index.js +9 -0
  66. package/dist/index.mjs +9 -0
  67. package/dist/interaction-tracking.d.ts.map +1 -1
  68. package/dist/interaction-tracking.js +2 -1
  69. package/dist/section-tracking.d.ts +3 -0
  70. package/dist/section-tracking.d.ts.map +1 -1
  71. package/dist/section-tracking.js +29 -0
  72. package/dist/text-utils.d.ts +14 -0
  73. package/dist/text-utils.d.ts.map +1 -0
  74. package/dist/text-utils.js +49 -0
  75. package/dist/types/auto-tracking.d.ts +3 -0
  76. package/dist/types/auto-tracking.d.ts.map +1 -1
  77. package/dist/types/heatmap-tracking.d.ts +3 -0
  78. package/dist/types/heatmap-tracking.d.ts.map +1 -1
  79. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1011,6 +1011,15 @@ class GrainAnalytics {
1011
1011
  resetEventCountSinceLastHeartbeat() {
1012
1012
  this.eventCountSinceLastHeartbeat = 0;
1013
1013
  }
1014
+ /**
1015
+ * Get the activity detector (for internal use by tracking managers)
1016
+ */
1017
+ getActivityDetector() {
1018
+ if (!this.activityDetector) {
1019
+ throw new Error('Activity detector not initialized');
1020
+ }
1021
+ return this.activityDetector;
1022
+ }
1014
1023
  /**
1015
1024
  * Get the effective user ID (public method)
1016
1025
  */
package/dist/index.mjs CHANGED
@@ -970,6 +970,15 @@ export class GrainAnalytics {
970
970
  resetEventCountSinceLastHeartbeat() {
971
971
  this.eventCountSinceLastHeartbeat = 0;
972
972
  }
973
+ /**
974
+ * Get the activity detector (for internal use by tracking managers)
975
+ */
976
+ getActivityDetector() {
977
+ if (!this.activityDetector) {
978
+ throw new Error('Activity detector not initialized');
979
+ }
980
+ return this.activityDetector;
981
+ }
973
982
  /**
974
983
  * Get the effective user ID (public method)
975
984
  */
@@ -1 +1 @@
1
- {"version":3,"file":"interaction-tracking.d.ts","sourceRoot":"","sources":["../src/interaction-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,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;IACjH,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAA6E;IACtG,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,qBAAqB,CAAuB;gBAGlD,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,iBAAiB,EAAE,EACjC,MAAM,GAAE,yBAA8B;IA0BxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiCjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAoB3D;;OAEG;IACH,OAAO,IAAI,IAAI;CA4BhB"}
1
+ {"version":3,"file":"interaction-tracking.d.ts","sourceRoot":"","sources":["../src/interaction-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,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;IACjH,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAA6E;IACtG,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,qBAAqB,CAAuB;gBAGlD,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,iBAAiB,EAAE,EACjC,MAAM,GAAE,yBAA8B;IA0BxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiCjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAoB3D;;OAEG;IACH,OAAO,IAAI,IAAI;CA4BhB"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.InteractionTrackingManager = void 0;
8
+ const text_utils_1 = require("./text-utils");
8
9
  class InteractionTrackingManager {
9
10
  constructor(tracker, interactions, config = {}) {
10
11
  this.isDestroyed = false;
@@ -91,7 +92,7 @@ class InteractionTrackingManager {
91
92
  interaction_description: interaction.description,
92
93
  interaction_priority: interaction.priority,
93
94
  element_tag: element.tagName?.toLowerCase(),
94
- element_text: element.textContent?.trim().substring(0, 100),
95
+ element_text: (0, text_utils_1.cleanElementText)(element.textContent),
95
96
  element_id: element.id || undefined,
96
97
  element_class: element.className || undefined,
97
98
  ...(isNavigationLink && { href: element.href }),
@@ -3,9 +3,11 @@
3
3
  * Intelligent scroll tracking with viewport metrics, visible sections, and engagement analysis
4
4
  */
5
5
  import type { SectionConfig, SectionTrackingOptions } from './types/auto-tracking';
6
+ import type { ActivityDetector } from './activity';
6
7
  export interface SectionTracker {
7
8
  trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;
8
9
  hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;
10
+ getActivityDetector(): ActivityDetector;
9
11
  log(...args: unknown[]): void;
10
12
  }
11
13
  export declare class SectionTrackingManager {
@@ -24,6 +26,7 @@ export declare class SectionTrackingManager {
24
26
  private batchTimer;
25
27
  private sectionTimers;
26
28
  private readonly SPLIT_DURATION;
29
+ private attentionQuality;
27
30
  constructor(tracker: SectionTracker, sections: SectionConfig[], options?: Partial<SectionTrackingOptions>);
28
31
  /**
29
32
  * Initialize section tracking
@@ -1 +1 @@
1
- {"version":3,"file":"section-tracking.d.ts","sourceRoot":"","sources":["../src/section-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAmB,sBAAsB,EAAwB,MAAM,uBAAuB,CAAC;AAE1H,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/E,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AAWD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,oBAAoB,CAAqC;IACjE,OAAO,CAAC,UAAU,CAA0C;IAG5D,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,UAAU,CAAuB;IAGzC,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;gBAGrC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IAgB/C;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyD7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqCzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IAsB/C;;OAEG;IACH,OAAO,IAAI,IAAI;CAsChB"}
1
+ {"version":3,"file":"section-tracking.d.ts","sourceRoot":"","sources":["../src/section-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAmB,sBAAsB,EAAwB,MAAM,uBAAuB,CAAC;AAE1H,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/E,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;AAWD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,oBAAoB,CAAqC;IACjE,OAAO,CAAC,UAAU,CAA0C;IAG5D,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,UAAU,CAAuB;IAGzC,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAGvC,OAAO,CAAC,gBAAgB,CAA0B;gBAGhD,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IA2B/C;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiF7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IAsB/C;;OAEG;IACH,OAAO,IAAI,IAAI;CAyChB"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.SectionTrackingManager = void 0;
8
+ const attention_quality_1 = require("./attention-quality");
8
9
  const DEFAULT_OPTIONS = {
9
10
  minDwellTime: 1000, // 1 second minimum
10
11
  scrollVelocityThreshold: 500, // 500px/s
@@ -34,6 +35,13 @@ class SectionTrackingManager {
34
35
  this.tracker = tracker;
35
36
  this.sections = sections;
36
37
  this.options = { ...DEFAULT_OPTIONS, ...options };
38
+ // Initialize attention quality manager
39
+ this.attentionQuality = new attention_quality_1.AttentionQualityManager(tracker.getActivityDetector(), {
40
+ maxSectionDuration: 9000, // 9 seconds
41
+ minScrollDistance: 100, // 100 pixels
42
+ idleThreshold: 30000, // 30 seconds
43
+ debug: this.options.debug,
44
+ });
37
45
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
38
46
  // Initialize after DOM is ready
39
47
  if (document.readyState === 'loading') {
@@ -178,6 +186,21 @@ class SectionTrackingManager {
178
186
  const duration = now - state.entryTime;
179
187
  // Only track if minimum dwell time has passed
180
188
  if (duration >= this.options.minDwellTime) {
189
+ // Check attention quality policies
190
+ const currentScrollY = window.scrollY;
191
+ const attentionCheck = this.attentionQuality.shouldTrackSection(state.config.sectionName, currentScrollY);
192
+ // If attention was reset due to scroll, reset our entry time
193
+ if (attentionCheck.resetAttention) {
194
+ this.log(`Section "${state.config.sectionName}": Attention reset, restarting timer`);
195
+ state.entryTime = now;
196
+ state.entryScrollSpeed = this.scrollVelocity;
197
+ return;
198
+ }
199
+ // If tracking is not allowed (page hidden, idle, or max duration reached)
200
+ if (!attentionCheck.shouldTrack) {
201
+ this.log(`Section "${state.config.sectionName}": Tracking paused - ${attentionCheck.reason}`);
202
+ return;
203
+ }
181
204
  // Create partial section view data
182
205
  const viewData = {
183
206
  sectionName: state.config.sectionName,
@@ -208,6 +231,8 @@ class SectionTrackingManager {
208
231
  exit_timestamp: viewData.exitTime,
209
232
  is_split: true, // Flag to indicate this is a periodic split, not final exit
210
233
  });
234
+ // Update attention quality duration tracker
235
+ this.attentionQuality.updateSectionDuration(state.config.sectionName, duration);
211
236
  // Reset entry time for next split (but keep tracking)
212
237
  state.entryTime = now;
213
238
  state.entryScrollSpeed = this.scrollVelocity;
@@ -232,6 +257,8 @@ class SectionTrackingManager {
232
257
  handleSectionExit(state) {
233
258
  // Stop periodic tracking
234
259
  this.stopPeriodicTracking(state.config.sectionName);
260
+ // Reset attention for this section
261
+ this.attentionQuality.resetSection(state.config.sectionName);
235
262
  if (state.entryTime === null)
236
263
  return;
237
264
  state.exitTime = Date.now();
@@ -439,6 +466,8 @@ class SectionTrackingManager {
439
466
  this.intersectionObserver.disconnect();
440
467
  this.intersectionObserver = null;
441
468
  }
469
+ // Destroy attention quality manager
470
+ this.attentionQuality.destroy();
442
471
  // Clear state
443
472
  this.sectionStates.clear();
444
473
  this.xpathCache.clear();
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Text utility functions for cleaning and processing text content
3
+ */
4
+ /**
5
+ * Remove emojis and other Unicode symbols from text
6
+ * This regex matches emoji ranges and other Unicode symbols
7
+ */
8
+ export declare function removeEmojis(text: string | null | undefined): string | undefined;
9
+ /**
10
+ * Clean and truncate text content for event tracking
11
+ * Removes emojis, trims whitespace, and limits length
12
+ */
13
+ export declare function cleanElementText(text: string | null | undefined, maxLength?: number): string | undefined;
14
+ //# sourceMappingURL=text-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../src/text-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAwBhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,GAAG,SAAS,CAO7G"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Text utility functions for cleaning and processing text content
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.removeEmojis = removeEmojis;
7
+ exports.cleanElementText = cleanElementText;
8
+ /**
9
+ * Remove emojis and other Unicode symbols from text
10
+ * This regex matches emoji ranges and other Unicode symbols
11
+ */
12
+ function removeEmojis(text) {
13
+ if (!text)
14
+ return undefined;
15
+ // Remove emojis and other Unicode symbols
16
+ // This regex covers:
17
+ // - Emoticons (😀-🙏)
18
+ // - Miscellaneous Symbols and Pictographs (🀀-🿿)
19
+ // - Supplemental Symbols and Pictographs (🈀-🈿)
20
+ // - Transport and Map Symbols (🚀-🛿)
21
+ // - Enclosed characters (Ⓜ-⓿)
22
+ // - Regional indicator symbols (🇦-🇿)
23
+ // - Other Unicode symbol ranges
24
+ return text
25
+ .replace(/[\u{1F300}-\u{1F9FF}]/gu, '') // Miscellaneous Symbols and Pictographs
26
+ .replace(/[\u{1F600}-\u{1F64F}]/gu, '') // Emoticons
27
+ .replace(/[\u{1F680}-\u{1F6FF}]/gu, '') // Transport and Map Symbols
28
+ .replace(/[\u{2600}-\u{26FF}]/gu, '') // Miscellaneous Symbols
29
+ .replace(/[\u{2700}-\u{27BF}]/gu, '') // Dingbats
30
+ .replace(/[\u{1F900}-\u{1F9FF}]/gu, '') // Supplemental Symbols and Pictographs
31
+ .replace(/[\u{1F1E0}-\u{1F1FF}]/gu, '') // Regional Indicator Symbols (flags)
32
+ .replace(/[\u{200D}]/gu, '') // Zero Width Joiner
33
+ .replace(/[\u{FE0F}]/gu, '') // Variation Selector-16
34
+ .replace(/[\u{20E3}]/gu, '') // Combining Enclosing Keycap
35
+ .trim();
36
+ }
37
+ /**
38
+ * Clean and truncate text content for event tracking
39
+ * Removes emojis, trims whitespace, and limits length
40
+ */
41
+ function cleanElementText(text, maxLength = 100) {
42
+ if (!text)
43
+ return undefined;
44
+ const cleaned = removeEmojis(text);
45
+ if (!cleaned)
46
+ return undefined;
47
+ return cleaned.substring(0, maxLength) || undefined;
48
+ }
49
+ //# sourceMappingURL=text-utils.js.map
@@ -39,6 +39,9 @@ export interface SectionTrackingOptions {
39
39
  debounceDelay: number;
40
40
  batchDelay: number;
41
41
  debug?: boolean;
42
+ maxSectionDuration?: number;
43
+ minScrollDistance?: number;
44
+ idleThreshold?: number;
42
45
  }
43
46
  export interface SectionTrackingState {
44
47
  element: Element;
@@ -1 +1 @@
1
- {"version":3,"file":"auto-tracking.d.ts","sourceRoot":"","sources":["../../src/types/auto-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"auto-tracking.d.ts","sourceRoot":"","sources":["../../src/types/auto-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -27,6 +27,9 @@ export interface HeatmapTrackingOptions {
27
27
  batchDelay: number;
28
28
  maxBatchSize: number;
29
29
  debug?: boolean;
30
+ maxSectionDuration?: number;
31
+ minScrollDistance?: number;
32
+ idleThreshold?: number;
30
33
  }
31
34
  export interface HeatmapScrollState {
32
35
  viewportSection: number;
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../src/types/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,cAAc,EAAE,iBAAiB,EAAE,CAAC;CACrC"}
1
+ {"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../src/types/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,cAAc,EAAE,iBAAiB,EAAE,CAAC;CACrC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grainql/analytics-web",
3
- "version": "2.6.0",
3
+ "version": "2.7.1",
4
4
  "description": "Lightweight TypeScript SDK for sending analytics events and managing remote configurations via Grain's REST API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",