@gemx-dev/heatmap-react 3.5.44 → 3.5.46

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 (303) hide show
  1. package/dist/esm/components/Layout/ContentHeader.d.ts +4 -0
  2. package/dist/esm/components/Layout/ContentHeader.d.ts.map +1 -0
  3. package/dist/esm/components/Layout/VizMode.d.ts +2 -0
  4. package/dist/esm/components/Layout/VizMode.d.ts.map +1 -0
  5. package/dist/esm/components/Test.d.ts +121 -0
  6. package/dist/esm/components/Test.d.ts.map +1 -0
  7. package/dist/esm/components/VizDom/VizDomContainer.d.ts +6 -0
  8. package/dist/esm/components/VizDom/VizDomContainer.d.ts.map +1 -0
  9. package/dist/esm/components/VizDom/VizDomRenderer.d.ts.map +1 -1
  10. package/dist/esm/components/VizElement/ClickedElementOverlay.d.ts +17 -0
  11. package/dist/esm/components/VizElement/ClickedElementOverlay.d.ts.map +1 -0
  12. package/dist/esm/components/VizElement/HeatmapElements.d.ts.map +1 -1
  13. package/dist/esm/components/VizElement/HoveredElementOverlay.d.ts +12 -0
  14. package/dist/esm/components/VizElement/HoveredElementOverlay.d.ts.map +1 -0
  15. package/dist/esm/components/VizElement/MissingElementMessage.d.ts +7 -0
  16. package/dist/esm/components/VizElement/MissingElementMessage.d.ts.map +1 -0
  17. package/dist/esm/components/VizElement/VizElements.d.ts.map +1 -1
  18. package/dist/esm/components/VizElement/temp/ClarityVisualizer.d.ts +150 -0
  19. package/dist/esm/components/VizElement/temp/ClarityVisualizer.d.ts.map +1 -0
  20. package/dist/esm/components/VizElement/temp/VizElementRank.d.ts +74 -0
  21. package/dist/esm/components/VizElement/temp/VizElementRank.d.ts.map +1 -0
  22. package/dist/esm/components/VizLive/VizLive.d.ts +2 -0
  23. package/dist/esm/components/VizLive/VizLive.d.ts.map +1 -0
  24. package/dist/esm/components/VizLive/VizLiveHeatmap.d.ts.map +1 -1
  25. package/dist/esm/components/VizLive/VizLiveRenderer.d.ts.map +1 -1
  26. package/dist/esm/configs/style.d.ts +0 -2
  27. package/dist/esm/configs/style.d.ts.map +1 -1
  28. package/dist/esm/helpers/index.d.ts +2 -1
  29. package/dist/esm/helpers/index.d.ts.map +1 -1
  30. package/dist/esm/helpers/viewport-fixer.d.ts +13 -0
  31. package/dist/esm/helpers/viewport-fixer.d.ts.map +1 -0
  32. package/dist/esm/helpers/viewport-replacer.d.ts +26 -0
  33. package/dist/esm/helpers/viewport-replacer.d.ts.map +1 -0
  34. package/dist/esm/hooks/vix-elements/useHoveredElement.d.ts.map +1 -1
  35. package/dist/esm/hooks/viz-canvas/useClickmap.d.ts +1 -3
  36. package/dist/esm/hooks/viz-canvas/useClickmap.d.ts.map +1 -1
  37. package/dist/esm/hooks/viz-canvas/useHeatmapVizCanvas.d.ts +1 -1
  38. package/dist/esm/hooks/viz-canvas/useHeatmapVizCanvas.d.ts.map +1 -1
  39. package/dist/esm/hooks/viz-canvas/useScrollmap.d.ts +1 -3
  40. package/dist/esm/hooks/viz-canvas/useScrollmap.d.ts.map +1 -1
  41. package/dist/esm/hooks/viz-live/index.d.ts +1 -1
  42. package/dist/esm/hooks/viz-live/{useVizLiveIframeMsg.d.ts → useIframeMessage.d.ts} +10 -2
  43. package/dist/esm/hooks/viz-live/useIframeMessage.d.ts.map +1 -0
  44. package/dist/esm/hooks/viz-render/useHeatmapRender.d.ts.map +1 -1
  45. package/dist/esm/hooks/viz-scale/useContainerDimensions.d.ts.map +1 -1
  46. package/dist/esm/hooks/viz-scale/useHeatmapScale.d.ts +1 -1
  47. package/dist/esm/hooks/viz-scale/useHeatmapScale.d.ts.map +1 -1
  48. package/dist/esm/hooks/viz-scale/useIframeHeight.d.ts +10 -0
  49. package/dist/esm/hooks/viz-scale/useIframeHeight.d.ts.map +1 -0
  50. package/dist/esm/index.d.ts +1 -1
  51. package/dist/esm/index.d.ts.map +1 -1
  52. package/dist/esm/index.js +203 -910
  53. package/dist/esm/index.mjs +203 -910
  54. package/dist/esm/stores/index.d.ts +0 -1
  55. package/dist/esm/stores/index.d.ts.map +1 -1
  56. package/dist/esm/stores/interaction.d.ts.map +1 -1
  57. package/dist/esm/stores/mode-live.d.ts +0 -4
  58. package/dist/esm/stores/mode-live.d.ts.map +1 -1
  59. package/dist/esm/stores/viz.d.ts +4 -0
  60. package/dist/esm/stores/viz.d.ts.map +1 -1
  61. package/dist/esm/types/index.d.ts +1 -1
  62. package/dist/esm/types/index.d.ts.map +1 -1
  63. package/dist/esm/types/viewport-fixer.d.ts +31 -0
  64. package/dist/esm/types/viewport-fixer.d.ts.map +1 -0
  65. package/dist/umd/components/Layout/ContentHeader.d.ts +4 -0
  66. package/dist/umd/components/Layout/ContentHeader.d.ts.map +1 -0
  67. package/dist/umd/components/Test.d.ts +121 -0
  68. package/dist/umd/components/Test.d.ts.map +1 -0
  69. package/dist/umd/components/VizDom/VizDomContainer.d.ts +2 -0
  70. package/dist/umd/components/VizDom/VizDomContainer.d.ts.map +1 -0
  71. package/dist/umd/components/VizDom/VizDomRenderer.d.ts.map +1 -1
  72. package/dist/umd/components/VizElement/ClickedElementOverlay.d.ts +17 -0
  73. package/dist/umd/components/VizElement/ClickedElementOverlay.d.ts.map +1 -0
  74. package/dist/umd/components/VizElement/HeatmapElements.d.ts.map +1 -1
  75. package/dist/umd/components/VizElement/HoveredElementOverlay.d.ts +12 -0
  76. package/dist/umd/components/VizElement/HoveredElementOverlay.d.ts.map +1 -0
  77. package/dist/umd/components/VizElement/MissingElementMessage.d.ts +7 -0
  78. package/dist/umd/components/VizElement/MissingElementMessage.d.ts.map +1 -0
  79. package/dist/umd/components/VizElement/VizElements.d.ts.map +1 -1
  80. package/dist/umd/components/VizElement/temp/ClarityVisualizer.d.ts +150 -0
  81. package/dist/umd/components/VizElement/temp/ClarityVisualizer.d.ts.map +1 -0
  82. package/dist/umd/components/VizElement/temp/VizElementRank.d.ts +74 -0
  83. package/dist/umd/components/VizElement/temp/VizElementRank.d.ts.map +1 -0
  84. package/dist/umd/components/VizLive/VizLiveHeatmap.d.ts.map +1 -1
  85. package/dist/umd/components/VizLive/VizLiveRenderer.d.ts.map +1 -1
  86. package/dist/umd/configs/style.d.ts +0 -2
  87. package/dist/umd/configs/style.d.ts.map +1 -1
  88. package/dist/umd/helpers/index.d.ts +2 -1
  89. package/dist/umd/helpers/index.d.ts.map +1 -1
  90. package/dist/umd/helpers/viewport-fixer.d.ts +13 -0
  91. package/dist/umd/helpers/viewport-fixer.d.ts.map +1 -0
  92. package/dist/umd/helpers/viewport-replacer.d.ts +26 -0
  93. package/dist/umd/helpers/viewport-replacer.d.ts.map +1 -0
  94. package/dist/umd/hooks/vix-elements/useHoveredElement.d.ts.map +1 -1
  95. package/dist/umd/hooks/viz-canvas/useClickmap.d.ts +1 -3
  96. package/dist/umd/hooks/viz-canvas/useClickmap.d.ts.map +1 -1
  97. package/dist/umd/hooks/viz-canvas/useHeatmapVizCanvas.d.ts +1 -1
  98. package/dist/umd/hooks/viz-canvas/useHeatmapVizCanvas.d.ts.map +1 -1
  99. package/dist/umd/hooks/viz-canvas/useScrollmap.d.ts +1 -3
  100. package/dist/umd/hooks/viz-canvas/useScrollmap.d.ts.map +1 -1
  101. package/dist/umd/hooks/viz-live/index.d.ts +1 -1
  102. package/dist/umd/hooks/viz-live/{useVizLiveIframeMsg.d.ts → useIframeMessage.d.ts} +10 -2
  103. package/dist/umd/hooks/viz-live/useIframeMessage.d.ts.map +1 -0
  104. package/dist/umd/hooks/viz-render/useHeatmapRender.d.ts.map +1 -1
  105. package/dist/umd/hooks/viz-scale/useContainerDimensions.d.ts.map +1 -1
  106. package/dist/umd/hooks/viz-scale/useHeatmapScale.d.ts +1 -1
  107. package/dist/umd/hooks/viz-scale/useHeatmapScale.d.ts.map +1 -1
  108. package/dist/umd/hooks/viz-scale/useIframeHeight.d.ts +10 -0
  109. package/dist/umd/hooks/viz-scale/useIframeHeight.d.ts.map +1 -0
  110. package/dist/umd/index.d.ts +1 -1
  111. package/dist/umd/index.d.ts.map +1 -1
  112. package/dist/umd/index.js +2 -2
  113. package/dist/umd/stores/index.d.ts +0 -1
  114. package/dist/umd/stores/index.d.ts.map +1 -1
  115. package/dist/umd/stores/interaction.d.ts.map +1 -1
  116. package/dist/umd/stores/mode-live.d.ts +0 -4
  117. package/dist/umd/stores/mode-live.d.ts.map +1 -1
  118. package/dist/umd/stores/viz.d.ts +4 -0
  119. package/dist/umd/stores/viz.d.ts.map +1 -1
  120. package/dist/umd/types/index.d.ts +1 -1
  121. package/dist/umd/types/index.d.ts.map +1 -1
  122. package/dist/umd/types/viewport-fixer.d.ts +31 -0
  123. package/dist/umd/types/viewport-fixer.d.ts.map +1 -0
  124. package/package.json +13 -15
  125. package/src/components/GraphView.tsx +58 -0
  126. package/src/components/Layout/ContentMetricBar.tsx +23 -0
  127. package/src/components/Layout/ContentToolbar.tsx +22 -0
  128. package/src/components/Layout/ContentTopBar.tsx +24 -0
  129. package/src/components/Layout/ContentVizByMode.tsx +14 -0
  130. package/src/components/Layout/HeatmapLayout.tsx +60 -0
  131. package/src/components/Layout/LeftSidebar.tsx +44 -0
  132. package/src/components/Layout/WrapperLayout.tsx +12 -0
  133. package/src/components/Layout/WrapperPreview.tsx +24 -0
  134. package/src/components/Layout/index.ts +1 -0
  135. package/src/components/VizDom/ReplayControls.tsx +48 -0
  136. package/src/components/VizDom/VizContainer.tsx +40 -0
  137. package/src/components/VizDom/VizDomHeatmap.tsx +28 -0
  138. package/src/components/VizDom/VizDomRenderer.tsx +82 -0
  139. package/src/components/VizDom/VizLoading.tsx +8 -0
  140. package/src/components/VizDom/WrapperVisual.tsx +73 -0
  141. package/src/components/VizDom/index.ts +5 -0
  142. package/src/components/VizElement/DefaultRankBadges.tsx +36 -0
  143. package/src/components/VizElement/ElementCallout.tsx +82 -0
  144. package/src/components/VizElement/ElementMissing.tsx +35 -0
  145. package/src/components/VizElement/ElementOverlay.tsx +66 -0
  146. package/src/components/VizElement/HeatmapElements.tsx +127 -0
  147. package/src/components/VizElement/HeatmapExample.tsx +70 -0
  148. package/src/components/VizElement/RankBadge.tsx +25 -0
  149. package/src/components/VizElement/VizElements.tsx +57 -0
  150. package/src/components/VizElement/index.ts +1 -0
  151. package/src/components/VizLive/VizLiveHeatmap.tsx +27 -0
  152. package/src/components/VizLive/VizLiveRenderer.tsx +47 -0
  153. package/src/components/VizLive/index.ts +1 -0
  154. package/src/components/VizScrollmap/AverageFoldLine.tsx +57 -0
  155. package/src/components/VizScrollmap/HoverZones.tsx +58 -0
  156. package/src/components/VizScrollmap/MetricRow.tsx +0 -0
  157. package/src/components/VizScrollmap/ScrollMapMinimap.tsx +64 -0
  158. package/src/components/VizScrollmap/ScrollMapOverlay.tsx +79 -0
  159. package/src/components/VizScrollmap/ScrollZoneHoverArea.tsx +35 -0
  160. package/src/components/VizScrollmap/ScrollZoneTooltip.tsx +146 -0
  161. package/src/components/VizScrollmap/ScrollmapMarker.tsx +106 -0
  162. package/src/components/VizScrollmap/VizScrollMap.tsx +36 -0
  163. package/src/components/VizScrollmap/index.ts +1 -0
  164. package/src/components/VizScrollmapV2/ScrollmapOverlay.css +94 -0
  165. package/src/components/VizScrollmapV2/ScrollmapOverlayV2.tsx +130 -0
  166. package/src/components/VizScrollmapV2/index.ts +1 -0
  167. package/src/components/VizScrollmapV2/scrollmap.types.ts +21 -0
  168. package/src/components/VizScrollmapV2/useScrollmapOverlay.ts +187 -0
  169. package/src/components/index.tsx +2 -0
  170. package/src/configs/iframe.ts +15 -0
  171. package/src/configs/index.ts +2 -0
  172. package/src/configs/style.ts +21 -0
  173. package/src/constants/index.ts +4 -0
  174. package/src/global.d.ts +5 -0
  175. package/src/helpers/elm-callout.ts +347 -0
  176. package/src/helpers/elm-getter.ts +70 -0
  177. package/src/helpers/iframe-helper/fixer.ts +100 -0
  178. package/src/helpers/iframe-helper/index.ts +1 -0
  179. package/src/helpers/iframe-helper/init.ts +56 -0
  180. package/src/helpers/iframe-helper/navigation-blocker-v2.ts +371 -0
  181. package/src/helpers/iframe-helper/navigation-blocker.ts +367 -0
  182. package/src/helpers/iframe-helper/style-replacer.ts +231 -0
  183. package/src/helpers/iframe.ts +42 -0
  184. package/src/helpers/index.ts +8 -0
  185. package/src/helpers/viz-canvas/area-clustering.ts +234 -0
  186. package/src/helpers/viz-canvas/area-overlay-manager-v2.ts +176 -0
  187. package/src/helpers/viz-canvas/area-overlay-manager.ts +273 -0
  188. package/src/helpers/viz-canvas/hierarchical-area-clustering.ts +420 -0
  189. package/src/helpers/viz-canvas/index.ts +2 -0
  190. package/src/helpers/viz-elements.ts +43 -0
  191. package/src/hooks/index.ts +8 -0
  192. package/src/hooks/register/index.ts +4 -0
  193. package/src/hooks/register/useRegisterConfig.ts +17 -0
  194. package/src/hooks/register/useRegisterControl.ts +13 -0
  195. package/src/hooks/register/useRegisterData.ts +36 -0
  196. package/src/hooks/register/useRegisterHeatmap.ts +38 -0
  197. package/src/hooks/viz-area/useAreaHeatmap.ts +336 -0
  198. package/src/hooks/viz-area/useAreaHeatmapManager.ts +692 -0
  199. package/src/hooks/viz-canvas/index.ts +1 -0
  200. package/src/hooks/viz-canvas/useAreamap.ts +162 -0
  201. package/src/hooks/viz-canvas/useClickmap.ts +24 -0
  202. package/src/hooks/viz-canvas/useHeatmapCanvas.ts +27 -0
  203. package/src/hooks/viz-canvas/useScrollmap.ts +22 -0
  204. package/src/hooks/viz-elements/index.ts +5 -0
  205. package/src/hooks/viz-elements/useClickedElement.ts +86 -0
  206. package/src/hooks/viz-elements/useElementCalloutVisible.ts +45 -0
  207. package/src/hooks/viz-elements/useHeatmapEffects.ts +30 -0
  208. package/src/hooks/viz-elements/useHeatmapElementPosition.ts +60 -0
  209. package/src/hooks/viz-elements/useHeatmapMouseHandler.ts +255 -0
  210. package/src/hooks/viz-elements/useHoveredElement.ts +170 -0
  211. package/src/hooks/viz-live/index.ts +1 -0
  212. package/src/hooks/viz-live/useVizLiveIframeMsg.ts +88 -0
  213. package/src/hooks/viz-live/useVizLiveRender.ts +67 -0
  214. package/src/hooks/viz-render/index.ts +1 -0
  215. package/src/hooks/viz-render/useHeatmapRender.ts +71 -0
  216. package/src/hooks/viz-render/useHeatmapVizRender.ts +20 -0
  217. package/src/hooks/viz-render/useReplayRender.ts +160 -0
  218. package/src/hooks/viz-scale/index.ts +2 -0
  219. package/src/hooks/viz-scale/useContainerDimensions.ts +48 -0
  220. package/src/hooks/viz-scale/useContentDimensions.ts +25 -0
  221. package/src/hooks/viz-scale/useHeatmapScale.ts +52 -0
  222. package/src/hooks/viz-scale/useObserveIframeHeight.ts +162 -0
  223. package/src/hooks/viz-scale/useScaleCalculation.ts +31 -0
  224. package/src/hooks/viz-scale/useScrollSync.ts +36 -0
  225. package/src/hooks/viz-scale/useWrapperRefHeight.ts +91 -0
  226. package/src/hooks/viz-scrollmap/index.ts +2 -0
  227. package/src/hooks/viz-scrollmap/useScrollmapZones.ts +165 -0
  228. package/src/hooks/viz-scrollmap/useZonePositions.ts +38 -0
  229. package/src/index.ts +10 -0
  230. package/src/stores/comp.ts +31 -0
  231. package/src/stores/config.ts +37 -0
  232. package/src/stores/data.ts +30 -0
  233. package/src/stores/index.ts +10 -0
  234. package/src/stores/interaction.ts +32 -0
  235. package/src/stores/mode-live.ts +38 -0
  236. package/src/stores/mode-single.ts +18 -0
  237. package/src/stores/viz-scrollmap.ts +22 -0
  238. package/src/stores/viz.ts +17 -0
  239. package/src/styles/base.css +1 -0
  240. package/src/styles/style.css +137 -0
  241. package/src/types/clarity.ts +45 -0
  242. package/src/types/control.ts +10 -0
  243. package/src/types/elm-callout.ts +9 -0
  244. package/src/types/heatmap-info.ts +11 -0
  245. package/src/types/heatmap.ts +25 -0
  246. package/src/types/iframe-helper.ts +18 -0
  247. package/src/types/index.ts +12 -0
  248. package/src/types/viz-canvas.ts +20 -0
  249. package/src/types/viz-element.ts +34 -0
  250. package/src/types/viz-scrollmap.ts +28 -0
  251. package/src/ui/BoxStack/BoxStack.tsx +136 -0
  252. package/src/ui/BoxStack/index.ts +1 -0
  253. package/src/ui/index.ts +1 -0
  254. package/src/utils/debounce.ts +10 -0
  255. package/src/utils/device.ts +7 -0
  256. package/src/utils/retry.ts +20 -0
  257. package/src/utils/sort.ts +5 -0
  258. package/dist/esm/helpers/iframe-helper/fixer.d.ts +0 -18
  259. package/dist/esm/helpers/iframe-helper/fixer.d.ts.map +0 -1
  260. package/dist/esm/helpers/iframe-helper/index.d.ts +0 -2
  261. package/dist/esm/helpers/iframe-helper/index.d.ts.map +0 -1
  262. package/dist/esm/helpers/iframe-helper/init.d.ts +0 -5
  263. package/dist/esm/helpers/iframe-helper/init.d.ts.map +0 -1
  264. package/dist/esm/helpers/iframe-helper/navigation-blocker-v2.d.ts +0 -28
  265. package/dist/esm/helpers/iframe-helper/navigation-blocker-v2.d.ts.map +0 -1
  266. package/dist/esm/helpers/iframe-helper/navigation-blocker.d.ts +0 -20
  267. package/dist/esm/helpers/iframe-helper/navigation-blocker.d.ts.map +0 -1
  268. package/dist/esm/helpers/iframe-helper/style-replacer.d.ts +0 -25
  269. package/dist/esm/helpers/iframe-helper/style-replacer.d.ts.map +0 -1
  270. package/dist/esm/hooks/vix-elements/useHeatmapMouseHandler.d.ts +0 -34
  271. package/dist/esm/hooks/vix-elements/useHeatmapMouseHandler.d.ts.map +0 -1
  272. package/dist/esm/hooks/viz-live/useVizLiveIframeMsg.d.ts.map +0 -1
  273. package/dist/esm/hooks/viz-live/useVizLiveRender.d.ts +0 -4
  274. package/dist/esm/hooks/viz-live/useVizLiveRender.d.ts.map +0 -1
  275. package/dist/esm/hooks/viz-scale/useObserveIframeHeight.d.ts +0 -10
  276. package/dist/esm/hooks/viz-scale/useObserveIframeHeight.d.ts.map +0 -1
  277. package/dist/esm/stores/mode-single.d.ts +0 -9
  278. package/dist/esm/stores/mode-single.d.ts.map +0 -1
  279. package/dist/esm/types/iframe-helper.d.ts +0 -20
  280. package/dist/esm/types/iframe-helper.d.ts.map +0 -1
  281. package/dist/umd/helpers/iframe-helper/fixer.d.ts +0 -18
  282. package/dist/umd/helpers/iframe-helper/fixer.d.ts.map +0 -1
  283. package/dist/umd/helpers/iframe-helper/index.d.ts +0 -2
  284. package/dist/umd/helpers/iframe-helper/index.d.ts.map +0 -1
  285. package/dist/umd/helpers/iframe-helper/init.d.ts +0 -5
  286. package/dist/umd/helpers/iframe-helper/init.d.ts.map +0 -1
  287. package/dist/umd/helpers/iframe-helper/navigation-blocker-v2.d.ts +0 -28
  288. package/dist/umd/helpers/iframe-helper/navigation-blocker-v2.d.ts.map +0 -1
  289. package/dist/umd/helpers/iframe-helper/navigation-blocker.d.ts +0 -20
  290. package/dist/umd/helpers/iframe-helper/navigation-blocker.d.ts.map +0 -1
  291. package/dist/umd/helpers/iframe-helper/style-replacer.d.ts +0 -25
  292. package/dist/umd/helpers/iframe-helper/style-replacer.d.ts.map +0 -1
  293. package/dist/umd/hooks/vix-elements/useHeatmapMouseHandler.d.ts +0 -34
  294. package/dist/umd/hooks/vix-elements/useHeatmapMouseHandler.d.ts.map +0 -1
  295. package/dist/umd/hooks/viz-live/useVizLiveIframeMsg.d.ts.map +0 -1
  296. package/dist/umd/hooks/viz-live/useVizLiveRender.d.ts +0 -4
  297. package/dist/umd/hooks/viz-live/useVizLiveRender.d.ts.map +0 -1
  298. package/dist/umd/hooks/viz-scale/useObserveIframeHeight.d.ts +0 -10
  299. package/dist/umd/hooks/viz-scale/useObserveIframeHeight.d.ts.map +0 -1
  300. package/dist/umd/stores/mode-single.d.ts +0 -9
  301. package/dist/umd/stores/mode-single.d.ts.map +0 -1
  302. package/dist/umd/types/iframe-helper.d.ts +0 -20
  303. package/dist/umd/types/iframe-helper.d.ts.map +0 -1
@@ -0,0 +1,73 @@
1
+ import { HEATMAP_CONFIG, HEATMAP_STYLE } from '../../configs';
2
+ import { useHeatmapConfigStore, useHeatmapVizStore } from '../../stores';
3
+
4
+ interface WrapperVisualProps {
5
+ children?: React.ReactNode;
6
+ visualRef: React.RefObject<HTMLDivElement>;
7
+ wrapperRef: React.RefObject<HTMLDivElement>;
8
+ scaledHeight: number;
9
+ iframeHeight: number;
10
+ onScroll: (e: React.UIEvent<HTMLDivElement>) => void;
11
+ }
12
+
13
+ export const WrapperVisual: React.FC<WrapperVisualProps> = ({
14
+ children,
15
+ visualRef,
16
+ wrapperRef,
17
+ scaledHeight,
18
+ iframeHeight,
19
+ onScroll,
20
+ }) => {
21
+ const contentWidth = useHeatmapConfigStore((state) => state.width);
22
+ const widthScale = useHeatmapVizStore((state) => state.scale);
23
+
24
+ const contentHeight =
25
+ scaledHeight > 0
26
+ ? `${scaledHeight + HEATMAP_CONFIG['heightToolbar'] + HEATMAP_CONFIG['padding'] * 2}px`
27
+ : 'auto';
28
+
29
+ return (
30
+ <div
31
+ ref={visualRef}
32
+ className="gx-hm-visual"
33
+ onScroll={onScroll}
34
+ style={{
35
+ overflow: 'hidden auto',
36
+ display: 'flex',
37
+ position: 'relative',
38
+ justifyContent: 'center',
39
+ flex: 1,
40
+ // paddingBottom: HEATMAP_STYLE['viz']['paddingBottom'],
41
+ background: '#fff',
42
+ }}
43
+ >
44
+ <div
45
+ className="gx-hm-visual-unscaled"
46
+ style={{
47
+ width: '100%',
48
+ display: 'flex',
49
+ justifyContent: 'center',
50
+ alignItems: 'flex-start',
51
+ height: contentHeight,
52
+ padding: HEATMAP_STYLE['wrapper']['padding'],
53
+ paddingBottom: HEATMAP_STYLE['viz']['paddingBottom'],
54
+ background: HEATMAP_STYLE['viz']['background'],
55
+ }}
56
+ >
57
+ <div
58
+ className="gx-hm-wrapper"
59
+ ref={wrapperRef}
60
+ style={{
61
+ width: contentWidth,
62
+ height: iframeHeight,
63
+ transform: `scale(${widthScale})`,
64
+ transformOrigin: 'top center',
65
+ paddingBlockEnd: '0',
66
+ }}
67
+ >
68
+ {children}
69
+ </div>
70
+ </div>
71
+ </div>
72
+ );
73
+ };
@@ -0,0 +1,5 @@
1
+ export * from './VizContainer';
2
+ export * from './VizDomHeatmap';
3
+ export * from './VizLoading';
4
+
5
+ export * from './WrapperVisual';
@@ -0,0 +1,36 @@
1
+ import type { ElementRect, HeatmapElement } from '../../types';
2
+
3
+ import { useHeatmapDataStore, useHeatmapVizStore } from '../../stores';
4
+ import { RankBadge } from './RankBadge';
5
+
6
+ const NUMBER_OF_TOP_ELEMENTS = 10;
7
+ interface Props {
8
+ getRect: (el?: HeatmapElement) => ElementRect | null;
9
+ hidden?: boolean;
10
+ }
11
+
12
+ export const DefaultRankBadges: React.FC<Props> = ({ getRect, hidden }) => {
13
+ const heatmapInfo = useHeatmapDataStore((state) => state.dataInfo);
14
+ const widthScale = useHeatmapVizStore((state) => state.scale);
15
+
16
+ const elements = heatmapInfo?.sortedElements?.slice(0, NUMBER_OF_TOP_ELEMENTS) ?? [];
17
+ if (hidden || elements.length === 0) return null;
18
+
19
+ return (
20
+ <>
21
+ {elements.map((element, index) => {
22
+ const rect = getRect(element);
23
+ if (!rect) return null;
24
+
25
+ return (
26
+ <RankBadge
27
+ key={element.hash}
28
+ index={index + 1}
29
+ elementRect={rect}
30
+ widthScale={widthScale}
31
+ />
32
+ );
33
+ })}
34
+ </>
35
+ );
36
+ };
@@ -0,0 +1,82 @@
1
+ import type { ElementInfo, ICalloutPosition, IHorizontalAlignment } from '../../types';
2
+
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { calcCalloutPosition } from '../../helpers';
6
+ import { useHeatmapControlStore } from '../../stores';
7
+
8
+ const DEFAULT_POSITION: ICalloutPosition = {
9
+ top: 0,
10
+ left: 0,
11
+ placement: 'top',
12
+ horizontalAlign: 'center',
13
+ };
14
+
15
+ export interface ElementCalloutProps {
16
+ element: ElementInfo;
17
+ target: string;
18
+ visualRef?: React.RefObject<HTMLDivElement>;
19
+ hozOffset?: number;
20
+ alignment?: IHorizontalAlignment;
21
+ }
22
+
23
+ export const ElementCallout: React.FC<ElementCalloutProps> = (props) => {
24
+ const CompElementCallout = useHeatmapControlStore((state) => state.controls.ElementCallout);
25
+
26
+ const { element, target, visualRef, hozOffset, alignment = 'left' } = props;
27
+
28
+ const calloutRef = useRef<HTMLDivElement>(null);
29
+
30
+ const [position, setPosition] = useState<ICalloutPosition>(DEFAULT_POSITION);
31
+
32
+ useEffect(() => {
33
+ const targetElm = document.querySelector(target);
34
+ const calloutElm = calloutRef.current;
35
+ if (!targetElm || !calloutElm) return;
36
+
37
+ const positionFn = calcCalloutPosition({
38
+ targetElm,
39
+ calloutElm,
40
+ setPosition,
41
+ hozOffset,
42
+ alignment,
43
+ });
44
+
45
+ positionFn();
46
+ const handleUpdate = () => {
47
+ requestAnimationFrame(positionFn);
48
+ };
49
+
50
+ window.addEventListener('scroll', handleUpdate, true);
51
+ window.addEventListener('resize', handleUpdate);
52
+ visualRef?.current?.addEventListener('scroll', handleUpdate);
53
+
54
+ return () => {
55
+ window.removeEventListener('scroll', handleUpdate, true);
56
+ window.removeEventListener('resize', handleUpdate);
57
+ visualRef?.current?.removeEventListener('scroll', handleUpdate);
58
+ };
59
+ }, [element, target, visualRef, hozOffset, alignment]);
60
+
61
+ const calloutContent = (
62
+ <div
63
+ ref={calloutRef}
64
+ className={`clarity-callout clarity-callout--${position.placement} clarity-callout--align-${position.horizontalAlign}`}
65
+ style={{
66
+ position: 'fixed',
67
+ top: position.top,
68
+ left: position.left,
69
+ zIndex: 2147483647,
70
+ }}
71
+ aria-live="assertive"
72
+ role="tooltip"
73
+ >
74
+ {CompElementCallout && <CompElementCallout elementHash={element.hash} />}
75
+ </div>
76
+ );
77
+
78
+ return createPortal(
79
+ calloutContent,
80
+ document.getElementById('gx-hm-viz-container') as Element,
81
+ ) as React.ReactPortal;
82
+ };
@@ -0,0 +1,35 @@
1
+ import { useHeatmapVizStore } from '../../stores';
2
+
3
+ interface Props {
4
+ show?: boolean;
5
+ }
6
+
7
+ export const ElementMissing: React.FC<Props> = ({ show = true }) => {
8
+ if (!show) return null;
9
+
10
+ const widthScale = useHeatmapVizStore((state) => state.scale);
11
+
12
+ return (
13
+ <div
14
+ className="missingElement"
15
+ style={{
16
+ position: 'fixed',
17
+ top: '50%',
18
+ left: '50%',
19
+ transform: `translate(-50%, -50%) scale(${1 / widthScale})`,
20
+ background: 'rgba(0, 0, 0, 0.8)',
21
+ color: 'white',
22
+ padding: '12px 20px',
23
+ borderRadius: '8px',
24
+ fontSize: '14px',
25
+ fontWeight: '500',
26
+ zIndex: 9999,
27
+ pointerEvents: 'none',
28
+ whiteSpace: 'nowrap',
29
+ }}
30
+ aria-live="assertive"
31
+ >
32
+ Element not visible on current screen
33
+ </div>
34
+ );
35
+ };
@@ -0,0 +1,66 @@
1
+ import type { ElementInfo } from '../../types';
2
+
3
+ import { Fragment } from 'react';
4
+ import { HEATMAP_CONFIG } from '../../configs/style';
5
+ import {
6
+ CLICKED_ELEMENT_ID,
7
+ HOVERED_ELEMENT_ID,
8
+ SECONDARY_CLICKED_ELEMENT_ID,
9
+ SECONDARY_HOVERED_ELEMENT_ID,
10
+ } from '../../constants';
11
+ import { useHeatmapVizStore } from '../../stores';
12
+ import { RankBadge } from './RankBadge';
13
+
14
+ interface Props {
15
+ type: 'hovered' | 'clicked';
16
+ element: ElementInfo | null;
17
+ onClick?: () => void;
18
+ isSecondary?: boolean;
19
+ }
20
+
21
+ const TARGET_ID_BY_TYPE = {
22
+ hovered: {
23
+ default: HOVERED_ELEMENT_ID,
24
+ secondary: SECONDARY_HOVERED_ELEMENT_ID,
25
+ },
26
+ clicked: {
27
+ default: CLICKED_ELEMENT_ID,
28
+ secondary: SECONDARY_CLICKED_ELEMENT_ID,
29
+ },
30
+ };
31
+ export const ElementOverlay: React.FC<Props> = ({ type, element, onClick, isSecondary }) => {
32
+ const widthScale = useHeatmapVizStore((state) => state.scale);
33
+
34
+ if (!element || (element.width === 0 && element.height === 0)) return null;
35
+
36
+ // Iframe has border, so we need to add it to the top position
37
+ const top = element.top + HEATMAP_CONFIG['borderWidthIframe'];
38
+ const left = element.left + HEATMAP_CONFIG['borderWidthIframe'];
39
+ const width = element.width;
40
+ const height = element.height;
41
+ const targetId = TARGET_ID_BY_TYPE[type][isSecondary ? 'secondary' : 'default'];
42
+
43
+ return (
44
+ <Fragment>
45
+ <div
46
+ onClick={onClick}
47
+ className="heatmapElement"
48
+ id={targetId}
49
+ style={{
50
+ top,
51
+ left,
52
+ width,
53
+ height,
54
+ cursor: 'pointer',
55
+ }}
56
+ />
57
+
58
+ <RankBadge
59
+ index={element.rank}
60
+ elementRect={element}
61
+ widthScale={type === 'hovered' ? 1 : widthScale}
62
+ clickOnElement={onClick}
63
+ />
64
+ </Fragment>
65
+ );
66
+ };
@@ -0,0 +1,127 @@
1
+ import type { IHeatmapInfo, WebVisualizer } from '../../types';
2
+
3
+ import { CLICKED_ELEMENT_ID, HOVERED_ELEMENT_ID } from '../../constants';
4
+ import {
5
+ useClickedElement,
6
+ useElementCalloutVisible,
7
+ useHeatmapEffects,
8
+ useHeatmapElementPosition,
9
+ useHoveredElement,
10
+ } from '../../hooks';
11
+ import { useHeatmapSingleStore } from '../../stores';
12
+ import { DefaultRankBadges } from './DefaultRankBadges';
13
+ import { ElementCallout, ElementCalloutProps } from './ElementCallout';
14
+ import { ElementMissing } from './ElementMissing';
15
+ import { ElementOverlay } from './ElementOverlay';
16
+
17
+ const ELEMENT_CALLOUT: Pick<ElementCalloutProps, 'hozOffset' | 'alignment'> = {
18
+ hozOffset: -8,
19
+ alignment: 'left',
20
+ };
21
+
22
+ interface HeatmapElementsProps {
23
+ heatmapInfo?: IHeatmapInfo;
24
+ isElementSidebarOpen?: boolean;
25
+ visualizer?: WebVisualizer;
26
+ isVisible?: boolean;
27
+ iframeDimensions?: React.CSSProperties;
28
+ areDefaultRanksHidden?: boolean;
29
+ isSecondary?: boolean;
30
+ iframeRef: React.RefObject<HTMLIFrameElement>;
31
+ wrapperRef: React.RefObject<HTMLElement>;
32
+ visualRef: React.RefObject<HTMLDivElement>;
33
+ }
34
+
35
+ export const HeatmapElements: React.FC<HeatmapElementsProps> = (props) => {
36
+ const iframeHeight = useHeatmapSingleStore((state) => state.iframeHeight);
37
+
38
+ const {
39
+ iframeRef,
40
+ wrapperRef,
41
+ visualRef,
42
+ visualizer,
43
+ iframeDimensions,
44
+ isElementSidebarOpen,
45
+ isVisible = true,
46
+ areDefaultRanksHidden,
47
+ isSecondary,
48
+ } = props;
49
+
50
+ const getRect = useHeatmapElementPosition({
51
+ iframeRef,
52
+ wrapperRef,
53
+ visualizer,
54
+ });
55
+
56
+ const { clickedElement, showMissingElement, shouldShowCallout, setShouldShowCallout } =
57
+ useClickedElement({
58
+ visualRef,
59
+ getRect,
60
+ });
61
+
62
+ const { hoveredElement, handleMouseMove, handleMouseLeave, handleClick } = useHoveredElement({
63
+ iframeRef,
64
+ getRect,
65
+ });
66
+
67
+ useElementCalloutVisible({
68
+ visualRef,
69
+ getRect,
70
+ });
71
+
72
+ const resetAll = () => {
73
+ // setShouldShowCallout(false);
74
+ };
75
+
76
+ useHeatmapEffects({
77
+ isVisible,
78
+ isElementSidebarOpen,
79
+ setShouldShowCallout,
80
+ resetAll,
81
+ });
82
+
83
+ if (!isVisible) return null;
84
+
85
+ return (
86
+ <div
87
+ onMouseMove={(event) => {
88
+ handleMouseMove(event as any);
89
+ // handleMouseMove2(event as any);
90
+ }}
91
+ onMouseLeave={handleMouseLeave}
92
+ className="gx-hm-elements"
93
+ style={{ ...iframeDimensions, height: `${iframeHeight}px` }}
94
+ >
95
+ {/* Default & Missing element */}
96
+ <ElementMissing show={showMissingElement} />
97
+ <DefaultRankBadges getRect={getRect} hidden={areDefaultRanksHidden} />
98
+
99
+ {/* Clicked & Secondary */}
100
+ <ElementOverlay type="clicked" element={clickedElement} isSecondary={isSecondary} />
101
+ <ElementOverlay
102
+ type="hovered"
103
+ element={hoveredElement}
104
+ isSecondary={isSecondary}
105
+ onClick={handleClick}
106
+ />
107
+
108
+ {/* Element callout */}
109
+ {hoveredElement?.hash !== clickedElement?.hash && hoveredElement && (
110
+ <ElementCallout
111
+ element={hoveredElement}
112
+ target={`#${HOVERED_ELEMENT_ID}`}
113
+ visualRef={visualRef}
114
+ {...ELEMENT_CALLOUT}
115
+ />
116
+ )}
117
+ {shouldShowCallout && clickedElement && (
118
+ <ElementCallout
119
+ element={clickedElement}
120
+ target={`#${CLICKED_ELEMENT_ID}`}
121
+ visualRef={visualRef}
122
+ {...ELEMENT_CALLOUT}
123
+ />
124
+ )}
125
+ </div>
126
+ );
127
+ };
@@ -0,0 +1,70 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { HeatmapData } from '../../hooks/viz-area/useAreaHeatmapManager';
3
+ export function HeatmapWithIframeExample() {
4
+ const containerRef = useRef<HTMLDivElement>(null);
5
+ const iframeRef = useRef<HTMLIFrameElement>(null);
6
+
7
+ // Dữ liệu mẫu
8
+ const heatmapData: HeatmapData = {
9
+ clickData: [
10
+ {
11
+ hash: 'main-button',
12
+ clicks: [1, 2, 3, 4, 5],
13
+ x: [100, 102, 98, 101, 99],
14
+ y: [50, 51, 49, 50, 52],
15
+ points: 15,
16
+ totalclicks: 150,
17
+ selector: '.main-button',
18
+ },
19
+ {
20
+ hash: 'iframe-button', // Element trong iframe
21
+ clicks: [1, 2, 3],
22
+ x: [200, 201, 199],
23
+ y: [30, 31, 29],
24
+ points: 8,
25
+ totalclicks: 80,
26
+ selector: '.iframe-button',
27
+ },
28
+ ],
29
+ totalClicks: 230,
30
+ };
31
+
32
+ // Load nội dung vào iframe
33
+ useEffect(() => {
34
+ if (iframeRef.current && iframeRef.current.contentDocument) {
35
+ const iframeDoc = iframeRef.current.contentDocument;
36
+ iframeDoc.open();
37
+ iframeDoc.write(`
38
+ <!DOCTYPE html>
39
+ <html>
40
+ <head>
41
+ <style>
42
+ body {
43
+ font-family: Arial, sans-serif;
44
+ padding: 20px;
45
+ margin: 0;
46
+ }
47
+ .iframe-button {
48
+ padding: 15px 30px;
49
+ background: #0078D4;
50
+ color: white;
51
+ border: none;
52
+ border-radius: 4px;
53
+ cursor: pointer;
54
+ font-size: 16px;
55
+ }
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <h2>Nội dung trong Iframe</h2>
60
+ <p>Đây là nội dung bên trong iframe</p>
61
+ <button class="iframe-button" data-clarity-hashalpha="iframe-button">
62
+ Button trong Iframe (80 clicks)
63
+ </button>
64
+ </body>
65
+ </html>
66
+ `);
67
+ iframeDoc.close();
68
+ }
69
+ }, []);
70
+ }
@@ -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="gx-hm-rank-badge" style={style} onClick={clickOnElement}>
22
+ {index}
23
+ </div>
24
+ );
25
+ };
@@ -0,0 +1,57 @@
1
+ import { useHeatmapConfigStore, useHeatmapDataStore, useHeatmapSingleStore } from '../../stores';
2
+ import { WebVisualizer } from '../../types';
3
+ import { HeatmapElements } from './HeatmapElements';
4
+
5
+ interface VizElementsProps {
6
+ iframeRef: React.RefObject<HTMLIFrameElement | null>;
7
+ visualRef: React.RefObject<HTMLDivElement | null>;
8
+ wrapperRef: React.RefObject<HTMLDivElement>;
9
+ }
10
+ export const VizElements: React.FC<VizElementsProps> = ({ iframeRef, visualRef, wrapperRef }) => {
11
+ const heatmapInfo = useHeatmapDataStore((state) => state.dataInfo);
12
+ const contentWidth = useHeatmapConfigStore((state) => state.width);
13
+ const vizRef = useHeatmapSingleStore((state) => state.vizRef);
14
+
15
+ const visualizer: WebVisualizer = {
16
+ get: (hash: string) => {
17
+ if (vizRef) {
18
+ return vizRef.get(hash);
19
+ }
20
+
21
+ const doc = iframeRef.current?.contentDocument;
22
+ if (!doc) return null;
23
+
24
+ const elmHashAlpha = doc.querySelector(`[data-clarity-hashalpha="${hash}"]`) as HTMLElement;
25
+ if (elmHashAlpha) {
26
+ return elmHashAlpha;
27
+ }
28
+
29
+ const elmHash = doc.querySelector(`[data-clarity-hash="${hash}"]`) as HTMLElement;
30
+ if (elmHash) {
31
+ return elmHash;
32
+ }
33
+
34
+ return null;
35
+ },
36
+ };
37
+
38
+ if (!iframeRef.current) return null;
39
+
40
+ return (
41
+ <HeatmapElements
42
+ visualizer={visualizer}
43
+ visualRef={visualRef as React.RefObject<HTMLDivElement>}
44
+ iframeRef={iframeRef as React.RefObject<HTMLIFrameElement>}
45
+ wrapperRef={wrapperRef as React.RefObject<HTMLElement>}
46
+ heatmapInfo={heatmapInfo}
47
+ isVisible={true}
48
+ iframeDimensions={{
49
+ width: contentWidth,
50
+ position: 'absolute',
51
+ top: 0,
52
+ left: 0,
53
+ // pointerEvents: 'none',
54
+ }}
55
+ />
56
+ );
57
+ };
@@ -0,0 +1 @@
1
+ export * from './VizElements';
@@ -0,0 +1,27 @@
1
+ import { useEffect } from 'react';
2
+ import { useHeatmapControlStore, useHeatmapDataStore, useHeatmapLiveStore } from '../../stores';
3
+ import { VizContainer, VizLoading } from '../VizDom';
4
+ import { VizLiveRenderer } from './VizLiveRenderer';
5
+
6
+ export const VizLiveHeatmap: React.FC = () => {
7
+ const controls = useHeatmapControlStore((state) => state.controls);
8
+ const isRendering = useHeatmapDataStore((state) => state.isRendering);
9
+ const iframeHeight = useHeatmapLiveStore((state) => state.iframeHeight);
10
+ const wrapperHeight = useHeatmapLiveStore((state) => state.wrapperHeight);
11
+ const setWrapperHeight = useHeatmapLiveStore((state) => state.setWrapperHeight);
12
+ const reset = useHeatmapLiveStore((state) => state.reset);
13
+
14
+ useEffect(() => {
15
+ return () => {
16
+ reset();
17
+ };
18
+ }, [reset]);
19
+
20
+ if (isRendering) return controls.VizLoading ?? null;
21
+ return (
22
+ <VizContainer setWrapperHeight={setWrapperHeight}>
23
+ <VizLiveRenderer />
24
+ {(!iframeHeight || !wrapperHeight) && <VizLoading />}
25
+ </VizContainer>
26
+ );
27
+ };
@@ -0,0 +1,47 @@
1
+ import { useRef } from 'react';
2
+ import { HEATMAP_IFRAME } from '../../configs';
3
+ import { useHeatmapScale } from '../../hooks';
4
+ import { useVizLiveRender } from '../../hooks/viz-live';
5
+ import { useHeatmapConfigStore, useHeatmapLiveStore } from '../../stores';
6
+ import { WrapperVisual } from '../VizDom';
7
+
8
+ export const VizLiveRenderer: React.FC = () => {
9
+ const contentWidth = useHeatmapConfigStore((state) => state.width);
10
+ const iframeHeight = useHeatmapLiveStore((state) => state.iframeHeight);
11
+ const setIframeHeight = useHeatmapLiveStore((state) => state.setIframeHeight);
12
+ const visualRef = useRef<HTMLDivElement>(null);
13
+ const wrapperRef = useRef<HTMLDivElement>(null);
14
+
15
+ const { iframeRef } = useVizLiveRender();
16
+ const { scaledHeight, handleScroll } = useHeatmapScale({
17
+ wrapperRef,
18
+ iframeRef,
19
+ visualRef,
20
+ iframeHeight,
21
+ setIframeHeight,
22
+ });
23
+
24
+ const onScroll = (e: React.UIEvent<HTMLDivElement>) => {
25
+ const scrollTop = e.currentTarget.scrollTop;
26
+ handleScroll(scrollTop);
27
+ };
28
+
29
+ return (
30
+ <WrapperVisual
31
+ visualRef={visualRef}
32
+ wrapperRef={wrapperRef}
33
+ scaledHeight={scaledHeight}
34
+ iframeHeight={iframeHeight}
35
+ onScroll={onScroll}
36
+ >
37
+ <iframe
38
+ ref={iframeRef}
39
+ {...HEATMAP_IFRAME}
40
+ width={contentWidth}
41
+ // height={iframeHeight}
42
+ scrolling="no"
43
+ sandbox="allow-scripts allow-same-origin"
44
+ />
45
+ </WrapperVisual>
46
+ );
47
+ };
@@ -0,0 +1 @@
1
+ export * from './VizLiveHeatmap';