@gemx-dev/heatmap-react 3.5.23 → 3.5.24

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 (223) hide show
  1. package/package.json +14 -11
  2. package/dist/esm/components/HeatmapLayout/ContentHeader.d.ts +0 -4
  3. package/dist/esm/components/HeatmapLayout/ContentHeader.d.ts.map +0 -1
  4. package/dist/esm/components/HeatmapLayout/HeatmapLayout.d.ts +0 -7
  5. package/dist/esm/components/HeatmapLayout/HeatmapLayout.d.ts.map +0 -1
  6. package/dist/esm/components/HeatmapLayout/LeftSidebar.d.ts +0 -4
  7. package/dist/esm/components/HeatmapLayout/LeftSidebar.d.ts.map +0 -1
  8. package/dist/esm/components/HeatmapLayout/ReplayControls.d.ts +0 -2
  9. package/dist/esm/components/HeatmapLayout/ReplayControls.d.ts.map +0 -1
  10. package/dist/esm/components/HeatmapLayout/VizDomContainer.d.ts +0 -2
  11. package/dist/esm/components/HeatmapLayout/VizDomContainer.d.ts.map +0 -1
  12. package/dist/esm/components/HeatmapLayout/VizDomRenderer.d.ts +0 -6
  13. package/dist/esm/components/HeatmapLayout/VizDomRenderer.d.ts.map +0 -1
  14. package/dist/esm/components/HeatmapLayout/WrapperLayout.d.ts +0 -7
  15. package/dist/esm/components/HeatmapLayout/WrapperLayout.d.ts.map +0 -1
  16. package/dist/esm/components/HeatmapLayout/WrapperPreview.d.ts +0 -4
  17. package/dist/esm/components/HeatmapLayout/WrapperPreview.d.ts.map +0 -1
  18. package/dist/esm/components/HeatmapLayout/index.d.ts +0 -2
  19. package/dist/esm/components/HeatmapLayout/index.d.ts.map +0 -1
  20. package/dist/esm/components/VizElement/ClarityVisualizer.d.ts +0 -150
  21. package/dist/esm/components/VizElement/ClarityVisualizer.d.ts.map +0 -1
  22. package/dist/esm/components/VizElement/HeatmapElementV2.d.ts +0 -45
  23. package/dist/esm/components/VizElement/HeatmapElementV2.d.ts.map +0 -1
  24. package/dist/esm/components/VizElement/PayloadProcessor.d.ts +0 -65
  25. package/dist/esm/components/VizElement/PayloadProcessor.d.ts.map +0 -1
  26. package/dist/esm/components/VizElement/VizElementRank.d.ts +0 -74
  27. package/dist/esm/components/VizElement/VizElementRank.d.ts.map +0 -1
  28. package/dist/esm/components/VizElement/constants.d.ts +0 -5
  29. package/dist/esm/components/VizElement/constants.d.ts.map +0 -1
  30. package/dist/esm/components/VizElement/helpers.d.ts +0 -20
  31. package/dist/esm/components/VizElement/helpers.d.ts.map +0 -1
  32. package/dist/esm/components/VizElement/types.d.ts +0 -13
  33. package/dist/esm/components/VizElement/types.d.ts.map +0 -1
  34. package/dist/esm/hooks/useHeatmapByMode.d.ts +0 -6
  35. package/dist/esm/hooks/useHeatmapByMode.d.ts.map +0 -1
  36. package/dist/esm/hooks/useHeatmapRender.d.ts +0 -6
  37. package/dist/esm/hooks/useHeatmapRender.d.ts.map +0 -1
  38. package/dist/esm/hooks/useHeatmapScale.d.ts +0 -28
  39. package/dist/esm/hooks/useHeatmapScale.d.ts.map +0 -1
  40. package/dist/esm/hooks/useReplayRender.d.ts +0 -9
  41. package/dist/esm/hooks/useReplayRender.d.ts.map +0 -1
  42. package/dist/esm/types/index.d.ts +0 -3
  43. package/dist/esm/types/index.d.ts.map +0 -1
  44. package/dist/umd/components/VizElement/VizElementRank.d.ts +0 -75
  45. package/dist/umd/components/VizElement/VizElementRank.d.ts.map +0 -1
  46. package/src/components/GraphView.tsx +0 -58
  47. package/src/components/Layout/ContentHeader.tsx +0 -15
  48. package/src/components/Layout/HeatmapLayout.tsx +0 -63
  49. package/src/components/Layout/LeftSidebar.tsx +0 -32
  50. package/src/components/Layout/WrapperLayout.tsx +0 -18
  51. package/src/components/Layout/WrapperPreview.tsx +0 -14
  52. package/src/components/Layout/index.ts +0 -1
  53. package/src/components/Test.tsx +0 -1106
  54. package/src/components/VizDom/ReplayControls.tsx +0 -48
  55. package/src/components/VizDom/VizDomContainer.tsx +0 -25
  56. package/src/components/VizDom/VizDomRenderer.tsx +0 -87
  57. package/src/components/VizDom/index.ts +0 -1
  58. package/src/components/VizElement/ClickedElementOverlay.tsx +0 -65
  59. package/src/components/VizElement/DefaultRankBadges.tsx +0 -33
  60. package/src/components/VizElement/ElementCallout.tsx +0 -337
  61. package/src/components/VizElement/HeatmapElements.tsx +0 -147
  62. package/src/components/VizElement/HoveredElementOverlay.tsx +0 -46
  63. package/src/components/VizElement/MissingElementMessage.tsx +0 -32
  64. package/src/components/VizElement/RankBadge.tsx +0 -25
  65. package/src/components/VizElement/VizElements.tsx +0 -80
  66. package/src/components/VizElement/index.ts +0 -1
  67. package/src/components/VizElement/temp/ClarityVisualizer.ts +0 -764
  68. package/src/components/VizElement/temp/VizElementRank.tsx +0 -579
  69. package/src/components/index.tsx +0 -4
  70. package/src/configs/iframe.ts +0 -15
  71. package/src/configs/index.ts +0 -2
  72. package/src/configs/style.ts +0 -9
  73. package/src/constants/index.ts +0 -4
  74. package/src/dist/components/GraphView.d.ts +0 -9
  75. package/src/dist/components/GraphView.d.ts.map +0 -1
  76. package/src/dist/components/Layout/ContentHeader.d.ts +0 -4
  77. package/src/dist/components/Layout/ContentHeader.d.ts.map +0 -1
  78. package/src/dist/components/Layout/HeatmapLayout.d.ts +0 -11
  79. package/src/dist/components/Layout/HeatmapLayout.d.ts.map +0 -1
  80. package/src/dist/components/Layout/LeftSidebar.d.ts +0 -4
  81. package/src/dist/components/Layout/LeftSidebar.d.ts.map +0 -1
  82. package/src/dist/components/Layout/WrapperLayout.d.ts +0 -8
  83. package/src/dist/components/Layout/WrapperLayout.d.ts.map +0 -1
  84. package/src/dist/components/Layout/WrapperPreview.d.ts +0 -4
  85. package/src/dist/components/Layout/WrapperPreview.d.ts.map +0 -1
  86. package/src/dist/components/Layout/index.d.ts +0 -2
  87. package/src/dist/components/Layout/index.d.ts.map +0 -1
  88. package/src/dist/components/Test.d.ts +0 -121
  89. package/src/dist/components/Test.d.ts.map +0 -1
  90. package/src/dist/components/VizDom/ReplayControls.d.ts +0 -2
  91. package/src/dist/components/VizDom/ReplayControls.d.ts.map +0 -1
  92. package/src/dist/components/VizDom/VizDomContainer.d.ts +0 -2
  93. package/src/dist/components/VizDom/VizDomContainer.d.ts.map +0 -1
  94. package/src/dist/components/VizDom/VizDomRenderer.d.ts +0 -6
  95. package/src/dist/components/VizDom/VizDomRenderer.d.ts.map +0 -1
  96. package/src/dist/components/VizDom/index.d.ts +0 -2
  97. package/src/dist/components/VizDom/index.d.ts.map +0 -1
  98. package/src/dist/components/VizElement/ClickedElementOverlay.d.ts +0 -17
  99. package/src/dist/components/VizElement/ClickedElementOverlay.d.ts.map +0 -1
  100. package/src/dist/components/VizElement/DefaultRankBadges.d.ts +0 -11
  101. package/src/dist/components/VizElement/DefaultRankBadges.d.ts.map +0 -1
  102. package/src/dist/components/VizElement/ElementCallout.d.ts +0 -17
  103. package/src/dist/components/VizElement/ElementCallout.d.ts.map +0 -1
  104. package/src/dist/components/VizElement/HeatmapElements.d.ts +0 -23
  105. package/src/dist/components/VizElement/HeatmapElements.d.ts.map +0 -1
  106. package/src/dist/components/VizElement/HoveredElementOverlay.d.ts +0 -12
  107. package/src/dist/components/VizElement/HoveredElementOverlay.d.ts.map +0 -1
  108. package/src/dist/components/VizElement/MissingElementMessage.d.ts +0 -7
  109. package/src/dist/components/VizElement/MissingElementMessage.d.ts.map +0 -1
  110. package/src/dist/components/VizElement/RankBadge.d.ts +0 -10
  111. package/src/dist/components/VizElement/RankBadge.d.ts.map +0 -1
  112. package/src/dist/components/VizElement/VizElements.d.ts +0 -10
  113. package/src/dist/components/VizElement/VizElements.d.ts.map +0 -1
  114. package/src/dist/components/VizElement/index.d.ts +0 -2
  115. package/src/dist/components/VizElement/index.d.ts.map +0 -1
  116. package/src/dist/components/VizElement/temp/ClarityVisualizer.d.ts +0 -150
  117. package/src/dist/components/VizElement/temp/ClarityVisualizer.d.ts.map +0 -1
  118. package/src/dist/components/VizElement/temp/VizElementRank.d.ts +0 -74
  119. package/src/dist/components/VizElement/temp/VizElementRank.d.ts.map +0 -1
  120. package/src/dist/components/index.d.ts +0 -4
  121. package/src/dist/components/index.d.ts.map +0 -1
  122. package/src/dist/configs/iframe.d.ts +0 -10
  123. package/src/dist/configs/iframe.d.ts.map +0 -1
  124. package/src/dist/configs/index.d.ts +0 -3
  125. package/src/dist/configs/index.d.ts.map +0 -1
  126. package/src/dist/configs/style.d.ts +0 -9
  127. package/src/dist/configs/style.d.ts.map +0 -1
  128. package/src/dist/constants/index.d.ts +0 -5
  129. package/src/dist/constants/index.d.ts.map +0 -1
  130. package/src/dist/helpers/iframe.d.ts +0 -3
  131. package/src/dist/helpers/iframe.d.ts.map +0 -1
  132. package/src/dist/helpers/index.d.ts +0 -2
  133. package/src/dist/helpers/index.d.ts.map +0 -1
  134. package/src/dist/helpers/viz-elements.d.ts +0 -10
  135. package/src/dist/helpers/viz-elements.d.ts.map +0 -1
  136. package/src/dist/hooks/index.d.ts +0 -4
  137. package/src/dist/hooks/index.d.ts.map +0 -1
  138. package/src/dist/hooks/vix-elements/index.d.ts +0 -5
  139. package/src/dist/hooks/vix-elements/index.d.ts.map +0 -1
  140. package/src/dist/hooks/vix-elements/useClickedElement.d.ts +0 -14
  141. package/src/dist/hooks/vix-elements/useClickedElement.d.ts.map +0 -1
  142. package/src/dist/hooks/vix-elements/useHeatmapEffects.d.ts +0 -8
  143. package/src/dist/hooks/vix-elements/useHeatmapEffects.d.ts.map +0 -1
  144. package/src/dist/hooks/vix-elements/useHeatmapElementPosition.d.ts +0 -13
  145. package/src/dist/hooks/vix-elements/useHeatmapElementPosition.d.ts.map +0 -1
  146. package/src/dist/hooks/vix-elements/useHoveredElement.d.ts +0 -17
  147. package/src/dist/hooks/vix-elements/useHoveredElement.d.ts.map +0 -1
  148. package/src/dist/hooks/viz-render/index.d.ts +0 -2
  149. package/src/dist/hooks/viz-render/index.d.ts.map +0 -1
  150. package/src/dist/hooks/viz-render/useHeatmapRender.d.ts +0 -8
  151. package/src/dist/hooks/viz-render/useHeatmapRender.d.ts.map +0 -1
  152. package/src/dist/hooks/viz-render/useHeatmapVizRender.d.ts +0 -8
  153. package/src/dist/hooks/viz-render/useHeatmapVizRender.d.ts.map +0 -1
  154. package/src/dist/hooks/viz-render/useReplayRender.d.ts +0 -11
  155. package/src/dist/hooks/viz-render/useReplayRender.d.ts.map +0 -1
  156. package/src/dist/hooks/viz-scale/index.d.ts +0 -2
  157. package/src/dist/hooks/viz-scale/index.d.ts.map +0 -1
  158. package/src/dist/hooks/viz-scale/useContainerDimensions.d.ts +0 -10
  159. package/src/dist/hooks/viz-scale/useContainerDimensions.d.ts.map +0 -1
  160. package/src/dist/hooks/viz-scale/useContentDimensions.d.ts +0 -11
  161. package/src/dist/hooks/viz-scale/useContentDimensions.d.ts.map +0 -1
  162. package/src/dist/hooks/viz-scale/useHeatmapScale.d.ts +0 -19
  163. package/src/dist/hooks/viz-scale/useHeatmapScale.d.ts.map +0 -1
  164. package/src/dist/hooks/viz-scale/useIframeHeight.d.ts +0 -10
  165. package/src/dist/hooks/viz-scale/useIframeHeight.d.ts.map +0 -1
  166. package/src/dist/hooks/viz-scale/useScaleCalculation.d.ts +0 -10
  167. package/src/dist/hooks/viz-scale/useScaleCalculation.d.ts.map +0 -1
  168. package/src/dist/hooks/viz-scale/useScrollSync.d.ts +0 -10
  169. package/src/dist/hooks/viz-scale/useScrollSync.d.ts.map +0 -1
  170. package/src/dist/index.d.ts +0 -4
  171. package/src/dist/index.d.ts.map +0 -1
  172. package/src/dist/stores/data.d.ts +0 -18
  173. package/src/dist/stores/data.d.ts.map +0 -1
  174. package/src/dist/stores/index.d.ts +0 -2
  175. package/src/dist/stores/index.d.ts.map +0 -1
  176. package/src/dist/ui/BoxStack/BoxStack.d.ts +0 -56
  177. package/src/dist/ui/BoxStack/BoxStack.d.ts.map +0 -1
  178. package/src/dist/ui/BoxStack/index.d.ts +0 -2
  179. package/src/dist/ui/BoxStack/index.d.ts.map +0 -1
  180. package/src/dist/ui/index.d.ts +0 -2
  181. package/src/dist/ui/index.d.ts.map +0 -1
  182. package/src/dist/utils/device.d.ts +0 -2
  183. package/src/dist/utils/device.d.ts.map +0 -1
  184. package/src/dist/utils/retry.d.ts +0 -2
  185. package/src/dist/utils/retry.d.ts.map +0 -1
  186. package/src/dist/utils/sort.d.ts +0 -3
  187. package/src/dist/utils/sort.d.ts.map +0 -1
  188. package/src/global.d.ts +0 -5
  189. package/src/helpers/iframe.ts +0 -33
  190. package/src/helpers/index.ts +0 -1
  191. package/src/helpers/viz-elements.ts +0 -34
  192. package/src/hooks/index.ts +0 -3
  193. package/src/hooks/vix-elements/index.ts +0 -4
  194. package/src/hooks/vix-elements/useClickedElement.ts +0 -62
  195. package/src/hooks/vix-elements/useHeatmapEffects.ts +0 -29
  196. package/src/hooks/vix-elements/useHeatmapElementPosition.ts +0 -66
  197. package/src/hooks/vix-elements/useHoveredElement.ts +0 -135
  198. package/src/hooks/viz-render/index.ts +0 -1
  199. package/src/hooks/viz-render/useHeatmapRender.ts +0 -98
  200. package/src/hooks/viz-render/useHeatmapVizRender.ts +0 -22
  201. package/src/hooks/viz-render/useReplayRender.ts +0 -162
  202. package/src/hooks/viz-scale/index.ts +0 -1
  203. package/src/hooks/viz-scale/useContainerDimensions.ts +0 -46
  204. package/src/hooks/viz-scale/useContentDimensions.ts +0 -29
  205. package/src/hooks/viz-scale/useHeatmapScale.ts +0 -53
  206. package/src/hooks/viz-scale/useIframeHeight.ts +0 -119
  207. package/src/hooks/viz-scale/useScaleCalculation.ts +0 -28
  208. package/src/hooks/viz-scale/useScrollSync.ts +0 -36
  209. package/src/index.ts +0 -5
  210. package/src/stores/data.ts +0 -34
  211. package/src/stores/index.ts +0 -1
  212. package/src/styles/base.css +0 -1
  213. package/src/styles/style.css +0 -30
  214. package/src/types/clarity.d.ts +0 -38
  215. package/src/types/heatmap.d.ts +0 -3
  216. package/src/types/index.d.ts +0 -3
  217. package/src/types/viz-element.d.ts +0 -39
  218. package/src/ui/BoxStack/BoxStack.tsx +0 -120
  219. package/src/ui/BoxStack/index.ts +0 -1
  220. package/src/ui/index.ts +0 -1
  221. package/src/utils/device.ts +0 -7
  222. package/src/utils/retry.ts +0 -20
  223. package/src/utils/sort.ts +0 -5
@@ -1,579 +0,0 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react';
2
- // import './HeatmapElements.css'; // You'll need to create corresponding CSS
3
-
4
- // ============================================================================
5
- // Types & Interfaces
6
- // ============================================================================
7
-
8
- export enum HeatmapType {
9
- Sessions = 0,
10
- Timeline = 1,
11
- Click = 2,
12
- Scroll = 3,
13
- Area = 4,
14
- Attention = 5,
15
- }
16
-
17
- export enum DeviceType {
18
- Desktop = 'desktop',
19
- Mobile = 'mobile',
20
- Tablet = 'tablet',
21
- }
22
-
23
- interface ElementRect {
24
- hash: string;
25
- top: number;
26
- left: number;
27
- width: number;
28
- height: number;
29
- }
30
-
31
- interface ElementInfo extends ElementRect {
32
- hash: string;
33
- clicks: number;
34
- rank: number;
35
- selector: string;
36
- }
37
-
38
- interface AndroidNode extends ElementRect {
39
- x: number;
40
- y: number;
41
- }
42
-
43
- interface ElementMapInfo {
44
- totalclicks: number;
45
- selector?: string;
46
- hash: string;
47
- }
48
-
49
- interface SortedElement {
50
- hash?: string;
51
- selector?: string;
52
- }
53
-
54
- export interface HeatmapInfo {
55
- sortedElements?: SortedElement[];
56
- elementMapInfo?: Record<string, ElementMapInfo>;
57
- totalClicks?: number;
58
- }
59
-
60
- interface ClarityVisualizer {
61
- getAndroidNode: (hash: string, flag1: boolean, flag2: boolean) => AndroidNode | null;
62
- getAndroidElements: (x: number, y: number, flag: boolean) => AndroidNode[];
63
- setAndroidClickmapScrolledCallback: (callback: () => void) => void;
64
- }
65
-
66
- interface DivDimensions {
67
- width?: number;
68
- height?: number;
69
- }
70
-
71
- // ============================================================================
72
- // Props Interface
73
- // ============================================================================
74
-
75
- export interface HeatmapElementsProps {
76
- // Dimensions & Transform
77
- widthScale: number;
78
- divDimensions: DivDimensions;
79
- transform: string;
80
-
81
- // Data
82
- heatmapInfo?: HeatmapInfo;
83
- selectedElement?: string;
84
- selectedFrameElements?: SortedElement[];
85
- clarityVisualizer?: ClarityVisualizer;
86
-
87
- // Refs
88
- heatmapWrapperRef: React.RefObject<HTMLDivElement>;
89
- parentRef: React.RefObject<HTMLElement>;
90
-
91
- // Flags
92
- isVisible: boolean;
93
- isElementSidebarOpen: boolean;
94
- showScreenElementsOnly: boolean;
95
- areDefaultRanksHidden: boolean;
96
- showMissingElementMessage: boolean;
97
- isRecordingView: boolean;
98
- isCompareMode: boolean;
99
- isSecondary?: boolean;
100
-
101
- // Callbacks
102
- selectElement: (hash: string) => void;
103
-
104
- // Device
105
- deviceType: DeviceType;
106
-
107
- // Feature flags (from config)
108
- enableAdvancedSelection?: boolean; // Corresponds to c.sLk
109
- enableMobileOptimization?: boolean; // Corresponds to c.rEk
110
- }
111
-
112
- // ============================================================================
113
- // Component
114
- // ============================================================================
115
-
116
- export const HeatmapElements: React.FC<HeatmapElementsProps> = (props) => {
117
- const {
118
- widthScale,
119
- divDimensions,
120
- transform,
121
- heatmapInfo,
122
- selectedElement,
123
- selectedFrameElements,
124
- clarityVisualizer,
125
- heatmapWrapperRef,
126
- parentRef,
127
- isVisible,
128
- isElementSidebarOpen,
129
- showScreenElementsOnly,
130
- areDefaultRanksHidden,
131
- showMissingElementMessage,
132
- isRecordingView,
133
- isCompareMode,
134
- isSecondary = false,
135
- selectElement,
136
- deviceType,
137
- enableAdvancedSelection = false,
138
- enableMobileOptimization = false,
139
- } = props;
140
-
141
- // ============================================================================
142
- // State
143
- // ============================================================================
144
-
145
- const [hoveredElement, setHoveredElement] = useState<ElementInfo | null>(null);
146
- const [clickedElement, setClickedElement] = useState<ElementInfo | null>(null);
147
- const [isInitialLoad, setIsInitialLoad] = useState(false);
148
- const [showClickedCallout, setShowClickedCallout] = useState(false);
149
- const [showMissingElement, setShowMissingElement] = useState(false);
150
- const [displayElements, setDisplayElements] = useState<SortedElement[] | undefined>(
151
- heatmapInfo?.sortedElements,
152
- );
153
-
154
- // ============================================================================
155
- // Refs
156
- // ============================================================================
157
-
158
- const observerRef = useRef<IntersectionObserver | null>(null);
159
-
160
- // ============================================================================
161
- // Constants
162
- // ============================================================================
163
-
164
- const rankScale = 0.8 / widthScale;
165
- const scale = widthScale;
166
-
167
- // IDs for callout targets
168
- const clickedElementId = isSecondary ? 'secondaryClickedElementID' : 'clickedElement';
169
- const hoveredElementId = isSecondary ? 'secondaryhoveredElementID' : 'hoveredElement';
170
-
171
- // ============================================================================
172
- // Helper Functions
173
- // ============================================================================
174
-
175
- const clearSelection = useCallback(() => {
176
- setHoveredElement(null);
177
- setClickedElement(null);
178
- setShowClickedCallout(false);
179
- setShowMissingElement(false);
180
- }, []);
181
-
182
- const getAndroidNodeRect = useCallback(
183
- (
184
- element?: SortedElement,
185
- flag1: boolean = false,
186
- flag2: boolean = false,
187
- ): ElementRect | undefined => {
188
- if (element?.hash) {
189
- const node = clarityVisualizer?.getAndroidNode(element.hash, flag1, flag2);
190
- if (node === null) return undefined;
191
- return {
192
- hash: element.hash,
193
- top: node?.y ?? 0,
194
- left: node?.x ?? 0,
195
- width: node?.width ?? 0,
196
- height: node?.height ?? 0,
197
- };
198
- }
199
- return undefined;
200
- },
201
- [clarityVisualizer],
202
- );
203
-
204
- const calculateRankPosition = (rect: ElementRect, scale: number) => {
205
- const top = rect.top <= 18 ? rect.top + 3 : rect.top - 18;
206
- const left = rect.left <= 18 ? rect.left + 3 : rect.left - 18;
207
- return {
208
- transform: `scale(${1.2 * scale})`,
209
- top: Number.isNaN(top) ? undefined : top,
210
- left: Number.isNaN(left) ? undefined : left,
211
- };
212
- };
213
-
214
- // ============================================================================
215
- // Effects
216
- // ============================================================================
217
-
218
- // Handle sidebar state changes
219
- useEffect(() => {
220
- if (isElementSidebarOpen && enableMobileOptimization && selectedElement) {
221
- setShowClickedCallout(false);
222
- }
223
- if (!isElementSidebarOpen && enableMobileOptimization && selectedElement) {
224
- setShowClickedCallout(true);
225
- }
226
- }, [isElementSidebarOpen, selectedElement, enableMobileOptimization]);
227
-
228
- // Setup scroll callback
229
- useEffect(() => {
230
- const handleScrollCallback = () => {
231
- updateSelectedElement(false);
232
- };
233
- clarityVisualizer?.setAndroidClickmapScrolledCallback(handleScrollCallback);
234
- }, [clarityVisualizer, selectedElement, selectedFrameElements, heatmapInfo]);
235
-
236
- // Clear on visibility change
237
- useEffect(() => {
238
- if (!isVisible) {
239
- clearSelection();
240
- }
241
- }, [isVisible, clearSelection]);
242
-
243
- // Update display elements based on filter
244
- useEffect(() => {
245
- if (showScreenElementsOnly) {
246
- setDisplayElements(selectedFrameElements);
247
- } else {
248
- setDisplayElements(heatmapInfo?.sortedElements);
249
- }
250
- }, [showScreenElementsOnly, selectedFrameElements, heatmapInfo]);
251
-
252
- // Cleanup on heatmap info change
253
- useEffect(() => {
254
- clearSelection();
255
- if (observerRef.current) {
256
- observerRef.current.disconnect();
257
- }
258
- }, [heatmapInfo, clearSelection]);
259
-
260
- // ============================================================================
261
- // Selected Element Handler
262
- // ============================================================================
263
-
264
- const tryUpdateSelectedElement = useCallback(
265
- (scrollFlag: boolean): boolean => {
266
- const elementInfo = selectedElement
267
- ? heatmapInfo?.elementMapInfo?.[selectedElement]
268
- : undefined;
269
- const rect = getAndroidNodeRect(
270
- elementInfo ? { hash: selectedElement, selector: elementInfo.selector } : undefined,
271
- false,
272
- scrollFlag,
273
- );
274
-
275
- if (rect && elementInfo && displayElements) {
276
- setClickedElement({
277
- ...rect,
278
- hash: selectedElement!,
279
- clicks: elementInfo.totalclicks,
280
- rank: displayElements.map((e) => e.hash).indexOf(elementInfo.hash) + 1,
281
- selector: displayElements.filter((e) => e.hash === elementInfo.hash)?.[0]?.selector ?? '',
282
- });
283
- setShowClickedCallout(true);
284
- return true;
285
- }
286
- return false;
287
- },
288
- [selectedElement, heatmapInfo, displayElements, getAndroidNodeRect],
289
- );
290
-
291
- const updateSelectedElement = useCallback(
292
- (scrollFlag: boolean) => {
293
- if (selectedElement && selectedFrameElements) {
294
- if (!isInitialLoad) {
295
- setShowClickedCallout(false);
296
- if (tryUpdateSelectedElement(scrollFlag)) {
297
- setIsInitialLoad(false);
298
- setShowClickedCallout(true);
299
- } else {
300
- const elementInfo = heatmapInfo?.elementMapInfo?.[selectedElement];
301
- if (elementInfo && displayElements) {
302
- setClickedElement({
303
- hash: selectedElement,
304
- clicks: elementInfo.totalclicks,
305
- rank: displayElements.map((e) => e.hash).indexOf(elementInfo.hash) + 1,
306
- selector: elementInfo.selector ?? '',
307
- left: 0,
308
- top: 0,
309
- width: 0,
310
- height: 0,
311
- });
312
- }
313
- setShowMissingElement(true);
314
- }
315
- }
316
- setIsInitialLoad(false);
317
- } else {
318
- setHoveredElement(null);
319
- setClickedElement(null);
320
- setShowClickedCallout(false);
321
- setIsInitialLoad(false);
322
- }
323
- setIsInitialLoad(false);
324
- },
325
- [
326
- selectedElement,
327
- selectedFrameElements,
328
- isInitialLoad,
329
- tryUpdateSelectedElement,
330
- heatmapInfo,
331
- displayElements,
332
- ],
333
- );
334
-
335
- useEffect(() => {
336
- updateSelectedElement(true);
337
- }, [selectedElement, heatmapInfo, selectedFrameElements, isRecordingView, displayElements]);
338
-
339
- // ============================================================================
340
- // Mouse Event Handlers
341
- // ============================================================================
342
-
343
- const handleMouseMove = useCallback(
344
- (event: React.MouseEvent) => {
345
- if (!heatmapWrapperRef.current || !heatmapInfo?.elementMapInfo || !parentRef.current) {
346
- return;
347
- }
348
-
349
- const wrapperRect = heatmapWrapperRef.current.getBoundingClientRect();
350
- const x = (event.clientX - wrapperRect.left) / scale;
351
- const y = (event.clientY - wrapperRect.top) / scale;
352
-
353
- const elements = clarityVisualizer
354
- ?.getAndroidElements(x, y, !enableAdvancedSelection)
355
- .reverse();
356
-
357
- if (!enableAdvancedSelection) {
358
- // Simple selection mode
359
- if (elements) {
360
- for (let i = 0; i < elements.length; i++) {
361
- const element = elements[i];
362
- const hash = element.hash;
363
- if (hash && heatmapInfo.elementMapInfo[hash] && displayElements) {
364
- const info = heatmapInfo.elementMapInfo[hash];
365
- setHoveredElement({
366
- top: element.y,
367
- left: element.x,
368
- width: element.width,
369
- height: element.height,
370
- hash,
371
- clicks: info.totalclicks,
372
- rank: displayElements.map((e) => e.hash).indexOf(info.hash) + 1,
373
- selector: info.selector ?? '',
374
- });
375
- break;
376
- }
377
- }
378
- }
379
- return;
380
- }
381
-
382
- // Advanced selection mode with click sorting
383
- const validElements: Array<AndroidNode & { totalClicks: number; hash: string }> = [];
384
- for (const element of elements ?? []) {
385
- const info = heatmapInfo.elementMapInfo?.[element.hash];
386
- if (info) {
387
- validElements.push({
388
- ...element,
389
- x: element.x,
390
- y: element.y,
391
- totalClicks: info.totalclicks,
392
- hash: element.hash,
393
- });
394
- }
395
- }
396
-
397
- if (validElements.length > 0) {
398
- validElements.sort((a, b) => b.totalClicks - a.totalClicks);
399
- let selectedElement = validElements[0];
400
-
401
- // Find smallest element within wrapper bounds
402
- for (let i = 0; i < validElements.length; i++) {
403
- const element = validElements[i];
404
- if (element.width < wrapperRect.width && element.height < wrapperRect.height) {
405
- selectedElement = element;
406
- break;
407
- }
408
- }
409
-
410
- const hash = selectedElement.hash;
411
- const info = heatmapInfo.elementMapInfo[hash];
412
- if (displayElements) {
413
- setHoveredElement({
414
- top: selectedElement.y,
415
- left: selectedElement.x,
416
- width: selectedElement.width,
417
- height: selectedElement.height,
418
- hash,
419
- clicks: info.totalclicks,
420
- rank: displayElements.map((e) => e.hash).indexOf(info.hash) + 1,
421
- selector: info.selector ?? '',
422
- });
423
- }
424
- }
425
- },
426
- [
427
- heatmapInfo,
428
- heatmapWrapperRef,
429
- parentRef,
430
- displayElements,
431
- clarityVisualizer,
432
- scale,
433
- enableAdvancedSelection,
434
- ],
435
- );
436
-
437
- const handleMouseLeave = useCallback(() => {
438
- setHoveredElement(null);
439
- }, []);
440
-
441
- const handleHoveredElementClick = useCallback(() => {
442
- setIsInitialLoad(true);
443
- setShowClickedCallout(true);
444
- setClickedElement(hoveredElement);
445
- if (hoveredElement) {
446
- selectElement(hoveredElement.hash);
447
- }
448
- }, [hoveredElement, selectElement]);
449
-
450
- // ============================================================================
451
- // Render Helpers
452
- // ============================================================================
453
-
454
- const renderRankBadge = (index: number, elementRect?: ElementRect, clickHandler?: () => void) => {
455
- const style = elementRect ? calculateRankPosition(elementRect, rankScale) : undefined;
456
- return elementRect ? (
457
- <div
458
- className="element-rank-badge"
459
- style={style}
460
- onClick={clickHandler}
461
- data-testid="elementRank"
462
- >
463
- {index}
464
- </div>
465
- ) : null;
466
- };
467
-
468
- const renderCallout = (element: ElementInfo, targetId: string, isHovered: boolean = false) => {
469
- const clickPercentage = ((element.clicks / (heatmapInfo?.totalClicks ?? 1)) * 100).toFixed(2);
470
-
471
- return (
472
- <div
473
- className={`callout ${isHovered ? 'callout-hovered' : 'callout-clicked'}`}
474
- data-target={targetId}
475
- >
476
- <div className="callout-content">
477
- <div className={`rank-badge ${isSecondary ? 'secondary' : ''}`}>{element.rank}</div>
478
- <div className="callout-info">
479
- <div>
480
- <span>Clicks</span>
481
- <div className="click-stats">
482
- <span className="click-count">{element.clicks?.toLocaleString()}</span>
483
- <span className="click-percentage">({clickPercentage}%)</span>
484
- </div>
485
- </div>
486
- </div>
487
- {!isRecordingView && !isCompareMode && (
488
- <button
489
- className="view-recording-btn"
490
- data-clarity-id="viewRecordingClickedFromHeatmapIframe"
491
- >
492
- View Recording
493
- </button>
494
- )}
495
- </div>
496
- </div>
497
- );
498
- };
499
-
500
- // ============================================================================
501
- // Render
502
- // ============================================================================
503
-
504
- return (
505
- <div
506
- onMouseMove={handleMouseMove}
507
- onMouseLeave={handleMouseLeave}
508
- className="heatmapElements"
509
- style={{
510
- ...divDimensions,
511
- transform,
512
- transformOrigin: '0px 0px',
513
- zIndex: 2147483647,
514
- }}
515
- >
516
- {/* Default rank badges (top 10) */}
517
- {displayElements &&
518
- !areDefaultRanksHidden &&
519
- displayElements
520
- .slice(0, 10)
521
- .map((element, index) => (
522
- <React.Fragment key={element.hash}>
523
- {renderRankBadge(index + 1, getAndroidNodeRect(element, true, false))}
524
- </React.Fragment>
525
- ))}
526
-
527
- {/* Clicked element highlight */}
528
- {clickedElement && (clickedElement.height > 0 || clickedElement.width > 0) && (
529
- <>
530
- <div
531
- className="heatmapElement clicked"
532
- id={clickedElementId}
533
- style={{
534
- top: clickedElement.top,
535
- left: clickedElement.left,
536
- width: clickedElement.width,
537
- height: clickedElement.height,
538
- }}
539
- />
540
- {renderRankBadge(clickedElement.rank, clickedElement)}
541
- {showClickedCallout && renderCallout(clickedElement, clickedElementId)}
542
- </>
543
- )}
544
-
545
- {/* Missing element message */}
546
- {(showMissingElementMessage || showMissingElement) &&
547
- (!clickedElement || (clickedElement.height === 0 && clickedElement.width === 0)) && (
548
- <div
549
- className="missingElement"
550
- style={{
551
- transform: `scale(${rankScale}) translateX(-50%)`,
552
- }}
553
- >
554
- Element not visible in current view
555
- </div>
556
- )}
557
-
558
- {/* Hovered element highlight */}
559
- {hoveredElement && (
560
- <>
561
- <div
562
- onClick={handleHoveredElementClick}
563
- className="heatmapElement hovered"
564
- id={hoveredElementId}
565
- style={{
566
- top: hoveredElement.top,
567
- left: hoveredElement.left,
568
- width: hoveredElement.width,
569
- height: hoveredElement.height,
570
- }}
571
- />
572
- {renderRankBadge(hoveredElement.rank, hoveredElement, handleHoveredElementClick)}
573
- {hoveredElement !== clickedElement &&
574
- renderCallout(hoveredElement, hoveredElementId, true)}
575
- </>
576
- )}
577
- </div>
578
- );
579
- };
@@ -1,4 +0,0 @@
1
- export { GraphView } from './GraphView';
2
- export { HeatmapLayout } from './Layout';
3
-
4
- export * from './Test';
@@ -1,15 +0,0 @@
1
- interface IFrameAttrs {
2
- id: string;
3
- title: string;
4
- sandbox: string;
5
- scrolling: string;
6
- height: string;
7
- }
8
-
9
- export const HEATMAP_IFRAME: IFrameAttrs = {
10
- id: 'clarity-iframe',
11
- title: 'Clarity Session Replay',
12
- sandbox: 'allow-same-origin allow-scripts',
13
- scrolling: 'no',
14
- height: '100%',
15
- };
@@ -1,2 +0,0 @@
1
- export * from './iframe';
2
- export * from './style';
@@ -1,9 +0,0 @@
1
- export const HEATMAP_CONFIG = {
2
- paddingBlock: 0,
3
- };
4
-
5
- export const HEATMAP_STYLE = {
6
- wrapper: {
7
- padding: `${HEATMAP_CONFIG.paddingBlock}px 0`,
8
- },
9
- };
@@ -1,4 +0,0 @@
1
- export const CLICKED_ELEMENT_ID = 'clickedElement';
2
- export const SECONDARY_CLICKED_ELEMENT_ID = 'secondaryClickedElementID';
3
- export const HOVERED_ELEMENT_ID = 'hoveredElement';
4
- export const SECONDARY_HOVERED_ELEMENT_ID = 'secondaryhoveredElementID';
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- interface GraphViewProps {
3
- children: React.ReactNode;
4
- width: number;
5
- height: number;
6
- }
7
- export declare const GraphView: React.FC<GraphViewProps>;
8
- export {};
9
- //# sourceMappingURL=GraphView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphView.d.ts","sourceRoot":"","sources":["../../src/components/GraphView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,UAAU,cAAc;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA4C9C,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare const ContentHeader: React.FC<{
2
- children: React.ReactNode;
3
- }>;
4
- //# sourceMappingURL=ContentHeader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/ContentHeader.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAYjE,CAAC"}
@@ -1,11 +0,0 @@
1
- import { ClickMapPoint, DecodedPayload } from '../../types';
2
- interface HeatmapLayoutProps {
3
- data?: DecodedPayload[];
4
- clickmap?: ClickMapPoint[];
5
- header: React.ReactNode;
6
- sidebar: React.ReactNode;
7
- toolbar: React.ReactNode;
8
- }
9
- export declare const HeatmapLayout: React.FC<HeatmapLayoutProps>;
10
- export {};
11
- //# sourceMappingURL=HeatmapLayout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeatmapLayout.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/HeatmapLayout.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI5D,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AACD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAiDtD,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare const LeftSidebar: React.FC<{
2
- children: React.ReactNode;
3
- }>;
4
- //# sourceMappingURL=LeftSidebar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LeftSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/LeftSidebar.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CA4B/D,CAAC"}
@@ -1,8 +0,0 @@
1
- interface WrapperLayoutProps {
2
- header: React.ReactNode;
3
- toolbar: React.ReactNode;
4
- sidebar: React.ReactNode;
5
- }
6
- export declare const WrapperLayout: React.FC<WrapperLayoutProps>;
7
- export {};
8
- //# sourceMappingURL=WrapperLayout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WrapperLayout.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/WrapperLayout.tsx"],"names":[],"mappings":"AAIA,UAAU,kBAAkB;IAC1B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AACD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAQtD,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare const WrapperPreview: React.FC<{
2
- children: React.ReactNode;
3
- }>;
4
- //# sourceMappingURL=WrapperPreview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WrapperPreview.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/WrapperPreview.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAUlE,CAAC"}