@rio-cloud/rio-uikit 2.2.0 → 2.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/AnalyticsAnalysisOverlay.d.ts +1 -0
  2. package/AnalyticsAnalysisOverlay.js +5 -0
  3. package/AnalyticsAnalysisOverlay.js.map +1 -0
  4. package/Table.d.ts +2 -0
  5. package/Table.js +23 -0
  6. package/Table.js.map +1 -0
  7. package/TableCol.d.ts +2 -2
  8. package/TableCol.js +1 -1
  9. package/TableHead.d.ts +2 -2
  10. package/TableHead.js +1 -1
  11. package/TableSettingsDialog.d.ts +2 -2
  12. package/TableSettingsDialog.js +1 -1
  13. package/TableToolbar.js +3 -2
  14. package/analyticsAnalysisUtils.d.ts +1 -0
  15. package/analyticsAnalysisUtils.js +13 -0
  16. package/analyticsAnalysisUtils.js.map +1 -0
  17. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.d.ts +18 -0
  18. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js +128 -0
  19. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js.map +1 -0
  20. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.d.ts +9 -0
  21. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js +73 -0
  22. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js.map +1 -0
  23. package/components/applicationHeader/AppMenuContent.js.map +1 -1
  24. package/components/applicationHeader/ApplicationActionBar.js +4 -4
  25. package/components/applicationHeader/ApplicationActionBar.js.map +1 -1
  26. package/components/applicationHeader/CollapsedNavItem.js +5 -14
  27. package/components/applicationHeader/CollapsedNavItem.js.map +1 -1
  28. package/components/applicationHeader/NavItems.js +10 -10
  29. package/components/applicationHeader/NavItems.js.map +1 -1
  30. package/components/assetTree/AssetTree.js +23 -23
  31. package/components/assetTree/AssetTree.js.map +1 -1
  32. package/components/assetTree/TreeNothingFound.js +2 -2
  33. package/components/assetTree/TreeNothingFound.js.map +1 -1
  34. package/components/assetTree/treeUtils.js.map +1 -1
  35. package/components/autosuggest/AutoSuggest.js +31 -31
  36. package/components/autosuggest/AutoSuggest.js.map +1 -1
  37. package/components/autosuggest/AutoSuggestAddons.js +9 -9
  38. package/components/autosuggest/AutoSuggestAddons.js.map +1 -1
  39. package/components/banner/BannerActions.js +2 -2
  40. package/components/banner/BannerActions.js.map +1 -1
  41. package/components/banner/BannerIcon.js +3 -3
  42. package/components/banner/BannerIcon.js.map +1 -1
  43. package/components/banner/BannerPage.js +4 -4
  44. package/components/banner/BannerPage.js.map +1 -1
  45. package/components/button/Button.d.ts +7 -0
  46. package/components/button/Button.js +73 -65
  47. package/components/button/Button.js.map +1 -1
  48. package/components/checkbox/Checkbox.js +18 -17
  49. package/components/checkbox/Checkbox.js.map +1 -1
  50. package/components/datepicker/DateRangePicker.js +0 -2
  51. package/components/datepicker/DateRangePicker.js.map +1 -1
  52. package/components/datepicker/DayPicker.js +16 -16
  53. package/components/datepicker/DayPicker.js.map +1 -1
  54. package/components/dialog/Dialog.js.map +1 -1
  55. package/components/dialog/DialogHeader.js +23 -20
  56. package/components/dialog/DialogHeader.js.map +1 -1
  57. package/components/dialog/MediaDialog.js +1 -1
  58. package/components/dialog/MediaDialog.js.map +1 -1
  59. package/components/editableContent/EditableContent.js +7 -7
  60. package/components/editableContent/EditableContent.js.map +1 -1
  61. package/components/expander/ExpanderList.d.ts +5 -0
  62. package/components/expander/ExpanderList.js +25 -16
  63. package/components/expander/ExpanderList.js.map +1 -1
  64. package/components/expander/ExpanderPanel.d.ts +5 -0
  65. package/components/expander/ExpanderPanel.js +29 -28
  66. package/components/expander/ExpanderPanel.js.map +1 -1
  67. package/components/fade/FadeExpander.js +1 -1
  68. package/components/fade/FadeExpander.js.map +1 -1
  69. package/components/filepicker/FilePicker.js.map +1 -1
  70. package/components/loadMore/LoadMoreButton.d.ts +5 -0
  71. package/components/loadMore/LoadMoreButton.js +33 -29
  72. package/components/loadMore/LoadMoreButton.js.map +1 -1
  73. package/components/map/components/features/ContextMenu.js +13 -13
  74. package/components/map/components/features/ContextMenu.js.map +1 -1
  75. package/components/map/components/features/basics/InfoBubble.js.map +1 -1
  76. package/components/map/components/features/settings/MapSettingsTile.js.map +1 -1
  77. package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js +6 -6
  78. package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js.map +1 -1
  79. package/components/map/utils/eventHandling.js +18 -18
  80. package/components/map/utils/eventHandling.js.map +1 -1
  81. package/components/map/utils/positions.d.ts +1 -1
  82. package/components/map/utils/positions.js +15 -12
  83. package/components/map/utils/positions.js.map +1 -1
  84. package/components/map/utils/rendering.d.ts +1 -1
  85. package/components/menuItems/MenuItems.js +6 -6
  86. package/components/menuItems/MenuItems.js.map +1 -1
  87. package/components/notification/NotificationsContainer.js.map +1 -1
  88. package/components/numberInput/NumberInput.js +57 -56
  89. package/components/numberInput/NumberInput.js.map +1 -1
  90. package/components/popover/Popover.js +4 -4
  91. package/components/popover/Popover.js.map +1 -1
  92. package/components/resizer/Resizer.js +6 -3
  93. package/components/resizer/Resizer.js.map +1 -1
  94. package/components/selects/BaseSelectDropdown.js +34 -32
  95. package/components/selects/BaseSelectDropdown.js.map +1 -1
  96. package/components/selects/MultiselectTogglePlaceholder.js.map +1 -1
  97. package/components/selects/MultiselectToggleSelection.js +11 -11
  98. package/components/selects/MultiselectToggleSelection.js.map +1 -1
  99. package/components/sidebars/Sidebar.js +12 -12
  100. package/components/sidebars/Sidebar.js.map +1 -1
  101. package/components/sidebars/SidebarCloseButton.js +2 -2
  102. package/components/sidebars/SidebarCloseButton.js.map +1 -1
  103. package/components/smoothScrollbars/SmoothScrollbars.d.ts +4 -3
  104. package/components/smoothScrollbars/SmoothScrollbars.js +11 -11
  105. package/components/smoothScrollbars/SmoothScrollbars.js.map +1 -1
  106. package/components/states/CustomState.js.map +1 -1
  107. package/components/svgImage/svgConverter.js.map +1 -1
  108. package/components/table/Table.d.ts +267 -0
  109. package/components/table/Table.js +233 -0
  110. package/components/table/Table.js.map +1 -0
  111. package/components/table/Table.types.d.ts +207 -0
  112. package/components/table/TableBody.d.ts +10 -0
  113. package/components/table/TableBody.js +5 -0
  114. package/components/table/TableBody.js.map +1 -0
  115. package/components/table/TableCard.d.ts +63 -0
  116. package/components/table/TableCard.js +150 -0
  117. package/components/table/TableCard.js.map +1 -0
  118. package/components/table/TableColumn.d.ts +47 -0
  119. package/components/table/TableColumn.js +5 -0
  120. package/components/table/TableColumn.js.map +1 -0
  121. package/components/table/TableExpandedContentRow.d.ts +22 -0
  122. package/components/table/TableExpandedContentRow.js +5 -0
  123. package/components/table/TableExpandedContentRow.js.map +1 -0
  124. package/components/table/TableExpandedRow.d.ts +17 -0
  125. package/components/table/TableExpandedRow.js +5 -0
  126. package/components/table/TableExpandedRow.js.map +1 -0
  127. package/components/table/TableExpanderButton.d.ts +25 -0
  128. package/components/table/TableExpanderButton.js +22 -0
  129. package/components/table/TableExpanderButton.js.map +1 -0
  130. package/components/table/TableFooter.d.ts +13 -0
  131. package/components/table/TableFooter.js +5 -0
  132. package/components/table/TableFooter.js.map +1 -0
  133. package/components/table/TableGroupFooterRow.d.ts +18 -0
  134. package/components/table/TableGroupFooterRow.js +5 -0
  135. package/components/table/TableGroupFooterRow.js.map +1 -0
  136. package/components/table/TableGroupRow.d.ts +24 -0
  137. package/components/table/TableGroupRow.js +5 -0
  138. package/components/table/TableGroupRow.js.map +1 -0
  139. package/components/table/TableHeader.d.ts +9 -0
  140. package/components/table/TableHeader.js +5 -0
  141. package/components/table/TableHeader.js.map +1 -0
  142. package/components/table/TableHeaderColumn.d.ts +70 -0
  143. package/components/table/TableHeaderColumn.js +5 -0
  144. package/components/table/TableHeaderColumn.js.map +1 -0
  145. package/components/table/TableHeaderRow.d.ts +9 -0
  146. package/components/table/TableHeaderRow.js +5 -0
  147. package/components/table/TableHeaderRow.js.map +1 -0
  148. package/components/table/TableRow.d.ts +19 -0
  149. package/components/table/TableRow.js +5 -0
  150. package/components/table/TableRow.js.map +1 -0
  151. package/components/table/TableSpacerRow.d.ts +12 -0
  152. package/components/table/TableSpacerRow.js +5 -0
  153. package/components/table/TableSpacerRow.js.map +1 -0
  154. package/components/table/TableToolbar.d.ts +23 -1
  155. package/components/table/TableToolbar.js +38 -4
  156. package/components/table/TableToolbar.js.map +1 -1
  157. package/components/table/TableViewToggles.d.ts +18 -0
  158. package/components/table/TableViewToggles.js +59 -87
  159. package/components/table/TableViewToggles.js.map +1 -1
  160. package/components/table/layout/columnSizing.d.ts +3 -0
  161. package/components/table/layout/columnSizing.js +23 -0
  162. package/components/table/layout/columnSizing.js.map +1 -0
  163. package/components/table/layout/useDraggableColumns.d.ts +14 -0
  164. package/components/table/layout/useDraggableColumns.js +47 -0
  165. package/components/table/layout/useDraggableColumns.js.map +1 -0
  166. package/components/table/layout/useHorizontalSectionSync.d.ts +11 -0
  167. package/components/table/layout/useHorizontalSectionSync.js +39 -0
  168. package/components/table/layout/useHorizontalSectionSync.js.map +1 -0
  169. package/components/table/layout/useMeasuredColumnMaxWidths.d.ts +12 -0
  170. package/components/table/layout/useMeasuredColumnMaxWidths.js +85 -0
  171. package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -0
  172. package/components/table/layout/useResizableColumns.d.ts +14 -0
  173. package/components/table/layout/useResizableColumns.js +91 -0
  174. package/components/table/layout/useResizableColumns.js.map +1 -0
  175. package/components/table/layout/useTableLayout.d.ts +25 -0
  176. package/components/table/layout/useTableLayout.js +56 -0
  177. package/components/table/layout/useTableLayout.js.map +1 -0
  178. package/components/table/layout/useTableVirtualization.d.ts +22 -0
  179. package/components/table/layout/useTableVirtualization.js +125 -0
  180. package/components/table/layout/useTableVirtualization.js.map +1 -0
  181. package/components/table/model/buildTableViewModel.d.ts +28 -0
  182. package/components/table/model/buildTableViewModel.js +221 -0
  183. package/components/table/model/buildTableViewModel.js.map +1 -0
  184. package/components/table/model/resolveCellContent.d.ts +2 -0
  185. package/components/table/model/resolveCellContent.js +5 -0
  186. package/components/table/model/resolveCellContent.js.map +1 -0
  187. package/components/table/model/resolveRowMeta.d.ts +2 -0
  188. package/components/table/model/resolveRowMeta.js +15 -0
  189. package/components/table/model/resolveRowMeta.js.map +1 -0
  190. package/components/table/model/resolveTableClassConfig.d.ts +48 -0
  191. package/components/table/model/resolveTableClassConfig.js +64 -0
  192. package/components/table/model/resolveTableClassConfig.js.map +1 -0
  193. package/components/table/model/tableViewModel.types.d.ts +153 -0
  194. package/components/table/native/TableCol.js.map +1 -0
  195. package/components/table/{TableHead.js → native/TableHead.js} +2 -2
  196. package/components/table/native/TableHead.js.map +1 -0
  197. package/components/table/native/TableSettingsColumnButtons.js +59 -0
  198. package/components/table/native/TableSettingsColumnButtons.js.map +1 -0
  199. package/components/table/{TableSettingsColumnDetails.js → native/TableSettingsColumnDetails.js} +2 -2
  200. package/components/table/native/TableSettingsColumnDetails.js.map +1 -0
  201. package/components/table/{TableSettingsDialog.d.ts → native/TableSettingsDialog.d.ts} +2 -3
  202. package/components/table/native/TableSettingsDialog.js +216 -0
  203. package/components/table/native/TableSettingsDialog.js.map +1 -0
  204. package/components/table/{TableSettingsDialogFooter.js → native/TableSettingsDialogFooter.js} +2 -2
  205. package/components/table/native/TableSettingsDialogFooter.js.map +1 -0
  206. package/components/table/{TableSettingsListContainer.js → native/TableSettingsListContainer.js} +8 -8
  207. package/components/table/native/TableSettingsListContainer.js.map +1 -0
  208. package/components/table/native/TableSettingsListItem.js +100 -0
  209. package/components/table/native/TableSettingsListItem.js.map +1 -0
  210. package/components/table/parse/parseBody.d.ts +3 -0
  211. package/components/table/parse/parseBody.js +13 -0
  212. package/components/table/parse/parseBody.js.map +1 -0
  213. package/components/table/parse/parseColumns.d.ts +3 -0
  214. package/components/table/parse/parseColumns.js +81 -0
  215. package/components/table/parse/parseColumns.js.map +1 -0
  216. package/components/table/parse/parseFooter.d.ts +3 -0
  217. package/components/table/parse/parseFooter.js +39 -0
  218. package/components/table/parse/parseFooter.js.map +1 -0
  219. package/components/table/parse/parseHeaders.d.ts +4 -0
  220. package/components/table/parse/parseHeaders.js +89 -0
  221. package/components/table/parse/parseHeaders.js.map +1 -0
  222. package/components/table/parse/parseRows.d.ts +3 -0
  223. package/components/table/parse/parseRows.js +93 -0
  224. package/components/table/parse/parseRows.js.map +1 -0
  225. package/components/table/parse/tableChildGuards.d.ts +25 -0
  226. package/components/table/parse/tableChildGuards.js +29 -0
  227. package/components/table/parse/tableChildGuards.js.map +1 -0
  228. package/components/table/render/body/TableBodyRow.d.ts +16 -0
  229. package/components/table/render/body/TableBodyRow.js +84 -0
  230. package/components/table/render/body/TableBodyRow.js.map +1 -0
  231. package/components/table/render/body/TableBodySection.d.ts +20 -0
  232. package/components/table/render/body/TableBodySection.js +68 -0
  233. package/components/table/render/body/TableBodySection.js.map +1 -0
  234. package/components/table/render/body/TableDataRow.d.ts +15 -0
  235. package/components/table/render/body/TableDataRow.js +143 -0
  236. package/components/table/render/body/TableDataRow.js.map +1 -0
  237. package/components/table/render/body/TableEmptyRow.d.ts +7 -0
  238. package/components/table/render/body/TableEmptyRow.js +6 -0
  239. package/components/table/render/body/TableEmptyRow.js.map +1 -0
  240. package/components/table/render/body/TableExpandedRow.d.ts +8 -0
  241. package/components/table/render/body/TableExpandedRow.js +84 -0
  242. package/components/table/render/body/TableExpandedRow.js.map +1 -0
  243. package/components/table/render/body/TableGroupRow.d.ts +8 -0
  244. package/components/table/render/body/TableGroupRow.js +21 -0
  245. package/components/table/render/body/TableGroupRow.js.map +1 -0
  246. package/components/table/render/body/TableSpacerRow.d.ts +7 -0
  247. package/components/table/render/body/TableSpacerRow.js +15 -0
  248. package/components/table/render/body/TableSpacerRow.js.map +1 -0
  249. package/components/table/render/footer/TableFooterCell.d.ts +8 -0
  250. package/components/table/render/footer/TableFooterCell.js +31 -0
  251. package/components/table/render/footer/TableFooterCell.js.map +1 -0
  252. package/components/table/render/footer/TableFooterContent.d.ts +6 -0
  253. package/components/table/render/footer/TableFooterContent.js +6 -0
  254. package/components/table/render/footer/TableFooterContent.js.map +1 -0
  255. package/components/table/render/footer/TableFooterSection.d.ts +10 -0
  256. package/components/table/render/footer/TableFooterSection.js +28 -0
  257. package/components/table/render/footer/TableFooterSection.js.map +1 -0
  258. package/components/table/render/header/TableBatchDropdown.d.ts +9 -0
  259. package/components/table/render/header/TableBatchDropdown.js +28 -0
  260. package/components/table/render/header/TableBatchDropdown.js.map +1 -0
  261. package/components/table/render/header/TableColumnFilter.d.ts +66 -0
  262. package/components/table/render/header/TableColumnFilter.js +70 -0
  263. package/components/table/render/header/TableColumnFilter.js.map +1 -0
  264. package/components/table/render/header/TableDraggableHeaderCell.d.ts +3 -0
  265. package/components/table/render/header/TableDraggableHeaderCell.js +54 -0
  266. package/components/table/render/header/TableDraggableHeaderCell.js.map +1 -0
  267. package/components/table/render/header/TableHeader.types.d.ts +35 -0
  268. package/components/table/render/header/TableHeaderCellContent.d.ts +3 -0
  269. package/components/table/render/header/TableHeaderCellContent.js +57 -0
  270. package/components/table/render/header/TableHeaderCellContent.js.map +1 -0
  271. package/components/table/render/header/TableHeaderCellResizeHandle.d.ts +3 -0
  272. package/components/table/render/header/TableHeaderCellResizeHandle.js +22 -0
  273. package/components/table/render/header/TableHeaderCellResizeHandle.js.map +1 -0
  274. package/components/table/render/header/TableHeaderDragOverlay.d.ts +13 -0
  275. package/components/table/render/header/TableHeaderDragOverlay.js +35 -0
  276. package/components/table/render/header/TableHeaderDragOverlay.js.map +1 -0
  277. package/components/table/render/header/TableHeaderSection.d.ts +3 -0
  278. package/components/table/render/header/TableHeaderSection.js +104 -0
  279. package/components/table/render/header/TableHeaderSection.js.map +1 -0
  280. package/components/table/render/header/TableHeaderSelectionCell.d.ts +9 -0
  281. package/components/table/render/header/TableHeaderSelectionCell.js +41 -0
  282. package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -0
  283. package/components/table/render/header/TableStaticHeaderCell.d.ts +3 -0
  284. package/components/table/render/header/TableStaticHeaderCell.js +36 -0
  285. package/components/table/render/header/TableStaticHeaderCell.js.map +1 -0
  286. package/components/table/render/header/resolveAriaSort.d.ts +2 -0
  287. package/components/table/render/header/resolveAriaSort.js +8 -0
  288. package/components/table/render/header/resolveAriaSort.js.map +1 -0
  289. package/components/table/render/header/resolveColumnCollisionDetection.d.ts +2 -0
  290. package/components/table/render/header/resolveColumnCollisionDetection.js +9 -0
  291. package/components/table/render/header/resolveColumnCollisionDetection.js.map +1 -0
  292. package/components/table/render/header/resolveHeaderCellClassName.d.ts +10 -0
  293. package/components/table/render/header/resolveHeaderCellClassName.js +22 -0
  294. package/components/table/render/header/resolveHeaderCellClassName.js.map +1 -0
  295. package/components/table/render/header/resolveHeaderCellStyle.d.ts +829 -0
  296. package/components/table/render/header/resolveHeaderCellStyle.js +9 -0
  297. package/components/table/render/header/resolveHeaderCellStyle.js.map +1 -0
  298. package/components/table/selection/useTableSelection.d.ts +82 -0
  299. package/components/table/selection/useTableSelection.js +35 -0
  300. package/components/table/selection/useTableSelection.js.map +1 -0
  301. package/components/table/settings/TableColumnsDropdown.d.ts +90 -0
  302. package/components/table/settings/TableColumnsDropdown.js +137 -0
  303. package/components/table/settings/TableColumnsDropdown.js.map +1 -0
  304. package/components/table/settings/TableColumnsDropdownItem.d.ts +8 -0
  305. package/components/table/settings/TableColumnsDropdownItem.js +66 -0
  306. package/components/table/settings/TableColumnsDropdownItem.js.map +1 -0
  307. package/components/table/shared/getAlignClassName.d.ts +3 -0
  308. package/components/table/shared/getAlignClassName.js +6 -0
  309. package/components/table/shared/getAlignClassName.js.map +1 -0
  310. package/components/table/shared/getInteractiveRowProps.d.ts +14 -0
  311. package/components/table/shared/getInteractiveRowProps.js +15 -0
  312. package/components/table/shared/getInteractiveRowProps.js.map +1 -0
  313. package/components/table/shared/resolveTableAria.d.ts +2 -0
  314. package/components/table/shared/resolveTableAria.js +6 -0
  315. package/components/table/shared/resolveTableAria.js.map +1 -0
  316. package/components/table/tableSizing.constants.d.ts +4 -0
  317. package/components/table/tableSizing.constants.js +8 -0
  318. package/components/table/tableSizing.constants.js.map +1 -0
  319. package/components/teaser/TeaserContainer.js +3 -3
  320. package/components/teaser/TeaserContainer.js.map +1 -1
  321. package/components/virtualList/VirtualList.js +16 -13
  322. package/components/virtualList/VirtualList.js.map +1 -1
  323. package/googleAnalyticsUtils.d.ts +1 -0
  324. package/googleAnalyticsUtils.js +9 -0
  325. package/googleAnalyticsUtils.js.map +1 -0
  326. package/hooks/useCookies.js +17 -17
  327. package/hooks/useCookies.js.map +1 -1
  328. package/hooks/useDraggableElement.d.ts +35 -0
  329. package/hooks/useDraggableElement.js +49 -0
  330. package/hooks/useDraggableElement.js.map +1 -0
  331. package/hooks/useElapsedTime.js +4 -4
  332. package/hooks/useElapsedTime.js.map +1 -1
  333. package/hooks/useLocationSuggestions.js +13 -10
  334. package/hooks/useLocationSuggestions.js.map +1 -1
  335. package/hooks/useMergeRefs.js +12 -12
  336. package/hooks/useMergeRefs.js.map +1 -1
  337. package/hooks/usePrevious.d.ts +1 -1
  338. package/hooks/usePrevious.js.map +1 -1
  339. package/hooks/useResizeObserver.js +25 -10
  340. package/hooks/useResizeObserver.js.map +1 -1
  341. package/hooks/useRioCookieConsent.js +7 -4
  342. package/hooks/useRioCookieConsent.js.map +1 -1
  343. package/hooks/useSorting.js +10 -10
  344. package/hooks/useSorting.js.map +1 -1
  345. package/hooks/useStorage.js +12 -12
  346. package/hooks/useStorage.js.map +1 -1
  347. package/hooks/useSum.js +10 -7
  348. package/hooks/useSum.js.map +1 -1
  349. package/hooks/useTableSelection.js.map +1 -1
  350. package/hooks/useTimeout.js +6 -3
  351. package/hooks/useTimeout.js.map +1 -1
  352. package/package.json +3 -3
  353. package/routeUtils.js +12 -10
  354. package/utils/analytics/analyticsAnalysisUtils.d.ts +27 -0
  355. package/utils/analytics/analyticsAnalysisUtils.js +161 -0
  356. package/utils/analytics/analyticsAnalysisUtils.js.map +1 -0
  357. package/utils/analytics/autoTracking.d.ts +14 -0
  358. package/utils/analytics/autoTracking.js +19 -0
  359. package/utils/analytics/autoTracking.js.map +1 -0
  360. package/utils/analytics/createAnalyticsOverlayTooltip.d.ts +36 -0
  361. package/utils/analytics/createAnalyticsOverlayTooltip.js +203 -0
  362. package/utils/analytics/createAnalyticsOverlayTooltip.js.map +1 -0
  363. package/utils/analytics/googleAnalyticsUtils.d.ts +37 -0
  364. package/utils/analytics/googleAnalyticsUtils.js +37 -0
  365. package/utils/analytics/googleAnalyticsUtils.js.map +1 -0
  366. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.d.ts +8 -0
  367. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js +61 -0
  368. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js.map +1 -0
  369. package/utils/analytics/useAnalyticsOverlayDom.d.ts +11 -0
  370. package/utils/analytics/useAnalyticsOverlayDom.js +120 -0
  371. package/utils/analytics/useAnalyticsOverlayDom.js.map +1 -0
  372. package/utils/arrayMove.js +11 -0
  373. package/utils/arrayMove.js.map +1 -0
  374. package/utils/cssuseragent.js +2 -2
  375. package/utils/cssuseragent.js.map +1 -1
  376. package/utils/deviceUtils.js.map +1 -1
  377. package/utils/formatUtils.js.map +1 -1
  378. package/utils/hasUtilityClass.js +3 -3
  379. package/utils/hasUtilityClass.js.map +1 -1
  380. package/utils/hidePiiData.js.map +1 -1
  381. package/utils/init/checkForReleaseVersion.js +4 -4
  382. package/utils/init/checkForReleaseVersion.js.map +1 -1
  383. package/utils/init/styledLogs.js.map +1 -1
  384. package/utils/mergeRefs.js +3 -3
  385. package/utils/mergeRefs.js.map +1 -1
  386. package/utils/routeUtils.d.ts +32 -1
  387. package/utils/routeUtils.js +85 -67
  388. package/utils/routeUtils.js.map +1 -1
  389. package/utils/storageUtils.js +9 -9
  390. package/utils/storageUtils.js.map +1 -1
  391. package/version.d.ts +1 -1
  392. package/version.js +2 -2
  393. package/version.js.map +1 -1
  394. package/components/table/TableCol.js.map +0 -1
  395. package/components/table/TableHead.js.map +0 -1
  396. package/components/table/TableSettingsColumnButtons.js +0 -45
  397. package/components/table/TableSettingsColumnButtons.js.map +0 -1
  398. package/components/table/TableSettingsColumnDetails.js.map +0 -1
  399. package/components/table/TableSettingsDialog.js +0 -208
  400. package/components/table/TableSettingsDialog.js.map +0 -1
  401. package/components/table/TableSettingsDialogFooter.js.map +0 -1
  402. package/components/table/TableSettingsListContainer.js.map +0 -1
  403. package/components/table/TableSettingsListItem.js +0 -96
  404. package/components/table/TableSettingsListItem.js.map +0 -1
  405. /package/components/table/{TableCol.d.ts → native/TableCol.d.ts} +0 -0
  406. /package/components/table/{TableCol.js → native/TableCol.js} +0 -0
  407. /package/components/table/{TableHead.d.ts → native/TableHead.d.ts} +0 -0
  408. /package/components/table/{TableSettingsColumnButtons.d.ts → native/TableSettingsColumnButtons.d.ts} +0 -0
  409. /package/components/table/{TableSettingsColumnDetails.d.ts → native/TableSettingsColumnDetails.d.ts} +0 -0
  410. /package/components/table/{TableSettingsDialogFooter.d.ts → native/TableSettingsDialogFooter.d.ts} +0 -0
  411. /package/components/table/{TableSettingsListContainer.d.ts → native/TableSettingsListContainer.d.ts} +0 -0
  412. /package/components/table/{TableSettingsListItem.d.ts → native/TableSettingsListItem.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyticsAnalysisUtils.js","sources":["../../../src/utils/analytics/analyticsAnalysisUtils.ts"],"sourcesContent":["type AnalyticsReportEntry = {\n reportName: string;\n eventAction: string;\n eventLabel: string;\n eventCount: string;\n totalUsers: string;\n eventCountPerActiveUser: string;\n};\n\ntype AnalyticsDateRange = {\n startDate: Date | null;\n endDate: Date | null;\n};\n\ntype AnalyticsCsvUpload = {\n reportName: string;\n csvRaw: string;\n};\n\ntype AnalyticsAnalysisData = {\n analyticsLookup: Map<string, AnalyticsReportEntry[]>;\n analyticsDateRangeLabel: string | null;\n analyticsTotalUsers: number | null;\n};\n\nconst CSV_SEPARATOR = ',';\nconst START_DATE_PREFIX = '# Start date:';\nconst END_DATE_PREFIX = '# End date:';\nconst COMPACT_DATE_RANGE_LINE_REGEX = /^#\\s*(\\d{8})\\s*-\\s*(\\d{8})\\s*$/;\n\nexport const LOOKUP_MAX_LENGTH = 100;\n\nconst REQUIRED_ANALYTICS_HEADER_COLUMNS = [\n 'event_action',\n 'event_label',\n 'Event count',\n 'Total users',\n 'Event count per active user',\n] as const;\n\nconst REQUIRED_ANALYTICS_DIMENSION_COLUMNS = ['event_action', 'event_label'] as const;\nconst EVENT_COUNT_COLUMN_ALIASES = ['event count'];\nconst TOTAL_USERS_COLUMN_ALIASES = ['total users', 'active users'];\nconst EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES = ['event count per active user', 'event countactive user'];\n\nexport const REQUIRED_ANALYTICS_HEADER_ROW = REQUIRED_ANALYTICS_HEADER_COLUMNS.join(CSV_SEPARATOR);\n\nexport const ANALYTICS_OVERLAY_SELECTOR = '[data-track-ga-event-action][data-track-ga-event-label]';\nexport const EVENT_TYPE_ICON_CLASS: Record<'seen' | 'clicked', string> = {\n seen: 'rioglyph-eye-open',\n clicked: 'rioglyph-click',\n};\n\nconst getEventLabelLookupPart = (eventLabel: string) => eventLabel.slice(0, LOOKUP_MAX_LENGTH);\n\nexport const createAnalyticsLookupKey = (eventAction: string, eventLabel: string) =>\n `${eventAction}::${getEventLabelLookupPart(eventLabel)}`;\n\nexport const toEventType = (eventTrigger: string) => {\n if (eventTrigger === 'visibility') {\n return 'seen' as const;\n }\n\n if (eventTrigger === 'click') {\n return 'clicked' as const;\n }\n\n return null;\n};\n\nconst parseDateFromAnalyticsMetadata = (value: string) => {\n const normalizedValue = value.trim();\n\n if (!/^\\d{8}$/.test(normalizedValue)) {\n return null;\n }\n\n const year = Number(normalizedValue.slice(0, 4));\n const month = Number(normalizedValue.slice(4, 6));\n const day = Number(normalizedValue.slice(6, 8));\n const parsedDate = new Date(Date.UTC(year, month - 1, day));\n\n // Reject impossible dates such as 20250230 after UTC parsing normalizes them.\n if (\n parsedDate.getUTCFullYear() !== year ||\n parsedDate.getUTCMonth() !== month - 1 ||\n parsedDate.getUTCDate() !== day\n ) {\n return null;\n }\n\n return parsedDate;\n};\n\nconst formatDateInEnglish = (date: Date) =>\n new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n }).format(date);\n\nconst parseAnalyticsDateRange = (csvRaw: string): AnalyticsDateRange => {\n const lines = csvRaw.split(/\\r?\\n/);\n const startDateLine = lines.find(line => line.startsWith(START_DATE_PREFIX));\n const endDateLine = lines.find(line => line.startsWith(END_DATE_PREFIX));\n\n const startDateRaw = startDateLine?.slice(START_DATE_PREFIX.length).trim() ?? '';\n const endDateRaw = endDateLine?.slice(END_DATE_PREFIX.length).trim() ?? '';\n const startDate = parseDateFromAnalyticsMetadata(startDateRaw);\n const endDate = parseDateFromAnalyticsMetadata(endDateRaw);\n\n if (startDate !== null && endDate !== null) {\n return { startDate, endDate };\n }\n\n // Some exports collapse the range into a single comment line instead of separate start/end metadata.\n const compactDateRangeLine = lines.find(line => COMPACT_DATE_RANGE_LINE_REGEX.test(line.trim()));\n if (!compactDateRangeLine) {\n return { startDate, endDate };\n }\n\n const dateRangeMatch = compactDateRangeLine.trim().match(COMPACT_DATE_RANGE_LINE_REGEX);\n if (!dateRangeMatch) {\n return { startDate, endDate };\n }\n\n const compactStartDate = parseDateFromAnalyticsMetadata(dateRangeMatch[1]);\n const compactEndDate = parseDateFromAnalyticsMetadata(dateRangeMatch[2]);\n\n return { startDate: compactStartDate, endDate: compactEndDate };\n};\n\nconst getAnalyticsReportLines = (csvRaw: string) =>\n csvRaw\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'));\n\nconst parseCsvCells = (line: string) => {\n const cells: string[] = [];\n let currentCell = '';\n let isInsideQuotes = false;\n\n // Handle quoted separators and escaped double quotes without relying on a CSV library.\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n\n if (char === '\"') {\n const nextChar = line[index + 1];\n\n if (isInsideQuotes && nextChar === '\"') {\n currentCell += '\"';\n index += 1;\n continue;\n }\n\n isInsideQuotes = !isInsideQuotes;\n continue;\n }\n\n if (char === CSV_SEPARATOR && !isInsideQuotes) {\n cells.push(currentCell.trim());\n currentCell = '';\n continue;\n }\n\n currentCell += char;\n }\n\n cells.push(currentCell.trim());\n return cells;\n};\n\nconst normalizeHeaderColumn = (column: string) => column.trim().toLowerCase().replace(/\\s+/g, ' ');\n\nconst findHeaderColumnIndex = (headerColumns: string[], aliases: string[]) => {\n const normalizedAliases = new Set(aliases.map(alias => normalizeHeaderColumn(alias)));\n return headerColumns.findIndex(column => normalizedAliases.has(normalizeHeaderColumn(column)));\n};\n\ntype AnalyticsColumnIndices = {\n eventActionIndex: number;\n eventLabelIndex: number;\n eventCountIndex: number;\n totalUsersIndex: number;\n eventCountPerUserIndex: number;\n};\n\nconst isNumericValue = (value: string | undefined) => {\n if (!value || !value.trim()) {\n return false;\n }\n\n return Number.isFinite(Number(value));\n};\n\nconst isLikelyTextValue = (value: string | undefined) => {\n const normalizedValue = value?.trim() ?? '';\n return normalizedValue !== '' && !isNumericValue(normalizedValue);\n};\n\nconst buildHeaderBasedColumnIndices = (headerColumns: string[]): AnalyticsColumnIndices | null => {\n let eventActionIndex = findHeaderColumnIndex(headerColumns, [REQUIRED_ANALYTICS_DIMENSION_COLUMNS[0]]);\n let eventLabelIndex = findHeaderColumnIndex(headerColumns, [REQUIRED_ANALYTICS_DIMENSION_COLUMNS[1]]);\n let eventCountIndex = findHeaderColumnIndex(headerColumns, EVENT_COUNT_COLUMN_ALIASES);\n let totalUsersIndex = findHeaderColumnIndex(headerColumns, TOTAL_USERS_COLUMN_ALIASES);\n let eventCountPerUserIndex = findHeaderColumnIndex(headerColumns, EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES);\n\n // Fall back to the expected export order when headers are incomplete but the column layout is still usable.\n if (eventActionIndex === -1 && headerColumns.length >= 1) {\n eventActionIndex = 0;\n }\n\n if (eventLabelIndex === -1 && headerColumns.length >= 2) {\n eventLabelIndex = eventActionIndex + 1;\n }\n\n if (eventCountIndex === -1 && headerColumns.length >= 3) {\n eventCountIndex = eventLabelIndex + 1;\n }\n\n if (totalUsersIndex === -1 && headerColumns.length >= 4) {\n totalUsersIndex = eventCountIndex + 1;\n }\n\n if (eventCountPerUserIndex === -1 && headerColumns.length >= 5) {\n eventCountPerUserIndex = totalUsersIndex + 1;\n }\n\n if (\n eventActionIndex < 0 ||\n eventLabelIndex < 0 ||\n eventCountIndex < 0 ||\n totalUsersIndex < 0 ||\n eventCountPerUserIndex < 0\n ) {\n return null;\n }\n\n return {\n eventActionIndex,\n eventLabelIndex,\n eventCountIndex,\n totalUsersIndex,\n eventCountPerUserIndex,\n };\n};\n\nconst isPlausibleAnalyticsColumnMapping = (reportLines: string[], columnIndices: AnalyticsColumnIndices) => {\n const dataRows = reportLines.slice(1);\n let validatedRows = 0;\n let plausibleRows = 0;\n\n for (const line of dataRows) {\n const cells = parseCsvCells(line);\n const action = cells[columnIndices.eventActionIndex];\n const label = cells[columnIndices.eventLabelIndex];\n\n if (!action && !label) {\n continue;\n }\n\n validatedRows += 1;\n\n const eventCount = cells[columnIndices.eventCountIndex];\n const totalUsers = cells[columnIndices.totalUsersIndex];\n\n if (\n isLikelyTextValue(action) &&\n isLikelyTextValue(label) &&\n isNumericValue(eventCount) &&\n isNumericValue(totalUsers)\n ) {\n plausibleRows += 1;\n }\n\n if (validatedRows >= 5) {\n break;\n }\n }\n\n if (validatedRows === 0) {\n return true;\n }\n\n return plausibleRows >= Math.ceil(validatedRows / 2);\n};\n\nconst resolveAnalyticsColumnIndices = (reportLines: string[]): AnalyticsColumnIndices | null => {\n if (reportLines.length < 2) {\n return null;\n }\n\n const headerColumns = parseCsvCells(reportLines[0]);\n const headerBasedColumnIndices = buildHeaderBasedColumnIndices(headerColumns);\n\n if (headerBasedColumnIndices && isPlausibleAnalyticsColumnMapping(reportLines, headerBasedColumnIndices)) {\n return headerBasedColumnIndices;\n }\n\n // Last-resort support for exports that omit headers but still follow the default column order.\n const positionalColumnIndices: AnalyticsColumnIndices = {\n eventActionIndex: 0,\n eventLabelIndex: 1,\n eventCountIndex: 2,\n totalUsersIndex: 3,\n eventCountPerUserIndex: 4,\n };\n\n if (isPlausibleAnalyticsColumnMapping(reportLines, positionalColumnIndices)) {\n return positionalColumnIndices;\n }\n\n return null;\n};\n\nexport const hasRequiredAnalyticsHeaderRow = (csvRaw: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length === 0) {\n return false;\n }\n\n const headerColumns = parseCsvCells(reportLines[0]);\n const hasRequiredDimensions = REQUIRED_ANALYTICS_DIMENSION_COLUMNS.every(requiredColumn =>\n headerColumns.some(column => normalizeHeaderColumn(column) === requiredColumn)\n );\n\n return hasRequiredDimensions && resolveAnalyticsColumnIndices(reportLines) !== null;\n};\n\nconst parseNumericMetric = (value: string | undefined) => {\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : 0;\n};\n\nconst isMissingEventDimensionValue = (value: string | undefined) => {\n const normalizedValue = value?.trim().toLowerCase() ?? '';\n return !normalizedValue;\n};\n\nconst isSummaryTotalUsersRow = (\n rowIndex: number,\n cells: string[],\n eventActionIndex: number,\n eventLabelIndex: number\n) => {\n if (rowIndex !== 0) {\n return false;\n }\n\n // Analytics exports often prepend a rollup row with only totals before the per-event rows.\n const eventAction = cells[eventActionIndex];\n const eventLabel = cells[eventLabelIndex];\n\n return isMissingEventDimensionValue(eventAction) && isMissingEventDimensionValue(eventLabel);\n};\n\nconst extractAnalyticsTotalUsers = (csvRaw: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length < 2) {\n return null;\n }\n\n const columnIndices = resolveAnalyticsColumnIndices(reportLines);\n\n if (!columnIndices) {\n return null;\n }\n\n const firstDataRowCells = parseCsvCells(reportLines[1]);\n\n if (!isSummaryTotalUsersRow(0, firstDataRowCells, columnIndices.eventActionIndex, columnIndices.eventLabelIndex)) {\n return null;\n }\n\n return parseNumericMetric(firstDataRowCells[columnIndices.totalUsersIndex]);\n};\n\nexport const parseAnalyticsReportCsv = (csvRaw: string, reportName: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length < 2) {\n return [] as AnalyticsReportEntry[];\n }\n\n const columnIndices = resolveAnalyticsColumnIndices(reportLines);\n if (!columnIndices) {\n return [] as AnalyticsReportEntry[];\n }\n\n return reportLines.slice(1).reduce((entries, line, rowIndex) => {\n const cells = parseCsvCells(line);\n\n if (isSummaryTotalUsersRow(rowIndex, cells, columnIndices.eventActionIndex, columnIndices.eventLabelIndex)) {\n return entries;\n }\n\n const eventAction = cells[columnIndices.eventActionIndex];\n const eventLabel = cells[columnIndices.eventLabelIndex];\n\n if (!eventAction || !eventLabel) {\n return entries;\n }\n\n entries.push({\n reportName,\n eventAction,\n eventLabel,\n eventCount: cells[columnIndices.eventCountIndex] ?? '0',\n totalUsers: cells[columnIndices.totalUsersIndex] ?? '0',\n eventCountPerActiveUser: cells[columnIndices.eventCountPerUserIndex] ?? '0',\n });\n return entries;\n }, [] as AnalyticsReportEntry[]);\n};\n\nexport const buildAnalyticsAnalysisData = (uploads: AnalyticsCsvUpload[]): AnalyticsAnalysisData => {\n const parsedReports = uploads.map(upload => ({\n analyticsEntries: parseAnalyticsReportCsv(upload.csvRaw, upload.reportName),\n analyticsTotalUsers: extractAnalyticsTotalUsers(upload.csvRaw),\n }));\n\n const analyticsEntries = parsedReports.flatMap(report => report.analyticsEntries);\n const totalUsersValues = parsedReports\n .map(report => report.analyticsTotalUsers)\n .filter((totalUsers): totalUsers is number => totalUsers !== null);\n\n const analyticsTotalUsers =\n totalUsersValues.length > 0 ? totalUsersValues.reduce((sum, totalUsers) => sum + totalUsers, 0) : null;\n\n const analyticsLookup = analyticsEntries.reduce((lookup, entry) => {\n const key = createAnalyticsLookupKey(entry.eventAction, entry.eventLabel);\n const existingEntries = lookup.get(key) ?? [];\n\n existingEntries.push(entry);\n lookup.set(key, existingEntries);\n\n return lookup;\n }, new Map<string, AnalyticsReportEntry[]>());\n\n // Merge all uploaded date windows so the UI reflects the full period covered by the combined reports.\n const analyticsDateRanges = uploads.map(upload => parseAnalyticsDateRange(upload.csvRaw));\n const analyticsStartDates = analyticsDateRanges\n .map(range => range.startDate)\n .filter((date): date is Date => date !== null);\n const analyticsEndDates = analyticsDateRanges\n .map(range => range.endDate)\n .filter((date): date is Date => date !== null);\n\n const analyticsStartDate =\n analyticsStartDates.length > 0 ? new Date(Math.min(...analyticsStartDates.map(date => date.getTime()))) : null;\n const analyticsEndDate =\n analyticsEndDates.length > 0 ? new Date(Math.max(...analyticsEndDates.map(date => date.getTime()))) : null;\n\n const analyticsDateRangeLabel =\n analyticsStartDate && analyticsEndDate\n ? `${formatDateInEnglish(analyticsStartDate)} - ${formatDateInEnglish(analyticsEndDate)}`\n : null;\n\n return { analyticsLookup, analyticsDateRangeLabel, analyticsTotalUsers };\n};\n\nexport type { AnalyticsAnalysisData, AnalyticsCsvUpload, AnalyticsReportEntry };\n"],"names":["START_DATE_PREFIX","END_DATE_PREFIX","COMPACT_DATE_RANGE_LINE_REGEX","LOOKUP_MAX_LENGTH","REQUIRED_ANALYTICS_HEADER_COLUMNS","REQUIRED_ANALYTICS_DIMENSION_COLUMNS","EVENT_COUNT_COLUMN_ALIASES","TOTAL_USERS_COLUMN_ALIASES","EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES","REQUIRED_ANALYTICS_HEADER_ROW","ANALYTICS_OVERLAY_SELECTOR","EVENT_TYPE_ICON_CLASS","getEventLabelLookupPart","eventLabel","createAnalyticsLookupKey","eventAction","toEventType","eventTrigger","parseDateFromAnalyticsMetadata","value","normalizedValue","year","month","day","parsedDate","formatDateInEnglish","date","parseAnalyticsDateRange","csvRaw","lines","startDateLine","line","endDateLine","startDateRaw","endDateRaw","startDate","endDate","compactDateRangeLine","dateRangeMatch","compactStartDate","compactEndDate","getAnalyticsReportLines","parseCsvCells","cells","currentCell","isInsideQuotes","index","char","nextChar","normalizeHeaderColumn","column","findHeaderColumnIndex","headerColumns","aliases","normalizedAliases","alias","isNumericValue","isLikelyTextValue","buildHeaderBasedColumnIndices","eventActionIndex","eventLabelIndex","eventCountIndex","totalUsersIndex","eventCountPerUserIndex","isPlausibleAnalyticsColumnMapping","reportLines","columnIndices","dataRows","validatedRows","plausibleRows","action","label","eventCount","totalUsers","resolveAnalyticsColumnIndices","headerBasedColumnIndices","positionalColumnIndices","hasRequiredAnalyticsHeaderRow","requiredColumn","parseNumericMetric","numericValue","isMissingEventDimensionValue","isSummaryTotalUsersRow","rowIndex","extractAnalyticsTotalUsers","firstDataRowCells","parseAnalyticsReportCsv","reportName","entries","buildAnalyticsAnalysisData","uploads","parsedReports","upload","analyticsEntries","report","totalUsersValues","analyticsTotalUsers","sum","analyticsLookup","lookup","entry","key","existingEntries","analyticsDateRanges","analyticsStartDates","range","analyticsEndDates","analyticsStartDate","analyticsEndDate","analyticsDateRangeLabel"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { TRACKING_TRIGGER } from './googleAnalyticsUtils';
2
+ declare const TRACKING_ATTRIBUTE_KEYS: readonly ["data-track-ga-event-trigger", "data-track-ga-event-category", "data-track-ga-event-action", "data-track-ga-event-label", "data-track-ga-event-value"];
3
+ type TrackingAttributeKey = (typeof TRACKING_ATTRIBUTE_KEYS)[number];
4
+ export type AutoTrackingAttributes = Partial<Record<TrackingAttributeKey, string>>;
5
+ type GetAutoTrackingAttributesParams = {
6
+ autoTrackingKey: string | undefined;
7
+ props: Record<string, unknown>;
8
+ source?: string;
9
+ trigger?: TRACKING_TRIGGER;
10
+ category?: string;
11
+ action?: string;
12
+ };
13
+ export declare const getAutoTrackingAttributes: (params: GetAutoTrackingAttributesParams) => AutoTrackingAttributes;
14
+ export {};
@@ -0,0 +1,19 @@
1
+ const k = [
2
+ "data-track-ga-event-trigger",
3
+ "data-track-ga-event-category",
4
+ "data-track-ga-event-action",
5
+ "data-track-ga-event-label",
6
+ "data-track-ga-event-value"
7
+ ], s = (a) => k.some((t) => a[t] !== void 0), v = (a) => {
8
+ const { autoTrackingKey: t, props: c, source: e = "element", trigger: r = "click", category: n, action: g } = a, o = n || `${e} autoTracking`, i = g || `${e} ${r}`;
9
+ return s(c) ? {} : !t || t.trim() === "" ? {} : {
10
+ "data-track-ga-event-trigger": r,
11
+ "data-track-ga-event-category": o,
12
+ "data-track-ga-event-action": i,
13
+ "data-track-ga-event-label": t
14
+ };
15
+ };
16
+ export {
17
+ v as getAutoTrackingAttributes
18
+ };
19
+ //# sourceMappingURL=autoTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTracking.js","sources":["../../../src/utils/analytics/autoTracking.ts"],"sourcesContent":["import type { TRACKING_TRIGGER } from './googleAnalyticsUtils';\n\nconst TRACKING_ATTRIBUTE_KEYS = [\n 'data-track-ga-event-trigger',\n 'data-track-ga-event-category',\n 'data-track-ga-event-action',\n 'data-track-ga-event-label',\n 'data-track-ga-event-value',\n] as const;\n\ntype TrackingAttributeKey = (typeof TRACKING_ATTRIBUTE_KEYS)[number];\n\nexport type AutoTrackingAttributes = Partial<Record<TrackingAttributeKey, string>>;\n\ntype GetAutoTrackingAttributesParams = {\n autoTrackingKey: string | undefined;\n props: Record<string, unknown>;\n source?: string;\n trigger?: TRACKING_TRIGGER;\n category?: string;\n action?: string;\n};\n\nconst hasExplicitTrackingAttributes = (props: Record<string, unknown>) =>\n TRACKING_ATTRIBUTE_KEYS.some(attributeKey => props[attributeKey] !== undefined);\n\nexport const getAutoTrackingAttributes = (params: GetAutoTrackingAttributesParams): AutoTrackingAttributes => {\n const { autoTrackingKey, props, source = 'element', trigger = 'click', category, action } = params;\n const resolvedCategory = category || `${source} autoTracking`;\n const resolvedAction = action || `${source} ${trigger}`;\n\n // Never override explicit tracking attributes provided by consumers.\n if (hasExplicitTrackingAttributes(props)) {\n return {};\n }\n\n if (!autoTrackingKey || autoTrackingKey.trim() === '') {\n return {};\n }\n\n return {\n 'data-track-ga-event-trigger': trigger,\n 'data-track-ga-event-category': resolvedCategory,\n 'data-track-ga-event-action': resolvedAction,\n 'data-track-ga-event-label': autoTrackingKey,\n };\n};\n"],"names":["TRACKING_ATTRIBUTE_KEYS","hasExplicitTrackingAttributes","props","attributeKey","getAutoTrackingAttributes","params","autoTrackingKey","source","trigger","category","action","resolvedCategory","resolvedAction"],"mappings":"AAEA,MAAMA,IAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAeMC,IAAgC,CAACC,MACnCF,EAAwB,KAAK,CAAAG,MAAgBD,EAAMC,CAAY,MAAM,MAAS,GAErEC,IAA4B,CAACC,MAAoE;AAC1G,QAAM,EAAE,iBAAAC,GAAiB,OAAAJ,GAAO,QAAAK,IAAS,WAAW,SAAAC,IAAU,SAAS,UAAAC,GAAU,QAAAC,EAAA,IAAWL,GACtFM,IAAmBF,KAAY,GAAGF,CAAM,iBACxCK,IAAiBF,KAAU,GAAGH,CAAM,IAAIC,CAAO;AAGrD,SAAIP,EAA8BC,CAAK,IAC5B,CAAA,IAGP,CAACI,KAAmBA,EAAgB,KAAA,MAAW,KACxC,CAAA,IAGJ;AAAA,IACH,+BAA+BE;AAAA,IAC/B,gCAAgCG;AAAA,IAChC,8BAA8BC;AAAA,IAC9B,6BAA6BN;AAAA,EAAA;AAErC;"}
@@ -0,0 +1,36 @@
1
+ type AnalyticsOverlayTooltipTrackingData = {
2
+ eventAction: string;
3
+ eventLabel: string;
4
+ eventTrigger: 'click' | 'visibility';
5
+ };
6
+ declare const CAMPAIGN_QUERY_PARAM_CONFIG: readonly [{
7
+ readonly queryParam: "utm_source";
8
+ readonly label: "Source";
9
+ }, {
10
+ readonly queryParam: "utm_medium";
11
+ readonly label: "Medium";
12
+ }, {
13
+ readonly queryParam: "utm_campaign";
14
+ readonly label: "Campaign";
15
+ }, {
16
+ readonly queryParam: "utm_content";
17
+ readonly label: "Content";
18
+ }, {
19
+ readonly queryParam: "utm_term";
20
+ readonly label: "Term";
21
+ }];
22
+ type CampaignQueryParam = (typeof CAMPAIGN_QUERY_PARAM_CONFIG)[number]['queryParam'];
23
+ type AnalyticsOverlayTooltipCampaignData = Partial<Record<CampaignQueryParam, string>>;
24
+ type CreateAnalyticsOverlayTooltipProps = {
25
+ overlayRoot: HTMLElement;
26
+ trackingData: AnalyticsOverlayTooltipTrackingData;
27
+ totalEventCount: number;
28
+ totalUserCount: number;
29
+ analyticsTotalUsers: number | null;
30
+ clickEvent: MouseEvent;
31
+ trackedElement: HTMLElement;
32
+ };
33
+ export declare const extractCampaignTrackingDataFromHref: (href: string, baseHref?: string) => AnalyticsOverlayTooltipCampaignData | null;
34
+ export declare const extractCampaignTrackingDataFromElement: (trackedElement: HTMLElement) => Partial<Record<"utm_source" | "utm_medium" | "utm_campaign" | "utm_content" | "utm_term", string>> | null;
35
+ export declare const createAnalyticsOverlayTooltip: (props: CreateAnalyticsOverlayTooltipProps) => HTMLDivElement;
36
+ export type { AnalyticsOverlayTooltipCampaignData, AnalyticsOverlayTooltipTrackingData, CreateAnalyticsOverlayTooltipProps, };
@@ -0,0 +1,203 @@
1
+ const k = [
2
+ { queryParam: "utm_source", label: "Source" },
3
+ { queryParam: "utm_medium", label: "Medium" },
4
+ { queryParam: "utm_campaign", label: "Campaign" },
5
+ { queryParam: "utm_content", label: "Content" },
6
+ { queryParam: "utm_term", label: "Term" }
7
+ ], b = new Intl.NumberFormat("en-US", {
8
+ minimumFractionDigits: 0,
9
+ maximumFractionDigits: 2
10
+ }), L = (t, i) => {
11
+ const n = document.createElement("span");
12
+ return n.classList.add("rioglyph", t, i), n;
13
+ }, u = (t) => {
14
+ const { iconClass: i, text: n } = t, a = document.createElement("div");
15
+ a.classList.add(
16
+ "display-flex",
17
+ "align-items-center",
18
+ "gap-5",
19
+ "text-medium",
20
+ "text-size-16",
21
+ "line-height-16",
22
+ "margin-bottom--3"
23
+ ), a.appendChild(L(i, "text-size-16"));
24
+ const r = document.createElement("span");
25
+ return r.textContent = n, a.appendChild(r), a;
26
+ }, C = () => {
27
+ const t = document.createElement("div");
28
+ return t.classList.add("rounded", "padding-10", "bg-decent", "display-flex", "flex-column", "gap-5", "shadow-accent"), t;
29
+ }, o = (t) => {
30
+ const { iconClass: i, label: n, right: a } = t, r = document.createElement("div");
31
+ r.classList.add("display-flex", "align-items-center", "gap-5");
32
+ const l = document.createElement("div");
33
+ l.classList.add("display-flex", "align-items-center", "gap-5", "min-width-80");
34
+ const p = L(i, "text-size-14");
35
+ l.appendChild(p);
36
+ const s = document.createElement("div");
37
+ s.classList.add("text-medium"), s.textContent = n, l.appendChild(s), r.appendChild(l);
38
+ const e = document.createElement("div");
39
+ if (e.classList.add("flex-1-1", "text-right"), typeof a == "string") {
40
+ const c = document.createElement("div");
41
+ c.classList.add("word-break-all", "text-bold"), c.textContent = a, e.appendChild(c);
42
+ } else
43
+ e.appendChild(a);
44
+ return r.appendChild(e), r;
45
+ }, f = (t) => t === null ? "n/a" : `${b.format(t)}%`, N = () => typeof window < "u" && /^https?:/i.test(window.location.href) ? window.location.href : "https://rio.cloud", O = (t, i = N()) => {
46
+ try {
47
+ const n = new URL(t, i), a = {};
48
+ return k.forEach(({ queryParam: r }) => {
49
+ const l = n.searchParams.get(r)?.trim();
50
+ l && (a[r] = l);
51
+ }), Object.keys(a).length > 0 ? a : null;
52
+ } catch {
53
+ return null;
54
+ }
55
+ }, V = (t) => {
56
+ const i = t.getAttribute("href")?.trim() ?? t.closest("a[href]")?.href?.trim();
57
+ return i ? O(i) : null;
58
+ }, G = (t) => {
59
+ const { eventTrigger: i, totalEventCount: n, analyticsTotalUsers: a } = t;
60
+ return a === null || a <= 0 ? null : i === "click" || i === "visibility" ? n / a * 100 : null;
61
+ }, S = (t) => {
62
+ const {
63
+ overlayRoot: i,
64
+ trackingData: n,
65
+ totalEventCount: a,
66
+ totalUserCount: r,
67
+ analyticsTotalUsers: l,
68
+ clickEvent: p,
69
+ trackedElement: s
70
+ } = t, e = document.createElement("div");
71
+ e.setAttribute("data-analytics-overlay-tooltip", "true"), e.classList.add(
72
+ "position-fixed",
73
+ "pointer-events-all",
74
+ "z-index-max",
75
+ "rounded",
76
+ "padding-15",
77
+ "shadow-focused",
78
+ "bg-secondary",
79
+ "text-color-white",
80
+ "max-width-350",
81
+ "width-100pct",
82
+ "word-break-all",
83
+ "display-flex",
84
+ "flex-column",
85
+ "gap-10",
86
+ "line-height-125rel"
87
+ );
88
+ const c = n.eventTrigger === "click" ? "Clicks" : "Views", A = n.eventTrigger === "click" ? "rioglyph-click" : "rioglyph-eye-open", R = n.eventTrigger === "click" ? "Click rate" : "View rate", U = r > 0 ? a / r * 100 : null, v = G({
89
+ eventTrigger: n.eventTrigger,
90
+ totalEventCount: a,
91
+ analyticsTotalUsers: l
92
+ }), _ = l !== null && l > 0 ? r / l * 100 : null, D = u({
93
+ iconClass: "rioglyph-user",
94
+ text: "Event users"
95
+ });
96
+ e.appendChild(D);
97
+ const g = C();
98
+ g.appendChild(
99
+ o({
100
+ iconClass: "rioglyph-user",
101
+ label: "Event users",
102
+ right: `${b.format(r)}`
103
+ })
104
+ ), l !== null && (g.appendChild(
105
+ o({
106
+ iconClass: "rioglyph-user-group",
107
+ label: "Total users",
108
+ right: `${b.format(l)}`
109
+ })
110
+ ), g.appendChild(
111
+ o({
112
+ iconClass: "rioglyph-bar-chart-box",
113
+ label: "Event rate (all users)",
114
+ right: f(_)
115
+ })
116
+ )), e.appendChild(g);
117
+ const F = u({
118
+ iconClass: "rioglyph-stats",
119
+ text: "Element performance"
120
+ });
121
+ e.appendChild(F);
122
+ const d = C();
123
+ d.appendChild(
124
+ o({
125
+ iconClass: A,
126
+ label: c,
127
+ right: `${b.format(a)}`
128
+ })
129
+ ), d.appendChild(
130
+ o({
131
+ iconClass: "rioglyph-bar-chart-box",
132
+ label: R,
133
+ right: f(U)
134
+ })
135
+ ), n.eventTrigger === "click" && l !== null && d.appendChild(
136
+ o({
137
+ iconClass: "rioglyph-bar-chart-box",
138
+ label: "Click rate (all users)",
139
+ right: f(v)
140
+ })
141
+ ), n.eventTrigger === "visibility" && l !== null && d.appendChild(
142
+ o({
143
+ iconClass: "rioglyph-bar-chart-box",
144
+ label: "View rate (all users)",
145
+ right: f(v)
146
+ })
147
+ ), e.appendChild(d);
148
+ const M = u({
149
+ iconClass: "rioglyph-info-sign",
150
+ text: "Tracking Attributes"
151
+ });
152
+ e.appendChild(M);
153
+ const h = C();
154
+ h.appendChild(
155
+ o({
156
+ iconClass: "rioglyph-cog",
157
+ label: "Action",
158
+ right: n.eventAction
159
+ })
160
+ ), h.appendChild(
161
+ o({
162
+ iconClass: "rioglyph-emergency-stop",
163
+ label: "Trigger",
164
+ right: n.eventTrigger
165
+ })
166
+ ), h.appendChild(
167
+ o({
168
+ iconClass: "rioglyph-tag",
169
+ label: "Label",
170
+ right: n.eventLabel
171
+ })
172
+ ), e.appendChild(h);
173
+ const w = V(s);
174
+ if (w) {
175
+ const $ = u({
176
+ iconClass: "rioglyph-megaphone",
177
+ text: "Campaign"
178
+ });
179
+ e.appendChild($);
180
+ const E = C();
181
+ k.forEach(({ queryParam: q, label: z }) => {
182
+ const P = w[q];
183
+ P && E.appendChild(
184
+ o({
185
+ iconClass: "rioglyph-tag",
186
+ label: z,
187
+ right: P
188
+ })
189
+ );
190
+ }), e.appendChild(E);
191
+ }
192
+ const T = 12, m = 8;
193
+ i.appendChild(e);
194
+ let x = p.clientX + T, y = p.clientY + T;
195
+ const H = window.innerWidth - e.offsetWidth - m, I = window.innerHeight - e.offsetHeight - m;
196
+ return x = Math.max(m, Math.min(x, H)), y = Math.max(m, Math.min(y, I)), e.style.left = `${x}px`, e.style.top = `${y}px`, e;
197
+ };
198
+ export {
199
+ S as createAnalyticsOverlayTooltip,
200
+ V as extractCampaignTrackingDataFromElement,
201
+ O as extractCampaignTrackingDataFromHref
202
+ };
203
+ //# sourceMappingURL=createAnalyticsOverlayTooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAnalyticsOverlayTooltip.js","sources":["../../../src/utils/analytics/createAnalyticsOverlayTooltip.ts"],"sourcesContent":["type AnalyticsOverlayTooltipTrackingData = {\n eventAction: string;\n eventLabel: string;\n eventTrigger: 'click' | 'visibility';\n};\n\nconst CAMPAIGN_QUERY_PARAM_CONFIG = [\n { queryParam: 'utm_source', label: 'Source' },\n { queryParam: 'utm_medium', label: 'Medium' },\n { queryParam: 'utm_campaign', label: 'Campaign' },\n { queryParam: 'utm_content', label: 'Content' },\n { queryParam: 'utm_term', label: 'Term' },\n] as const;\n\ntype CampaignQueryParam = (typeof CAMPAIGN_QUERY_PARAM_CONFIG)[number]['queryParam'];\ntype AnalyticsOverlayTooltipCampaignData = Partial<Record<CampaignQueryParam, string>>;\n\ntype CreateAnalyticsOverlayTooltipProps = {\n overlayRoot: HTMLElement;\n trackingData: AnalyticsOverlayTooltipTrackingData;\n totalEventCount: number;\n totalUserCount: number;\n analyticsTotalUsers: number | null;\n clickEvent: MouseEvent;\n trackedElement: HTMLElement;\n};\n\nconst numberFormatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n});\n\nconst createIcon = (iconClass: string, sizeClass: string) => {\n const icon = document.createElement('span');\n icon.classList.add('rioglyph', iconClass, sizeClass);\n return icon;\n};\n\nconst createTitle = (props: { iconClass: string; text: string }) => {\n const { iconClass, text } = props;\n const title = document.createElement('div');\n title.classList.add(\n 'display-flex',\n 'align-items-center',\n 'gap-5',\n 'text-medium',\n 'text-size-16',\n 'line-height-16',\n 'margin-bottom--3'\n );\n title.appendChild(createIcon(iconClass, 'text-size-16'));\n\n const titleText = document.createElement('span');\n titleText.textContent = text;\n title.appendChild(titleText);\n\n return title;\n};\n\nconst createPanel = () => {\n const panel = document.createElement('div');\n panel.classList.add('rounded', 'padding-10', 'bg-decent', 'display-flex', 'flex-column', 'gap-5', 'shadow-accent');\n return panel;\n};\n\nconst createInfoRow = (props: { iconClass: string; label: string; right: Node | string }) => {\n const { iconClass, label, right } = props;\n\n const row = document.createElement('div');\n row.classList.add('display-flex', 'align-items-center', 'gap-5');\n\n const leftContainer = document.createElement('div');\n leftContainer.classList.add('display-flex', 'align-items-center', 'gap-5', 'min-width-80');\n\n const icon = createIcon(iconClass, 'text-size-14');\n leftContainer.appendChild(icon);\n\n const labelNode = document.createElement('div');\n labelNode.classList.add('text-medium');\n labelNode.textContent = label;\n leftContainer.appendChild(labelNode);\n row.appendChild(leftContainer);\n\n const rightContainer = document.createElement('div');\n rightContainer.classList.add('flex-1-1', 'text-right');\n\n if (typeof right === 'string') {\n const rightText = document.createElement('div');\n rightText.classList.add('word-break-all', 'text-bold');\n rightText.textContent = right;\n rightContainer.appendChild(rightText);\n } else {\n rightContainer.appendChild(right);\n }\n\n row.appendChild(rightContainer);\n return row;\n};\n\nconst formatPercentage = (value: number | null) => (value === null ? 'n/a' : `${numberFormatter.format(value)}%`);\n\nconst getUrlParsingBaseHref = () => {\n if (typeof window !== 'undefined' && /^https?:/i.test(window.location.href)) {\n return window.location.href;\n }\n\n return 'https://rio.cloud';\n};\n\nexport const extractCampaignTrackingDataFromHref = (\n href: string,\n baseHref = getUrlParsingBaseHref()\n): AnalyticsOverlayTooltipCampaignData | null => {\n try {\n const url = new URL(href, baseHref);\n const campaignData: AnalyticsOverlayTooltipCampaignData = {};\n\n CAMPAIGN_QUERY_PARAM_CONFIG.forEach(({ queryParam }) => {\n const value = url.searchParams.get(queryParam)?.trim();\n if (value) {\n campaignData[queryParam] = value;\n }\n });\n\n return Object.keys(campaignData).length > 0 ? campaignData : null;\n } catch {\n return null;\n }\n};\n\nexport const extractCampaignTrackingDataFromElement = (trackedElement: HTMLElement) => {\n const href =\n trackedElement.getAttribute('href')?.trim() ?? trackedElement.closest<HTMLElement>('a[href]')?.href?.trim();\n\n if (!href) {\n return null;\n }\n\n return extractCampaignTrackingDataFromHref(href);\n};\n\nconst calculateAllUsersRatePercentage = (props: {\n eventTrigger: 'click' | 'visibility';\n totalEventCount: number;\n analyticsTotalUsers: number | null;\n}) => {\n const { eventTrigger, totalEventCount, analyticsTotalUsers } = props;\n\n if (analyticsTotalUsers === null || analyticsTotalUsers <= 0) {\n return null;\n }\n\n if (eventTrigger === 'click' || eventTrigger === 'visibility') {\n return (totalEventCount / analyticsTotalUsers) * 100;\n }\n\n return null;\n};\n\nexport const createAnalyticsOverlayTooltip = (props: CreateAnalyticsOverlayTooltipProps) => {\n const {\n overlayRoot,\n trackingData,\n totalEventCount,\n totalUserCount,\n analyticsTotalUsers,\n clickEvent,\n trackedElement,\n } = props;\n const tooltip = document.createElement('div');\n tooltip.setAttribute('data-analytics-overlay-tooltip', 'true');\n tooltip.classList.add(\n 'position-fixed',\n 'pointer-events-all',\n 'z-index-max',\n 'rounded',\n 'padding-15',\n 'shadow-focused',\n 'bg-secondary',\n 'text-color-white',\n 'max-width-350',\n 'width-100pct',\n 'word-break-all',\n 'display-flex',\n 'flex-column',\n 'gap-10',\n 'line-height-125rel'\n );\n\n const metricLabel = trackingData.eventTrigger === 'click' ? 'Clicks' : 'Views';\n const metricIconClass = trackingData.eventTrigger === 'click' ? 'rioglyph-click' : 'rioglyph-eye-open';\n const elementRateLabel = trackingData.eventTrigger === 'click' ? 'Click rate' : 'View rate';\n\n const elementRatePercentage = totalUserCount > 0 ? (totalEventCount / totalUserCount) * 100 : null;\n const allUsersRatePercentage = calculateAllUsersRatePercentage({\n eventTrigger: trackingData.eventTrigger,\n totalEventCount,\n analyticsTotalUsers,\n });\n const interactionRateAllUsersPercentage =\n analyticsTotalUsers !== null && analyticsTotalUsers > 0 ? (totalUserCount / analyticsTotalUsers) * 100 : null;\n\n const overallTitle = createTitle({\n iconClass: 'rioglyph-user',\n text: 'Event users',\n });\n tooltip.appendChild(overallTitle);\n\n const overallPanel = createPanel();\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-user',\n label: 'Event users',\n right: `${numberFormatter.format(totalUserCount)}`,\n })\n );\n if (analyticsTotalUsers !== null) {\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-user-group',\n label: 'Total users',\n right: `${numberFormatter.format(analyticsTotalUsers)}`,\n })\n );\n\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'Event rate (all users)',\n right: formatPercentage(interactionRateAllUsersPercentage),\n })\n );\n }\n tooltip.appendChild(overallPanel);\n\n const performanceTitle = createTitle({\n iconClass: 'rioglyph-stats',\n text: 'Element performance',\n });\n tooltip.appendChild(performanceTitle);\n\n const performancePanel = createPanel();\n performancePanel.appendChild(\n createInfoRow({\n iconClass: metricIconClass,\n label: metricLabel,\n right: `${numberFormatter.format(totalEventCount)}`,\n })\n );\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: elementRateLabel,\n right: formatPercentage(elementRatePercentage),\n })\n );\n if (trackingData.eventTrigger === 'click' && analyticsTotalUsers !== null) {\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'Click rate (all users)',\n right: formatPercentage(allUsersRatePercentage),\n })\n );\n }\n if (trackingData.eventTrigger === 'visibility' && analyticsTotalUsers !== null) {\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'View rate (all users)',\n right: formatPercentage(allUsersRatePercentage),\n })\n );\n }\n tooltip.appendChild(performancePanel);\n\n const attributesHeader = createTitle({\n iconClass: 'rioglyph-info-sign',\n text: 'Tracking Attributes',\n });\n tooltip.appendChild(attributesHeader);\n\n const attributesPanel = createPanel();\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-cog',\n label: 'Action',\n right: trackingData.eventAction,\n })\n );\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-emergency-stop',\n label: 'Trigger',\n right: trackingData.eventTrigger,\n })\n );\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-tag',\n label: 'Label',\n right: trackingData.eventLabel,\n })\n );\n tooltip.appendChild(attributesPanel);\n\n const campaignData = extractCampaignTrackingDataFromElement(trackedElement);\n if (campaignData) {\n const campaignHeader = createTitle({\n iconClass: 'rioglyph-megaphone',\n text: 'Campaign',\n });\n tooltip.appendChild(campaignHeader);\n\n const campaignPanel = createPanel();\n CAMPAIGN_QUERY_PARAM_CONFIG.forEach(({ queryParam, label }) => {\n const value = campaignData[queryParam];\n if (!value) {\n return;\n }\n\n campaignPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-tag',\n label,\n right: value,\n })\n );\n });\n\n tooltip.appendChild(campaignPanel);\n }\n\n const pointerOffset = 12;\n const viewportPadding = 8;\n overlayRoot.appendChild(tooltip);\n\n let left = clickEvent.clientX + pointerOffset;\n let top = clickEvent.clientY + pointerOffset;\n const maxLeft = window.innerWidth - tooltip.offsetWidth - viewportPadding;\n const maxTop = window.innerHeight - tooltip.offsetHeight - viewportPadding;\n left = Math.max(viewportPadding, Math.min(left, maxLeft));\n top = Math.max(viewportPadding, Math.min(top, maxTop));\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n return tooltip;\n};\n\nexport type {\n AnalyticsOverlayTooltipCampaignData,\n AnalyticsOverlayTooltipTrackingData,\n CreateAnalyticsOverlayTooltipProps,\n};\n"],"names":["CAMPAIGN_QUERY_PARAM_CONFIG","numberFormatter","createIcon","iconClass","sizeClass","icon","createTitle","props","text","title","titleText","createPanel","panel","createInfoRow","label","right","row","leftContainer","labelNode","rightContainer","rightText","formatPercentage","value","getUrlParsingBaseHref","extractCampaignTrackingDataFromHref","href","baseHref","url","campaignData","queryParam","extractCampaignTrackingDataFromElement","trackedElement","calculateAllUsersRatePercentage","eventTrigger","totalEventCount","analyticsTotalUsers","createAnalyticsOverlayTooltip","overlayRoot","trackingData","totalUserCount","clickEvent","tooltip","metricLabel","metricIconClass","elementRateLabel","elementRatePercentage","allUsersRatePercentage","interactionRateAllUsersPercentage","overallTitle","overallPanel","performanceTitle","performancePanel","attributesHeader","attributesPanel","campaignHeader","campaignPanel","pointerOffset","viewportPadding","left","top","maxLeft","maxTop"],"mappings":"AAMA,MAAMA,IAA8B;AAAA,EAChC,EAAE,YAAY,cAAc,OAAO,SAAA;AAAA,EACnC,EAAE,YAAY,cAAc,OAAO,SAAA;AAAA,EACnC,EAAE,YAAY,gBAAgB,OAAO,WAAA;AAAA,EACrC,EAAE,YAAY,eAAe,OAAO,UAAA;AAAA,EACpC,EAAE,YAAY,YAAY,OAAO,OAAA;AACrC,GAeMC,IAAkB,IAAI,KAAK,aAAa,SAAS;AAAA,EACnD,uBAAuB;AAAA,EACvB,uBAAuB;AAC3B,CAAC,GAEKC,IAAa,CAACC,GAAmBC,MAAsB;AACzD,QAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,SAAAA,EAAK,UAAU,IAAI,YAAYF,GAAWC,CAAS,GAC5CC;AACX,GAEMC,IAAc,CAACC,MAA+C;AAChE,QAAM,EAAE,WAAAJ,GAAW,MAAAK,EAAA,IAASD,GACtBE,IAAQ,SAAS,cAAc,KAAK;AAC1C,EAAAA,EAAM,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEJA,EAAM,YAAYP,EAAWC,GAAW,cAAc,CAAC;AAEvD,QAAMO,IAAY,SAAS,cAAc,MAAM;AAC/C,SAAAA,EAAU,cAAcF,GACxBC,EAAM,YAAYC,CAAS,GAEpBD;AACX,GAEME,IAAc,MAAM;AACtB,QAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,SAAAA,EAAM,UAAU,IAAI,WAAW,cAAc,aAAa,gBAAgB,eAAe,SAAS,eAAe,GAC1GA;AACX,GAEMC,IAAgB,CAACN,MAAsE;AACzF,QAAM,EAAE,WAAAJ,GAAW,OAAAW,GAAO,OAAAC,EAAA,IAAUR,GAE9BS,IAAM,SAAS,cAAc,KAAK;AACxC,EAAAA,EAAI,UAAU,IAAI,gBAAgB,sBAAsB,OAAO;AAE/D,QAAMC,IAAgB,SAAS,cAAc,KAAK;AAClD,EAAAA,EAAc,UAAU,IAAI,gBAAgB,sBAAsB,SAAS,cAAc;AAEzF,QAAMZ,IAAOH,EAAWC,GAAW,cAAc;AACjD,EAAAc,EAAc,YAAYZ,CAAI;AAE9B,QAAMa,IAAY,SAAS,cAAc,KAAK;AAC9C,EAAAA,EAAU,UAAU,IAAI,aAAa,GACrCA,EAAU,cAAcJ,GACxBG,EAAc,YAAYC,CAAS,GACnCF,EAAI,YAAYC,CAAa;AAE7B,QAAME,IAAiB,SAAS,cAAc,KAAK;AAGnD,MAFAA,EAAe,UAAU,IAAI,YAAY,YAAY,GAEjD,OAAOJ,KAAU,UAAU;AAC3B,UAAMK,IAAY,SAAS,cAAc,KAAK;AAC9C,IAAAA,EAAU,UAAU,IAAI,kBAAkB,WAAW,GACrDA,EAAU,cAAcL,GACxBI,EAAe,YAAYC,CAAS;AAAA,EACxC;AACI,IAAAD,EAAe,YAAYJ,CAAK;AAGpC,SAAAC,EAAI,YAAYG,CAAc,GACvBH;AACX,GAEMK,IAAmB,CAACC,MAA0BA,MAAU,OAAO,QAAQ,GAAGrB,EAAgB,OAAOqB,CAAK,CAAC,KAEvGC,IAAwB,MACtB,OAAO,SAAW,OAAe,YAAY,KAAK,OAAO,SAAS,IAAI,IAC/D,OAAO,SAAS,OAGpB,qBAGEC,IAAsC,CAC/CC,GACAC,IAAWH,QACkC;AAC7C,MAAI;AACA,UAAMI,IAAM,IAAI,IAAIF,GAAMC,CAAQ,GAC5BE,IAAoD,CAAA;AAE1D,WAAA5B,EAA4B,QAAQ,CAAC,EAAE,YAAA6B,QAAiB;AACpD,YAAMP,IAAQK,EAAI,aAAa,IAAIE,CAAU,GAAG,KAAA;AAChD,MAAIP,MACAM,EAAaC,CAAU,IAAIP;AAAA,IAEnC,CAAC,GAEM,OAAO,KAAKM,CAAY,EAAE,SAAS,IAAIA,IAAe;AAAA,EACjE,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ,GAEaE,IAAyC,CAACC,MAAgC;AACnF,QAAMN,IACFM,EAAe,aAAa,MAAM,GAAG,UAAUA,EAAe,QAAqB,SAAS,GAAG,MAAM,KAAA;AAEzG,SAAKN,IAIED,EAAoCC,CAAI,IAHpC;AAIf,GAEMO,IAAkC,CAACzB,MAInC;AACF,QAAM,EAAE,cAAA0B,GAAc,iBAAAC,GAAiB,qBAAAC,EAAA,IAAwB5B;AAE/D,SAAI4B,MAAwB,QAAQA,KAAuB,IAChD,OAGPF,MAAiB,WAAWA,MAAiB,eACrCC,IAAkBC,IAAuB,MAG9C;AACX,GAEaC,IAAgC,CAAC7B,MAA8C;AACxF,QAAM;AAAA,IACF,aAAA8B;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAJ;AAAA,IACA,gBAAAK;AAAA,IACA,qBAAAJ;AAAA,IACA,YAAAK;AAAA,IACA,gBAAAT;AAAA,EAAA,IACAxB,GACEkC,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAA,EAAQ,aAAa,kCAAkC,MAAM,GAC7DA,EAAQ,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGJ,QAAMC,IAAcJ,EAAa,iBAAiB,UAAU,WAAW,SACjEK,IAAkBL,EAAa,iBAAiB,UAAU,mBAAmB,qBAC7EM,IAAmBN,EAAa,iBAAiB,UAAU,eAAe,aAE1EO,IAAwBN,IAAiB,IAAKL,IAAkBK,IAAkB,MAAM,MACxFO,IAAyBd,EAAgC;AAAA,IAC3D,cAAcM,EAAa;AAAA,IAC3B,iBAAAJ;AAAA,IACA,qBAAAC;AAAA,EAAA,CACH,GACKY,IACFZ,MAAwB,QAAQA,IAAsB,IAAKI,IAAiBJ,IAAuB,MAAM,MAEvGa,IAAe1C,EAAY;AAAA,IAC7B,WAAW;AAAA,IACX,MAAM;AAAA,EAAA,CACT;AACD,EAAAmC,EAAQ,YAAYO,CAAY;AAEhC,QAAMC,IAAetC,EAAA;AACrB,EAAAsC,EAAa;AAAA,IACTpC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO,GAAGZ,EAAgB,OAAOsC,CAAc,CAAC;AAAA,IAAA,CACnD;AAAA,EAAA,GAEDJ,MAAwB,SACxBc,EAAa;AAAA,IACTpC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO,GAAGZ,EAAgB,OAAOkC,CAAmB,CAAC;AAAA,IAAA,CACxD;AAAA,EAAA,GAGLc,EAAa;AAAA,IACTpC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOQ,EAAiB0B,CAAiC;AAAA,IAAA,CAC5D;AAAA,EAAA,IAGTN,EAAQ,YAAYQ,CAAY;AAEhC,QAAMC,IAAmB5C,EAAY;AAAA,IACjC,WAAW;AAAA,IACX,MAAM;AAAA,EAAA,CACT;AACD,EAAAmC,EAAQ,YAAYS,CAAgB;AAEpC,QAAMC,IAAmBxC,EAAA;AACzB,EAAAwC,EAAiB;AAAA,IACbtC,EAAc;AAAA,MACV,WAAW8B;AAAA,MACX,OAAOD;AAAA,MACP,OAAO,GAAGzC,EAAgB,OAAOiC,CAAe,CAAC;AAAA,IAAA,CACpD;AAAA,EAAA,GAELiB,EAAiB;AAAA,IACbtC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO+B;AAAA,MACP,OAAOvB,EAAiBwB,CAAqB;AAAA,IAAA,CAChD;AAAA,EAAA,GAEDP,EAAa,iBAAiB,WAAWH,MAAwB,QACjEgB,EAAiB;AAAA,IACbtC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOQ,EAAiByB,CAAsB;AAAA,IAAA,CACjD;AAAA,EAAA,GAGLR,EAAa,iBAAiB,gBAAgBH,MAAwB,QACtEgB,EAAiB;AAAA,IACbtC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOQ,EAAiByB,CAAsB;AAAA,IAAA,CACjD;AAAA,EAAA,GAGTL,EAAQ,YAAYU,CAAgB;AAEpC,QAAMC,IAAmB9C,EAAY;AAAA,IACjC,WAAW;AAAA,IACX,MAAM;AAAA,EAAA,CACT;AACD,EAAAmC,EAAQ,YAAYW,CAAgB;AAEpC,QAAMC,IAAkB1C,EAAA;AACxB,EAAA0C,EAAgB;AAAA,IACZxC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOyB,EAAa;AAAA,IAAA,CACvB;AAAA,EAAA,GAELe,EAAgB;AAAA,IACZxC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOyB,EAAa;AAAA,IAAA,CACvB;AAAA,EAAA,GAELe,EAAgB;AAAA,IACZxC,EAAc;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAOyB,EAAa;AAAA,IAAA,CACvB;AAAA,EAAA,GAELG,EAAQ,YAAYY,CAAe;AAEnC,QAAMzB,IAAeE,EAAuCC,CAAc;AAC1E,MAAIH,GAAc;AACd,UAAM0B,IAAiBhD,EAAY;AAAA,MAC/B,WAAW;AAAA,MACX,MAAM;AAAA,IAAA,CACT;AACD,IAAAmC,EAAQ,YAAYa,CAAc;AAElC,UAAMC,IAAgB5C,EAAA;AACtB,IAAAX,EAA4B,QAAQ,CAAC,EAAE,YAAA6B,GAAY,OAAAf,QAAY;AAC3D,YAAMQ,IAAQM,EAAaC,CAAU;AACrC,MAAKP,KAILiC,EAAc;AAAA,QACV1C,EAAc;AAAA,UACV,WAAW;AAAA,UACX,OAAAC;AAAA,UACA,OAAOQ;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAET,CAAC,GAEDmB,EAAQ,YAAYc,CAAa;AAAA,EACrC;AAEA,QAAMC,IAAgB,IAChBC,IAAkB;AACxB,EAAApB,EAAY,YAAYI,CAAO;AAE/B,MAAIiB,IAAOlB,EAAW,UAAUgB,GAC5BG,IAAMnB,EAAW,UAAUgB;AAC/B,QAAMI,IAAU,OAAO,aAAanB,EAAQ,cAAcgB,GACpDI,IAAS,OAAO,cAAcpB,EAAQ,eAAegB;AAC3D,SAAAC,IAAO,KAAK,IAAID,GAAiB,KAAK,IAAIC,GAAME,CAAO,CAAC,GACxDD,IAAM,KAAK,IAAIF,GAAiB,KAAK,IAAIE,GAAKE,CAAM,CAAC,GAErDpB,EAAQ,MAAM,OAAO,GAAGiB,CAAI,MAC5BjB,EAAQ,MAAM,MAAM,GAAGkB,CAAG,MAEnBlB;AACX;"}
@@ -0,0 +1,37 @@
1
+ declare global {
2
+ interface Window {
3
+ dataLayer?: unknown[];
4
+ }
5
+ }
6
+ export type GAEvent = {
7
+ category: string;
8
+ action: string;
9
+ label: string;
10
+ value?: string | number;
11
+ };
12
+ export declare const gaPush: (gaEvent: GAEvent) => void;
13
+ export declare const executeAndTrack: <Args extends unknown[], Result>(func: (...args: Args) => Result, value: GAEvent) => (...args: Args) => Result;
14
+ /**
15
+ * Approach 2: Tracking attributes (preferred)
16
+ *
17
+ * Use this to add DOM attributes to an element. These attributes can be utilized later
18
+ * by the AnalyticsAnalysisOverlay component.
19
+ */
20
+ export type TRACKING_TRIGGER = 'click' | 'visibility';
21
+ export type TrackingValues = {
22
+ trigger: TRACKING_TRIGGER;
23
+ category: string;
24
+ action?: string;
25
+ label?: string;
26
+ value?: string;
27
+ };
28
+ export type TrackingAttributes = {
29
+ 'data-track-ga-event-trigger': TRACKING_TRIGGER;
30
+ 'data-track-ga-event-category': string;
31
+ 'data-track-ga-event-action': string;
32
+ 'data-track-ga-event-label'?: string;
33
+ 'data-track-ga-event-value'?: string;
34
+ };
35
+ export declare const TRACKING_ACTIONS: Record<string, string>;
36
+ export declare const TRACKING_LABELS: Record<string, string>;
37
+ export declare const getTrackingAttributes: (param: TrackingValues) => TrackingAttributes;
@@ -0,0 +1,37 @@
1
+ import { LOOKUP_MAX_LENGTH as c } from "./analyticsAnalysisUtils.js";
2
+ const l = /* @__PURE__ */ new Set(), d = (e, a) => {
3
+ if (process.env.NODE_ENV === "production" || a.length <= c)
4
+ return;
5
+ const t = `${e}::${a}`;
6
+ l.has(t) || (l.add(t), console.warn(
7
+ `[Analytics] data-track-ga-event-label exceeds ${c} chars for action "${e}". Overlay mapping uses only the first ${c} chars.`
8
+ ));
9
+ }, u = () => typeof window < "u" && Array.isArray(window.dataLayer), g = (e) => {
10
+ if (!u())
11
+ return;
12
+ const a = {
13
+ event: "ga_event",
14
+ eventCategory: e.category,
15
+ eventAction: e.action,
16
+ eventLabel: e.label
17
+ };
18
+ e.value !== void 0 && e.value !== "" && (a.eventValue = e.value), window.dataLayer?.push(a);
19
+ }, y = (e, a) => (...t) => {
20
+ const n = e(...t);
21
+ return g(a), n;
22
+ }, A = {}, w = {}, L = (e) => {
23
+ const { trigger: a, category: t, action: n, label: r, value: s } = e, i = n || `action_${a}`, o = {
24
+ "data-track-ga-event-trigger": a,
25
+ "data-track-ga-event-category": t,
26
+ "data-track-ga-event-action": i
27
+ };
28
+ return r && (o["data-track-ga-event-label"] = r, d(i, r)), s && (o["data-track-ga-event-value"] = s), o;
29
+ };
30
+ export {
31
+ A as TRACKING_ACTIONS,
32
+ w as TRACKING_LABELS,
33
+ y as executeAndTrack,
34
+ g as gaPush,
35
+ L as getTrackingAttributes
36
+ };
37
+ //# sourceMappingURL=googleAnalyticsUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googleAnalyticsUtils.js","sources":["../../../src/utils/analytics/googleAnalyticsUtils.ts"],"sourcesContent":["import { LOOKUP_MAX_LENGTH } from './analyticsAnalysisUtils';\n\ndeclare global {\n interface Window {\n dataLayer?: unknown[];\n }\n}\n\nexport type GAEvent = {\n category: string;\n action: string;\n label: string;\n value?: string | number;\n};\n\ntype GADataLayerEvent = {\n event: 'ga_event';\n eventCategory: string;\n eventAction: string;\n eventLabel: string;\n eventValue?: string | number;\n};\n\nconst warnedLongTrackingLabels = new Set<string>();\n\nconst warnAboutLongTrackingLabel = (action: string, label: string) => {\n if (process.env.NODE_ENV === 'production' || label.length <= LOOKUP_MAX_LENGTH) {\n return;\n }\n\n const warningKey = `${action}::${label}`;\n if (warnedLongTrackingLabels.has(warningKey)) {\n return;\n }\n\n warnedLongTrackingLabels.add(warningKey);\n console.warn(\n `[Analytics] data-track-ga-event-label exceeds ${LOOKUP_MAX_LENGTH} chars for action \"${action}\". ` +\n `Overlay mapping uses only the first ${LOOKUP_MAX_LENGTH} chars.`\n );\n};\n\n/**\n * Approach 1: DataLayer push\n *\n * Use this to send events to Google Analytics imperatively, for example from UI callbacks.\n * This is also the only supported path for tracking hover interactions, since the\n * attribute-based tracking flow only supports click and visibility triggers.\n */\n\nconst isBrowserDataLayerAvailable = () => typeof window !== 'undefined' && Array.isArray(window.dataLayer);\n\nexport const gaPush = (gaEvent: GAEvent) => {\n if (!isBrowserDataLayerAvailable()) {\n return;\n }\n\n const payload: GADataLayerEvent = {\n event: 'ga_event',\n eventCategory: gaEvent.category,\n eventAction: gaEvent.action,\n eventLabel: gaEvent.label,\n };\n\n if (gaEvent.value !== undefined && gaEvent.value !== '') {\n payload.eventValue = gaEvent.value;\n }\n\n window.dataLayer?.push(payload);\n};\n\nexport const executeAndTrack =\n <Args extends unknown[], Result>(func: (...args: Args) => Result, value: GAEvent) =>\n (...args: Args): Result => {\n const result = func(...args);\n gaPush(value);\n return result;\n };\n\n/**\n * Approach 2: Tracking attributes (preferred)\n *\n * Use this to add DOM attributes to an element. These attributes can be utilized later\n * by the AnalyticsAnalysisOverlay component.\n */\n\nexport type TRACKING_TRIGGER = 'click' | 'visibility';\n\nexport type TrackingValues = {\n trigger: TRACKING_TRIGGER;\n category: string;\n action?: string;\n label?: string;\n value?: string;\n};\n\nexport type TrackingAttributes = {\n 'data-track-ga-event-trigger': TRACKING_TRIGGER;\n 'data-track-ga-event-category': string;\n 'data-track-ga-event-action': string;\n 'data-track-ga-event-label'?: string;\n 'data-track-ga-event-value'?: string;\n};\n\n// Application-specific maps to be filled by consuming apps.\nexport const TRACKING_ACTIONS: Record<string, string> = {};\n\n// Application-specific maps to be filled by consuming apps.\nexport const TRACKING_LABELS: Record<string, string> = {};\n\nexport const getTrackingAttributes = (param: TrackingValues): TrackingAttributes => {\n const { trigger, category, action, label, value } = param;\n const resolvedAction = action || `action_${trigger}`;\n\n const attributes: TrackingAttributes = {\n 'data-track-ga-event-trigger': trigger,\n 'data-track-ga-event-category': category,\n 'data-track-ga-event-action': resolvedAction,\n };\n\n if (label) {\n attributes['data-track-ga-event-label'] = label;\n warnAboutLongTrackingLabel(resolvedAction, label);\n }\n\n if (value) {\n attributes['data-track-ga-event-value'] = value;\n }\n\n return attributes;\n};\n"],"names":["warnedLongTrackingLabels","warnAboutLongTrackingLabel","action","label","LOOKUP_MAX_LENGTH","warningKey","isBrowserDataLayerAvailable","gaPush","gaEvent","payload","executeAndTrack","func","value","args","result","TRACKING_ACTIONS","TRACKING_LABELS","getTrackingAttributes","param","trigger","category","resolvedAction","attributes"],"mappings":";AAuBA,MAAMA,wBAA+B,IAAA,GAE/BC,IAA6B,CAACC,GAAgBC,MAAkB;AAClE,MAAI,QAAQ,IAAI,aAAa,gBAAgBA,EAAM,UAAUC;AACzD;AAGJ,QAAMC,IAAa,GAAGH,CAAM,KAAKC,CAAK;AACtC,EAAIH,EAAyB,IAAIK,CAAU,MAI3CL,EAAyB,IAAIK,CAAU,GACvC,QAAQ;AAAA,IACJ,iDAAiDD,CAAiB,sBAAsBF,CAAM,0CACnDE,CAAiB;AAAA,EAAA;AAEpE,GAUME,IAA8B,MAAM,OAAO,SAAW,OAAe,MAAM,QAAQ,OAAO,SAAS,GAE5FC,IAAS,CAACC,MAAqB;AACxC,MAAI,CAACF;AACD;AAGJ,QAAMG,IAA4B;AAAA,IAC9B,OAAO;AAAA,IACP,eAAeD,EAAQ;AAAA,IACvB,aAAaA,EAAQ;AAAA,IACrB,YAAYA,EAAQ;AAAA,EAAA;AAGxB,EAAIA,EAAQ,UAAU,UAAaA,EAAQ,UAAU,OACjDC,EAAQ,aAAaD,EAAQ,QAGjC,OAAO,WAAW,KAAKC,CAAO;AAClC,GAEaC,IACT,CAAiCC,GAAiCC,MAClE,IAAIC,MAAuB;AACvB,QAAMC,IAASH,EAAK,GAAGE,CAAI;AAC3B,SAAAN,EAAOK,CAAK,GACLE;AACX,GA4BSC,IAA2C,CAAA,GAG3CC,IAA0C,CAAA,GAE1CC,IAAwB,CAACC,MAA8C;AAChF,QAAM,EAAE,SAAAC,GAAS,UAAAC,GAAU,QAAAlB,GAAQ,OAAAC,GAAO,OAAAS,MAAUM,GAC9CG,IAAiBnB,KAAU,UAAUiB,CAAO,IAE5CG,IAAiC;AAAA,IACnC,+BAA+BH;AAAA,IAC/B,gCAAgCC;AAAA,IAChC,8BAA8BC;AAAA,EAAA;AAGlC,SAAIlB,MACAmB,EAAW,2BAA2B,IAAInB,GAC1CF,EAA2BoB,GAAgBlB,CAAK,IAGhDS,MACAU,EAAW,2BAA2B,IAAIV,IAGvCU;AACX;"}
@@ -0,0 +1,8 @@
1
+ import { AnalyticsReportEntry } from './analyticsAnalysisUtils';
2
+ type LogAnalyticsOverlayUnmatchedEntriesParams = {
3
+ analyticsLookup: Map<string, AnalyticsReportEntry[]>;
4
+ trackedElements: HTMLElement[];
5
+ previousFingerprint: string | null;
6
+ };
7
+ export declare const logAnalyticsOverlayUnmatchedEntries: (props: LogAnalyticsOverlayUnmatchedEntriesParams) => string;
8
+ export type { LogAnalyticsOverlayUnmatchedEntriesParams };
@@ -0,0 +1,61 @@
1
+ import { createAnalyticsLookupKey as k } from "./analyticsAnalysisUtils.js";
2
+ const f = (n, r, p) => {
3
+ const l = n.get(r) ?? /* @__PURE__ */ new Set();
4
+ l.add(p), n.set(r, l);
5
+ }, g = (n, r = 3) => !n || n.size === 0 ? "" : Array.from(n).slice(0, r).join(", "), w = (n) => n.toLowerCase().replace(/[\s,]+/g, " ").trim(), S = (n) => {
6
+ const { analyticsLookup: r, trackedElements: p, previousFingerprint: l } = n, b = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), v = /* @__PURE__ */ new Map(), A = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map();
7
+ p.forEach((t) => {
8
+ const e = t.getAttribute("data-track-ga-event-action"), i = t.getAttribute("data-track-ga-event-label");
9
+ if (!e || !i)
10
+ return;
11
+ const c = t.getAttribute("data-track-ga-event-trigger"), a = k(e, i), o = b.get(a) ?? {
12
+ hasSupportedTrigger: !1,
13
+ triggers: /* @__PURE__ */ new Set()
14
+ };
15
+ c && o.triggers.add(c), (c === "click" || c === "visibility") && (o.hasSupportedTrigger = !0), b.set(a, o), f(m, e, i), f(v, i, e);
16
+ const s = w(e);
17
+ f(A, s, i), f(h, s, e);
18
+ });
19
+ const $ = Array.from(r.values()).flat(), L = /* @__PURE__ */ new Set(), d = $.reduce((t, e) => {
20
+ const i = `${e.eventAction}::${e.eventLabel}`;
21
+ if (L.has(i))
22
+ return t;
23
+ L.add(i);
24
+ const c = k(e.eventAction, e.eventLabel), a = b.get(c);
25
+ if (a?.hasSupportedTrigger)
26
+ return t;
27
+ let o = "No frontend element with matching action and label was found.";
28
+ if (a && !a.hasSupportedTrigger) {
29
+ const s = g(a.triggers);
30
+ o = s.length > 0 ? `Element found, but trigger "${s}" is not supported. Use "click" or "visibility".` : 'Element found, but trigger is missing. Use "click" or "visibility".';
31
+ } else if (m.has(e.eventAction))
32
+ o = `Action exists in frontend, but label differs. Example labels: ${g(
33
+ m.get(e.eventAction)
34
+ )}`;
35
+ else if (v.has(e.eventLabel))
36
+ o = `Label exists in frontend, but action differs. Example actions: ${g(
37
+ v.get(e.eventLabel)
38
+ )}`;
39
+ else {
40
+ const s = w(e.eventAction), u = h.get(s), y = A.get(s);
41
+ u && u.size > 0 && (y?.has(e.eventLabel) ? o = `Action differs by formatting (e.g. commas/spaces). Example frontend actions: ${g(
42
+ u
43
+ )}` : o = `Possible action formatting mismatch. Example frontend actions: ${g(
44
+ u
45
+ )}`);
46
+ }
47
+ return t.push({
48
+ eventAction: e.eventAction,
49
+ eventLabel: e.eventLabel,
50
+ reason: o
51
+ }), t;
52
+ }, []), E = d.map((t) => `${t.eventAction}|${t.eventLabel}|${t.reason}`).sort().join(`
53
+ `);
54
+ return E === l ? l : (d.length > 0 && (console.groupCollapsed(
55
+ `[Analytics Overlay] ${d.length} CSV row(s) could not be matched to frontend elements`
56
+ ), console.table(d), console.groupEnd()), E);
57
+ };
58
+ export {
59
+ S as logAnalyticsOverlayUnmatchedEntries
60
+ };
61
+ //# sourceMappingURL=logAnalyticsOverlayUnmatchedEntries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logAnalyticsOverlayUnmatchedEntries.js","sources":["../../../src/utils/analytics/logAnalyticsOverlayUnmatchedEntries.ts"],"sourcesContent":["import { createAnalyticsLookupKey, type AnalyticsReportEntry } from './analyticsAnalysisUtils';\n\ntype LogAnalyticsOverlayUnmatchedEntriesParams = {\n analyticsLookup: Map<string, AnalyticsReportEntry[]>;\n trackedElements: HTMLElement[];\n previousFingerprint: string | null;\n};\n\ntype DomLookupInfo = {\n hasSupportedTrigger: boolean;\n triggers: Set<string>;\n};\n\ntype UnmatchedAnalyticsEntry = {\n eventAction: string;\n eventLabel: string;\n reason: string;\n};\n\nconst addToSetMap = (map: Map<string, Set<string>>, key: string, value: string) => {\n const values = map.get(key) ?? new Set<string>();\n values.add(value);\n map.set(key, values);\n};\n\nconst toListPreview = (values: Set<string> | undefined, maxItems = 3) => {\n if (!values || values.size === 0) {\n return '';\n }\n\n return Array.from(values).slice(0, maxItems).join(', ');\n};\n\nconst normalizeAction = (action: string) =>\n action\n .toLowerCase()\n .replace(/[\\s,]+/g, ' ')\n .trim();\n\nexport const logAnalyticsOverlayUnmatchedEntries = (props: LogAnalyticsOverlayUnmatchedEntriesParams) => {\n const { analyticsLookup, trackedElements, previousFingerprint } = props;\n\n const entriesByLookupKey = new Map<string, DomLookupInfo>();\n const labelsByAction = new Map<string, Set<string>>();\n const actionsByLabel = new Map<string, Set<string>>();\n const labelsByNormalizedAction = new Map<string, Set<string>>();\n const actionsByNormalizedAction = new Map<string, Set<string>>();\n\n trackedElements.forEach(element => {\n const eventAction = element.getAttribute('data-track-ga-event-action');\n const eventLabel = element.getAttribute('data-track-ga-event-label');\n\n if (!eventAction || !eventLabel) {\n return;\n }\n\n const eventTrigger = element.getAttribute('data-track-ga-event-trigger');\n const lookupKey = createAnalyticsLookupKey(eventAction, eventLabel);\n const lookupInfo = entriesByLookupKey.get(lookupKey) ?? {\n hasSupportedTrigger: false,\n triggers: new Set<string>(),\n };\n\n if (eventTrigger) {\n lookupInfo.triggers.add(eventTrigger);\n }\n\n if (eventTrigger === 'click' || eventTrigger === 'visibility') {\n lookupInfo.hasSupportedTrigger = true;\n }\n\n entriesByLookupKey.set(lookupKey, lookupInfo);\n addToSetMap(labelsByAction, eventAction, eventLabel);\n addToSetMap(actionsByLabel, eventLabel, eventAction);\n\n const normalizedAction = normalizeAction(eventAction);\n addToSetMap(labelsByNormalizedAction, normalizedAction, eventLabel);\n addToSetMap(actionsByNormalizedAction, normalizedAction, eventAction);\n });\n\n const allAnalyticsEntries = Array.from(analyticsLookup.values()).flat();\n const seenEntries = new Set<string>();\n const unmatchedEntries = allAnalyticsEntries.reduce((entries, entry) => {\n const uniqueEntryKey = `${entry.eventAction}::${entry.eventLabel}`;\n if (seenEntries.has(uniqueEntryKey)) {\n return entries;\n }\n seenEntries.add(uniqueEntryKey);\n\n const lookupKey = createAnalyticsLookupKey(entry.eventAction, entry.eventLabel);\n const domLookup = entriesByLookupKey.get(lookupKey);\n\n if (domLookup?.hasSupportedTrigger) {\n return entries;\n }\n\n let reason = 'No frontend element with matching action and label was found.';\n\n if (domLookup && !domLookup.hasSupportedTrigger) {\n const triggers = toListPreview(domLookup.triggers);\n reason =\n triggers.length > 0\n ? `Element found, but trigger \"${triggers}\" is not supported. Use \"click\" or \"visibility\".`\n : 'Element found, but trigger is missing. Use \"click\" or \"visibility\".';\n } else if (labelsByAction.has(entry.eventAction)) {\n reason = `Action exists in frontend, but label differs. Example labels: ${toListPreview(\n labelsByAction.get(entry.eventAction)\n )}`;\n } else if (actionsByLabel.has(entry.eventLabel)) {\n reason = `Label exists in frontend, but action differs. Example actions: ${toListPreview(\n actionsByLabel.get(entry.eventLabel)\n )}`;\n } else {\n const normalizedAction = normalizeAction(entry.eventAction);\n const normalizedActionMatches = actionsByNormalizedAction.get(normalizedAction);\n const normalizedActionLabels = labelsByNormalizedAction.get(normalizedAction);\n if (normalizedActionMatches && normalizedActionMatches.size > 0) {\n if (normalizedActionLabels?.has(entry.eventLabel)) {\n reason = `Action differs by formatting (e.g. commas/spaces). Example frontend actions: ${toListPreview(\n normalizedActionMatches\n )}`;\n } else {\n reason = `Possible action formatting mismatch. Example frontend actions: ${toListPreview(\n normalizedActionMatches\n )}`;\n }\n }\n }\n\n entries.push({\n eventAction: entry.eventAction,\n eventLabel: entry.eventLabel,\n reason,\n });\n return entries;\n }, [] as UnmatchedAnalyticsEntry[]);\n\n const fingerprint = unmatchedEntries\n .map(entry => `${entry.eventAction}|${entry.eventLabel}|${entry.reason}`)\n .sort()\n .join('\\n');\n\n if (fingerprint === previousFingerprint) {\n return previousFingerprint;\n }\n\n if (unmatchedEntries.length > 0) {\n console.groupCollapsed(\n `[Analytics Overlay] ${unmatchedEntries.length} CSV row(s) could not be matched to frontend elements`\n );\n console.table(unmatchedEntries);\n console.groupEnd();\n }\n\n return fingerprint;\n};\n\nexport type { LogAnalyticsOverlayUnmatchedEntriesParams };\n"],"names":["addToSetMap","map","key","value","values","toListPreview","maxItems","normalizeAction","action","logAnalyticsOverlayUnmatchedEntries","props","analyticsLookup","trackedElements","previousFingerprint","entriesByLookupKey","labelsByAction","actionsByLabel","labelsByNormalizedAction","actionsByNormalizedAction","element","eventAction","eventLabel","eventTrigger","lookupKey","createAnalyticsLookupKey","lookupInfo","normalizedAction","allAnalyticsEntries","seenEntries","unmatchedEntries","entries","entry","uniqueEntryKey","domLookup","reason","triggers","normalizedActionMatches","normalizedActionLabels","fingerprint"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { AnalyticsReportEntry } from './analyticsAnalysisUtils';
2
+ type UseAnalyticsOverlayDomProps = {
3
+ analyticsLookup: Map<string, AnalyticsReportEntry[]>;
4
+ overlayBackgroundOpacity: number;
5
+ showOverlayDetails: boolean;
6
+ showOverlayLabelText: boolean;
7
+ analyticsTotalUsers: number | null;
8
+ };
9
+ declare const useAnalyticsOverlayDom: (props: UseAnalyticsOverlayDomProps) => HTMLDivElement | null;
10
+ export default useAnalyticsOverlayDom;
11
+ export type { UseAnalyticsOverlayDomProps };