@gemx-dev/heatmap-react 3.5.21 → 3.5.23

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/dist/esm/components/HeatmapLayout/ContentHeader.d.ts +4 -0
  2. package/dist/esm/components/HeatmapLayout/ContentHeader.d.ts.map +1 -0
  3. package/dist/esm/components/HeatmapLayout/HeatmapLayout.d.ts +7 -0
  4. package/dist/esm/components/HeatmapLayout/HeatmapLayout.d.ts.map +1 -0
  5. package/dist/esm/components/HeatmapLayout/LeftSidebar.d.ts +4 -0
  6. package/dist/esm/components/HeatmapLayout/LeftSidebar.d.ts.map +1 -0
  7. package/dist/esm/components/HeatmapLayout/ReplayControls.d.ts +2 -0
  8. package/dist/esm/components/HeatmapLayout/ReplayControls.d.ts.map +1 -0
  9. package/dist/esm/components/HeatmapLayout/VizDomContainer.d.ts +2 -0
  10. package/dist/esm/components/HeatmapLayout/VizDomContainer.d.ts.map +1 -0
  11. package/dist/esm/components/HeatmapLayout/VizDomRenderer.d.ts +6 -0
  12. package/dist/esm/components/HeatmapLayout/VizDomRenderer.d.ts.map +1 -0
  13. package/dist/esm/components/HeatmapLayout/WrapperLayout.d.ts +7 -0
  14. package/dist/esm/components/HeatmapLayout/WrapperLayout.d.ts.map +1 -0
  15. package/dist/esm/components/HeatmapLayout/WrapperPreview.d.ts +4 -0
  16. package/dist/esm/components/HeatmapLayout/WrapperPreview.d.ts.map +1 -0
  17. package/dist/esm/components/HeatmapLayout/index.d.ts +2 -0
  18. package/dist/esm/components/HeatmapLayout/index.d.ts.map +1 -0
  19. package/dist/esm/components/VizElement/ClarityVisualizer.d.ts +150 -0
  20. package/dist/esm/components/VizElement/ClarityVisualizer.d.ts.map +1 -0
  21. package/dist/esm/components/VizElement/HeatmapElementV2.d.ts +45 -0
  22. package/dist/esm/components/VizElement/HeatmapElementV2.d.ts.map +1 -0
  23. package/dist/esm/components/VizElement/PayloadProcessor.d.ts +65 -0
  24. package/dist/esm/components/VizElement/PayloadProcessor.d.ts.map +1 -0
  25. package/dist/esm/components/VizElement/VizElementRank.d.ts +74 -0
  26. package/dist/esm/components/VizElement/VizElementRank.d.ts.map +1 -0
  27. package/dist/esm/components/VizElement/constants.d.ts +5 -0
  28. package/dist/esm/components/VizElement/constants.d.ts.map +1 -0
  29. package/dist/esm/components/VizElement/helpers.d.ts +20 -0
  30. package/dist/esm/components/VizElement/helpers.d.ts.map +1 -0
  31. package/dist/esm/components/VizElement/types.d.ts +13 -0
  32. package/dist/esm/components/VizElement/types.d.ts.map +1 -0
  33. package/dist/esm/hooks/useHeatmapByMode.d.ts +6 -0
  34. package/dist/esm/hooks/useHeatmapByMode.d.ts.map +1 -0
  35. package/dist/esm/hooks/useHeatmapRender.d.ts +6 -0
  36. package/dist/esm/hooks/useHeatmapRender.d.ts.map +1 -0
  37. package/dist/esm/hooks/useHeatmapScale.d.ts +28 -0
  38. package/dist/esm/hooks/useHeatmapScale.d.ts.map +1 -0
  39. package/dist/esm/hooks/useReplayRender.d.ts +9 -0
  40. package/dist/esm/hooks/useReplayRender.d.ts.map +1 -0
  41. package/dist/esm/types/index.d.ts +3 -0
  42. package/dist/esm/types/index.d.ts.map +1 -0
  43. package/dist/umd/components/VizElement/VizElementRank.d.ts +75 -0
  44. package/dist/umd/components/VizElement/VizElementRank.d.ts.map +1 -0
  45. package/package.json +11 -14
  46. package/src/components/GraphView.tsx +58 -0
  47. package/src/components/Layout/ContentHeader.tsx +15 -0
  48. package/src/components/Layout/HeatmapLayout.tsx +63 -0
  49. package/src/components/Layout/LeftSidebar.tsx +32 -0
  50. package/src/components/Layout/WrapperLayout.tsx +18 -0
  51. package/src/components/Layout/WrapperPreview.tsx +14 -0
  52. package/src/components/Layout/index.ts +1 -0
  53. package/src/components/Test.tsx +1106 -0
  54. package/src/components/VizDom/ReplayControls.tsx +48 -0
  55. package/src/components/VizDom/VizDomContainer.tsx +25 -0
  56. package/src/components/VizDom/VizDomRenderer.tsx +87 -0
  57. package/src/components/VizDom/index.ts +1 -0
  58. package/src/components/VizElement/ClickedElementOverlay.tsx +65 -0
  59. package/src/components/VizElement/DefaultRankBadges.tsx +33 -0
  60. package/src/components/VizElement/ElementCallout.tsx +337 -0
  61. package/src/components/VizElement/HeatmapElements.tsx +147 -0
  62. package/src/components/VizElement/HoveredElementOverlay.tsx +46 -0
  63. package/src/components/VizElement/MissingElementMessage.tsx +32 -0
  64. package/src/components/VizElement/RankBadge.tsx +25 -0
  65. package/src/components/VizElement/VizElements.tsx +80 -0
  66. package/src/components/VizElement/index.ts +1 -0
  67. package/src/components/VizElement/temp/ClarityVisualizer.ts +764 -0
  68. package/src/components/VizElement/temp/VizElementRank.tsx +579 -0
  69. package/src/components/index.tsx +4 -0
  70. package/src/configs/iframe.ts +15 -0
  71. package/src/configs/index.ts +2 -0
  72. package/src/configs/style.ts +9 -0
  73. package/src/constants/index.ts +4 -0
  74. package/src/dist/components/GraphView.d.ts +9 -0
  75. package/src/dist/components/GraphView.d.ts.map +1 -0
  76. package/src/dist/components/Layout/ContentHeader.d.ts +4 -0
  77. package/src/dist/components/Layout/ContentHeader.d.ts.map +1 -0
  78. package/src/dist/components/Layout/HeatmapLayout.d.ts +11 -0
  79. package/src/dist/components/Layout/HeatmapLayout.d.ts.map +1 -0
  80. package/src/dist/components/Layout/LeftSidebar.d.ts +4 -0
  81. package/src/dist/components/Layout/LeftSidebar.d.ts.map +1 -0
  82. package/src/dist/components/Layout/WrapperLayout.d.ts +8 -0
  83. package/src/dist/components/Layout/WrapperLayout.d.ts.map +1 -0
  84. package/src/dist/components/Layout/WrapperPreview.d.ts +4 -0
  85. package/src/dist/components/Layout/WrapperPreview.d.ts.map +1 -0
  86. package/src/dist/components/Layout/index.d.ts +2 -0
  87. package/src/dist/components/Layout/index.d.ts.map +1 -0
  88. package/src/dist/components/Test.d.ts +121 -0
  89. package/src/dist/components/Test.d.ts.map +1 -0
  90. package/src/dist/components/VizDom/ReplayControls.d.ts +2 -0
  91. package/src/dist/components/VizDom/ReplayControls.d.ts.map +1 -0
  92. package/src/dist/components/VizDom/VizDomContainer.d.ts +2 -0
  93. package/src/dist/components/VizDom/VizDomContainer.d.ts.map +1 -0
  94. package/src/dist/components/VizDom/VizDomRenderer.d.ts +6 -0
  95. package/src/dist/components/VizDom/VizDomRenderer.d.ts.map +1 -0
  96. package/src/dist/components/VizDom/index.d.ts +2 -0
  97. package/src/dist/components/VizDom/index.d.ts.map +1 -0
  98. package/src/dist/components/VizElement/ClickedElementOverlay.d.ts +17 -0
  99. package/src/dist/components/VizElement/ClickedElementOverlay.d.ts.map +1 -0
  100. package/src/dist/components/VizElement/DefaultRankBadges.d.ts +11 -0
  101. package/src/dist/components/VizElement/DefaultRankBadges.d.ts.map +1 -0
  102. package/src/dist/components/VizElement/ElementCallout.d.ts +17 -0
  103. package/src/dist/components/VizElement/ElementCallout.d.ts.map +1 -0
  104. package/src/dist/components/VizElement/HeatmapElements.d.ts +23 -0
  105. package/src/dist/components/VizElement/HeatmapElements.d.ts.map +1 -0
  106. package/src/dist/components/VizElement/HoveredElementOverlay.d.ts +12 -0
  107. package/src/dist/components/VizElement/HoveredElementOverlay.d.ts.map +1 -0
  108. package/src/dist/components/VizElement/MissingElementMessage.d.ts +7 -0
  109. package/src/dist/components/VizElement/MissingElementMessage.d.ts.map +1 -0
  110. package/src/dist/components/VizElement/RankBadge.d.ts +10 -0
  111. package/src/dist/components/VizElement/RankBadge.d.ts.map +1 -0
  112. package/src/dist/components/VizElement/VizElements.d.ts +10 -0
  113. package/src/dist/components/VizElement/VizElements.d.ts.map +1 -0
  114. package/src/dist/components/VizElement/index.d.ts +2 -0
  115. package/src/dist/components/VizElement/index.d.ts.map +1 -0
  116. package/src/dist/components/VizElement/temp/ClarityVisualizer.d.ts +150 -0
  117. package/src/dist/components/VizElement/temp/ClarityVisualizer.d.ts.map +1 -0
  118. package/src/dist/components/VizElement/temp/VizElementRank.d.ts +74 -0
  119. package/src/dist/components/VizElement/temp/VizElementRank.d.ts.map +1 -0
  120. package/src/dist/components/index.d.ts +4 -0
  121. package/src/dist/components/index.d.ts.map +1 -0
  122. package/src/dist/configs/iframe.d.ts +10 -0
  123. package/src/dist/configs/iframe.d.ts.map +1 -0
  124. package/src/dist/configs/index.d.ts +3 -0
  125. package/src/dist/configs/index.d.ts.map +1 -0
  126. package/src/dist/configs/style.d.ts +9 -0
  127. package/src/dist/configs/style.d.ts.map +1 -0
  128. package/src/dist/constants/index.d.ts +5 -0
  129. package/src/dist/constants/index.d.ts.map +1 -0
  130. package/src/dist/helpers/iframe.d.ts +3 -0
  131. package/src/dist/helpers/iframe.d.ts.map +1 -0
  132. package/src/dist/helpers/index.d.ts +2 -0
  133. package/src/dist/helpers/index.d.ts.map +1 -0
  134. package/src/dist/helpers/viz-elements.d.ts +10 -0
  135. package/src/dist/helpers/viz-elements.d.ts.map +1 -0
  136. package/src/dist/hooks/index.d.ts +4 -0
  137. package/src/dist/hooks/index.d.ts.map +1 -0
  138. package/src/dist/hooks/vix-elements/index.d.ts +5 -0
  139. package/src/dist/hooks/vix-elements/index.d.ts.map +1 -0
  140. package/src/dist/hooks/vix-elements/useClickedElement.d.ts +14 -0
  141. package/src/dist/hooks/vix-elements/useClickedElement.d.ts.map +1 -0
  142. package/src/dist/hooks/vix-elements/useHeatmapEffects.d.ts +8 -0
  143. package/src/dist/hooks/vix-elements/useHeatmapEffects.d.ts.map +1 -0
  144. package/src/dist/hooks/vix-elements/useHeatmapElementPosition.d.ts +13 -0
  145. package/src/dist/hooks/vix-elements/useHeatmapElementPosition.d.ts.map +1 -0
  146. package/src/dist/hooks/vix-elements/useHoveredElement.d.ts +17 -0
  147. package/src/dist/hooks/vix-elements/useHoveredElement.d.ts.map +1 -0
  148. package/src/dist/hooks/viz-render/index.d.ts +2 -0
  149. package/src/dist/hooks/viz-render/index.d.ts.map +1 -0
  150. package/src/dist/hooks/viz-render/useHeatmapRender.d.ts +8 -0
  151. package/src/dist/hooks/viz-render/useHeatmapRender.d.ts.map +1 -0
  152. package/src/dist/hooks/viz-render/useHeatmapVizRender.d.ts +8 -0
  153. package/src/dist/hooks/viz-render/useHeatmapVizRender.d.ts.map +1 -0
  154. package/src/dist/hooks/viz-render/useReplayRender.d.ts +11 -0
  155. package/src/dist/hooks/viz-render/useReplayRender.d.ts.map +1 -0
  156. package/src/dist/hooks/viz-scale/index.d.ts +2 -0
  157. package/src/dist/hooks/viz-scale/index.d.ts.map +1 -0
  158. package/src/dist/hooks/viz-scale/useContainerDimensions.d.ts +10 -0
  159. package/src/dist/hooks/viz-scale/useContainerDimensions.d.ts.map +1 -0
  160. package/src/dist/hooks/viz-scale/useContentDimensions.d.ts +11 -0
  161. package/src/dist/hooks/viz-scale/useContentDimensions.d.ts.map +1 -0
  162. package/src/dist/hooks/viz-scale/useHeatmapScale.d.ts +19 -0
  163. package/src/dist/hooks/viz-scale/useHeatmapScale.d.ts.map +1 -0
  164. package/src/dist/hooks/viz-scale/useIframeHeight.d.ts +10 -0
  165. package/src/dist/hooks/viz-scale/useIframeHeight.d.ts.map +1 -0
  166. package/src/dist/hooks/viz-scale/useScaleCalculation.d.ts +10 -0
  167. package/src/dist/hooks/viz-scale/useScaleCalculation.d.ts.map +1 -0
  168. package/src/dist/hooks/viz-scale/useScrollSync.d.ts +10 -0
  169. package/src/dist/hooks/viz-scale/useScrollSync.d.ts.map +1 -0
  170. package/src/dist/index.d.ts +4 -0
  171. package/src/dist/index.d.ts.map +1 -0
  172. package/src/dist/stores/data.d.ts +18 -0
  173. package/src/dist/stores/data.d.ts.map +1 -0
  174. package/src/dist/stores/index.d.ts +2 -0
  175. package/src/dist/stores/index.d.ts.map +1 -0
  176. package/src/dist/ui/BoxStack/BoxStack.d.ts +56 -0
  177. package/src/dist/ui/BoxStack/BoxStack.d.ts.map +1 -0
  178. package/src/dist/ui/BoxStack/index.d.ts +2 -0
  179. package/src/dist/ui/BoxStack/index.d.ts.map +1 -0
  180. package/src/dist/ui/index.d.ts +2 -0
  181. package/src/dist/ui/index.d.ts.map +1 -0
  182. package/src/dist/utils/device.d.ts +2 -0
  183. package/src/dist/utils/device.d.ts.map +1 -0
  184. package/src/dist/utils/retry.d.ts +2 -0
  185. package/src/dist/utils/retry.d.ts.map +1 -0
  186. package/src/dist/utils/sort.d.ts +3 -0
  187. package/src/dist/utils/sort.d.ts.map +1 -0
  188. package/src/global.d.ts +5 -0
  189. package/src/helpers/iframe.ts +33 -0
  190. package/src/helpers/index.ts +1 -0
  191. package/src/helpers/viz-elements.ts +34 -0
  192. package/src/hooks/index.ts +3 -0
  193. package/src/hooks/vix-elements/index.ts +4 -0
  194. package/src/hooks/vix-elements/useClickedElement.ts +62 -0
  195. package/src/hooks/vix-elements/useHeatmapEffects.ts +29 -0
  196. package/src/hooks/vix-elements/useHeatmapElementPosition.ts +66 -0
  197. package/src/hooks/vix-elements/useHoveredElement.ts +135 -0
  198. package/src/hooks/viz-render/index.ts +1 -0
  199. package/src/hooks/viz-render/useHeatmapRender.ts +98 -0
  200. package/src/hooks/viz-render/useHeatmapVizRender.ts +22 -0
  201. package/src/hooks/viz-render/useReplayRender.ts +162 -0
  202. package/src/hooks/viz-scale/index.ts +1 -0
  203. package/src/hooks/viz-scale/useContainerDimensions.ts +46 -0
  204. package/src/hooks/viz-scale/useContentDimensions.ts +29 -0
  205. package/src/hooks/viz-scale/useHeatmapScale.ts +53 -0
  206. package/src/hooks/viz-scale/useIframeHeight.ts +119 -0
  207. package/src/hooks/viz-scale/useScaleCalculation.ts +28 -0
  208. package/src/hooks/viz-scale/useScrollSync.ts +36 -0
  209. package/src/index.ts +5 -0
  210. package/src/stores/data.ts +34 -0
  211. package/src/stores/index.ts +1 -0
  212. package/src/styles/base.css +1 -0
  213. package/src/styles/style.css +30 -0
  214. package/src/types/clarity.d.ts +38 -0
  215. package/src/types/heatmap.d.ts +3 -0
  216. package/src/types/index.d.ts +3 -0
  217. package/src/types/viz-element.d.ts +39 -0
  218. package/src/ui/BoxStack/BoxStack.tsx +120 -0
  219. package/src/ui/BoxStack/index.ts +1 -0
  220. package/src/ui/index.ts +1 -0
  221. package/src/utils/device.ts +7 -0
  222. package/src/utils/retry.ts +20 -0
  223. package/src/utils/sort.ts +5 -0
@@ -0,0 +1,147 @@
1
+ import type { HeatmapInfo, WebVisualizer } from '../../types';
2
+
3
+ import {
4
+ CLICKED_ELEMENT_ID,
5
+ HOVERED_ELEMENT_ID,
6
+ SECONDARY_CLICKED_ELEMENT_ID,
7
+ SECONDARY_HOVERED_ELEMENT_ID,
8
+ } from '../../constants';
9
+ import {
10
+ useClickedElement,
11
+ useHeatmapEffects,
12
+ useHeatmapElementPosition,
13
+ useHoveredElement,
14
+ } from '../../hooks';
15
+
16
+ import { ClickedElementOverlay } from './ClickedElementOverlay';
17
+ import { DefaultRankBadges } from './DefaultRankBadges';
18
+ import { ElementCallout } from './ElementCallout';
19
+ import { HoveredElementOverlay } from './HoveredElementOverlay';
20
+ import { MissingElementMessage } from './MissingElementMessage';
21
+
22
+ export interface HeatmapElementsProps {
23
+ widthScale: number;
24
+ heatmapInfo?: HeatmapInfo;
25
+ isElementSidebarOpen?: boolean;
26
+ selectedElement?: string | null;
27
+ visualizer?: WebVisualizer;
28
+ isVisible?: boolean;
29
+ iframeDimensions?: React.CSSProperties;
30
+ areDefaultRanksHidden?: boolean;
31
+ isSecondary?: boolean;
32
+ isRecordingView?: boolean;
33
+ isCompareMode?: boolean;
34
+ deviceType?: string;
35
+ heatmapType?: string;
36
+ projectId?: string;
37
+ iframeRef: React.RefObject<HTMLIFrameElement>;
38
+ parentRef: React.RefObject<HTMLElement>;
39
+ iframeHeight?: number;
40
+ selectElement?: (hash: string) => void;
41
+ }
42
+
43
+ export const HeatmapElements: React.FC<HeatmapElementsProps> = (props) => {
44
+ const {
45
+ iframeRef,
46
+ parentRef,
47
+ visualizer,
48
+ heatmapInfo,
49
+ widthScale,
50
+ iframeHeight,
51
+ iframeDimensions,
52
+ selectedElement,
53
+ isElementSidebarOpen,
54
+ isVisible = true,
55
+ selectElement,
56
+ areDefaultRanksHidden,
57
+ isSecondary,
58
+ ...rest
59
+ } = props;
60
+
61
+ const getRect = useHeatmapElementPosition({
62
+ iframeRef,
63
+ parentRef,
64
+ visualizer,
65
+ heatmapWidth: heatmapInfo?.width,
66
+ iframeHeight,
67
+ widthScale,
68
+ projectId: props.projectId,
69
+ });
70
+
71
+ const { clickedElement, showMissingElement, shouldShowCallout, setShouldShowCallout } =
72
+ useClickedElement({
73
+ selectedElement,
74
+ heatmapInfo,
75
+ getRect,
76
+ });
77
+
78
+ const { hoveredElement, handleMouseMove, handleMouseLeave, handleClick } = useHoveredElement({
79
+ iframeRef,
80
+ heatmapInfo,
81
+ getRect,
82
+ onSelect: selectElement,
83
+ widthScale,
84
+ });
85
+
86
+ const resetAll = () => {
87
+ // nếu cần reset thêm state ở đây
88
+ // setShouldShowCallout(false);
89
+ };
90
+
91
+ useHeatmapEffects({
92
+ isVisible,
93
+ isElementSidebarOpen,
94
+ selectedElement,
95
+ setShouldShowCallout,
96
+ resetAll,
97
+ });
98
+
99
+ if (!isVisible) return null;
100
+
101
+ const top10 = heatmapInfo?.sortedElements?.slice(0, 10) ?? [];
102
+
103
+ return (
104
+ <div
105
+ onMouseMove={handleMouseMove}
106
+ onMouseLeave={handleMouseLeave}
107
+ className="heatmapElements gx-hm-elements"
108
+ style={iframeDimensions}
109
+ >
110
+ <DefaultRankBadges
111
+ elements={top10}
112
+ getRect={getRect}
113
+ widthScale={widthScale}
114
+ hidden={areDefaultRanksHidden}
115
+ />
116
+
117
+ <ClickedElementOverlay
118
+ widthScale={widthScale}
119
+ element={clickedElement}
120
+ shouldShowCallout={shouldShowCallout}
121
+ isSecondary={isSecondary}
122
+ targetId={isSecondary ? SECONDARY_CLICKED_ELEMENT_ID : CLICKED_ELEMENT_ID}
123
+ {...rest}
124
+ />
125
+
126
+ {showMissingElement && <MissingElementMessage widthScale={widthScale} />}
127
+
128
+ <HoveredElementOverlay
129
+ element={hoveredElement}
130
+ onClick={handleClick}
131
+ isSecondary={isSecondary}
132
+ targetId={isSecondary ? SECONDARY_HOVERED_ELEMENT_ID : HOVERED_ELEMENT_ID}
133
+ totalClicks={heatmapInfo?.totalClicks ?? 1}
134
+ />
135
+
136
+ {hoveredElement !== clickedElement && hoveredElement && (
137
+ <ElementCallout
138
+ element={hoveredElement}
139
+ target={`#${props.isSecondary ? SECONDARY_HOVERED_ELEMENT_ID : HOVERED_ELEMENT_ID}`}
140
+ totalClicks={props.heatmapInfo?.totalClicks ?? 1}
141
+ isSecondary={props.isSecondary}
142
+ parentRef={props.parentRef}
143
+ />
144
+ )}
145
+ </div>
146
+ );
147
+ };
@@ -0,0 +1,46 @@
1
+ import type { ElementInfo } from '../../types';
2
+
3
+ import React, { Fragment } from 'react';
4
+ import { RankBadge } from './RankBadge';
5
+
6
+ interface Props {
7
+ element: ElementInfo | null;
8
+ onClick?: () => void;
9
+ isSecondary?: boolean;
10
+ targetId: string;
11
+ totalClicks?: number;
12
+ }
13
+
14
+ export const HoveredElementOverlay: React.FC<Props> = ({
15
+ element,
16
+ onClick,
17
+ isSecondary,
18
+ targetId,
19
+ totalClicks = 1,
20
+ }) => {
21
+ if (!element) return null;
22
+
23
+ return (
24
+ <Fragment>
25
+ <div
26
+ onClick={onClick}
27
+ className="heatmapElement hovered"
28
+ id={targetId}
29
+ style={{
30
+ top: element.top,
31
+ left: element.left,
32
+ width: element.width,
33
+ height: element.height,
34
+ cursor: 'pointer',
35
+ }}
36
+ />
37
+
38
+ <RankBadge
39
+ index={element.rank}
40
+ elementRect={element}
41
+ widthScale={1}
42
+ clickOnElement={onClick}
43
+ />
44
+ </Fragment>
45
+ );
46
+ };
@@ -0,0 +1,32 @@
1
+ // src/components/HeatmapElements/components/MissingElementMessage.tsx
2
+ import React from 'react';
3
+
4
+ interface Props {
5
+ widthScale: number;
6
+ }
7
+
8
+ export const MissingElementMessage: React.FC<Props> = ({ widthScale }) => {
9
+ return (
10
+ <div
11
+ className="missingElement"
12
+ style={{
13
+ position: 'absolute',
14
+ top: '50%',
15
+ left: '50%',
16
+ transform: `translate(-50%, -50%) scale(${1 / widthScale})`,
17
+ background: 'rgba(0, 0, 0, 0.8)',
18
+ color: 'white',
19
+ padding: '12px 20px',
20
+ borderRadius: '8px',
21
+ fontSize: '14px',
22
+ fontWeight: '500',
23
+ zIndex: 9999,
24
+ pointerEvents: 'none',
25
+ whiteSpace: 'nowrap',
26
+ }}
27
+ aria-live="assertive"
28
+ >
29
+ Element not visible on current screen
30
+ </div>
31
+ );
32
+ };
@@ -0,0 +1,25 @@
1
+ import type { ElementRect } from '../../types';
2
+
3
+ import { calculateRankPosition } from '../../helpers/viz-elements';
4
+
5
+ interface RankBadgeProps {
6
+ index: number;
7
+ elementRect: ElementRect;
8
+ widthScale: number;
9
+ clickOnElement?: () => void;
10
+ }
11
+
12
+ export const RankBadge: React.FC<RankBadgeProps> = ({
13
+ index,
14
+ elementRect,
15
+ widthScale,
16
+ clickOnElement,
17
+ }) => {
18
+ const style = calculateRankPosition(elementRect, widthScale);
19
+
20
+ return (
21
+ <div className="rankBadge" style={style} onClick={clickOnElement} data-testid="elementRank">
22
+ {index}
23
+ </div>
24
+ );
25
+ };
@@ -0,0 +1,80 @@
1
+ import { useState } from 'react';
2
+ import { useHeatmapDataStore } from '../../stores';
3
+ import { HeatmapInfo, WebVisualizer } from '../../types';
4
+ import { HeatmapElements } from './HeatmapElements';
5
+
6
+ interface VizElementsProps {
7
+ width: number;
8
+ height: number;
9
+ iframeRef: React.RefObject<HTMLIFrameElement | null>;
10
+ wrapperRef: React.RefObject<HTMLDivElement>;
11
+ widthScale: number;
12
+ }
13
+ export const VizElements: React.FC<VizElementsProps> = ({
14
+ width,
15
+ height,
16
+ iframeRef,
17
+ wrapperRef,
18
+ widthScale,
19
+ }) => {
20
+ const data = useHeatmapDataStore((state) => state.data);
21
+
22
+ const heatmapInfo: HeatmapInfo = {
23
+ sortedElements: [
24
+ {
25
+ hash: '9ebwu6a3',
26
+ selector: 'Join our email list',
27
+ },
28
+ {
29
+ hash: '350hde5d4',
30
+ selector: 'Products',
31
+ },
32
+ ],
33
+ elementMapInfo: {
34
+ '9ebwu6a3': {
35
+ totalclicks: 4,
36
+ hash: '9ebwu6a3',
37
+ },
38
+ '350hde5d4': {
39
+ totalclicks: 4,
40
+ hash: '350hde5d4',
41
+ },
42
+ },
43
+ totalClicks: 8,
44
+ };
45
+
46
+ const visualizer: WebVisualizer = {
47
+ get: (hash: string) => {
48
+ const doc = iframeRef.current?.contentDocument;
49
+ if (!doc) return null;
50
+
51
+ // Find element by hash attribute
52
+ return doc.querySelector(`[data-clarity-hashalpha="${hash}"]`) as HTMLElement;
53
+ },
54
+ };
55
+ const [selectedElement, setSelectedElement] = useState<string | null>(null);
56
+
57
+ if (!iframeRef.current) return null;
58
+
59
+ return (
60
+ <HeatmapElements
61
+ visualizer={visualizer}
62
+ iframeRef={iframeRef as React.RefObject<HTMLIFrameElement>}
63
+ parentRef={wrapperRef as React.RefObject<HTMLElement>}
64
+ iframeHeight={window.innerHeight}
65
+ widthScale={widthScale}
66
+ heatmapInfo={heatmapInfo}
67
+ selectedElement={selectedElement}
68
+ selectElement={setSelectedElement}
69
+ isVisible={true}
70
+ iframeDimensions={{
71
+ width,
72
+ height,
73
+ position: 'absolute',
74
+ top: 0,
75
+ left: 0,
76
+ // pointerEvents: 'none',
77
+ }}
78
+ />
79
+ );
80
+ };
@@ -0,0 +1 @@
1
+ export * from './VizElements';