@rio-cloud/rio-uikit 2.2.1 → 2.3.0-beta.2

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 (475) hide show
  1. package/AnalyticsAnalysisOverlay.d.ts +1 -0
  2. package/AnalyticsAnalysisOverlay.js +5 -0
  3. package/AnalyticsAnalysisOverlay.js.map +1 -0
  4. package/DayPicker.js +6 -2
  5. package/DayPicker.js.map +1 -1
  6. package/DayPickerCalendar.d.ts +2 -0
  7. package/DayPickerCalendar.js +5 -0
  8. package/DayPickerCalendar.js.map +1 -0
  9. package/DayPickerPrototype.d.ts +2 -0
  10. package/DayPickerPrototype.js +5 -0
  11. package/DayPickerPrototype.js.map +1 -0
  12. package/Table.d.ts +2 -0
  13. package/Table.js +23 -0
  14. package/Table.js.map +1 -0
  15. package/TableCol.d.ts +2 -2
  16. package/TableCol.js +1 -1
  17. package/TableHead.d.ts +2 -2
  18. package/TableHead.js +1 -1
  19. package/TableNext.d.ts +2 -0
  20. package/TableNext.js +23 -0
  21. package/TableNext.js.map +1 -0
  22. package/TableSettingsDialog.d.ts +2 -2
  23. package/TableSettingsDialog.js +1 -1
  24. package/TableToolbar.js +4 -2
  25. package/TableToolbar.js.map +1 -1
  26. package/analyticsAnalysisUtils.d.ts +1 -0
  27. package/analyticsAnalysisUtils.js +13 -0
  28. package/analyticsAnalysisUtils.js.map +1 -0
  29. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.d.ts +18 -0
  30. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js +128 -0
  31. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js.map +1 -0
  32. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.d.ts +9 -0
  33. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js +73 -0
  34. package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js.map +1 -0
  35. package/components/applicationHeader/AppMenuContent.js.map +1 -1
  36. package/components/applicationHeader/ApplicationActionBar.js +4 -4
  37. package/components/applicationHeader/ApplicationActionBar.js.map +1 -1
  38. package/components/applicationHeader/CollapsedNavItem.js +5 -14
  39. package/components/applicationHeader/CollapsedNavItem.js.map +1 -1
  40. package/components/applicationHeader/NavItems.js +10 -10
  41. package/components/applicationHeader/NavItems.js.map +1 -1
  42. package/components/assetTree/AssetTree.js +23 -23
  43. package/components/assetTree/AssetTree.js.map +1 -1
  44. package/components/assetTree/Tree.js +13 -13
  45. package/components/assetTree/TreeNothingFound.js +2 -2
  46. package/components/assetTree/TreeNothingFound.js.map +1 -1
  47. package/components/assetTree/treeUtils.js.map +1 -1
  48. package/components/autosuggest/AutoSuggest.js +31 -31
  49. package/components/autosuggest/AutoSuggest.js.map +1 -1
  50. package/components/autosuggest/AutoSuggestAddons.js +9 -9
  51. package/components/autosuggest/AutoSuggestAddons.js.map +1 -1
  52. package/components/banner/BannerActions.js +2 -2
  53. package/components/banner/BannerActions.js.map +1 -1
  54. package/components/banner/BannerIcon.js +3 -3
  55. package/components/banner/BannerIcon.js.map +1 -1
  56. package/components/banner/BannerPage.js +4 -4
  57. package/components/banner/BannerPage.js.map +1 -1
  58. package/components/button/Button.d.ts +7 -0
  59. package/components/button/Button.js +73 -65
  60. package/components/button/Button.js.map +1 -1
  61. package/components/charts/Area.d.ts +5 -3
  62. package/components/charts/Area.js +4 -3
  63. package/components/charts/Area.js.map +1 -1
  64. package/components/charts/AreaChart.js.map +1 -1
  65. package/components/charts/ComposedChart.js.map +1 -1
  66. package/components/checkbox/Checkbox.js +18 -17
  67. package/components/checkbox/Checkbox.js.map +1 -1
  68. package/components/clearableInput/ClearableInput.d.ts +30 -0
  69. package/components/clearableInput/ClearableInput.js +81 -78
  70. package/components/clearableInput/ClearableInput.js.map +1 -1
  71. package/components/datepicker/DateRangePicker.js +0 -2
  72. package/components/datepicker/DateRangePicker.js.map +1 -1
  73. package/components/datepicker/DayPicker.d.ts +4 -51
  74. package/components/datepicker/DayPicker.js +264 -256
  75. package/components/datepicker/DayPicker.js.map +1 -1
  76. package/components/datepicker/DayPickerCalendar.d.ts +4 -0
  77. package/components/datepicker/DayPickerCalendar.js +129 -0
  78. package/components/datepicker/DayPickerCalendar.js.map +1 -0
  79. package/components/datepicker/DayPickerDropdown.d.ts +18 -0
  80. package/components/datepicker/DayPickerDropdown.js +75 -0
  81. package/components/datepicker/DayPickerDropdown.js.map +1 -0
  82. package/components/datepicker/DayPickerDropdownFooter.d.ts +7 -0
  83. package/components/datepicker/DayPickerDropdownFooter.js +7 -0
  84. package/components/datepicker/DayPickerDropdownFooter.js.map +1 -0
  85. package/components/datepicker/DayPickerDropdownSidebar.d.ts +8 -0
  86. package/components/datepicker/DayPickerDropdownSidebar.js +7 -0
  87. package/components/datepicker/DayPickerDropdownSidebar.js.map +1 -0
  88. package/components/datepicker/DayPickerInput.d.ts +28 -0
  89. package/components/datepicker/DayPickerInput.js +65 -0
  90. package/components/datepicker/DayPickerInput.js.map +1 -0
  91. package/components/datepicker/DayPickerPrototype.d.ts +53 -0
  92. package/components/datepicker/DayPickerPrototype.js +285 -0
  93. package/components/datepicker/DayPickerPrototype.js.map +1 -0
  94. package/components/datepicker/dayPickerRangeSelectionUtils.d.ts +15 -0
  95. package/components/datepicker/dayPickerRangeSelectionUtils.js +31 -0
  96. package/components/datepicker/dayPickerRangeSelectionUtils.js.map +1 -0
  97. package/components/datepicker/dayPickerTypes.d.ts +517 -0
  98. package/components/datepicker/dayPickerTypes.js +7 -0
  99. package/components/datepicker/dayPickerTypes.js.map +1 -0
  100. package/components/datepicker/dayPickerUtils.d.ts +10 -0
  101. package/components/datepicker/dayPickerUtils.js +92 -0
  102. package/components/datepicker/dayPickerUtils.js.map +1 -0
  103. package/components/datepicker/useDayPickerInputState.d.ts +32 -0
  104. package/components/datepicker/useDayPickerInputState.js +85 -0
  105. package/components/datepicker/useDayPickerInputState.js.map +1 -0
  106. package/components/datepicker/useStackedDayPickerCalendars.d.ts +5 -0
  107. package/components/datepicker/useStackedDayPickerCalendars.js +39 -0
  108. package/components/datepicker/useStackedDayPickerCalendars.js.map +1 -0
  109. package/components/dialog/Dialog.js.map +1 -1
  110. package/components/dialog/DialogHeader.js +23 -20
  111. package/components/dialog/DialogHeader.js.map +1 -1
  112. package/components/dialog/MediaDialog.js +1 -1
  113. package/components/dialog/MediaDialog.js.map +1 -1
  114. package/components/divider/Divider.js +6 -6
  115. package/components/dropdown/ButtonDropdown.d.ts +4 -0
  116. package/components/dropdown/ButtonDropdown.js +70 -68
  117. package/components/dropdown/ButtonDropdown.js.map +1 -1
  118. package/components/dropdown/DropdownToggleButton.d.ts +1 -0
  119. package/components/dropdown/DropdownToggleButton.js +17 -15
  120. package/components/dropdown/DropdownToggleButton.js.map +1 -1
  121. package/components/editableContent/EditableContent.js +7 -7
  122. package/components/editableContent/EditableContent.js.map +1 -1
  123. package/components/expander/ExpanderList.d.ts +5 -0
  124. package/components/expander/ExpanderList.js +25 -16
  125. package/components/expander/ExpanderList.js.map +1 -1
  126. package/components/expander/ExpanderPanel.d.ts +5 -0
  127. package/components/expander/ExpanderPanel.js +29 -28
  128. package/components/expander/ExpanderPanel.js.map +1 -1
  129. package/components/fade/FadeExpander.js +17 -20
  130. package/components/fade/FadeExpander.js.map +1 -1
  131. package/components/filepicker/FilePicker.js.map +1 -1
  132. package/components/loadMore/LoadMoreButton.d.ts +5 -0
  133. package/components/loadMore/LoadMoreButton.js +33 -29
  134. package/components/loadMore/LoadMoreButton.js.map +1 -1
  135. package/components/loadMore/LoadMoreProgress.js +6 -7
  136. package/components/map/components/Map.js +3 -3
  137. package/components/map/components/features/ContextMenu.js +13 -13
  138. package/components/map/components/features/ContextMenu.js.map +1 -1
  139. package/components/map/components/features/basics/InfoBubble.js.map +1 -1
  140. package/components/map/components/features/settings/MapSettingsTile.js.map +1 -1
  141. package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js +6 -6
  142. package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js.map +1 -1
  143. package/components/map/utils/eventHandling.js +18 -18
  144. package/components/map/utils/eventHandling.js.map +1 -1
  145. package/components/map/utils/positions.d.ts +1 -1
  146. package/components/map/utils/positions.js +15 -12
  147. package/components/map/utils/positions.js.map +1 -1
  148. package/components/map/utils/rendering.d.ts +1 -1
  149. package/components/map/utils/rendering.js +5 -5
  150. package/components/menuItems/MenuItems.js +6 -6
  151. package/components/menuItems/MenuItems.js.map +1 -1
  152. package/components/notification/NotificationsContainer.js.map +1 -1
  153. package/components/numberInput/NumberInput.js +57 -56
  154. package/components/numberInput/NumberInput.js.map +1 -1
  155. package/components/popover/Popover.js +3 -3
  156. package/components/popover/Popover.js.map +1 -1
  157. package/components/radiobutton/RadioCardGroup.js +3 -3
  158. package/components/resizer/Resizer.js +6 -3
  159. package/components/resizer/Resizer.js.map +1 -1
  160. package/components/rioglyph/RioglyphIconType.d.ts +1 -1
  161. package/components/selects/BaseSelectDropdown.js +34 -32
  162. package/components/selects/BaseSelectDropdown.js.map +1 -1
  163. package/components/selects/Multiselect.d.ts +6 -0
  164. package/components/selects/Multiselect.js +164 -150
  165. package/components/selects/Multiselect.js.map +1 -1
  166. package/components/selects/MultiselectTogglePlaceholder.js.map +1 -1
  167. package/components/selects/MultiselectToggleSelection.js +11 -11
  168. package/components/selects/MultiselectToggleSelection.js.map +1 -1
  169. package/components/selects/Select.js +39 -37
  170. package/components/selects/Select.js.map +1 -1
  171. package/components/sidebars/Sidebar.js +12 -12
  172. package/components/sidebars/Sidebar.js.map +1 -1
  173. package/components/sidebars/SidebarCloseButton.js +2 -2
  174. package/components/sidebars/SidebarCloseButton.js.map +1 -1
  175. package/components/smoothScrollbars/SmoothScrollbars.d.ts +4 -3
  176. package/components/smoothScrollbars/SmoothScrollbars.js +11 -11
  177. package/components/smoothScrollbars/SmoothScrollbars.js.map +1 -1
  178. package/components/states/CustomState.js.map +1 -1
  179. package/components/svgImage/svgConverter.js.map +1 -1
  180. package/components/table/Table.d.ts +46 -0
  181. package/components/table/Table.js +256 -0
  182. package/components/table/Table.js.map +1 -0
  183. package/components/table/Table.types.d.ts +379 -0
  184. package/components/table/TableBody.d.ts +70 -0
  185. package/components/table/TableBody.js +135 -0
  186. package/components/table/TableBody.js.map +1 -0
  187. package/components/table/TableCardsSorting.js +25 -32
  188. package/components/table/TableCardsSorting.js.map +1 -1
  189. package/components/table/TableColumn.d.ts +55 -0
  190. package/components/table/TableColumn.js +115 -0
  191. package/components/table/TableColumn.js.map +1 -0
  192. package/components/table/TableExpandedContentRow.d.ts +22 -0
  193. package/components/table/TableExpandedContentRow.js +110 -0
  194. package/components/table/TableExpandedContentRow.js.map +1 -0
  195. package/components/table/TableExpandedRow.d.ts +22 -0
  196. package/components/table/TableExpandedRow.js +150 -0
  197. package/components/table/TableExpandedRow.js.map +1 -0
  198. package/components/table/TableExpanderButton.d.ts +25 -0
  199. package/components/table/TableExpanderButton.js +24 -0
  200. package/components/table/TableExpanderButton.js.map +1 -0
  201. package/components/table/TableFooter.d.ts +17 -0
  202. package/components/table/TableFooter.js +52 -0
  203. package/components/table/TableFooter.js.map +1 -0
  204. package/components/table/TableGroupFooterRow.d.ts +18 -0
  205. package/components/table/TableGroupFooterRow.js +30 -0
  206. package/components/table/TableGroupFooterRow.js.map +1 -0
  207. package/components/table/TableGroupRow.d.ts +24 -0
  208. package/components/table/TableGroupRow.js +36 -0
  209. package/components/table/TableGroupRow.js.map +1 -0
  210. package/components/table/TableHeader.d.ts +14 -0
  211. package/components/table/TableHeader.js +107 -0
  212. package/components/table/TableHeader.js.map +1 -0
  213. package/components/table/TableHeaderColumn.d.ts +76 -0
  214. package/components/table/TableHeaderColumn.js +81 -0
  215. package/components/table/TableHeaderColumn.js.map +1 -0
  216. package/components/table/TableHeaderRow.d.ts +9 -0
  217. package/components/table/TableHeaderRow.js +14 -0
  218. package/components/table/TableHeaderRow.js.map +1 -0
  219. package/components/table/TableRow.d.ts +24 -0
  220. package/components/table/TableRow.js +111 -0
  221. package/components/table/TableRow.js.map +1 -0
  222. package/components/table/TableSpacerRow.d.ts +13 -0
  223. package/components/table/TableSpacerRow.js +29 -0
  224. package/components/table/TableSpacerRow.js.map +1 -0
  225. package/components/table/TableToolbar.d.ts +3 -0
  226. package/components/table/TableToolbar.js +49 -4
  227. package/components/table/TableToolbar.js.map +1 -1
  228. package/components/table/TableToolbarColumn.d.ts +31 -0
  229. package/components/table/TableToolbarColumn.js +33 -0
  230. package/components/table/TableToolbarColumn.js.map +1 -0
  231. package/components/table/TableViewToggles.d.ts +21 -3
  232. package/components/table/TableViewToggles.js +59 -87
  233. package/components/table/TableViewToggles.js.map +1 -1
  234. package/components/table/context/TableInteractionContext.d.ts +26 -0
  235. package/components/table/context/TableInteractionContext.js +7 -0
  236. package/components/table/context/TableInteractionContext.js.map +1 -0
  237. package/components/table/context/TableLayoutContext.d.ts +25 -0
  238. package/components/table/context/TableLayoutContext.js +7 -0
  239. package/components/table/context/TableLayoutContext.js.map +1 -0
  240. package/components/table/context/TableRenderConfigContext.d.ts +27 -0
  241. package/components/table/context/TableRenderConfigContext.js +7 -0
  242. package/components/table/context/TableRenderConfigContext.js.map +1 -0
  243. package/components/table/context/TableRenderContext.d.ts +85 -0
  244. package/components/table/context/TableRenderContext.js +7 -0
  245. package/components/table/context/TableRenderContext.js.map +1 -0
  246. package/components/table/context/TableStructureContext.d.ts +31 -0
  247. package/components/table/context/TableStructureContext.js +17 -0
  248. package/components/table/context/TableStructureContext.js.map +1 -0
  249. package/components/table/layout/columnSizing.d.ts +3 -0
  250. package/components/table/layout/columnSizing.js +23 -0
  251. package/components/table/layout/columnSizing.js.map +1 -0
  252. package/components/table/layout/useDraggableColumns.d.ts +14 -0
  253. package/components/table/layout/useDraggableColumns.js +47 -0
  254. package/components/table/layout/useDraggableColumns.js.map +1 -0
  255. package/components/table/layout/useHorizontalSectionSync.d.ts +13 -0
  256. package/components/table/layout/useHorizontalSectionSync.js +43 -0
  257. package/components/table/layout/useHorizontalSectionSync.js.map +1 -0
  258. package/components/table/layout/useMeasuredColumnMaxWidths.d.ts +12 -0
  259. package/components/table/layout/useMeasuredColumnMaxWidths.js +85 -0
  260. package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -0
  261. package/components/table/layout/useResizableColumns.d.ts +15 -0
  262. package/components/table/layout/useResizableColumns.js +132 -0
  263. package/components/table/layout/useResizableColumns.js.map +1 -0
  264. package/components/table/layout/useTableBodyScrollBottom.d.ts +12 -0
  265. package/components/table/layout/useTableBodyScrollBottom.js +37 -0
  266. package/components/table/layout/useTableBodyScrollBottom.js.map +1 -0
  267. package/components/table/layout/useTableLayout.d.ts +36 -0
  268. package/components/table/layout/useTableLayout.js +59 -0
  269. package/components/table/layout/useTableLayout.js.map +1 -0
  270. package/components/table/layout/useTableVirtualization.d.ts +22 -0
  271. package/components/table/layout/useTableVirtualization.js +125 -0
  272. package/components/table/layout/useTableVirtualization.js.map +1 -0
  273. package/components/table/model/resolveRowMeta.d.ts +3 -0
  274. package/components/table/model/resolveRowMeta.js +15 -0
  275. package/components/table/model/resolveRowMeta.js.map +1 -0
  276. package/components/table/model/resolveTableClassConfig.d.ts +47 -0
  277. package/components/table/model/resolveTableClassConfig.js +64 -0
  278. package/components/table/model/resolveTableClassConfig.js.map +1 -0
  279. package/components/table/model/tableView.types.d.ts +41 -0
  280. package/components/table/native/TableCol.js.map +1 -0
  281. package/components/table/{TableHead.js → native/TableHead.js} +2 -2
  282. package/components/table/native/TableHead.js.map +1 -0
  283. package/components/table/native/TableSettingsColumnButtons.js +59 -0
  284. package/components/table/native/TableSettingsColumnButtons.js.map +1 -0
  285. package/components/table/{TableSettingsColumnDetails.js → native/TableSettingsColumnDetails.js} +2 -2
  286. package/components/table/native/TableSettingsColumnDetails.js.map +1 -0
  287. package/components/table/{TableSettingsDialog.d.ts → native/TableSettingsDialog.d.ts} +2 -3
  288. package/components/table/native/TableSettingsDialog.js +216 -0
  289. package/components/table/native/TableSettingsDialog.js.map +1 -0
  290. package/components/table/{TableSettingsDialogFooter.js → native/TableSettingsDialogFooter.js} +2 -2
  291. package/components/table/native/TableSettingsDialogFooter.js.map +1 -0
  292. package/components/table/native/TableSettingsListContainer.js.map +1 -0
  293. package/components/table/native/TableSettingsListItem.js +100 -0
  294. package/components/table/native/TableSettingsListItem.js.map +1 -0
  295. package/components/table/render/body/TableBodyContent.d.ts +21 -0
  296. package/components/table/render/body/TableBodyContent.js +52 -0
  297. package/components/table/render/body/TableBodyContent.js.map +1 -0
  298. package/components/table/render/body/TableEmptyRow.d.ts +7 -0
  299. package/components/table/render/body/TableEmptyRow.js +6 -0
  300. package/components/table/render/body/TableEmptyRow.js.map +1 -0
  301. package/components/table/render/footer/TableFooterContent.d.ts +6 -0
  302. package/components/table/render/footer/TableFooterContent.js +6 -0
  303. package/components/table/render/footer/TableFooterContent.js.map +1 -0
  304. package/components/table/render/header/TableBatchDropdown.d.ts +13 -0
  305. package/components/table/render/header/TableBatchDropdown.js +30 -0
  306. package/components/table/render/header/TableBatchDropdown.js.map +1 -0
  307. package/components/table/render/header/TableColumnFilter.d.ts +66 -0
  308. package/components/table/render/header/TableColumnFilter.js +72 -0
  309. package/components/table/render/header/TableColumnFilter.js.map +1 -0
  310. package/components/table/render/header/TableDraggableHeaderCell.d.ts +4 -0
  311. package/components/table/render/header/TableDraggableHeaderCell.js +64 -0
  312. package/components/table/render/header/TableDraggableHeaderCell.js.map +1 -0
  313. package/components/table/render/header/TableHeader.types.d.ts +37 -0
  314. package/components/table/render/header/TableHeaderCellContent.d.ts +4 -0
  315. package/components/table/render/header/TableHeaderCellContent.js +57 -0
  316. package/components/table/render/header/TableHeaderCellContent.js.map +1 -0
  317. package/components/table/render/header/TableHeaderCellResizeHandle.d.ts +4 -0
  318. package/components/table/render/header/TableHeaderCellResizeHandle.js +22 -0
  319. package/components/table/render/header/TableHeaderCellResizeHandle.js.map +1 -0
  320. package/components/table/render/header/TableHeaderDragOverlay.d.ts +14 -0
  321. package/components/table/render/header/TableHeaderDragOverlay.js +35 -0
  322. package/components/table/render/header/TableHeaderDragOverlay.js.map +1 -0
  323. package/components/table/render/header/TableHeaderSelectionCell.d.ts +9 -0
  324. package/components/table/render/header/TableHeaderSelectionCell.js +41 -0
  325. package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -0
  326. package/components/table/render/header/TableStaticHeaderCell.d.ts +4 -0
  327. package/components/table/render/header/TableStaticHeaderCell.js +48 -0
  328. package/components/table/render/header/TableStaticHeaderCell.js.map +1 -0
  329. package/components/table/render/header/resolveAriaSort.d.ts +3 -0
  330. package/components/table/render/header/resolveAriaSort.js +8 -0
  331. package/components/table/render/header/resolveAriaSort.js.map +1 -0
  332. package/components/table/render/header/resolveColumnCollisionDetection.d.ts +2 -0
  333. package/components/table/render/header/resolveColumnCollisionDetection.js +9 -0
  334. package/components/table/render/header/resolveColumnCollisionDetection.js.map +1 -0
  335. package/components/table/render/header/resolveHeaderCellClassName.d.ts +12 -0
  336. package/components/table/render/header/resolveHeaderCellClassName.js +23 -0
  337. package/components/table/render/header/resolveHeaderCellClassName.js.map +1 -0
  338. package/components/table/render/header/resolveHeaderCellStyle.d.ts +830 -0
  339. package/components/table/render/header/resolveHeaderCellStyle.js +9 -0
  340. package/components/table/render/header/resolveHeaderCellStyle.js.map +1 -0
  341. package/components/table/runtime/shouldAnimateBodyRows.d.ts +17 -0
  342. package/components/table/runtime/shouldAnimateBodyRows.js +5 -0
  343. package/components/table/runtime/shouldAnimateBodyRows.js.map +1 -0
  344. package/components/table/runtime/useRenderDraftState.d.ts +14 -0
  345. package/components/table/runtime/useRenderDraftState.js +80 -0
  346. package/components/table/runtime/useRenderDraftState.js.map +1 -0
  347. package/components/table/runtime/useResolvedRenderColumns.d.ts +43 -0
  348. package/components/table/runtime/useResolvedRenderColumns.js +113 -0
  349. package/components/table/runtime/useResolvedRenderColumns.js.map +1 -0
  350. package/components/table/runtime/useResolvedRenderHeader.d.ts +27 -0
  351. package/components/table/runtime/useResolvedRenderHeader.js +67 -0
  352. package/components/table/runtime/useResolvedRenderHeader.js.map +1 -0
  353. package/components/table/selection/useInternalTableSelectionState.d.ts +17 -0
  354. package/components/table/selection/useInternalTableSelectionState.js +28 -0
  355. package/components/table/selection/useInternalTableSelectionState.js.map +1 -0
  356. package/components/table/selection/useTableSelection.d.ts +82 -0
  357. package/components/table/selection/useTableSelection.js +35 -0
  358. package/components/table/selection/useTableSelection.js.map +1 -0
  359. package/components/table/settings/TableColumnsDropdown.d.ts +90 -0
  360. package/components/table/settings/TableColumnsDropdown.js +137 -0
  361. package/components/table/settings/TableColumnsDropdown.js.map +1 -0
  362. package/components/table/settings/TableColumnsDropdownItem.d.ts +8 -0
  363. package/components/table/settings/TableColumnsDropdownItem.js +66 -0
  364. package/components/table/settings/TableColumnsDropdownItem.js.map +1 -0
  365. package/components/table/shared/getAlignClassName.d.ts +3 -0
  366. package/components/table/shared/getAlignClassName.js +6 -0
  367. package/components/table/shared/getAlignClassName.js.map +1 -0
  368. package/components/table/shared/getCellContentOverflowClassName.d.ts +3 -0
  369. package/components/table/shared/getCellContentOverflowClassName.js +18 -0
  370. package/components/table/shared/getCellContentOverflowClassName.js.map +1 -0
  371. package/components/table/shared/getInteractiveRowProps.d.ts +15 -0
  372. package/components/table/shared/getInteractiveRowProps.js +15 -0
  373. package/components/table/shared/getInteractiveRowProps.js.map +1 -0
  374. package/components/table/shared/resolveTableAria.d.ts +2 -0
  375. package/components/table/shared/resolveTableAria.js +6 -0
  376. package/components/table/shared/resolveTableAria.js.map +1 -0
  377. package/components/table/tableSizing.constants.d.ts +4 -0
  378. package/components/table/tableSizing.constants.js +8 -0
  379. package/components/table/tableSizing.constants.js.map +1 -0
  380. package/components/teaser/TeaserContainer.js +3 -3
  381. package/components/teaser/TeaserContainer.js.map +1 -1
  382. package/components/virtualList/VirtualList.js +16 -13
  383. package/components/virtualList/VirtualList.js.map +1 -1
  384. package/googleAnalyticsUtils.d.ts +1 -0
  385. package/googleAnalyticsUtils.js +9 -0
  386. package/googleAnalyticsUtils.js.map +1 -0
  387. package/hooks/useCookies.js +17 -17
  388. package/hooks/useCookies.js.map +1 -1
  389. package/hooks/useDraggableElement.d.ts +35 -0
  390. package/hooks/useDraggableElement.js +49 -0
  391. package/hooks/useDraggableElement.js.map +1 -0
  392. package/hooks/useElapsedTime.js +4 -4
  393. package/hooks/useElapsedTime.js.map +1 -1
  394. package/hooks/useLocationSuggestions.js +13 -10
  395. package/hooks/useLocationSuggestions.js.map +1 -1
  396. package/hooks/useMergeRefs.js +12 -12
  397. package/hooks/useMergeRefs.js.map +1 -1
  398. package/hooks/usePrevious.d.ts +1 -1
  399. package/hooks/usePrevious.js.map +1 -1
  400. package/hooks/useResizeObserver.js +25 -10
  401. package/hooks/useResizeObserver.js.map +1 -1
  402. package/hooks/useRioCookieConsent.js +7 -4
  403. package/hooks/useRioCookieConsent.js.map +1 -1
  404. package/hooks/useSorting.js +10 -10
  405. package/hooks/useSorting.js.map +1 -1
  406. package/hooks/useStorage.js +12 -12
  407. package/hooks/useStorage.js.map +1 -1
  408. package/hooks/useSum.js +10 -7
  409. package/hooks/useSum.js.map +1 -1
  410. package/hooks/useTableSelection.js.map +1 -1
  411. package/hooks/useTimeout.js +6 -3
  412. package/hooks/useTimeout.js.map +1 -1
  413. package/hooks/useUrlState.js +3 -3
  414. package/package.json +17 -18
  415. package/routeUtils.js +12 -10
  416. package/utils/analytics/analyticsAnalysisUtils.d.ts +27 -0
  417. package/utils/analytics/analyticsAnalysisUtils.js +161 -0
  418. package/utils/analytics/analyticsAnalysisUtils.js.map +1 -0
  419. package/utils/analytics/autoTracking.d.ts +14 -0
  420. package/utils/analytics/autoTracking.js +19 -0
  421. package/utils/analytics/autoTracking.js.map +1 -0
  422. package/utils/analytics/createAnalyticsOverlayTooltip.d.ts +36 -0
  423. package/utils/analytics/createAnalyticsOverlayTooltip.js +203 -0
  424. package/utils/analytics/createAnalyticsOverlayTooltip.js.map +1 -0
  425. package/utils/analytics/googleAnalyticsUtils.d.ts +37 -0
  426. package/utils/analytics/googleAnalyticsUtils.js +37 -0
  427. package/utils/analytics/googleAnalyticsUtils.js.map +1 -0
  428. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.d.ts +8 -0
  429. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js +61 -0
  430. package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js.map +1 -0
  431. package/utils/analytics/useAnalyticsOverlayDom.d.ts +11 -0
  432. package/utils/analytics/useAnalyticsOverlayDom.js +120 -0
  433. package/utils/analytics/useAnalyticsOverlayDom.js.map +1 -0
  434. package/utils/arrayMove.js +11 -0
  435. package/utils/arrayMove.js.map +1 -0
  436. package/utils/cssuseragent.js +2 -2
  437. package/utils/cssuseragent.js.map +1 -1
  438. package/utils/deviceUtils.js.map +1 -1
  439. package/utils/formatUtils.js.map +1 -1
  440. package/utils/hasUtilityClass.js +3 -3
  441. package/utils/hasUtilityClass.js.map +1 -1
  442. package/utils/hidePiiData.js.map +1 -1
  443. package/utils/init/checkForReleaseVersion.js +4 -4
  444. package/utils/init/checkForReleaseVersion.js.map +1 -1
  445. package/utils/init/styledLogs.js.map +1 -1
  446. package/utils/mergeRefs.js +3 -3
  447. package/utils/mergeRefs.js.map +1 -1
  448. package/utils/routeUtils.d.ts +37 -3
  449. package/utils/routeUtils.js +88 -70
  450. package/utils/routeUtils.js.map +1 -1
  451. package/utils/storageUtils.js +9 -9
  452. package/utils/storageUtils.js.map +1 -1
  453. package/version.d.ts +1 -1
  454. package/version.js +2 -2
  455. package/version.js.map +1 -1
  456. package/components/table/TableCol.js.map +0 -1
  457. package/components/table/TableHead.js.map +0 -1
  458. package/components/table/TableSettingsColumnButtons.js +0 -45
  459. package/components/table/TableSettingsColumnButtons.js.map +0 -1
  460. package/components/table/TableSettingsColumnDetails.js.map +0 -1
  461. package/components/table/TableSettingsDialog.js +0 -208
  462. package/components/table/TableSettingsDialog.js.map +0 -1
  463. package/components/table/TableSettingsDialogFooter.js.map +0 -1
  464. package/components/table/TableSettingsListContainer.js.map +0 -1
  465. package/components/table/TableSettingsListItem.js +0 -96
  466. package/components/table/TableSettingsListItem.js.map +0 -1
  467. /package/components/table/{TableCol.d.ts → native/TableCol.d.ts} +0 -0
  468. /package/components/table/{TableCol.js → native/TableCol.js} +0 -0
  469. /package/components/table/{TableHead.d.ts → native/TableHead.d.ts} +0 -0
  470. /package/components/table/{TableSettingsColumnButtons.d.ts → native/TableSettingsColumnButtons.d.ts} +0 -0
  471. /package/components/table/{TableSettingsColumnDetails.d.ts → native/TableSettingsColumnDetails.d.ts} +0 -0
  472. /package/components/table/{TableSettingsDialogFooter.d.ts → native/TableSettingsDialogFooter.d.ts} +0 -0
  473. /package/components/table/{TableSettingsListContainer.d.ts → native/TableSettingsListContainer.d.ts} +0 -0
  474. /package/components/table/{TableSettingsListContainer.js → native/TableSettingsListContainer.js} +0 -0
  475. /package/components/table/{TableSettingsListItem.d.ts → native/TableSettingsListItem.d.ts} +0 -0
@@ -0,0 +1,161 @@
1
+ const T = "# Start date:", U = "# End date:", g = /^#\s*(\d{8})\s*-\s*(\d{8})\s*$/, $ = 100, b = [
2
+ "event_action",
3
+ "event_label",
4
+ "Event count",
5
+ "Total users",
6
+ "Event count per active user"
7
+ ], I = ["event_action", "event_label"], O = ["event count"], M = ["total users", "active users"], w = ["event count per active user", "event countactive user"], X = b.join(","), G = "[data-track-ga-event-action][data-track-ga-event-label]", Q = {
8
+ seen: "rioglyph-eye-open",
9
+ clicked: "rioglyph-click"
10
+ }, V = (t) => t.slice(0, 100), P = (t, e) => `${t}::${V(e)}`, W = (t) => t === "visibility" ? "seen" : t === "click" ? "clicked" : null, f = (t) => {
11
+ const e = t.trim();
12
+ if (!/^\d{8}$/.test(e))
13
+ return null;
14
+ const s = Number(e.slice(0, 4)), n = Number(e.slice(4, 6)), r = Number(e.slice(6, 8)), c = new Date(Date.UTC(s, n - 1, r));
15
+ return c.getUTCFullYear() !== s || c.getUTCMonth() !== n - 1 || c.getUTCDate() !== r ? null : c;
16
+ }, y = (t) => new Intl.DateTimeFormat("en-US", {
17
+ month: "long",
18
+ day: "numeric",
19
+ year: "numeric",
20
+ timeZone: "UTC"
21
+ }).format(t), k = (t) => {
22
+ const e = t.split(/\r?\n/), s = e.find((a) => a.startsWith(T)), n = e.find((a) => a.startsWith(U)), r = s?.slice(T.length).trim() ?? "", c = n?.slice(U.length).trim() ?? "", i = f(r), o = f(c);
23
+ if (i !== null && o !== null)
24
+ return { startDate: i, endDate: o };
25
+ const l = e.find((a) => g.test(a.trim()));
26
+ if (!l)
27
+ return { startDate: i, endDate: o };
28
+ const u = l.trim().match(g);
29
+ if (!u)
30
+ return { startDate: i, endDate: o };
31
+ const d = f(u[1]), v = f(u[2]);
32
+ return { startDate: d, endDate: v };
33
+ }, D = (t) => t.split(/\r?\n/).map((e) => e.trim()).filter((e) => e && !e.startsWith("#")), A = (t) => {
34
+ const e = [];
35
+ let s = "", n = !1;
36
+ for (let r = 0; r < t.length; r += 1) {
37
+ const c = t[r];
38
+ if (c === '"') {
39
+ const i = t[r + 1];
40
+ if (n && i === '"') {
41
+ s += '"', r += 1;
42
+ continue;
43
+ }
44
+ n = !n;
45
+ continue;
46
+ }
47
+ if (c === "," && !n) {
48
+ e.push(s.trim()), s = "";
49
+ continue;
50
+ }
51
+ s += c;
52
+ }
53
+ return e.push(s.trim()), e;
54
+ }, R = (t) => t.trim().toLowerCase().replace(/\s+/g, " "), E = (t, e) => {
55
+ const s = new Set(e.map((n) => R(n)));
56
+ return t.findIndex((n) => s.has(R(n)));
57
+ }, _ = (t) => !t || !t.trim() ? !1 : Number.isFinite(Number(t)), h = (t) => {
58
+ const e = t?.trim() ?? "";
59
+ return e !== "" && !_(e);
60
+ }, H = (t) => {
61
+ let e = E(t, [I[0]]), s = E(t, [I[1]]), n = E(t, O), r = E(t, M), c = E(t, w);
62
+ return e === -1 && t.length >= 1 && (e = 0), s === -1 && t.length >= 2 && (s = e + 1), n === -1 && t.length >= 3 && (n = s + 1), r === -1 && t.length >= 4 && (r = n + 1), c === -1 && t.length >= 5 && (c = r + 1), e < 0 || s < 0 || n < 0 || r < 0 || c < 0 ? null : {
63
+ eventActionIndex: e,
64
+ eventLabelIndex: s,
65
+ eventCountIndex: n,
66
+ totalUsersIndex: r,
67
+ eventCountPerUserIndex: c
68
+ };
69
+ }, x = (t, e) => {
70
+ const s = t.slice(1);
71
+ let n = 0, r = 0;
72
+ for (const c of s) {
73
+ const i = A(c), o = i[e.eventActionIndex], l = i[e.eventLabelIndex];
74
+ if (!o && !l)
75
+ continue;
76
+ n += 1;
77
+ const u = i[e.eventCountIndex], d = i[e.totalUsersIndex];
78
+ if (h(o) && h(l) && _(u) && _(d) && (r += 1), n >= 5)
79
+ break;
80
+ }
81
+ return n === 0 ? !0 : r >= Math.ceil(n / 2);
82
+ }, C = (t) => {
83
+ if (t.length < 2)
84
+ return null;
85
+ const e = A(t[0]), s = H(e);
86
+ if (s && x(t, s))
87
+ return s;
88
+ const n = {
89
+ eventActionIndex: 0,
90
+ eventLabelIndex: 1,
91
+ eventCountIndex: 2,
92
+ totalUsersIndex: 3,
93
+ eventCountPerUserIndex: 4
94
+ };
95
+ return x(t, n) ? n : null;
96
+ }, q = (t) => {
97
+ const e = D(t);
98
+ if (e.length === 0)
99
+ return !1;
100
+ const s = A(e[0]);
101
+ return I.every(
102
+ (r) => s.some((c) => R(c) === r)
103
+ ) && C(e) !== null;
104
+ }, F = (t) => {
105
+ const e = Number(t);
106
+ return Number.isFinite(e) ? e : 0;
107
+ }, S = (t) => !(t?.trim().toLowerCase() ?? ""), N = (t, e, s, n) => {
108
+ if (t !== 0)
109
+ return !1;
110
+ const r = e[s], c = e[n];
111
+ return S(r) && S(c);
112
+ }, Y = (t) => {
113
+ const e = D(t);
114
+ if (e.length < 2)
115
+ return null;
116
+ const s = C(e);
117
+ if (!s)
118
+ return null;
119
+ const n = A(e[1]);
120
+ return N(0, n, s.eventActionIndex, s.eventLabelIndex) ? F(n[s.totalUsersIndex]) : null;
121
+ }, z = (t, e) => {
122
+ const s = D(t);
123
+ if (s.length < 2)
124
+ return [];
125
+ const n = C(s);
126
+ return n ? s.slice(1).reduce((r, c, i) => {
127
+ const o = A(c);
128
+ if (N(i, o, n.eventActionIndex, n.eventLabelIndex))
129
+ return r;
130
+ const l = o[n.eventActionIndex], u = o[n.eventLabelIndex];
131
+ return !l || !u || r.push({
132
+ reportName: e,
133
+ eventAction: l,
134
+ eventLabel: u,
135
+ eventCount: o[n.eventCountIndex] ?? "0",
136
+ totalUsers: o[n.totalUsersIndex] ?? "0",
137
+ eventCountPerActiveUser: o[n.eventCountPerUserIndex] ?? "0"
138
+ }), r;
139
+ }, []) : [];
140
+ }, K = (t) => {
141
+ const e = t.map((a) => ({
142
+ analyticsEntries: z(a.csvRaw, a.reportName),
143
+ analyticsTotalUsers: Y(a.csvRaw)
144
+ })), s = e.flatMap((a) => a.analyticsEntries), n = e.map((a) => a.analyticsTotalUsers).filter((a) => a !== null), r = n.length > 0 ? n.reduce((a, m) => a + m, 0) : null, c = s.reduce((a, m) => {
145
+ const L = P(m.eventAction, m.eventLabel), p = a.get(L) ?? [];
146
+ return p.push(m), a.set(L, p), a;
147
+ }, /* @__PURE__ */ new Map()), i = t.map((a) => k(a.csvRaw)), o = i.map((a) => a.startDate).filter((a) => a !== null), l = i.map((a) => a.endDate).filter((a) => a !== null), u = o.length > 0 ? new Date(Math.min(...o.map((a) => a.getTime()))) : null, d = l.length > 0 ? new Date(Math.max(...l.map((a) => a.getTime()))) : null, v = u && d ? `${y(u)} - ${y(d)}` : null;
148
+ return { analyticsLookup: c, analyticsDateRangeLabel: v, analyticsTotalUsers: r };
149
+ };
150
+ export {
151
+ G as ANALYTICS_OVERLAY_SELECTOR,
152
+ Q as EVENT_TYPE_ICON_CLASS,
153
+ $ as LOOKUP_MAX_LENGTH,
154
+ X as REQUIRED_ANALYTICS_HEADER_ROW,
155
+ K as buildAnalyticsAnalysisData,
156
+ P as createAnalyticsLookupKey,
157
+ q as hasRequiredAnalyticsHeaderRow,
158
+ z as parseAnalyticsReportCsv,
159
+ W as toEventType
160
+ };
161
+ //# sourceMappingURL=analyticsAnalysisUtils.js.map
@@ -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 = (n, r) => {
11
+ const e = document.createElement("span");
12
+ return e.classList.add("rioglyph", n, r), e;
13
+ }, u = (n) => {
14
+ const { iconClass: r, text: e } = n, 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(r, "text-size-16"));
24
+ const i = document.createElement("span");
25
+ return i.textContent = e, a.appendChild(i), a;
26
+ }, C = () => {
27
+ const n = document.createElement("div");
28
+ return n.classList.add("rounded", "padding-10", "bg-decent", "display-flex", "flex-column", "gap-5", "shadow-accent"), n;
29
+ }, o = (n) => {
30
+ const { iconClass: r, label: e, right: a } = n, i = document.createElement("div");
31
+ i.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(r, "text-size-14");
35
+ l.appendChild(p);
36
+ const s = document.createElement("div");
37
+ s.classList.add("text-medium"), s.textContent = e, l.appendChild(s), i.appendChild(l);
38
+ const t = document.createElement("div");
39
+ if (t.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, t.appendChild(c);
42
+ } else
43
+ t.appendChild(a);
44
+ return i.appendChild(t), i;
45
+ }, f = (n) => n === null ? "n/a" : `${b.format(n)}%`, N = () => typeof window < "u" && /^https?:/i.test(window.location.href) ? window.location.href : "https://rio.cloud", O = (n, r = N()) => {
46
+ try {
47
+ const e = new URL(n, r), a = {};
48
+ return k.forEach(({ queryParam: i }) => {
49
+ const l = e.searchParams.get(i)?.trim();
50
+ l && (a[i] = l);
51
+ }), Object.keys(a).length > 0 ? a : null;
52
+ } catch {
53
+ return null;
54
+ }
55
+ }, V = (n) => {
56
+ const r = n.closest("a[href]"), e = n.getAttribute("href")?.trim() ?? r?.href?.trim();
57
+ return e ? O(e) : null;
58
+ }, G = (n) => {
59
+ const { eventTrigger: r, totalEventCount: e, analyticsTotalUsers: a } = n;
60
+ return a === null || a <= 0 ? null : r === "click" || r === "visibility" ? e / a * 100 : null;
61
+ }, S = (n) => {
62
+ const {
63
+ overlayRoot: r,
64
+ trackingData: e,
65
+ totalEventCount: a,
66
+ totalUserCount: i,
67
+ analyticsTotalUsers: l,
68
+ clickEvent: p,
69
+ trackedElement: s
70
+ } = n, t = document.createElement("div");
71
+ t.setAttribute("data-analytics-overlay-tooltip", "true"), t.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 = e.eventTrigger === "click" ? "Clicks" : "Views", A = e.eventTrigger === "click" ? "rioglyph-click" : "rioglyph-eye-open", R = e.eventTrigger === "click" ? "Click rate" : "View rate", U = i > 0 ? a / i * 100 : null, v = G({
89
+ eventTrigger: e.eventTrigger,
90
+ totalEventCount: a,
91
+ analyticsTotalUsers: l
92
+ }), _ = l !== null && l > 0 ? i / l * 100 : null, D = u({
93
+ iconClass: "rioglyph-user",
94
+ text: "Event users"
95
+ });
96
+ t.appendChild(D);
97
+ const g = C();
98
+ g.appendChild(
99
+ o({
100
+ iconClass: "rioglyph-user",
101
+ label: "Event users",
102
+ right: `${b.format(i)}`
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
+ )), t.appendChild(g);
117
+ const F = u({
118
+ iconClass: "rioglyph-stats",
119
+ text: "Element performance"
120
+ });
121
+ t.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
+ ), e.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
+ ), e.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
+ ), t.appendChild(d);
148
+ const M = u({
149
+ iconClass: "rioglyph-info-sign",
150
+ text: "Tracking Attributes"
151
+ });
152
+ t.appendChild(M);
153
+ const h = C();
154
+ h.appendChild(
155
+ o({
156
+ iconClass: "rioglyph-cog",
157
+ label: "Action",
158
+ right: e.eventAction
159
+ })
160
+ ), h.appendChild(
161
+ o({
162
+ iconClass: "rioglyph-emergency-stop",
163
+ label: "Trigger",
164
+ right: e.eventTrigger
165
+ })
166
+ ), h.appendChild(
167
+ o({
168
+ iconClass: "rioglyph-tag",
169
+ label: "Label",
170
+ right: e.eventLabel
171
+ })
172
+ ), t.appendChild(h);
173
+ const w = V(s);
174
+ if (w) {
175
+ const $ = u({
176
+ iconClass: "rioglyph-megaphone",
177
+ text: "Campaign"
178
+ });
179
+ t.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
+ }), t.appendChild(E);
191
+ }
192
+ const T = 12, m = 8;
193
+ r.appendChild(t);
194
+ let x = p.clientX + T, y = p.clientY + T;
195
+ const H = window.innerWidth - t.offsetWidth - m, I = window.innerHeight - t.offsetHeight - m;
196
+ return x = Math.max(m, Math.min(x, H)), y = Math.max(m, Math.min(y, I)), t.style.left = `${x}px`, t.style.top = `${y}px`, t;
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 anchorElement = trackedElement.closest<HTMLAnchorElement>('a[href]');\n const href = trackedElement.getAttribute('href')?.trim() ?? anchorElement?.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","anchorElement","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":"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"}
@@ -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 };