@gemx-dev/heatmap-react 3.5.23 → 3.5.25

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,48 +0,0 @@
1
- import { useReplayRender } from '../../hooks/viz-render/useReplayRender';
2
-
3
- export const ReplayControls: React.FC = () => {
4
- const replayResult = useReplayRender();
5
-
6
- return (
7
- <div
8
- style={{
9
- position: 'absolute',
10
- bottom: 20,
11
- left: '50%',
12
- transform: 'translateX(-50%)',
13
- display: 'flex',
14
- gap: 10,
15
- backgroundColor: 'rgba(0, 0, 0, 0.7)',
16
- padding: '10px 20px',
17
- borderRadius: 8,
18
- }}
19
- >
20
- <button
21
- onClick={replayResult.play}
22
- style={{
23
- padding: '8px 16px',
24
- backgroundColor: '#4CAF50',
25
- color: 'white',
26
- border: 'none',
27
- borderRadius: 4,
28
- cursor: 'pointer',
29
- }}
30
- >
31
- Play
32
- </button>
33
- <button
34
- onClick={replayResult.pause}
35
- style={{
36
- padding: '8px 16px',
37
- backgroundColor: '#f44336',
38
- color: 'white',
39
- border: 'none',
40
- borderRadius: 4,
41
- cursor: 'pointer',
42
- }}
43
- >
44
- Pause
45
- </button>
46
- </div>
47
- );
48
- };
@@ -1,25 +0,0 @@
1
- import { BoxStack } from '../../ui';
2
- import { VizDomRenderer } from './VizDomRenderer';
3
-
4
- export const VizDomContainer: React.FC = () => {
5
- return (
6
- <BoxStack id="gx-hm-viz-container" flexDirection="column" flex="1 1 auto" overflow="auto">
7
- <BoxStack
8
- id="gx-hm-content"
9
- flexDirection="column"
10
- flex="1 1 auto"
11
- overflow="hidden"
12
- style={{
13
- // margin: '0px 16px 0px 12px',
14
- // borderRadius: '8px 8px 0 0',
15
- // borderRadius: '8px',
16
- minWidth: '394px',
17
- padding: '12px',
18
- background: '#f1f1f1',
19
- }}
20
- >
21
- <VizDomRenderer />
22
- </BoxStack>
23
- </BoxStack>
24
- );
25
- };
@@ -1,87 +0,0 @@
1
- import { useRef } from 'react';
2
- import { HEATMAP_CONFIG, HEATMAP_IFRAME, HEATMAP_STYLE } from '../../configs';
3
- import { useHeatmapScale, useHeatmapVizRender } from '../../hooks';
4
- import { useHeatmapDataStore } from '../../stores';
5
- import { VizElements } from '../VizElement';
6
- import { ReplayControls } from './ReplayControls';
7
-
8
- interface VizDomRendererProps {
9
- mode?: 'heatmap' | 'replay';
10
- }
11
-
12
- export const VizDomRenderer: React.FC<VizDomRendererProps> = ({ mode = 'heatmap' }) => {
13
- const config = useHeatmapDataStore((state) => state.config);
14
-
15
- const wrapperRef = useRef<HTMLDivElement>(null);
16
- const visualRef = useRef<HTMLDivElement>(null);
17
-
18
- const { iframeRef } = useHeatmapVizRender(mode);
19
- const { contentWidth, iframeHeight, scale, scaledHeight, handleScroll } = useHeatmapScale({
20
- wrapperRef,
21
- iframeRef,
22
- config,
23
- });
24
-
25
- const onScroll = (e: React.UIEvent<HTMLDivElement>) => {
26
- const scrollTop = e.currentTarget.scrollTop;
27
- handleScroll(scrollTop);
28
- };
29
-
30
- return (
31
- <div
32
- ref={visualRef}
33
- className="gx-hm-visual"
34
- onScroll={onScroll}
35
- style={{
36
- overflow: 'hidden auto',
37
- display: 'flex',
38
- position: 'relative',
39
- justifyContent: 'center',
40
- flex: 1,
41
- backgroundColor: '#fff',
42
- // borderRadius: '8px',
43
- }}
44
- >
45
- <div
46
- className="gx-hm-visual-unscaled"
47
- style={{
48
- width: '100%',
49
- display: 'flex',
50
- justifyContent: 'center',
51
- alignItems: 'flex-start',
52
- height: scaledHeight > 0 ? `${scaledHeight + HEATMAP_CONFIG['paddingBlock']}px` : 'auto',
53
- padding: HEATMAP_STYLE['wrapper']['padding'],
54
- }}
55
- >
56
- <div
57
- className="gx-hm-wrapper"
58
- ref={wrapperRef}
59
- style={{
60
- width: contentWidth,
61
- height: iframeHeight,
62
- transform: `scale(${scale})`,
63
- transformOrigin: 'top center',
64
- }}
65
- >
66
- <VizElements
67
- width={contentWidth}
68
- height={iframeHeight}
69
- widthScale={scale}
70
- iframeRef={iframeRef}
71
- wrapperRef={wrapperRef as React.RefObject<HTMLDivElement>}
72
- />
73
- <iframe
74
- // key={iframeKey}
75
- ref={iframeRef}
76
- {...HEATMAP_IFRAME}
77
- width={contentWidth}
78
- height={iframeHeight}
79
- scrolling="no"
80
- />
81
- </div>
82
- </div>
83
-
84
- {mode === 'replay' && <ReplayControls />}
85
- </div>
86
- );
87
- };
@@ -1 +0,0 @@
1
- export * from './VizDomContainer';
@@ -1,65 +0,0 @@
1
- import type { ElementInfo } from '../../types';
2
-
3
- import React, { Fragment } from 'react';
4
- import { ElementCallout } from './ElementCallout';
5
- import { RankBadge } from './RankBadge';
6
-
7
- interface Props {
8
- element: ElementInfo | null;
9
- shouldShowCallout: boolean;
10
- isSecondary?: boolean;
11
- targetId: string;
12
- totalClicks?: number;
13
- isRecordingView?: boolean;
14
- isCompareMode?: boolean;
15
- deviceType?: string;
16
- heatmapType?: string;
17
- widthScale: number;
18
- }
19
-
20
- export const ClickedElementOverlay: React.FC<Props> = ({
21
- element,
22
- shouldShowCallout,
23
- isSecondary,
24
- targetId,
25
- totalClicks = 1,
26
- isRecordingView,
27
- isCompareMode,
28
- deviceType,
29
- heatmapType,
30
- widthScale,
31
- }) => {
32
- if (!element || (element.width === 0 && element.height === 0)) return null;
33
-
34
- return (
35
- <Fragment>
36
- {/* Overlay highlight */}
37
- <div
38
- className="heatmapElement"
39
- id={targetId}
40
- style={{
41
- top: element.top,
42
- left: element.left,
43
- width: element.width,
44
- height: element.height,
45
- }}
46
- />
47
-
48
- <RankBadge index={element.rank} elementRect={element} widthScale={widthScale} />
49
-
50
- {shouldShowCallout && (
51
- <ElementCallout
52
- element={element}
53
- target={`#${targetId}`}
54
- totalClicks={totalClicks}
55
- isSecondary={isSecondary}
56
- isRecordingView={isRecordingView}
57
- isCompareMode={isCompareMode}
58
- deviceType={deviceType}
59
- heatmapType={heatmapType}
60
- widthScale={widthScale}
61
- />
62
- )}
63
- </Fragment>
64
- );
65
- };
@@ -1,33 +0,0 @@
1
- import type { ElementRect, HeatmapElement } from '../../types';
2
-
3
- import React from 'react';
4
- import { RankBadge } from './RankBadge';
5
-
6
- interface Props {
7
- elements: HeatmapElement[];
8
- getRect: (el?: HeatmapElement) => ElementRect | null;
9
- widthScale: number;
10
- hidden?: boolean;
11
- }
12
-
13
- export const DefaultRankBadges: React.FC<Props> = ({ elements, getRect, widthScale, hidden }) => {
14
- if (hidden || elements.length === 0) return null;
15
-
16
- return (
17
- <>
18
- {elements.map((element, index) => {
19
- const rect = getRect(element);
20
- if (!rect) return null;
21
-
22
- return (
23
- <RankBadge
24
- key={element.hash}
25
- index={index + 1}
26
- elementRect={rect}
27
- widthScale={widthScale}
28
- />
29
- );
30
- })}
31
- </>
32
- );
33
- };
@@ -1,337 +0,0 @@
1
- import { useEffect, useRef, useState } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { formatPercentage, getSimpleSelector } from '../../helpers/viz-elements';
4
- import { ElementInfo } from '../../types';
5
-
6
- interface ElementCalloutProps {
7
- element: ElementInfo;
8
- target: string;
9
- totalClicks: number;
10
- isSecondary?: boolean;
11
- isRecordingView?: boolean;
12
- isCompareMode?: boolean;
13
- deviceType?: string;
14
- heatmapType?: string;
15
- language?: string;
16
- widthScale?: number;
17
- parentRef?: React.RefObject<HTMLElement>;
18
- }
19
-
20
- type CalloutPosition = 'top' | 'bottom' | 'left' | 'right';
21
-
22
- export const ElementCallout: React.FC<ElementCalloutProps> = ({
23
- element,
24
- target,
25
- totalClicks,
26
- isSecondary,
27
- isRecordingView,
28
- isCompareMode,
29
- deviceType,
30
- heatmapType,
31
- language,
32
- widthScale,
33
- parentRef,
34
- }) => {
35
- const calloutRef = useRef<HTMLDivElement>(null);
36
- const [position, setPosition] = useState<{
37
- top: number;
38
- left: number;
39
- placement: CalloutPosition;
40
- }>({
41
- top: 0,
42
- left: 0,
43
- placement: 'top',
44
- });
45
-
46
- const percentage = formatPercentage(((element.clicks ?? 0) / totalClicks) * 100, 2);
47
-
48
- // Calculate callout position
49
- useEffect(() => {
50
- const targetElement = document.querySelector(target);
51
- const calloutElement = calloutRef.current;
52
-
53
- if (!targetElement || !calloutElement) return;
54
-
55
- const calculatePosition = () => {
56
- const targetRect = targetElement.getBoundingClientRect();
57
- const calloutRect = calloutElement.getBoundingClientRect();
58
- const viewportWidth = window.innerWidth;
59
- const viewportHeight = window.innerHeight;
60
- const padding = 12; // Space between target and callout
61
- const arrowSize = 8;
62
-
63
- let top = 0;
64
- let left = 0;
65
- let placement: CalloutPosition = 'top';
66
-
67
- // Try positions in order: top, bottom, right, left
68
- const positions: Array<{
69
- placement: CalloutPosition;
70
- top: number;
71
- left: number;
72
- valid: boolean;
73
- }> = [
74
- // Top
75
- {
76
- placement: 'top',
77
- top: targetRect.top - calloutRect.height - padding - arrowSize,
78
- left: targetRect.left + targetRect.width / 2 - calloutRect.width / 2,
79
- valid: targetRect.top - calloutRect.height - padding - arrowSize > 0,
80
- },
81
- // Bottom
82
- {
83
- placement: 'bottom',
84
- top: targetRect.bottom + padding + arrowSize,
85
- left: targetRect.left + targetRect.width / 2 - calloutRect.width / 2,
86
- valid: targetRect.bottom + calloutRect.height + padding + arrowSize < viewportHeight,
87
- },
88
- // Right
89
- {
90
- placement: 'right',
91
- top: targetRect.top + targetRect.height / 2 - calloutRect.height / 2,
92
- left: targetRect.right + padding + arrowSize,
93
- valid: targetRect.right + calloutRect.width + padding + arrowSize < viewportWidth,
94
- },
95
- // Left
96
- {
97
- placement: 'left',
98
- top: targetRect.top + targetRect.height / 2 - calloutRect.height / 2,
99
- left: targetRect.left - calloutRect.width - padding - arrowSize,
100
- valid: targetRect.left - calloutRect.width - padding - arrowSize > 0,
101
- },
102
- ];
103
-
104
- // Find first valid position
105
- const validPosition = positions.find((p) => p.valid) || positions[0];
106
-
107
- top = validPosition.top;
108
- left = validPosition.left;
109
- placement = validPosition.placement;
110
-
111
- // Keep within viewport bounds
112
- left = Math.max(padding, Math.min(left, viewportWidth - calloutRect.width - padding));
113
- top = Math.max(padding, Math.min(top, viewportHeight - calloutRect.height - padding));
114
-
115
- setPosition({ top, left, placement });
116
- };
117
-
118
- // Initial calculation
119
- calculatePosition();
120
-
121
- // Recalculate on scroll/resize
122
- const handleUpdate = () => {
123
- requestAnimationFrame(calculatePosition);
124
- };
125
-
126
- window.addEventListener('scroll', handleUpdate, true);
127
- window.addEventListener('resize', handleUpdate);
128
- parentRef?.current?.addEventListener('scroll', handleUpdate);
129
-
130
- return () => {
131
- window.removeEventListener('scroll', handleUpdate, true);
132
- window.removeEventListener('resize', handleUpdate);
133
- parentRef?.current?.removeEventListener('scroll', handleUpdate);
134
- };
135
- }, [target, parentRef]);
136
-
137
- const calloutContent = (
138
- <div
139
- ref={calloutRef}
140
- className={`clarity-callout clarity-callout--${position.placement} ${isSecondary ? 'clarity-callout--secondary' : ''}`}
141
- style={{
142
- position: 'fixed',
143
- top: position.top,
144
- left: position.left,
145
- zIndex: 2147483647,
146
- }}
147
- aria-live="assertive"
148
- role="tooltip"
149
- >
150
- {/* Arrow */}
151
- <div className="clarity-callout__arrow" />
152
-
153
- {/* Content */}
154
- <div className="clarity-callout__content">
155
- {/* Rank Badge */}
156
- <div className="clarity-callout__rank">{element.rank}</div>
157
-
158
- {/* Stats */}
159
- <div className="clarity-callout__stats">
160
- <div className="clarity-callout__label">Clicks</div>
161
- <div className="clarity-callout__value">
162
- <span className="clarity-callout__count">
163
- {element.clicks?.toLocaleString(language)}
164
- </span>
165
- <span className="clarity-callout__percentage">({percentage}%)</span>
166
- </div>
167
- </div>
168
-
169
- {/* Action Button */}
170
- {!isRecordingView && !isCompareMode && (
171
- <button
172
- className="clarity-callout__button"
173
- data-clarity-id="viewRecordingClickedFromHeatmapIframe"
174
- data-element-hash={element.hash}
175
- data-selector={getSimpleSelector(element.selector)}
176
- data-device-type={deviceType}
177
- data-heatmap-type={heatmapType}
178
- >
179
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
180
- <path d="M5 3L11 8L5 13V3Z" fill="currentColor" />
181
- </svg>
182
- View Recording
183
- </button>
184
- )}
185
- </div>
186
-
187
- {/* Inline Styles */}
188
- <style>{`
189
- .clarity-callout {
190
- background: white;
191
- border-radius: 8px;
192
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
193
- padding: 16px;
194
- min-width: 200px;
195
- max-width: 280px;
196
- animation: clarity-callout-fade-in 0.2s ease-out;
197
- pointer-events: auto;
198
- }
199
-
200
- @keyframes clarity-callout-fade-in {
201
- from {
202
- opacity: 0;
203
- transform: scale(0.95);
204
- }
205
- to {
206
- opacity: 1;
207
- transform: scale(1);
208
- }
209
- }
210
-
211
- .clarity-callout__arrow {
212
- position: absolute;
213
- width: 16px;
214
- height: 16px;
215
- background: white;
216
- transform: rotate(45deg);
217
- }
218
-
219
- /* Arrow positions */
220
- .clarity-callout--top .clarity-callout__arrow {
221
- bottom: -8px;
222
- left: 50%;
223
- margin-left: -8px;
224
- box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
225
- }
226
-
227
- .clarity-callout--bottom .clarity-callout__arrow {
228
- top: -8px;
229
- left: 50%;
230
- margin-left: -8px;
231
- box-shadow: -2px -2px 4px rgba(0, 0, 0, 0.1);
232
- }
233
-
234
- .clarity-callout--left .clarity-callout__arrow {
235
- right: -8px;
236
- top: 50%;
237
- margin-top: -8px;
238
- box-shadow: 2px -2px 4px rgba(0, 0, 0, 0.1);
239
- }
240
-
241
- .clarity-callout--right .clarity-callout__arrow {
242
- left: -8px;
243
- top: 50%;
244
- margin-top: -8px;
245
- box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.1);
246
- }
247
-
248
- .clarity-callout__content {
249
- position: relative;
250
- z-index: 1;
251
- }
252
-
253
- .clarity-callout__rank {
254
- display: inline-flex;
255
- align-items: center;
256
- justify-content: center;
257
- width: 32px;
258
- height: 32px;
259
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
260
- color: white;
261
- border-radius: 8px;
262
- font-weight: 600;
263
- font-size: 16px;
264
- margin-bottom: 12px;
265
- }
266
-
267
- .clarity-callout--secondary .clarity-callout__rank {
268
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
269
- }
270
-
271
- .clarity-callout__stats {
272
- margin-bottom: 12px;
273
- }
274
-
275
- .clarity-callout__label {
276
- font-size: 12px;
277
- color: #6b7280;
278
- margin-bottom: 4px;
279
- font-weight: 500;
280
- }
281
-
282
- .clarity-callout__value {
283
- display: flex;
284
- align-items: baseline;
285
- gap: 6px;
286
- }
287
-
288
- .clarity-callout__count {
289
- font-size: 20px;
290
- font-weight: 700;
291
- color: #111827;
292
- }
293
-
294
- .clarity-callout__percentage {
295
- font-size: 14px;
296
- color: #6b7280;
297
- font-weight: 500;
298
- }
299
-
300
- .clarity-callout__button {
301
- display: flex;
302
- align-items: center;
303
- justify-content: center;
304
- gap: 6px;
305
- width: 100%;
306
- padding: 8px 12px;
307
- background: #667eea;
308
- color: white;
309
- border: none;
310
- border-radius: 6px;
311
- font-size: 13px;
312
- font-weight: 600;
313
- cursor: pointer;
314
- transition: all 0.2s;
315
- }
316
-
317
- .clarity-callout__button:hover {
318
- background: #5568d3;
319
- transform: translateY(-1px);
320
- box-shadow: 0 2px 8px rgba(102, 126, 234, 0.4);
321
- }
322
-
323
- .clarity-callout__button:active {
324
- transform: translateY(0);
325
- }
326
-
327
- .clarity-callout__button svg {
328
- width: 14px;
329
- height: 14px;
330
- }
331
- `}</style>
332
- </div>
333
- );
334
-
335
- // Render to body using Portal
336
- return createPortal(calloutContent, document.body);
337
- };