@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,120 @@
1
+ import { useState as q, useRef as I, useEffect as M } from "react";
2
+ import { ANALYTICS_OVERLAY_SELECTOR as H, createAnalyticsLookupKey as Y, toEventType as K, EVENT_TYPE_ICON_CLASS as Q } from "./analyticsAnalysisUtils.js";
3
+ import { createAnalyticsOverlayTooltip as j } from "./createAnalyticsOverlayTooltip.js";
4
+ import { logAnalyticsOverlayUnmatchedEntries as G } from "./logAnalyticsOverlayUnmatchedEntries.js";
5
+ const te = (F) => {
6
+ const { analyticsLookup: m, overlayBackgroundOpacity: C, showOverlayDetails: y, showOverlayLabelText: g, analyticsTotalUsers: N } = F, [V, T] = q(null), w = I(/* @__PURE__ */ new WeakSet()), h = I(null), x = m.size > 0;
7
+ return M(() => {
8
+ w.current = /* @__PURE__ */ new WeakSet(), h.current = null;
9
+ }, [m, y]), M(() => {
10
+ const r = document.createElement("div");
11
+ r.setAttribute("data-analytics-overlay-root", "true"), r.classList.add("position-fixed"), r.classList.add("inset-0"), r.classList.add("pointer-events-none"), r.classList.add("z-index-max"), r.style.backgroundColor = x && y ? `rgba(0,0,0,${C})` : "rgba(0,0,0,0)";
12
+ const b = document.createElement("div");
13
+ b.setAttribute("data-analytics-overlay-banner", "true"), b.classList.add("pointer-events-all"), r.appendChild(b), T(b), document.body.appendChild(r);
14
+ let O = 0, k = !1, E = null, L = null;
15
+ const D = (t) => {
16
+ const e = Number(t);
17
+ return Number.isFinite(e) ? e : 0;
18
+ }, d = () => {
19
+ E?.remove(), E = null, L = null;
20
+ }, B = (t) => {
21
+ const e = t.element.getBoundingClientRect();
22
+ if (e.width === 0 || e.height === 0 || e.bottom <= 0 || e.top >= window.innerHeight || e.right <= 0 || e.left >= window.innerWidth)
23
+ return null;
24
+ const n = document.createElement("div");
25
+ n.classList.add(
26
+ "position-fixed",
27
+ "label",
28
+ "label-secondary",
29
+ "label-filled",
30
+ "label-condensed",
31
+ "ellipsis-1",
32
+ "shadow-focused",
33
+ "white-space-no-wrap",
34
+ "text-normal",
35
+ "pointer-events-all",
36
+ "cursor-pointer",
37
+ "hover-z-index-1",
38
+ "hover-bg-black",
39
+ "hover-border-color-black"
40
+ ), n.setAttribute("data-analytics-overlay-label", "true"), n.style.top = `${e.top + 4}px`, n.style.left = `${e.left + 4}px`, n.style.maxWidth = "min(80vw, 420px)";
41
+ const v = (s) => {
42
+ s.preventDefault(), s.stopPropagation(), w.current.add(t.element), L === n && d(), n.remove();
43
+ }, p = t.entries.reduce((s, f) => s + D(f.eventCount), 0), c = t.entries.reduce((s, f) => s + D(f.totalUsers), 0), i = Q[t.eventType], l = "rioglyph-remove", o = document.createElement("span");
44
+ o.classList.add("text-size-14", "margin-left-1", "rioglyph", "margin-right-0", i), n.appendChild(o), g && (o.addEventListener("pointerdown", v), o.addEventListener("click", v));
45
+ const P = () => {
46
+ i !== l && (o.classList.remove(i), o.classList.add(l));
47
+ }, U = () => {
48
+ i !== l && (o.classList.remove(l), o.classList.add(i));
49
+ };
50
+ g && (o.addEventListener("mouseenter", P), o.addEventListener("mouseleave", U));
51
+ const A = document.createElement("span");
52
+ return A.textContent = `${p} times / ${c} users`, A.classList.add(
53
+ g ? "display-inline" : "display-none",
54
+ "text-size-10",
55
+ "line-height-14",
56
+ "margin-left-5"
57
+ ), n.appendChild(A), n.addEventListener("click", (s) => {
58
+ s.preventDefault(), s.stopPropagation();
59
+ const f = s, W = L === n;
60
+ d(), !W && (E = j({
61
+ overlayRoot: r,
62
+ trackingData: {
63
+ eventAction: t.eventAction,
64
+ eventLabel: t.eventLabel,
65
+ eventTrigger: t.eventTrigger
66
+ },
67
+ totalEventCount: p,
68
+ totalUserCount: c,
69
+ analyticsTotalUsers: N,
70
+ clickEvent: f,
71
+ trackedElement: t.element
72
+ }), L = n);
73
+ }), n;
74
+ }, _ = (t) => t.reduce((e, a) => {
75
+ const n = a.getAttribute("data-track-ga-event-action"), v = a.getAttribute("data-track-ga-event-label"), p = a.getAttribute("data-track-ga-event-trigger"), c = p === "click" || p === "visibility" ? p : null, i = c ? K(c) : null;
76
+ if (!n || !v || !c || !i || w.current.has(a))
77
+ return e;
78
+ const l = m.get(Y(n, v));
79
+ return !l || l.length === 0 || e.push({ element: a, eventAction: n, eventLabel: v, eventTrigger: c, eventType: i, entries: l }), e;
80
+ }, []), $ = () => {
81
+ k = !1, d(), r.querySelectorAll("[data-analytics-overlay-label]").forEach((a) => {
82
+ a.remove();
83
+ });
84
+ const t = Array.from(document.querySelectorAll(H));
85
+ if (h.current = G({
86
+ analyticsLookup: m,
87
+ trackedElements: t,
88
+ previousFingerprint: h.current
89
+ }), !y)
90
+ return;
91
+ _(t).forEach((a) => {
92
+ const n = B(a);
93
+ n && r.appendChild(n);
94
+ });
95
+ }, u = () => {
96
+ k || (k = !0, O = window.requestAnimationFrame($));
97
+ }, R = new MutationObserver((t) => {
98
+ t.some((a) => !r.contains(a.target)) && u();
99
+ });
100
+ R.observe(document.body, {
101
+ childList: !0,
102
+ subtree: !0,
103
+ attributes: !0,
104
+ attributeFilter: ["data-track-ga-event-action", "data-track-ga-event-label", "data-track-ga-event-trigger"]
105
+ });
106
+ const S = (t) => {
107
+ const e = t.target;
108
+ e instanceof Node && (E?.contains(e) || e instanceof Element && e.closest("[data-analytics-overlay-label]") || d());
109
+ }, z = (t) => {
110
+ t.key === "Escape" && d();
111
+ };
112
+ return document.addEventListener("pointerdown", S, !0), document.addEventListener("keydown", z), window.addEventListener("scroll", u, !0), window.addEventListener("resize", u), u(), () => {
113
+ T(null), d(), document.removeEventListener("pointerdown", S, !0), document.removeEventListener("keydown", z), window.removeEventListener("scroll", u, !0), window.removeEventListener("resize", u), R.disconnect(), window.cancelAnimationFrame(O), r.remove();
114
+ };
115
+ }, [m, x, C, y, g]), V;
116
+ };
117
+ export {
118
+ te as default
119
+ };
120
+ //# sourceMappingURL=useAnalyticsOverlayDom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnalyticsOverlayDom.js","sources":["../../../src/utils/analytics/useAnalyticsOverlayDom.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport {\n ANALYTICS_OVERLAY_SELECTOR,\n EVENT_TYPE_ICON_CLASS,\n createAnalyticsLookupKey,\n toEventType,\n type AnalyticsReportEntry,\n} from './analyticsAnalysisUtils';\nimport { createAnalyticsOverlayTooltip } from './createAnalyticsOverlayTooltip';\nimport { logAnalyticsOverlayUnmatchedEntries } from './logAnalyticsOverlayUnmatchedEntries';\n\ntype AnalyticsOverlayMatch = {\n element: HTMLElement;\n eventAction: string;\n eventLabel: string;\n eventTrigger: 'click' | 'visibility';\n eventType: 'seen' | 'clicked';\n entries: AnalyticsReportEntry[];\n};\n\ntype UseAnalyticsOverlayDomProps = {\n analyticsLookup: Map<string, AnalyticsReportEntry[]>;\n overlayBackgroundOpacity: number;\n showOverlayDetails: boolean;\n showOverlayLabelText: boolean;\n analyticsTotalUsers: number | null;\n};\n\nconst useAnalyticsOverlayDom = (props: UseAnalyticsOverlayDomProps) => {\n const { analyticsLookup, overlayBackgroundOpacity, showOverlayDetails, showOverlayLabelText, analyticsTotalUsers } =\n props;\n const [metadataBannerHost, setMetadataBannerHost] = useState<HTMLDivElement | null>(null);\n const hiddenOverlayElementsRef = useRef<WeakSet<HTMLElement>>(new WeakSet());\n const unmatchedEntriesLogFingerprintRef = useRef<string | null>(null);\n const hasOverlayData = analyticsLookup.size > 0;\n\n useEffect(() => {\n // Reset manually hidden labels after overlay visibility toggles or data changes.\n hiddenOverlayElementsRef.current = new WeakSet();\n unmatchedEntriesLogFingerprintRef.current = null;\n }, [analyticsLookup, showOverlayDetails]);\n\n useEffect(() => {\n const overlayRoot = document.createElement('div');\n overlayRoot.setAttribute('data-analytics-overlay-root', 'true');\n overlayRoot.classList.add('position-fixed');\n overlayRoot.classList.add('inset-0');\n overlayRoot.classList.add('pointer-events-none');\n overlayRoot.classList.add('z-index-max');\n overlayRoot.style.backgroundColor =\n hasOverlayData && showOverlayDetails ? `rgba(0,0,0,${overlayBackgroundOpacity})` : 'rgba(0,0,0,0)';\n\n const metadataBannerContainer = document.createElement('div');\n metadataBannerContainer.setAttribute('data-analytics-overlay-banner', 'true');\n metadataBannerContainer.classList.add('pointer-events-all');\n overlayRoot.appendChild(metadataBannerContainer);\n setMetadataBannerHost(metadataBannerContainer);\n\n document.body.appendChild(overlayRoot);\n\n let frameId = 0;\n let refreshQueued = false;\n let activeTooltip: HTMLDivElement | null = null;\n let activeTooltipOwner: HTMLElement | null = null;\n\n const parseMetricValue = (value: string) => {\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : 0;\n };\n const hideActiveTooltip = () => {\n activeTooltip?.remove();\n activeTooltip = null;\n activeTooltipOwner = null;\n };\n\n const createOverlayMatchLabel = (match: AnalyticsOverlayMatch) => {\n const rect = match.element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return null;\n }\n\n const isOutsideViewport =\n rect.bottom <= 0 || rect.top >= window.innerHeight || rect.right <= 0 || rect.left >= window.innerWidth;\n if (isOutsideViewport) {\n return null;\n }\n\n const label = document.createElement('div');\n label.classList.add(\n 'position-fixed',\n 'label',\n 'label-secondary',\n 'label-filled',\n 'label-condensed',\n 'ellipsis-1',\n 'shadow-focused',\n 'white-space-no-wrap',\n 'text-normal',\n 'pointer-events-all',\n 'cursor-pointer',\n 'hover-z-index-1',\n 'hover-bg-black',\n 'hover-border-color-black'\n );\n label.setAttribute('data-analytics-overlay-label', 'true');\n label.style.top = `${rect.top + 4}px`;\n label.style.left = `${rect.left + 4}px`;\n label.style.maxWidth = 'min(80vw, 420px)';\n\n const hideLabel = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n hiddenOverlayElementsRef.current.add(match.element);\n if (activeTooltipOwner === label) {\n hideActiveTooltip();\n }\n label.remove();\n };\n\n const totalEventCount = match.entries.reduce((sum, entry) => sum + parseMetricValue(entry.eventCount), 0);\n const totalUserCount = match.entries.reduce((sum, entry) => sum + parseMetricValue(entry.totalUsers), 0);\n const eventTypeIconClass = EVENT_TYPE_ICON_CLASS[match.eventType];\n const closeIconClass = 'rioglyph-remove';\n const icon = document.createElement('span');\n icon.classList.add('text-size-14', 'margin-left-1', 'rioglyph', 'margin-right-0', eventTypeIconClass);\n label.appendChild(icon);\n\n if (showOverlayLabelText) {\n icon.addEventListener('pointerdown', hideLabel);\n icon.addEventListener('click', hideLabel);\n }\n\n const showCloseIcon = () => {\n if (eventTypeIconClass === closeIconClass) {\n return;\n }\n icon.classList.remove(eventTypeIconClass);\n icon.classList.add(closeIconClass);\n };\n const showDefaultIcon = () => {\n if (eventTypeIconClass === closeIconClass) {\n return;\n }\n icon.classList.remove(closeIconClass);\n icon.classList.add(eventTypeIconClass);\n };\n\n if (showOverlayLabelText) {\n icon.addEventListener('mouseenter', showCloseIcon);\n icon.addEventListener('mouseleave', showDefaultIcon);\n }\n\n const text = document.createElement('span');\n text.textContent = `${totalEventCount} times / ${totalUserCount} users`;\n text.classList.add(\n showOverlayLabelText ? 'display-inline' : 'display-none',\n 'text-size-10',\n 'line-height-14',\n 'margin-left-5'\n );\n label.appendChild(text);\n\n label.addEventListener('click', event => {\n event.preventDefault();\n event.stopPropagation();\n\n const mouseEvent = event as MouseEvent;\n const isCurrentLabelTooltip = activeTooltipOwner === label;\n hideActiveTooltip();\n\n if (isCurrentLabelTooltip) {\n return;\n }\n\n activeTooltip = createAnalyticsOverlayTooltip({\n overlayRoot,\n trackingData: {\n eventAction: match.eventAction,\n eventLabel: match.eventLabel,\n eventTrigger: match.eventTrigger,\n },\n totalEventCount,\n totalUserCount,\n analyticsTotalUsers,\n clickEvent: mouseEvent,\n trackedElement: match.element,\n });\n activeTooltipOwner = label;\n });\n\n return label;\n };\n\n const collectMatches = (trackedElements: HTMLElement[]) =>\n trackedElements.reduce((matches, element) => {\n const eventAction = element.getAttribute('data-track-ga-event-action');\n const eventLabel = element.getAttribute('data-track-ga-event-label');\n const eventTriggerRaw = element.getAttribute('data-track-ga-event-trigger');\n const eventTrigger =\n eventTriggerRaw === 'click' || eventTriggerRaw === 'visibility' ? eventTriggerRaw : null;\n const eventType = eventTrigger ? toEventType(eventTrigger) : null;\n\n if (!eventAction || !eventLabel || !eventTrigger || !eventType) {\n return matches;\n }\n\n if (hiddenOverlayElementsRef.current.has(element)) {\n return matches;\n }\n\n const entries = analyticsLookup.get(createAnalyticsLookupKey(eventAction, eventLabel));\n if (!entries || entries.length === 0) {\n return matches;\n }\n\n matches.push({ element, eventAction, eventLabel, eventTrigger, eventType, entries });\n return matches;\n }, [] as AnalyticsOverlayMatch[]);\n\n const refreshOverlay = () => {\n refreshQueued = false;\n hideActiveTooltip();\n overlayRoot.querySelectorAll('[data-analytics-overlay-label]').forEach(label => {\n label.remove();\n });\n\n const trackedElements = Array.from(document.querySelectorAll<HTMLElement>(ANALYTICS_OVERLAY_SELECTOR));\n unmatchedEntriesLogFingerprintRef.current = logAnalyticsOverlayUnmatchedEntries({\n analyticsLookup,\n trackedElements,\n previousFingerprint: unmatchedEntriesLogFingerprintRef.current,\n });\n\n if (!showOverlayDetails) {\n return;\n }\n\n const matches = collectMatches(trackedElements);\n matches.forEach(match => {\n const label = createOverlayMatchLabel(match);\n if (label) {\n overlayRoot.appendChild(label);\n }\n });\n };\n\n const scheduleRefresh = () => {\n if (refreshQueued) {\n return;\n }\n\n refreshQueued = true;\n frameId = window.requestAnimationFrame(refreshOverlay);\n };\n\n const mutationObserver = new MutationObserver(mutationRecords => {\n const hasExternalMutation = mutationRecords.some(record => !overlayRoot.contains(record.target));\n\n if (!hasExternalMutation) {\n return;\n }\n\n scheduleRefresh();\n });\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-track-ga-event-action', 'data-track-ga-event-label', 'data-track-ga-event-trigger'],\n });\n\n const handleDocumentPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (activeTooltip?.contains(target)) {\n return;\n }\n\n if (target instanceof Element && target.closest('[data-analytics-overlay-label]')) {\n return;\n }\n\n hideActiveTooltip();\n };\n const handleDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n hideActiveTooltip();\n }\n };\n\n document.addEventListener('pointerdown', handleDocumentPointerDown, true);\n document.addEventListener('keydown', handleDocumentKeyDown);\n window.addEventListener('scroll', scheduleRefresh, true);\n window.addEventListener('resize', scheduleRefresh);\n scheduleRefresh();\n\n return () => {\n setMetadataBannerHost(null);\n hideActiveTooltip();\n document.removeEventListener('pointerdown', handleDocumentPointerDown, true);\n document.removeEventListener('keydown', handleDocumentKeyDown);\n window.removeEventListener('scroll', scheduleRefresh, true);\n window.removeEventListener('resize', scheduleRefresh);\n mutationObserver.disconnect();\n window.cancelAnimationFrame(frameId);\n overlayRoot.remove();\n };\n }, [analyticsLookup, hasOverlayData, overlayBackgroundOpacity, showOverlayDetails, showOverlayLabelText]);\n\n return metadataBannerHost;\n};\n\nexport default useAnalyticsOverlayDom;\nexport type { UseAnalyticsOverlayDomProps };\n"],"names":["useAnalyticsOverlayDom","props","analyticsLookup","overlayBackgroundOpacity","showOverlayDetails","showOverlayLabelText","analyticsTotalUsers","metadataBannerHost","setMetadataBannerHost","useState","hiddenOverlayElementsRef","useRef","unmatchedEntriesLogFingerprintRef","hasOverlayData","useEffect","overlayRoot","metadataBannerContainer","frameId","refreshQueued","activeTooltip","activeTooltipOwner","parseMetricValue","value","numericValue","hideActiveTooltip","createOverlayMatchLabel","match","rect","label","hideLabel","event","totalEventCount","sum","entry","totalUserCount","eventTypeIconClass","EVENT_TYPE_ICON_CLASS","closeIconClass","icon","showCloseIcon","showDefaultIcon","text","mouseEvent","isCurrentLabelTooltip","createAnalyticsOverlayTooltip","collectMatches","trackedElements","matches","element","eventAction","eventLabel","eventTriggerRaw","eventTrigger","eventType","toEventType","entries","createAnalyticsLookupKey","refreshOverlay","ANALYTICS_OVERLAY_SELECTOR","logAnalyticsOverlayUnmatchedEntries","scheduleRefresh","mutationObserver","mutationRecords","record","handleDocumentPointerDown","target","handleDocumentKeyDown"],"mappings":";;;;AA6BA,MAAMA,KAAyB,CAACC,MAAuC;AACnE,QAAM,EAAE,iBAAAC,GAAiB,0BAAAC,GAA0B,oBAAAC,GAAoB,sBAAAC,GAAsB,qBAAAC,MACzFL,GACE,CAACM,GAAoBC,CAAqB,IAAIC,EAAgC,IAAI,GAClFC,IAA2BC,EAA6B,oBAAI,SAAS,GACrEC,IAAoCD,EAAsB,IAAI,GAC9DE,IAAiBX,EAAgB,OAAO;AAE9C,SAAAY,EAAU,MAAM;AAEZ,IAAAJ,EAAyB,8BAAc,QAAA,GACvCE,EAAkC,UAAU;AAAA,EAChD,GAAG,CAACV,GAAiBE,CAAkB,CAAC,GAExCU,EAAU,MAAM;AACZ,UAAMC,IAAc,SAAS,cAAc,KAAK;AAChD,IAAAA,EAAY,aAAa,+BAA+B,MAAM,GAC9DA,EAAY,UAAU,IAAI,gBAAgB,GAC1CA,EAAY,UAAU,IAAI,SAAS,GACnCA,EAAY,UAAU,IAAI,qBAAqB,GAC/CA,EAAY,UAAU,IAAI,aAAa,GACvCA,EAAY,MAAM,kBACdF,KAAkBT,IAAqB,cAAcD,CAAwB,MAAM;AAEvF,UAAMa,IAA0B,SAAS,cAAc,KAAK;AAC5D,IAAAA,EAAwB,aAAa,iCAAiC,MAAM,GAC5EA,EAAwB,UAAU,IAAI,oBAAoB,GAC1DD,EAAY,YAAYC,CAAuB,GAC/CR,EAAsBQ,CAAuB,GAE7C,SAAS,KAAK,YAAYD,CAAW;AAErC,QAAIE,IAAU,GACVC,IAAgB,IAChBC,IAAuC,MACvCC,IAAyC;AAE7C,UAAMC,IAAmB,CAACC,MAAkB;AACxC,YAAMC,IAAe,OAAOD,CAAK;AACjC,aAAO,OAAO,SAASC,CAAY,IAAIA,IAAe;AAAA,IAC1D,GACMC,IAAoB,MAAM;AAC5B,MAAAL,GAAe,OAAA,GACfA,IAAgB,MAChBC,IAAqB;AAAA,IACzB,GAEMK,IAA0B,CAACC,MAAiC;AAC9D,YAAMC,IAAOD,EAAM,QAAQ,sBAAA;AAO3B,UANIC,EAAK,UAAU,KAAKA,EAAK,WAAW,KAKpCA,EAAK,UAAU,KAAKA,EAAK,OAAO,OAAO,eAAeA,EAAK,SAAS,KAAKA,EAAK,QAAQ,OAAO;AAE7F,eAAO;AAGX,YAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,MAAAA,EAAM,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,GAEJA,EAAM,aAAa,gCAAgC,MAAM,GACzDA,EAAM,MAAM,MAAM,GAAGD,EAAK,MAAM,CAAC,MACjCC,EAAM,MAAM,OAAO,GAAGD,EAAK,OAAO,CAAC,MACnCC,EAAM,MAAM,WAAW;AAEvB,YAAMC,IAAY,CAACC,MAAiB;AAChC,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNpB,EAAyB,QAAQ,IAAIgB,EAAM,OAAO,GAC9CN,MAAuBQ,KACvBJ,EAAA,GAEJI,EAAM,OAAA;AAAA,MACV,GAEMG,IAAkBL,EAAM,QAAQ,OAAO,CAACM,GAAKC,MAAUD,IAAMX,EAAiBY,EAAM,UAAU,GAAG,CAAC,GAClGC,IAAiBR,EAAM,QAAQ,OAAO,CAACM,GAAKC,MAAUD,IAAMX,EAAiBY,EAAM,UAAU,GAAG,CAAC,GACjGE,IAAqBC,EAAsBV,EAAM,SAAS,GAC1DW,IAAiB,mBACjBC,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,UAAU,IAAI,gBAAgB,iBAAiB,YAAY,kBAAkBH,CAAkB,GACpGP,EAAM,YAAYU,CAAI,GAElBjC,MACAiC,EAAK,iBAAiB,eAAeT,CAAS,GAC9CS,EAAK,iBAAiB,SAAST,CAAS;AAG5C,YAAMU,IAAgB,MAAM;AACxB,QAAIJ,MAAuBE,MAG3BC,EAAK,UAAU,OAAOH,CAAkB,GACxCG,EAAK,UAAU,IAAID,CAAc;AAAA,MACrC,GACMG,IAAkB,MAAM;AAC1B,QAAIL,MAAuBE,MAG3BC,EAAK,UAAU,OAAOD,CAAc,GACpCC,EAAK,UAAU,IAAIH,CAAkB;AAAA,MACzC;AAEA,MAAI9B,MACAiC,EAAK,iBAAiB,cAAcC,CAAa,GACjDD,EAAK,iBAAiB,cAAcE,CAAe;AAGvD,YAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,aAAAA,EAAK,cAAc,GAAGV,CAAe,YAAYG,CAAc,UAC/DO,EAAK,UAAU;AAAA,QACXpC,IAAuB,mBAAmB;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MAAA,GAEJuB,EAAM,YAAYa,CAAI,GAEtBb,EAAM,iBAAiB,SAAS,CAAAE,MAAS;AACrC,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA;AAEN,cAAMY,IAAaZ,GACba,IAAwBvB,MAAuBQ;AAGrD,QAFAJ,EAAA,GAEI,CAAAmB,MAIJxB,IAAgByB,EAA8B;AAAA,UAC1C,aAAA7B;AAAA,UACA,cAAc;AAAA,YACV,aAAaW,EAAM;AAAA,YACnB,YAAYA,EAAM;AAAA,YAClB,cAAcA,EAAM;AAAA,UAAA;AAAA,UAExB,iBAAAK;AAAA,UACA,gBAAAG;AAAA,UACA,qBAAA5B;AAAA,UACA,YAAYoC;AAAA,UACZ,gBAAgBhB,EAAM;AAAA,QAAA,CACzB,GACDN,IAAqBQ;AAAA,MACzB,CAAC,GAEMA;AAAA,IACX,GAEMiB,IAAiB,CAACC,MACpBA,EAAgB,OAAO,CAACC,GAASC,MAAY;AACzC,YAAMC,IAAcD,EAAQ,aAAa,4BAA4B,GAC/DE,IAAaF,EAAQ,aAAa,2BAA2B,GAC7DG,IAAkBH,EAAQ,aAAa,6BAA6B,GACpEI,IACFD,MAAoB,WAAWA,MAAoB,eAAeA,IAAkB,MAClFE,IAAYD,IAAeE,EAAYF,CAAY,IAAI;AAM7D,UAJI,CAACH,KAAe,CAACC,KAAc,CAACE,KAAgB,CAACC,KAIjD3C,EAAyB,QAAQ,IAAIsC,CAAO;AAC5C,eAAOD;AAGX,YAAMQ,IAAUrD,EAAgB,IAAIsD,EAAyBP,GAAaC,CAAU,CAAC;AACrF,aAAI,CAACK,KAAWA,EAAQ,WAAW,KAInCR,EAAQ,KAAK,EAAE,SAAAC,GAAS,aAAAC,GAAa,YAAAC,GAAY,cAAAE,GAAc,WAAAC,GAAW,SAAAE,GAAS,GAC5ER;AAAA,IACX,GAAG,CAAA,CAA6B,GAE9BU,IAAiB,MAAM;AACzB,MAAAvC,IAAgB,IAChBM,EAAA,GACAT,EAAY,iBAAiB,gCAAgC,EAAE,QAAQ,CAAAa,MAAS;AAC5E,QAAAA,EAAM,OAAA;AAAA,MACV,CAAC;AAED,YAAMkB,IAAkB,MAAM,KAAK,SAAS,iBAA8BY,CAA0B,CAAC;AAOrG,UANA9C,EAAkC,UAAU+C,EAAoC;AAAA,QAC5E,iBAAAzD;AAAA,QACA,iBAAA4C;AAAA,QACA,qBAAqBlC,EAAkC;AAAA,MAAA,CAC1D,GAEG,CAACR;AACD;AAIJ,MADgByC,EAAeC,CAAe,EACtC,QAAQ,CAAApB,MAAS;AACrB,cAAME,IAAQH,EAAwBC,CAAK;AAC3C,QAAIE,KACAb,EAAY,YAAYa,CAAK;AAAA,MAErC,CAAC;AAAA,IACL,GAEMgC,IAAkB,MAAM;AAC1B,MAAI1C,MAIJA,IAAgB,IAChBD,IAAU,OAAO,sBAAsBwC,CAAc;AAAA,IACzD,GAEMI,IAAmB,IAAI,iBAAiB,CAAAC,MAAmB;AAG7D,MAF4BA,EAAgB,KAAK,CAAAC,MAAU,CAAChD,EAAY,SAASgD,EAAO,MAAM,CAAC,KAM/FH,EAAA;AAAA,IACJ,CAAC;AACD,IAAAC,EAAiB,QAAQ,SAAS,MAAM;AAAA,MACpC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,iBAAiB,CAAC,8BAA8B,6BAA6B,6BAA6B;AAAA,IAAA,CAC7G;AAED,UAAMG,IAA4B,CAAClC,MAAwB;AACvD,YAAMmC,IAASnC,EAAM;AACrB,MAAMmC,aAAkB,SAIpB9C,GAAe,SAAS8C,CAAM,KAI9BA,aAAkB,WAAWA,EAAO,QAAQ,gCAAgC,KAIhFzC,EAAA;AAAA,IACJ,GACM0C,IAAwB,CAACpC,MAAyB;AACpD,MAAIA,EAAM,QAAQ,YACdN,EAAA;AAAA,IAER;AAEA,oBAAS,iBAAiB,eAAewC,GAA2B,EAAI,GACxE,SAAS,iBAAiB,WAAWE,CAAqB,GAC1D,OAAO,iBAAiB,UAAUN,GAAiB,EAAI,GACvD,OAAO,iBAAiB,UAAUA,CAAe,GACjDA,EAAA,GAEO,MAAM;AACT,MAAApD,EAAsB,IAAI,GAC1BgB,EAAA,GACA,SAAS,oBAAoB,eAAewC,GAA2B,EAAI,GAC3E,SAAS,oBAAoB,WAAWE,CAAqB,GAC7D,OAAO,oBAAoB,UAAUN,GAAiB,EAAI,GAC1D,OAAO,oBAAoB,UAAUA,CAAe,GACpDC,EAAiB,WAAA,GACjB,OAAO,qBAAqB5C,CAAO,GACnCF,EAAY,OAAA;AAAA,IAChB;AAAA,EACJ,GAAG,CAACb,GAAiBW,GAAgBV,GAA0BC,GAAoBC,CAAoB,CAAC,GAEjGE;AACX;"}
@@ -0,0 +1,11 @@
1
+ const o = (e, s, t) => {
2
+ const n = t < 0 ? e.length + t : t, c = e.splice(s, 1)[0];
3
+ e.splice(n, 0, c);
4
+ }, r = (e, s, t) => {
5
+ const n = [...e];
6
+ return o(n, s, t), n;
7
+ };
8
+ export {
9
+ r as default
10
+ };
11
+ //# sourceMappingURL=arrayMove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrayMove.js","sources":["../../src/utils/arrayMove.ts"],"sourcesContent":["// taken from https://github.com/sindresorhus/array-move\n// but added here so it will be compiled to es5 as the original library was not and failed in IE11\n\nconst arrayMoveMutate = <T>(array: T[], from: number, to: number): void => {\n const startIndex = to < 0 ? array.length + to : to;\n const item = array.splice(from, 1)[0];\n array.splice(startIndex, 0, item);\n};\n\nconst arrayMove = <T>(array: T[], from: number, to: number): T[] => {\n const newArray = [...array];\n arrayMoveMutate(newArray, from, to);\n return newArray;\n};\n\nexport default arrayMove;\n"],"names":["arrayMoveMutate","array","from","to","startIndex","item","arrayMove","newArray"],"mappings":"AAGA,MAAMA,IAAkB,CAAIC,GAAYC,GAAcC,MAAqB;AACvE,QAAMC,IAAaD,IAAK,IAAIF,EAAM,SAASE,IAAKA,GAC1CE,IAAOJ,EAAM,OAAOC,GAAM,CAAC,EAAE,CAAC;AACpC,EAAAD,EAAM,OAAOG,GAAY,GAAGC,CAAI;AACpC,GAEMC,IAAY,CAAIL,GAAYC,GAAcC,MAAoB;AAChE,QAAMI,IAAW,CAAC,GAAGN,CAAK;AAC1B,SAAAD,EAAgBO,GAAUL,GAAMC,CAAE,GAC3BI;AACX;"}
@@ -1,5 +1,5 @@
1
1
  const N = (p, x, u) => {
2
- var f = " ua-", g = /\s*([\-\w ]+)[\s\/\:]([\d_]+\b(?:[\-\._\/]\w+)*)/, h = /([\w\-\.]+[\s\/][v]?[\d_]+\b(?:[\-\._\/]\w+)*)/g, k = /\b(?:(blackberry\w*|bb10)|(rim tablet os))(?:\/(\d+\.\d+(?:\.\w+)*))?/, R = /\bsilk-accelerated=true\b/, y = /\bfluidapp\b/, j = /(\bwindows\b|\bmacintosh\b|\blinux\b|\bunix\b)/, E = /(\bandroid\b|\bipad\b|\bipod\b|\bwindows phone\b|\bwpdesktop\b|\bxblwp7\b|\bzunewp7\b|\bwindows ce\b|\bblackberry\w*|\bbb10\b|\brim tablet os\b|\bmeego|\bwebos\b|\bpalm|\bsymbian|\bj2me\b|\bdocomo\b|\bpda\b|\bchtml\b|\bmidp\b|\bcldc\b|\w*?mobile\w*?|\w*?phone\w*?)/, $ = /(\bxbox\b|\bplaystation\b|\bnintendo\s+\w+)/, a = {
2
+ var f = " ua-", g = /\s*([-\w ]+)[\s/:]([\d_]+\b(?:[-._/]\w+)*)/, h = /([\w\-.]+[\s/][v]?[\d_]+\b(?:[-._/]\w+)*)/g, k = /\b(?:(blackberry\w*|bb10)|(rim tablet os))(?:\/(\d+\.\d+(?:\.\w+)*))?/, R = /\bsilk-accelerated=true\b/, y = /\bfluidapp\b/, j = /(\bwindows\b|\bmacintosh\b|\blinux\b|\bunix\b)/, E = /(\bandroid\b|\bipad\b|\bipod\b|\bwindows phone\b|\bwpdesktop\b|\bxblwp7\b|\bzunewp7\b|\bwindows ce\b|\bblackberry\w*|\bbb10\b|\brim tablet os\b|\bmeego|\bwebos\b|\bpalm|\bsymbian|\bj2me\b|\bdocomo\b|\bpda\b|\bchtml\b|\bmidp\b|\bcldc\b|\w*?mobile\w*?|\w*?phone\w*?)/, $ = /(\bxbox\b|\bplaystation\b|\bnintendo\s+\w+)/, a = {
3
3
  parse: (
4
4
  /**
5
5
  * @param uaStr {string}
@@ -21,7 +21,7 @@ const N = (p, x, u) => {
21
21
  var c = s[n].match(h);
22
22
  if (c)
23
23
  for (o = 0, r = c.length; o < r; o++) {
24
- var t = c[o].split(/[\/\s]+/);
24
+ var t = c[o].split(/[/\s]+/);
25
25
  t.length && t[0] !== "mozilla" && (e[t[0].split(" ").join("_")] = t.slice(1).join("-"));
26
26
  }
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cssuseragent.js","sources":["../../src/utils/cssuseragent.js"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noRedundantUseStrict: 3rd party code */\n/** biome-ignore-all lint/suspicious/noPrototypeBuiltins: 3rd party code */\n/** biome-ignore-all lint/complexity/useArrowFunction: 3rd party code */\n/** biome-ignore-all lint/style/useTemplate: 3rd party code */\n\n/**\n * CssUserAgent (cssua.js) v2.1.31\n * http://cssuseragent.org\n *\n * Copyright (c)2006-2015 Stephen M. McKamey.\n * Licensed under The MIT License.\n */\n/*jshint smarttabs:true, regexp:false, browser:true */\n\n/**\n * @param html {Object} root DOM element\n * @param userAgent {string} browser userAgent string\n * @return {Object}\n */\nexport const cssua = (html, userAgent, sa) => {\n 'use strict';\n\n /**\n * @const\n * @type {string}\n */\n var PREFIX = ' ua-';\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Platform = /\\s*([\\-\\w ]+)[\\s\\/\\:]([\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Version = /([\\w\\-\\.]+[\\s\\/][v]?[\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/g;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_BlackBerry = /\\b(?:(blackberry\\w*|bb10)|(rim tablet os))(?:\\/(\\d+\\.\\d+(?:\\.\\w+)*))?/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Silk = /\\bsilk-accelerated=true\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_FluidApp = /\\bfluidapp\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_desktop = /(\\bwindows\\b|\\bmacintosh\\b|\\blinux\\b|\\bunix\\b)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_mobile =\n /(\\bandroid\\b|\\bipad\\b|\\bipod\\b|\\bwindows phone\\b|\\bwpdesktop\\b|\\bxblwp7\\b|\\bzunewp7\\b|\\bwindows ce\\b|\\bblackberry\\w*|\\bbb10\\b|\\brim tablet os\\b|\\bmeego|\\bwebos\\b|\\bpalm|\\bsymbian|\\bj2me\\b|\\bdocomo\\b|\\bpda\\b|\\bchtml\\b|\\bmidp\\b|\\bcldc\\b|\\w*?mobile\\w*?|\\w*?phone\\w*?)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_game = /(\\bxbox\\b|\\bplaystation\\b|\\bnintendo\\s+\\w+)/;\n\n /**\n * The root CssUserAgent\n * @type {Object}\n */\n var cssua = {\n parse:\n /**\n * @param uaStr {string}\n * @return {Object}\n */\n function (uaStr, sa) {\n /**\n * @type {Object}\n */\n var ua = {};\n if (sa) {\n ua.standalone = sa;\n }\n\n uaStr = ('' + uaStr).toLowerCase();\n if (!uaStr) {\n return ua;\n }\n\n var i,\n count,\n raw = uaStr.split(/[()]/);\n for (var j = 0, rawCount = raw.length; j < rawCount; j++) {\n if (j % 2) {\n // inside parens covers platform identifiers\n var platforms = raw[j].split(';');\n for (i = 0, count = platforms.length; i < count; i++) {\n if (R_Platform.exec(platforms[i])) {\n var key = RegExp.$1.split(' ').join('_'),\n val = RegExp.$2;\n\n // if duplicate entries favor highest version\n if (!ua[key] || Number.parseFloat(ua[key]) < Number.parseFloat(val)) {\n ua[key] = val;\n }\n }\n }\n } else {\n // outside parens covers most version identifiers\n var uas = raw[j].match(R_Version);\n if (uas) {\n for (i = 0, count = uas.length; i < count; i++) {\n var parts = uas[i].split(/[\\/\\s]+/);\n if (parts.length && parts[0] !== 'mozilla') {\n ua[parts[0].split(' ').join('_')] = parts.slice(1).join('-');\n }\n }\n }\n }\n }\n\n if (R_mobile.exec(uaStr)) {\n // mobile device indicators\n ua.mobile = RegExp.$1;\n if (R_BlackBerry.exec(uaStr)) {\n delete ua[ua.mobile];\n ua.blackberry = ua.version || RegExp.$3 || RegExp.$2 || RegExp.$1;\n if (RegExp.$1) {\n // standardize non-tablet blackberry\n ua.mobile = 'blackberry';\n } else if (ua.version === '0.0.1') {\n // fix playbook 1.0 quirk\n ua.blackberry = '7.1.0.0';\n }\n }\n } else if (R_game.exec(uaStr)) {\n // game console indicators\n ua.game = RegExp.$1;\n var game = ua.game.split(' ').join('_');\n\n if (ua.version && !ua[game]) {\n ua[game] = ua.version;\n }\n } else if (R_desktop.exec(uaStr)) {\n // desktop OS indicators\n ua.desktop = RegExp.$1;\n }\n\n // platform naming standardizations\n if (ua.intel_mac_os_x) {\n ua.mac_os_x = ua.intel_mac_os_x.split('_').join('.');\n delete ua.intel_mac_os_x;\n } else if (ua.cpu_iphone_os) {\n ua.ios = ua.cpu_iphone_os.split('_').join('.');\n delete ua.cpu_iphone_os;\n } else if (ua.cpu_os) {\n ua.ios = ua.cpu_os.split('_').join('.');\n delete ua.cpu_os;\n } else if (ua.mobile === 'iphone' && !ua.ios) {\n ua.ios = '1';\n }\n\n // UA naming standardizations\n if (ua.opera && ua.version) {\n ua.opera = ua.version;\n // version/XXX refers to opera\n delete ua.blackberry;\n } else if (R_Silk.exec(uaStr)) {\n ua.silk_accelerated = true;\n } else if (R_FluidApp.exec(uaStr)) {\n ua.fluidapp = ua.version;\n }\n\n if (ua.edge) {\n delete ua.applewebkit;\n delete ua.safari;\n delete ua.chrome;\n delete ua.android;\n }\n\n if (ua.applewebkit) {\n ua.webkit = ua.applewebkit;\n delete ua.applewebkit;\n\n if (ua.opr) {\n ua.opera = ua.opr;\n delete ua.opr;\n delete ua.chrome;\n }\n\n if (ua.safari) {\n if (\n ua.chrome ||\n ua.crios ||\n ua.fxios ||\n ua.opera ||\n ua.silk ||\n ua.fluidapp ||\n ua.phantomjs ||\n (ua.mobile && !ua.ios)\n ) {\n delete ua.safari;\n\n if (ua.vivaldi) {\n delete ua.chrome;\n }\n } else if (ua.version && !ua.rim_tablet_os) {\n ua.safari = ua.version;\n } else {\n ua.safari =\n {\n 419: '2.0.4',\n 417: '2.0.3',\n 416: '2.0.2',\n 412: '2.0',\n 312: '1.3',\n 125: '1.2',\n 85: '1.0',\n }[Number.parseInt(ua.safari, 10)] || ua.safari;\n }\n }\n } else if (ua.msie || ua.trident) {\n if (!ua.opera) {\n // standardize Internet Explorer\n ua.ie = ua.msie || ua.rv;\n }\n delete ua.msie;\n delete ua.android;\n\n if (ua.windows_phone_os) {\n // standardize window phone\n ua.windows_phone = ua.windows_phone_os;\n delete ua.windows_phone_os;\n } else if (ua.mobile === 'wpdesktop' || ua.mobile === 'xblwp7' || ua.mobile === 'zunewp7') {\n ua.mobile = 'windows desktop';\n ua.windows_phone = +ua.ie < 9 ? '7.0' : +ua.ie < 10 ? '7.5' : '8.0';\n delete ua.windows_nt;\n }\n } else if (ua.gecko || ua.firefox) {\n ua.gecko = ua.rv;\n }\n\n if (ua.rv) {\n delete ua.rv;\n }\n if (ua.version) {\n delete ua.version;\n }\n\n return ua;\n },\n\n format:\n /**\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n /**\n * @param b {string} browser key\n * @param v {string} browser value\n * @return {string} formatted CSS classes\n */\n function format(b, v) {\n b = b.split('.').join('-');\n\n /**\n * @type {string}\n */\n var css = PREFIX + b;\n if (typeof v === 'string') {\n v = v.split(' ').join('_').split('.').join('-');\n var i = v.indexOf('-');\n while (i > 0) {\n // loop through chopping last '-' to end off\n // concat result onto return string\n css += PREFIX + b + '-' + v.substring(0, i);\n i = v.indexOf('-', i + 1);\n }\n css += PREFIX + b + '-' + v;\n }\n return css;\n }\n\n /**\n * @type {string}\n */\n var uaCss = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n uaCss += format(b, ua[b]);\n }\n }\n\n // user-agent classNames\n return uaCss;\n },\n\n encode:\n /**\n * Encodes parsed userAgent object as a compact URI-Encoded key-value collection\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n var query = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n if (query) {\n query += '&';\n }\n query += encodeURIComponent(b) + '=' + encodeURIComponent(ua[b]);\n }\n }\n return query;\n },\n };\n\n /**\n * @const\n * @type {Object}\n */\n cssua.userAgent = cssua.ua = cssua.parse(userAgent, sa);\n\n /**\n * @const\n * @type {string}\n */\n var ua = cssua.format(cssua.ua) + ' js';\n\n // append CSS classes to HTML node\n if (html.className) {\n html.className = html.className.replace(/\\bno-js\\b/g, '') + ua;\n } else {\n html.className = ua.substr(1);\n }\n\n return cssua;\n};\n"],"names":["cssua","html","userAgent","sa","PREFIX","R_Platform","R_Version","R_BlackBerry","R_Silk","R_FluidApp","R_desktop","R_mobile","R_game","uaStr","ua","i","count","raw","j","rawCount","platforms","key","val","uas","parts","game","format","b","v","css","uaCss","query"],"mappings":"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"}
1
+ {"version":3,"file":"cssuseragent.js","sources":["../../src/utils/cssuseragent.js"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noRedundantUseStrict: 3rd party code */\n/** biome-ignore-all lint/suspicious/noPrototypeBuiltins: 3rd party code */\n/** biome-ignore-all lint/complexity/useArrowFunction: 3rd party code */\n/** biome-ignore-all lint/style/useTemplate: 3rd party code */\n\n/**\n * CssUserAgent (cssua.js) v2.1.31\n * http://cssuseragent.org\n *\n * Copyright (c)2006-2015 Stephen M. McKamey.\n * Licensed under The MIT License.\n */\n/*jshint smarttabs:true, regexp:false, browser:true */\n\n/**\n * @param html {Object} root DOM element\n * @param userAgent {string} browser userAgent string\n * @return {Object}\n */\nexport const cssua = (html, userAgent, sa) => {\n 'use strict';\n\n /**\n * @const\n * @type {string}\n */\n var PREFIX = ' ua-';\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Platform = /\\s*([-\\w ]+)[\\s/:]([\\d_]+\\b(?:[-._/]\\w+)*)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Version = /([\\w\\-.]+[\\s/][v]?[\\d_]+\\b(?:[-._/]\\w+)*)/g;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_BlackBerry = /\\b(?:(blackberry\\w*|bb10)|(rim tablet os))(?:\\/(\\d+\\.\\d+(?:\\.\\w+)*))?/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Silk = /\\bsilk-accelerated=true\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_FluidApp = /\\bfluidapp\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_desktop = /(\\bwindows\\b|\\bmacintosh\\b|\\blinux\\b|\\bunix\\b)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_mobile =\n /(\\bandroid\\b|\\bipad\\b|\\bipod\\b|\\bwindows phone\\b|\\bwpdesktop\\b|\\bxblwp7\\b|\\bzunewp7\\b|\\bwindows ce\\b|\\bblackberry\\w*|\\bbb10\\b|\\brim tablet os\\b|\\bmeego|\\bwebos\\b|\\bpalm|\\bsymbian|\\bj2me\\b|\\bdocomo\\b|\\bpda\\b|\\bchtml\\b|\\bmidp\\b|\\bcldc\\b|\\w*?mobile\\w*?|\\w*?phone\\w*?)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_game = /(\\bxbox\\b|\\bplaystation\\b|\\bnintendo\\s+\\w+)/;\n\n /**\n * The root CssUserAgent\n * @type {Object}\n */\n var cssua = {\n parse:\n /**\n * @param uaStr {string}\n * @return {Object}\n */\n function (uaStr, sa) {\n /**\n * @type {Object}\n */\n var ua = {};\n if (sa) {\n ua.standalone = sa;\n }\n\n uaStr = ('' + uaStr).toLowerCase();\n if (!uaStr) {\n return ua;\n }\n\n var i,\n count,\n raw = uaStr.split(/[()]/);\n for (var j = 0, rawCount = raw.length; j < rawCount; j++) {\n if (j % 2) {\n // inside parens covers platform identifiers\n var platforms = raw[j].split(';');\n for (i = 0, count = platforms.length; i < count; i++) {\n if (R_Platform.exec(platforms[i])) {\n var key = RegExp.$1.split(' ').join('_'),\n val = RegExp.$2;\n\n // if duplicate entries favor highest version\n if (!ua[key] || Number.parseFloat(ua[key]) < Number.parseFloat(val)) {\n ua[key] = val;\n }\n }\n }\n } else {\n // outside parens covers most version identifiers\n var uas = raw[j].match(R_Version);\n if (uas) {\n for (i = 0, count = uas.length; i < count; i++) {\n var parts = uas[i].split(/[/\\s]+/);\n if (parts.length && parts[0] !== 'mozilla') {\n ua[parts[0].split(' ').join('_')] = parts.slice(1).join('-');\n }\n }\n }\n }\n }\n\n if (R_mobile.exec(uaStr)) {\n // mobile device indicators\n ua.mobile = RegExp.$1;\n if (R_BlackBerry.exec(uaStr)) {\n delete ua[ua.mobile];\n ua.blackberry = ua.version || RegExp.$3 || RegExp.$2 || RegExp.$1;\n if (RegExp.$1) {\n // standardize non-tablet blackberry\n ua.mobile = 'blackberry';\n } else if (ua.version === '0.0.1') {\n // fix playbook 1.0 quirk\n ua.blackberry = '7.1.0.0';\n }\n }\n } else if (R_game.exec(uaStr)) {\n // game console indicators\n ua.game = RegExp.$1;\n var game = ua.game.split(' ').join('_');\n\n if (ua.version && !ua[game]) {\n ua[game] = ua.version;\n }\n } else if (R_desktop.exec(uaStr)) {\n // desktop OS indicators\n ua.desktop = RegExp.$1;\n }\n\n // platform naming standardizations\n if (ua.intel_mac_os_x) {\n ua.mac_os_x = ua.intel_mac_os_x.split('_').join('.');\n delete ua.intel_mac_os_x;\n } else if (ua.cpu_iphone_os) {\n ua.ios = ua.cpu_iphone_os.split('_').join('.');\n delete ua.cpu_iphone_os;\n } else if (ua.cpu_os) {\n ua.ios = ua.cpu_os.split('_').join('.');\n delete ua.cpu_os;\n } else if (ua.mobile === 'iphone' && !ua.ios) {\n ua.ios = '1';\n }\n\n // UA naming standardizations\n if (ua.opera && ua.version) {\n ua.opera = ua.version;\n // version/XXX refers to opera\n delete ua.blackberry;\n } else if (R_Silk.exec(uaStr)) {\n ua.silk_accelerated = true;\n } else if (R_FluidApp.exec(uaStr)) {\n ua.fluidapp = ua.version;\n }\n\n if (ua.edge) {\n delete ua.applewebkit;\n delete ua.safari;\n delete ua.chrome;\n delete ua.android;\n }\n\n if (ua.applewebkit) {\n ua.webkit = ua.applewebkit;\n delete ua.applewebkit;\n\n if (ua.opr) {\n ua.opera = ua.opr;\n delete ua.opr;\n delete ua.chrome;\n }\n\n if (ua.safari) {\n if (\n ua.chrome ||\n ua.crios ||\n ua.fxios ||\n ua.opera ||\n ua.silk ||\n ua.fluidapp ||\n ua.phantomjs ||\n (ua.mobile && !ua.ios)\n ) {\n delete ua.safari;\n\n if (ua.vivaldi) {\n delete ua.chrome;\n }\n } else if (ua.version && !ua.rim_tablet_os) {\n ua.safari = ua.version;\n } else {\n ua.safari =\n {\n 419: '2.0.4',\n 417: '2.0.3',\n 416: '2.0.2',\n 412: '2.0',\n 312: '1.3',\n 125: '1.2',\n 85: '1.0',\n }[Number.parseInt(ua.safari, 10)] || ua.safari;\n }\n }\n } else if (ua.msie || ua.trident) {\n if (!ua.opera) {\n // standardize Internet Explorer\n ua.ie = ua.msie || ua.rv;\n }\n delete ua.msie;\n delete ua.android;\n\n if (ua.windows_phone_os) {\n // standardize window phone\n ua.windows_phone = ua.windows_phone_os;\n delete ua.windows_phone_os;\n } else if (ua.mobile === 'wpdesktop' || ua.mobile === 'xblwp7' || ua.mobile === 'zunewp7') {\n ua.mobile = 'windows desktop';\n ua.windows_phone = +ua.ie < 9 ? '7.0' : +ua.ie < 10 ? '7.5' : '8.0';\n delete ua.windows_nt;\n }\n } else if (ua.gecko || ua.firefox) {\n ua.gecko = ua.rv;\n }\n\n if (ua.rv) {\n delete ua.rv;\n }\n if (ua.version) {\n delete ua.version;\n }\n\n return ua;\n },\n\n format:\n /**\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n /**\n * @param b {string} browser key\n * @param v {string} browser value\n * @return {string} formatted CSS classes\n */\n function format(b, v) {\n b = b.split('.').join('-');\n\n /**\n * @type {string}\n */\n var css = PREFIX + b;\n if (typeof v === 'string') {\n v = v.split(' ').join('_').split('.').join('-');\n var i = v.indexOf('-');\n while (i > 0) {\n // loop through chopping last '-' to end off\n // concat result onto return string\n css += PREFIX + b + '-' + v.substring(0, i);\n i = v.indexOf('-', i + 1);\n }\n css += PREFIX + b + '-' + v;\n }\n return css;\n }\n\n /**\n * @type {string}\n */\n var uaCss = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n uaCss += format(b, ua[b]);\n }\n }\n\n // user-agent classNames\n return uaCss;\n },\n\n encode:\n /**\n * Encodes parsed userAgent object as a compact URI-Encoded key-value collection\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n var query = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n if (query) {\n query += '&';\n }\n query += encodeURIComponent(b) + '=' + encodeURIComponent(ua[b]);\n }\n }\n return query;\n },\n };\n\n /**\n * @const\n * @type {Object}\n */\n cssua.userAgent = cssua.ua = cssua.parse(userAgent, sa);\n\n /**\n * @const\n * @type {string}\n */\n var ua = cssua.format(cssua.ua) + ' js';\n\n // append CSS classes to HTML node\n if (html.className) {\n html.className = html.className.replace(/\\bno-js\\b/g, '') + ua;\n } else {\n html.className = ua.substr(1);\n }\n\n return cssua;\n};\n"],"names":["cssua","html","userAgent","sa","PREFIX","R_Platform","R_Version","R_BlackBerry","R_Silk","R_FluidApp","R_desktop","R_mobile","R_game","uaStr","ua","i","count","raw","j","rawCount","platforms","key","val","uas","parts","game","format","b","v","css","uaCss","query"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deviceUtils.js","sources":["../../src/utils/deviceUtils.ts"],"sourcesContent":["import { cssua } from './cssuseragent';\n\n// Navigator.standalone - Returns a boolean indicating whether the browser is running in standalone mode.\n// Caution, it's available on Apple's iOS Safari only.\ntype NavigatorWithStandalone = Navigator & {\n standalone?: boolean;\n};\n\n// As \"cssuseragent\" is accessing the html dom object directly without checking whether it exists or not,\n// we need to initialize only when html really exists. This avoids issues when running the UIKIT in a web-worker\nif (document?.documentElement) {\n cssua(document.documentElement, navigator.userAgent, (navigator as NavigatorWithStandalone).standalone);\n}\n\nconst isDefined = <T>(val: T | null | undefined): val is T => val !== undefined && val !== null;\n\n// see https://patrickhlauke.github.io/touch/touchscreen-detection/ for reference\nexport const hasTouch = () => {\n if (window.PointerEvent && isDefined(navigator.maxTouchPoints)) {\n // if Pointer Events are supported, just check maxTouchPoints\n if (navigator.maxTouchPoints > 0) {\n return true;\n }\n } else if (window.matchMedia?.('(any-pointer:coarse)').matches) {\n // no Pointer Events...\n // check for any-pointer:coarse which mostly means touchscreen\n return true;\n } else if (window.TouchEvent || isDefined(window.ontouchstart)) {\n // last resort - check for exposed touch events API / event handler\n return true;\n }\n\n return false;\n};\n\n// Screen sizes\nexport const MOBILE_SCREEN = 480;\n\nexport const SCREEN_SM = 768;\nexport const SCREEN_MD = 992;\nexport const SCREEN_LG = 1200;\nexport const SCREEN_XL = 1700;\n\nexport const isMobileScreen = () => window.matchMedia(`(max-width: ${MOBILE_SCREEN}px)`).matches;\n\nexport const isMobile = () => document?.documentElement.classList.contains('ua-mobile');\nexport const isDesktop = () => document?.documentElement.classList.contains('ua-desktop');\n\nexport const isMac = () => document?.documentElement.classList.contains('ua-desktop-macintosh');\n\nexport const isRetinaDevice = () => window.devicePixelRatio > 1;\n\nexport const inIframe = () => {\n try {\n return window.self !== window.top;\n } catch (_) {\n return true;\n }\n};\n\n// Disables the Zoom for the mobile devices.\n// This is not good for accessibility but makes the webpage feel more like a native app.\n// <meta name=\"viewport\" content=\"user-scalable=0 ...\" />\nconst USER_SCALABLE = 'user-scalable=0 maximum-scale=1';\nexport const toggleZoomOnMobile = () => {\n if (!document) {\n return;\n }\n\n const viewportMeta = document.head.querySelector('[name=\"viewport\"]') as HTMLMetaElement | null;\n if (!viewportMeta) {\n return;\n }\n\n const isScalable = viewportMeta.content.includes(USER_SCALABLE);\n\n // Restrict the zoom for mobile if not yet set\n if (isMobile() && !isScalable) {\n viewportMeta.content += ` ${USER_SCALABLE}`;\n return;\n }\n\n // Remove the setting, for non mobile cases\n if (!isMobile() && isScalable) {\n viewportMeta.content = viewportMeta.content.replace(USER_SCALABLE, '').trim();\n return;\n }\n};\n"],"names":["cssua","isDefined","val","hasTouch","MOBILE_SCREEN","SCREEN_SM","SCREEN_MD","SCREEN_LG","SCREEN_XL","isMobileScreen","isMobile","isDesktop","isMac","isRetinaDevice","inIframe","USER_SCALABLE","toggleZoomOnMobile","viewportMeta","isScalable"],"mappings":";AAUI,UAAU,mBACVA,EAAM,SAAS,iBAAiB,UAAU,WAAY,UAAsC,UAAU;AAG1G,MAAMC,IAAY,CAAIC,MAA6DA,KAAQ,MAG9EC,IAAW,MAAM;AAC1B,MAAI,OAAO,gBAAgBF,EAAU,UAAU,cAAc;AAEzD,QAAI,UAAU,iBAAiB;AAC3B,aAAO;AAAA,SAEf;AAAA,QAAW,OAAO,aAAa,sBAAsB,EAAE;AAGnD,aAAO;QACA,OAAO,cAAcA,EAAU,OAAO,YAAY;AAEzD,aAAO;AAAA;AAGX,SAAO;AACX,GAGaG,IAAgB,KAEhBC,IAAY,KACZC,IAAY,KACZC,IAAY,MACZC,IAAY,MAEZC,IAAiB,MAAM,OAAO,WAAW,eAAeL,CAAa,KAAK,EAAE,SAE5EM,IAAW,MAAM,UAAU,gBAAgB,UAAU,SAAS,WAAW,GACzEC,IAAY,MAAM,UAAU,gBAAgB,UAAU,SAAS,YAAY,GAE3EC,IAAQ,MAAM,UAAU,gBAAgB,UAAU,SAAS,sBAAsB,GAEjFC,IAAiB,MAAM,OAAO,mBAAmB,GAEjDC,IAAW,MAAM;AAC1B,MAAI;AACA,WAAO,OAAO,SAAS,OAAO;AAAA,EAClC,QAAY;AACR,WAAO;AAAA,EACX;AACJ,GAKMC,IAAgB,mCACTC,IAAqB,MAAM;AACpC,MAAI,CAAC;AACD;AAGJ,QAAMC,IAAe,SAAS,KAAK,cAAc,mBAAmB;AACpE,MAAI,CAACA;AACD;AAGJ,QAAMC,IAAaD,EAAa,QAAQ,SAASF,CAAa;AAG9D,MAAIL,EAAA,KAAc,CAACQ,GAAY;AAC3B,IAAAD,EAAa,WAAW,IAAIF,CAAa;AACzC;AAAA,EACJ;AAGA,MAAI,CAACL,EAAA,KAAcQ,GAAY;AAC3B,IAAAD,EAAa,UAAUA,EAAa,QAAQ,QAAQF,GAAe,EAAE,EAAE,KAAA;AACvE;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"deviceUtils.js","sources":["../../src/utils/deviceUtils.ts"],"sourcesContent":["import { cssua } from './cssuseragent';\n\n// Navigator.standalone - Returns a boolean indicating whether the browser is running in standalone mode.\n// Caution, it's available on Apple's iOS Safari only.\ntype NavigatorWithStandalone = Navigator & {\n standalone?: boolean;\n};\n\n// As \"cssuseragent\" is accessing the html dom object directly without checking whether it exists or not,\n// we need to initialize only when html really exists. This avoids issues when running the UIKIT in a web-worker\nif (document?.documentElement) {\n cssua(document.documentElement, navigator.userAgent, (navigator as NavigatorWithStandalone).standalone);\n}\n\nconst isDefined = <T>(val: T | null | undefined): val is T => val !== undefined && val !== null;\n\n// see https://patrickhlauke.github.io/touch/touchscreen-detection/ for reference\nexport const hasTouch = () => {\n if (window.PointerEvent && isDefined(navigator.maxTouchPoints)) {\n // if Pointer Events are supported, just check maxTouchPoints\n if (navigator.maxTouchPoints > 0) {\n return true;\n }\n } else if (window.matchMedia?.('(any-pointer:coarse)').matches) {\n // no Pointer Events...\n // check for any-pointer:coarse which mostly means touchscreen\n return true;\n } else if (window.TouchEvent || isDefined(window.ontouchstart)) {\n // last resort - check for exposed touch events API / event handler\n return true;\n }\n\n return false;\n};\n\n// Screen sizes\nexport const MOBILE_SCREEN = 480;\n\nexport const SCREEN_SM = 768;\nexport const SCREEN_MD = 992;\nexport const SCREEN_LG = 1200;\nexport const SCREEN_XL = 1700;\n\nexport const isMobileScreen = () => window.matchMedia(`(max-width: ${MOBILE_SCREEN}px)`).matches;\n\nexport const isMobile = () => document?.documentElement.classList.contains('ua-mobile');\nexport const isDesktop = () => document?.documentElement.classList.contains('ua-desktop');\n\nexport const isMac = () => document?.documentElement.classList.contains('ua-desktop-macintosh');\n\nexport const isRetinaDevice = () => window.devicePixelRatio > 1;\n\nexport const inIframe = () => {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n};\n\n// Disables the Zoom for the mobile devices.\n// This is not good for accessibility but makes the webpage feel more like a native app.\n// <meta name=\"viewport\" content=\"user-scalable=0 ...\" />\nconst USER_SCALABLE = 'user-scalable=0 maximum-scale=1';\nexport const toggleZoomOnMobile = () => {\n if (!document) {\n return;\n }\n\n const viewportMeta = document.head.querySelector('[name=\"viewport\"]') as HTMLMetaElement | null;\n if (!viewportMeta) {\n return;\n }\n\n const isScalable = viewportMeta.content.includes(USER_SCALABLE);\n\n // Restrict the zoom for mobile if not yet set\n if (isMobile() && !isScalable) {\n viewportMeta.content += ` ${USER_SCALABLE}`;\n return;\n }\n\n // Remove the setting, for non mobile cases\n if (!isMobile() && isScalable) {\n viewportMeta.content = viewportMeta.content.replace(USER_SCALABLE, '').trim();\n return;\n }\n};\n"],"names":["cssua","isDefined","val","hasTouch","MOBILE_SCREEN","SCREEN_SM","SCREEN_MD","SCREEN_LG","SCREEN_XL","isMobileScreen","isMobile","isDesktop","isMac","isRetinaDevice","inIframe","USER_SCALABLE","toggleZoomOnMobile","viewportMeta","isScalable"],"mappings":";AAUI,UAAU,mBACVA,EAAM,SAAS,iBAAiB,UAAU,WAAY,UAAsC,UAAU;AAG1G,MAAMC,IAAY,CAAIC,MAA6DA,KAAQ,MAG9EC,IAAW,MAAM;AAC1B,MAAI,OAAO,gBAAgBF,EAAU,UAAU,cAAc;AAEzD,QAAI,UAAU,iBAAiB;AAC3B,aAAO;AAAA,SAEf;AAAA,QAAW,OAAO,aAAa,sBAAsB,EAAE;AAGnD,aAAO;QACA,OAAO,cAAcA,EAAU,OAAO,YAAY;AAEzD,aAAO;AAAA;AAGX,SAAO;AACX,GAGaG,IAAgB,KAEhBC,IAAY,KACZC,IAAY,KACZC,IAAY,MACZC,IAAY,MAEZC,IAAiB,MAAM,OAAO,WAAW,eAAeL,CAAa,KAAK,EAAE,SAE5EM,IAAW,MAAM,UAAU,gBAAgB,UAAU,SAAS,WAAW,GACzEC,IAAY,MAAM,UAAU,gBAAgB,UAAU,SAAS,YAAY,GAE3EC,IAAQ,MAAM,UAAU,gBAAgB,UAAU,SAAS,sBAAsB,GAEjFC,IAAiB,MAAM,OAAO,mBAAmB,GAEjDC,IAAW,MAAM;AAC1B,MAAI;AACA,WAAO,OAAO,SAAS,OAAO;AAAA,EAClC,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ,GAKMC,IAAgB,mCACTC,IAAqB,MAAM;AACpC,MAAI,CAAC;AACD;AAGJ,QAAMC,IAAe,SAAS,KAAK,cAAc,mBAAmB;AACpE,MAAI,CAACA;AACD;AAGJ,QAAMC,IAAaD,EAAa,QAAQ,SAASF,CAAa;AAG9D,MAAIL,EAAA,KAAc,CAACQ,GAAY;AAC3B,IAAAD,EAAa,WAAW,IAAIF,CAAa;AACzC;AAAA,EACJ;AAGA,MAAI,CAACL,EAAA,KAAcQ,GAAY;AAC3B,IAAAD,EAAa,UAAUA,EAAa,QAAQ,QAAQF,GAAe,EAAE,EAAE,KAAA;AACvE;AAAA,EACJ;AACJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatUtils.js","sources":["../../src/utils/formatUtils.ts"],"sourcesContent":["import { isNil } from 'es-toolkit/predicate';\n\n/**\n * Helper to extract a number from a string that may have units or grouping delimiters. It take localization into account.\n *\n * @param value\n * @param locale\n * @returns parsed number\n */\nexport const parseNumberFromValue = (value: unknown, locale: string): number => {\n if (isNil(value)) {\n return 0;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value !== 'string') {\n return 0;\n }\n\n const example = 1234567.89;\n const parts = new Intl.NumberFormat(locale).formatToParts(example);\n\n const groupSymbol = parts.find(p => p.type === 'group')?.value ?? ',';\n const decimalSymbol = parts.find(p => p.type === 'decimal')?.value ?? '.';\n\n // Extract numeric part only (up to last digit or decimal), ignore units\n const match = value.match(/[-\\d.,'\\u00A0\\s]+/);\n if (!match) {\n return 0;\n }\n\n let numeric = match[0].trim();\n\n // Normalize: remove group symbols (thousand delimiter)\n if (groupSymbol !== decimalSymbol) {\n numeric = numeric.replaceAll(groupSymbol, '');\n }\n\n // Replace decimal with dot for number parsing\n if (decimalSymbol !== '.') {\n numeric = numeric.replace(decimalSymbol, '.');\n }\n\n const parsed = Number.parseFloat(numeric);\n return Number.isNaN(parsed) ? Number.NaN : parsed;\n};\n\n/**\n * Retrieves a nested property value from an object using dot-notation.\n *\n * @param obj - The object to retrieve the value from.\n * @param path - Dot-separated path to the desired property (e.g. \"price.amount\").\n * @returns The value at the given path or undefined if not found.\n */\nexport const getValueByPath = (obj: unknown, path: string): unknown => {\n return path.split('.').reduce((acc, key) => (acc && typeof acc === 'object' ? (acc as any)[key] : undefined), obj);\n};\n"],"names":["parseNumberFromValue","value","locale","isNil","parts","groupSymbol","p","decimalSymbol","match","numeric","parsed","getValueByPath","obj","path","acc","key"],"mappings":";AASO,MAAMA,IAAuB,CAACC,GAAgBC,MAA2B;AAC5E,MAAIC,EAAMF,CAAK;AACX,WAAO;AAGX,MAAI,OAAOA,KAAU;AACjB,WAAOA;AAGX,MAAI,OAAOA,KAAU;AACjB,WAAO;AAIX,QAAMG,IAAQ,IAAI,KAAK,aAAaF,CAAM,EAAE,cAD5B,YACiD,GAE3DG,IAAcD,EAAM,KAAK,CAAAE,MAAKA,EAAE,SAAS,OAAO,GAAG,SAAS,KAC5DC,IAAgBH,EAAM,KAAK,CAAAE,MAAKA,EAAE,SAAS,SAAS,GAAG,SAAS,KAGhEE,IAAQP,EAAM,MAAM,mBAAmB;AAC7C,MAAI,CAACO;AACD,WAAO;AAGX,MAAIC,IAAUD,EAAM,CAAC,EAAE,KAAA;AAGvB,EAAIH,MAAgBE,MAChBE,IAAUA,EAAQ,WAAWJ,GAAa,EAAE,IAI5CE,MAAkB,QAClBE,IAAUA,EAAQ,QAAQF,GAAe,GAAG;AAGhD,QAAMG,IAAS,OAAO,WAAWD,CAAO;AACxC,SAAO,OAAO,MAAMC,CAAM,IAAI,OAAO,MAAMA;AAC/C,GASaC,IAAiB,CAACC,GAAcC,MAClCA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,GAAKC,MAASD,KAAO,OAAOA,KAAQ,WAAYA,EAAYC,CAAG,IAAI,QAAYH,CAAG;"}
1
+ {"version":3,"file":"formatUtils.js","sources":["../../src/utils/formatUtils.ts"],"sourcesContent":["import { isNil } from 'es-toolkit/predicate';\n\n/**\n * Helper to extract a number from a string that may have units or grouping delimiters. It take localization into account.\n *\n * @param value\n * @param locale\n * @returns parsed number\n */\nexport const parseNumberFromValue = (value: unknown, locale: string): number => {\n if (isNil(value)) {\n return 0;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value !== 'string') {\n return 0;\n }\n\n const example = 1234567.89;\n const parts = new Intl.NumberFormat(locale).formatToParts(example);\n\n const groupSymbol = parts.find(p => p.type === 'group')?.value ?? ',';\n const decimalSymbol = parts.find(p => p.type === 'decimal')?.value ?? '.';\n\n // Extract numeric part only (up to last digit or decimal), ignore units\n const match = value.match(/[-\\d.,'\\u00A0\\s]+/);\n if (!match) {\n return 0;\n }\n\n let numeric = match[0].trim();\n\n // Normalize: remove group symbols (thousand delimiter)\n if (groupSymbol !== decimalSymbol) {\n numeric = numeric.replaceAll(groupSymbol, '');\n }\n\n // Replace decimal with dot for number parsing\n if (decimalSymbol !== '.') {\n numeric = numeric.replace(decimalSymbol, '.');\n }\n\n const parsed = Number.parseFloat(numeric);\n return Number.isNaN(parsed) ? Number.NaN : parsed;\n};\n\n/**\n * Retrieves a nested property value from an object using dot-notation.\n *\n * @param obj - The object to retrieve the value from.\n * @param path - Dot-separated path to the desired property (e.g. \"price.amount\").\n * @returns The value at the given path or undefined if not found.\n */\nexport const getValueByPath = (obj: unknown, path: string): unknown =>\n path.split('.').reduce((acc, key) => (acc && typeof acc === 'object' ? (acc as any)[key] : undefined), obj);\n"],"names":["parseNumberFromValue","value","locale","isNil","parts","groupSymbol","p","decimalSymbol","match","numeric","parsed","getValueByPath","obj","path","acc","key"],"mappings":";AASO,MAAMA,IAAuB,CAACC,GAAgBC,MAA2B;AAC5E,MAAIC,EAAMF,CAAK;AACX,WAAO;AAGX,MAAI,OAAOA,KAAU;AACjB,WAAOA;AAGX,MAAI,OAAOA,KAAU;AACjB,WAAO;AAIX,QAAMG,IAAQ,IAAI,KAAK,aAAaF,CAAM,EAAE,cAD5B,YACiD,GAE3DG,IAAcD,EAAM,KAAK,CAAAE,MAAKA,EAAE,SAAS,OAAO,GAAG,SAAS,KAC5DC,IAAgBH,EAAM,KAAK,CAAAE,MAAKA,EAAE,SAAS,SAAS,GAAG,SAAS,KAGhEE,IAAQP,EAAM,MAAM,mBAAmB;AAC7C,MAAI,CAACO;AACD,WAAO;AAGX,MAAIC,IAAUD,EAAM,CAAC,EAAE,KAAA;AAGvB,EAAIH,MAAgBE,MAChBE,IAAUA,EAAQ,WAAWJ,GAAa,EAAE,IAI5CE,MAAkB,QAClBE,IAAUA,EAAQ,QAAQF,GAAe,GAAG;AAGhD,QAAMG,IAAS,OAAO,WAAWD,CAAO;AACxC,SAAO,OAAO,MAAMC,CAAM,IAAI,OAAO,MAAMA;AAC/C,GASaC,IAAiB,CAACC,GAAcC,MACzCA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,GAAKC,MAASD,KAAO,OAAOA,KAAQ,WAAYA,EAAYC,CAAG,IAAI,QAAYH,CAAG;"}
@@ -1,11 +1,11 @@
1
- const s = (a) => (e) => !!e.includes(a), l = s("align-items-"), o = s("align-self"), t = s("bg-"), n = s("border-"), r = s("cursor-"), c = s("display-"), C = s("flex-"), h = s("hover-scale-"), i = s("hover-text-color-"), d = s("overflow-"), u = s("padding-"), x = s("rounded-"), g = s("space-"), f = s("text-color-"), p = s("text-size"), v = s("user-select-");
1
+ const s = (a) => (e) => !!e.includes(a), l = s("align-items-"), o = s("align-self"), t = s("bg-"), n = s("border-"), c = s("cursor-"), r = s("display-"), C = s("flex-"), h = s("hover-scale-"), i = s("hover-text-color-"), d = s("overflow-"), u = s("padding-"), x = s("rounded-"), g = s("space-"), f = s("text-color-"), p = s("text-size"), v = s("user-select-");
2
2
  export {
3
3
  l as hasAlignItemsClass,
4
4
  o as hasAlignSelfClass,
5
5
  t as hasBgClass,
6
6
  n as hasBorderClass,
7
- r as hasCursorClass,
8
- c as hasDisplayClass,
7
+ c as hasCursorClass,
8
+ r as hasDisplayClass,
9
9
  C as hasFlexClass,
10
10
  h as hasHoverScaleClass,
11
11
  i as hasHoverTextColorClass,
@@ -1 +1 @@
1
- {"version":3,"file":"hasUtilityClass.js","sources":["../../src/utils/hasUtilityClass.ts"],"sourcesContent":["const hasClass = (utilityClass: string) => {\n return (classes: string): boolean => {\n if (classes.includes(utilityClass)) {\n return true;\n }\n return false;\n };\n};\n\nconst hasAlignContentClass = hasClass('align-content-');\nconst hasAlignItemsClass = hasClass('align-items-');\nconst hasAlignSelfClass = hasClass('align-self');\nconst hasBgClass = hasClass('bg-');\nconst hasBorderClass = hasClass('border-');\nconst hasBorderStyleClass = hasClass('border-style-');\nconst hasBorderWidthClass = hasClass('border-width');\nconst hasCursorClass = hasClass('cursor-');\nconst hasDisplayClass = hasClass('display-');\nconst hasFlexClass = hasClass('flex-');\nconst hasGapClass = hasClass('gap-');\nconst hasHeightClass = hasClass('height-');\nconst hasHoverBgClass = hasClass('hover-bg-');\nconst hasHoverOpacityClass = hasClass('hover-opacity-');\nconst hasHoverScaleClass = hasClass('hover-scale-');\nconst hasHoverTextColorClass = hasClass('hover-text-color-');\nconst hasMarginClass = hasClass('margin-');\nconst hasMaxHeightClass = hasClass('max-height-');\nconst hasMinHeightClass = hasClass('min-height-');\nconst hasOpacityClass = hasClass('opacity-');\nconst hasOverflowClass = hasClass('overflow-');\nconst hasPaddingClass = hasClass('padding-');\nconst hasRioglyphClass = hasClass('rioglyph-');\nconst hasRoundedClass = hasClass('rounded-');\nconst hasScaleClass = hasClass('scale-');\nconst hasSpaceClass = hasClass('space-');\nconst hasTextColorClass = hasClass('text-color-');\nconst hasTextSizeClass = hasClass('text-size');\nconst hasUserSelectClass = hasClass('user-select-');\n\nexport {\n hasAlignContentClass,\n hasAlignItemsClass,\n hasAlignSelfClass,\n hasBgClass,\n hasBorderClass,\n hasBorderStyleClass,\n hasBorderWidthClass,\n hasCursorClass,\n hasDisplayClass,\n hasFlexClass,\n hasGapClass,\n hasHeightClass,\n hasHoverBgClass,\n hasHoverOpacityClass,\n hasHoverScaleClass,\n hasHoverTextColorClass,\n hasMarginClass,\n hasMaxHeightClass,\n hasMinHeightClass,\n hasOpacityClass,\n hasOverflowClass,\n hasPaddingClass,\n hasRioglyphClass,\n hasRoundedClass,\n hasScaleClass,\n hasSpaceClass,\n hasTextColorClass,\n hasTextSizeClass,\n hasUserSelectClass,\n};\n"],"names":["hasClass","utilityClass","classes","hasAlignItemsClass","hasAlignSelfClass","hasBgClass","hasBorderClass","hasCursorClass","hasDisplayClass","hasFlexClass","hasHoverScaleClass","hasHoverTextColorClass","hasOverflowClass","hasPaddingClass","hasRoundedClass","hasSpaceClass","hasTextColorClass","hasTextSizeClass","hasUserSelectClass"],"mappings":"AAAA,MAAMA,IAAW,CAACC,MACP,CAACC,MACA,EAAAA,EAAQ,SAASD,CAAY,GAQnCE,IAAqBH,EAAS,cAAc,GAC5CI,IAAoBJ,EAAS,YAAY,GACzCK,IAAaL,EAAS,KAAK,GAC3BM,IAAiBN,EAAS,SAAS,GAGnCO,IAAiBP,EAAS,SAAS,GACnCQ,IAAkBR,EAAS,UAAU,GACrCS,IAAeT,EAAS,OAAO,GAK/BU,IAAqBV,EAAS,cAAc,GAC5CW,IAAyBX,EAAS,mBAAmB,GAKrDY,IAAmBZ,EAAS,WAAW,GACvCa,IAAkBb,EAAS,UAAU,GAErCc,IAAkBd,EAAS,UAAU,GAErCe,IAAgBf,EAAS,QAAQ,GACjCgB,IAAoBhB,EAAS,aAAa,GAC1CiB,IAAmBjB,EAAS,WAAW,GACvCkB,IAAqBlB,EAAS,cAAc;"}
1
+ {"version":3,"file":"hasUtilityClass.js","sources":["../../src/utils/hasUtilityClass.ts"],"sourcesContent":["const hasClass =\n (utilityClass: string) =>\n (classes: string): boolean => {\n if (classes.includes(utilityClass)) {\n return true;\n }\n return false;\n };\n\nconst hasAlignContentClass = hasClass('align-content-');\nconst hasAlignItemsClass = hasClass('align-items-');\nconst hasAlignSelfClass = hasClass('align-self');\nconst hasBgClass = hasClass('bg-');\nconst hasBorderClass = hasClass('border-');\nconst hasBorderStyleClass = hasClass('border-style-');\nconst hasBorderWidthClass = hasClass('border-width');\nconst hasCursorClass = hasClass('cursor-');\nconst hasDisplayClass = hasClass('display-');\nconst hasFlexClass = hasClass('flex-');\nconst hasGapClass = hasClass('gap-');\nconst hasHeightClass = hasClass('height-');\nconst hasHoverBgClass = hasClass('hover-bg-');\nconst hasHoverOpacityClass = hasClass('hover-opacity-');\nconst hasHoverScaleClass = hasClass('hover-scale-');\nconst hasHoverTextColorClass = hasClass('hover-text-color-');\nconst hasMarginClass = hasClass('margin-');\nconst hasMaxHeightClass = hasClass('max-height-');\nconst hasMinHeightClass = hasClass('min-height-');\nconst hasOpacityClass = hasClass('opacity-');\nconst hasOverflowClass = hasClass('overflow-');\nconst hasPaddingClass = hasClass('padding-');\nconst hasRioglyphClass = hasClass('rioglyph-');\nconst hasRoundedClass = hasClass('rounded-');\nconst hasScaleClass = hasClass('scale-');\nconst hasSpaceClass = hasClass('space-');\nconst hasTextColorClass = hasClass('text-color-');\nconst hasTextSizeClass = hasClass('text-size');\nconst hasUserSelectClass = hasClass('user-select-');\n\nexport {\n hasAlignContentClass,\n hasAlignItemsClass,\n hasAlignSelfClass,\n hasBgClass,\n hasBorderClass,\n hasBorderStyleClass,\n hasBorderWidthClass,\n hasCursorClass,\n hasDisplayClass,\n hasFlexClass,\n hasGapClass,\n hasHeightClass,\n hasHoverBgClass,\n hasHoverOpacityClass,\n hasHoverScaleClass,\n hasHoverTextColorClass,\n hasMarginClass,\n hasMaxHeightClass,\n hasMinHeightClass,\n hasOpacityClass,\n hasOverflowClass,\n hasPaddingClass,\n hasRioglyphClass,\n hasRoundedClass,\n hasScaleClass,\n hasSpaceClass,\n hasTextColorClass,\n hasTextSizeClass,\n hasUserSelectClass,\n};\n"],"names":["hasClass","utilityClass","classes","hasAlignItemsClass","hasAlignSelfClass","hasBgClass","hasBorderClass","hasCursorClass","hasDisplayClass","hasFlexClass","hasHoverScaleClass","hasHoverTextColorClass","hasOverflowClass","hasPaddingClass","hasRoundedClass","hasSpaceClass","hasTextColorClass","hasTextSizeClass","hasUserSelectClass"],"mappings":"AAAA,MAAMA,IACF,CAACC,MACD,CAACC,MACO,EAAAA,EAAQ,SAASD,CAAY,GAOnCE,IAAqBH,EAAS,cAAc,GAC5CI,IAAoBJ,EAAS,YAAY,GACzCK,IAAaL,EAAS,KAAK,GAC3BM,IAAiBN,EAAS,SAAS,GAGnCO,IAAiBP,EAAS,SAAS,GACnCQ,IAAkBR,EAAS,UAAU,GACrCS,IAAeT,EAAS,OAAO,GAK/BU,IAAqBV,EAAS,cAAc,GAC5CW,IAAyBX,EAAS,mBAAmB,GAKrDY,IAAmBZ,EAAS,WAAW,GACvCa,IAAkBb,EAAS,UAAU,GAErCc,IAAkBd,EAAS,UAAU,GAErCe,IAAgBf,EAAS,QAAQ,GACjCgB,IAAoBhB,EAAS,aAAa,GAC1CiB,IAAmBjB,EAAS,WAAW,GACvCkB,IAAqBlB,EAAS,cAAc;"}
@@ -1 +1 @@
1
- {"version":3,"file":"hidePiiData.js","sources":["../../src/utils/hidePiiData.ts"],"sourcesContent":["/****\n * hidePiiData.ts\n *\n * Purpose\n * -------\n * Utilities for anonymizing Personally Identifiable Information (PII) in rendered DOM content.\n * The main entry point is `hidePiiData`, which shuffles visible text inside a target element.\n *\n * Integration / Activation\n * -----------------------\n * Activation can be toggled with **Ctrl+Shift+U / Cmd+Shift+U**, or by setting the\n * `<html>` attribute `data-hide-pii=\"shuffle\"`. When activated, new or changed content\n * marked with `data-pii=\"visible\"` is processed by this module.\n * This file does not attach observers by itself. It only exposes pure DOM utilities.\n *\n * High level behavior\n * -------------------\n * 1. Tokenize text on whitespace while preserving the original whitespace.\n * 2. For email tokens, clean punctuation, pad each part to at least six characters,\n * shuffle both parts independently, and rejoin with `@`.\n * 3. For normal tokens shorter than six characters, pad with random alphanumerics before shuffling.\n * 4. Preserve capitalization pattern for simple Name like tokens (e.g. `Alice`) after shuffling.\n *\n * Data attributes used\n * --------------------\n * - `data-pii=\"visible\"` marks elements that should be anonymized.\n * - `data-pii=\"hidden\"` is written to elements that have already been processed to help external code introspect state.\n * - `data-hide-pii=\"shuffle\"` on `<html>` is used by an external observer to decide when to call `hidePiiData`.\n */\n\nconst ATTR_DATA_PII = 'data-pii';\nconst ATTR_ORIGINAL_PII = 'data-original-pii';\nconst ATTR_OBFUSCATED_PII = 'data-obfuscated-pii';\n\n/**\n * In place Fisher Yates shuffle.\n * Randomizes the order of the given array using `Math.random()`.\n * This is sufficient for UI anonymization but is not cryptographically secure.\n */\nconst fyShuffle = <T>(arr: T[]): void => {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n }\n};\n\n/** Returns true if (A-Z, a-z, 0-9). */\nconst isTextOrNumber = (el: string): boolean => {\n return /[A-Za-z0-9]/.test(el);\n};\n\n/**\n * Generate a random ASCII alphanumeric string of length `n`.\n * Used to pad very short tokens before shuffling to increase anonymity.\n */\nconst addRandomCharacter = (el: number): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n let out = '';\n for (let i = 0; i < el; i++) {\n out += chars.charAt(Math.floor(Math.random() * chars.length)).toLocaleLowerCase();\n }\n return out;\n};\n\n/**\n * Ensure a minimum length by appending random alphanumerics when `s` is shorter than `minLen`.\n * Defaults to 6 which balances privacy and UI density.\n */\nconst ensureMinLength = (el: string, minLen = 6): string => {\n if (el.length >= minLen) {\n return el;\n }\n return el + addRandomCharacter(minLen - el.length);\n};\n\n/** Generate a random numeric string of length `n`. */\nconst randomDigits = (n: number): string => {\n const digits = '0123456789';\n let out = '';\n for (let i = 0; i < n; i++) {\n out += digits.charAt(Math.floor(Math.random() * digits.length));\n }\n return out;\n};\n\n/** Ensure a minimum length by appending random digits (for phone numbers). */\nconst ensureMinDigits = (s: string, minLen = 6): string => {\n if (s.length >= minLen) {\n return s;\n }\n return s + randomDigits(minLen - s.length);\n};\n\n/**\n * Shuffle a token while trying to keep an alphanumeric character at both boundaries.\n *\n * Why boundaries matter\n * ---------------------\n * Many UI layouts expect words to begin and end with letters or digits. By forcing\n * alphanumeric characters to the first and last positions when possible, we avoid\n * odd leading punctuation or trailing punctuation that could break alignment or\n * cause misleading visual cues.\n *\n * Rules\n * -----\n * - If there are no alphanumerics, the original string is returned unchanged.\n * - If there is only one alphanumeric and length is at least 2, it also returns unchanged,\n * since we cannot satisfy both boundaries.\n * - Non alphanumeric characters are placed only in interior positions.\n */\nconst shuffle = (el: string): string => {\n const n = el.length;\n const chars = el.split('');\n\n // Separate alphanumeric and non-alphanumeric characters\n const alnums: string[] = [];\n const nonAlnums: string[] = [];\n\n for (const char of chars) {\n if (isTextOrNumber(char)) {\n alnums.push(char);\n } else {\n nonAlnums.push(char);\n }\n }\n\n // If we cannot satisfy the boundary rule, keep original\n if (alnums.length === 0) {\n return el;\n }\n\n if (n >= 2 && alnums.length === 1) {\n return el; // cannot put alnum at both ends\n }\n\n fyShuffle(alnums);\n fyShuffle(nonAlnums);\n\n // If there are more non alphanumerics than interior slots, bail out to keep boundaries valid\n const interiorSlots = Math.max(0, n - 2);\n if (nonAlnums.length > interiorSlots) {\n return el;\n }\n\n // Build output with alnum at boundaries\n const out: string[] = new Array(n);\n out[0] = alnums.pop() as string; // left boundary alnum (safe due to earlier guard)\n out[n - 1] = alnums.pop() as string; // right boundary alnum\n\n // Fill interior positions randomly with remaining characters\n const interiorPositions: number[] = [];\n for (let i = 1; i <= n - 2; i++) {\n interiorPositions.push(i);\n }\n fyShuffle(interiorPositions);\n\n let k = 0;\n for (const char of nonAlnums) {\n out[interiorPositions[k++]] = char; // place all non-alnums inside\n }\n for (const char of alnums) {\n out[interiorPositions[k++]] = char; // then remaining alnums\n }\n\n return out.join('');\n};\n\n/**\n * Shuffle an email address in a privacy aware way.\n *\n * Steps\n * -----\n * 1. Split on `@` into local and domain.\n * 2. Remove any non alphanumeric characters from both parts (drop dots and dashes).\n * 3. Pad each part to a minimum of six characters to avoid very short outputs.\n * 4. Shuffle the local and domain parts independently and rejoin with `@`.\n *\n * Rationale\n * ---------\n * Emails often contain structure that makes simple shuffling ineffective. By stripping\n * punctuation and enforcing a minimum length, we reduce the chance of hinting at the\n * original identity while still returning something that looks like an email.\n */\nconst shuffleEmail = (email: string): string => {\n const [local, domain] = email.split('@');\n // Remove all non-alphanumeric characters from both parts\n const cleanName = local.replace(/[^A-Za-z0-9]/g, '');\n const cleanDomain = domain.replace(/[^A-Za-z0-9]/g, '');\n const paddedName = ensureMinLength(cleanName, 6);\n const shuffledName = shuffleText(paddedName, false);\n const shuffledDomain = shuffleText(cleanDomain, false);\n\n /**\n * Get a two-letter locale suffix based on the user's browser locale.\n * Prefers the region subtag (e.g., \"en-US\" -> \"US\"). Falls back to the language\n * subtag (e.g., \"de\" -> \"DE\"). Returns \"XX\" if unavailable.\n */\n const getLocaleSuffix = (): string => {\n try {\n const langRaw =\n typeof navigator !== 'undefined' ? navigator.languages?.[0] || navigator.language || '' : '';\n const lang = (langRaw || '').replace('_', '-');\n if (!lang) {\n return 'com';\n }\n const parts = lang.split('-');\n const region = parts[1] || parts[0];\n const code = (region || '').slice(0, 2).toLocaleLowerCase();\n return code || 'com';\n } catch {\n return 'com';\n }\n };\n\n return `${shuffledName}@${shuffledDomain}.${getLocaleSuffix()}`;\n};\n\n/**\n * Shuffle a phone number while preserving its structure.\n * Removes non-digits, pads if too short, shuffles digits, then reinserts formatting.\n */\nconst shufflePhone = (phone: string): string => {\n const countryPrefix = phone.startsWith('+') ? phone.slice(1).match(/^\\d{1,3}/)?.[0] || '' : '';\n\n // Extract all digits and split into country code vs. rest\n const allDigits = phone.replace(/\\D/g, '');\n const restDigits = countryPrefix ? allDigits.slice(countryPrefix.length) : allDigits;\n\n if (restDigits.length < 4) {\n return phone; // too short to anonymize meaningfully beyond the country code\n }\n\n // Pad and shuffle only the rest (not the country code)\n const paddedRest = ensureMinDigits(restDigits, 6);\n const shuffledRest = shuffle(paddedRest);\n\n // Reinsert digits into original format:\n // - Keep the first `countryPrefix.length` digits after '+' unchanged\n // - Replace subsequent digits with shuffledRest\n let i = 0; // index into shuffledRest\n let prefixLeft = countryPrefix.length;\n let inPrefixBlock = !!countryPrefix; // true if we saw leading '+' and have prefix digits to preserve\n\n return phone.replace(/\\d/g, phoneNumber => {\n if (inPrefixBlock) {\n // We are preserving digits immediately after the leading '+'\n // Once we consume `prefixLeft` digits, we stop preserving\n if (prefixLeft > 0) {\n prefixLeft -= 1;\n if (prefixLeft === 0) {\n inPrefixBlock = false;\n }\n return phoneNumber; // keep country code digit as-is\n }\n inPrefixBlock = false;\n }\n // Replace with next shuffled digit (fallback '0' if exhausted, though length should suffice)\n return shuffledRest[i++] || '0';\n });\n};\n\n/**\n * Shuffle text while preserving whitespace.\n *\n * Behavior\n * --------\n * - Tokenization uses `\\S+` to process non whitespace runs and preserves the original whitespace.\n * - Email like tokens are handled by `shuffleEmail`.\n * - Non email tokens shorter than six characters are padded with random alphanumerics before shuffling.\n * - For simple Name like tokens (regex `^[A-Z][a-z]+$`), capitalization is preserved after shuffling.\n */\nexport const shuffleText = (str: string, preserveCase = true): string => {\n if (str.length < 2) {\n return str;\n }\n\n const lettersOnly = str.replace(/[^A-Za-z]/g, '');\n const paddedToken = ensureMinLength(lettersOnly, 6);\n const shuffled = shuffle(paddedToken);\n\n if (preserveCase) {\n return shuffled.charAt(0).toUpperCase() + shuffled.slice(1).toLowerCase();\n }\n\n return shuffled;\n};\n\nexport const shufflePii = (text: string): string => {\n // First pass: handle phone numbers that may span multiple tokens (spaces, dashes, parentheses)\n const phoneSeq = /(^|[^A-Za-z0-9])(\\+?\\d(?:[ \\t\\-()]*\\d){6,})(?=$|[^A-Za-z0-9])/g;\n const withPhonesShuffled = text.replace(\n phoneSeq,\n (_m: string, pre: string, num: string) => pre + shufflePhone(num)\n );\n\n // Second pass: token-wise processing for remaining tokens\n return withPhonesShuffled.replace(/\\S+/g, (token: string): string => {\n // Email detected: delegate to email specific logic\n if (/^[^@]+@[^@]+$/.test(token)) {\n return shuffleEmail(token);\n }\n\n // Phone number detected (single-token formats): delegate to phone logic\n if (/^\\+?[0-9][0-9\\s\\-()]{3,}$/.test(token)) {\n return shufflePhone(token);\n }\n\n // If the token has no letters at all, leave it unchanged (avoid turning digits into letters)\n if (!/[A-Za-z]/.test(token)) {\n return token;\n }\n\n // Enforce a minimum token length for short text tokens\n const paddedToken = token.length < 6 ? token + addRandomCharacter(6 - token.length) : token;\n const shuffled = shuffleText(paddedToken);\n return shuffled;\n });\n};\n\n/**\n * Shuffle text nodes or input values inside the provided element(s).\n *\n * Parameters\n * ----------\n * - `target`: either a single `Element` or a `NodeListOf<Element>`.\n * - `forceResult`: optional string to override output directly.\n *\n * How it works\n * ------------\n * - Marks each processed element with `data-pii=\"hidden\"`.\n * - If the element is an `<input>`, it shuffles the `value` string and writes it back.\n * - For non input elements, it walks text nodes with a `TreeWalker` and replaces the node values\n * with their shuffled variants.\n *\n * Performance notes\n * -----------------\n * - Work is proportional to the number of text nodes in `target`.\n * - Avoid calling this repeatedly on large subtrees without batching.\n */\nexport const hidePiiData = (target: Element | NodeListOf<Element>, forceResult?: string): void => {\n const elements: Element[] = target instanceof Element ? [target] : Array.from(target);\n\n for (const el of elements) {\n // Mark the element as processed so other parts of the app can detect its state\n el.setAttribute(ATTR_DATA_PII, 'hidden');\n\n const beforeText = (el.textContent || '').trim();\n\n // If the selected element is an <input>, shuffle its value instead of text nodes\n if (el.matches?.('input') || el.tagName === 'INPUT') {\n const input = el as HTMLInputElement;\n const val = input.value || '';\n\n if (typeof forceResult === 'string' && forceResult.length > 0) {\n el.setAttribute(ATTR_ORIGINAL_PII, val);\n input.value = forceResult;\n el.setAttribute(ATTR_OBFUSCATED_PII, input.value);\n continue;\n }\n\n el.setAttribute(ATTR_ORIGINAL_PII, val);\n const trimmed = val.trim();\n\n if (trimmed.length > 0) {\n const shuffled = shufflePii(val);\n if (shuffled !== val) {\n input.value = shuffled;\n }\n el.setAttribute(ATTR_OBFUSCATED_PII, input.value);\n }\n continue; // skip text-node processing for inputs\n }\n\n // Helper: safely apply a forced text replacement without destroying markup\n const applyForcedText = (root: Element, value: string): void => {\n // Case 1: Exactly one element child that itself has no element children\n // e.g. <td><span>Text</span></td> -> replace span textContent only\n if (root.children.length === 1) {\n const onlyChild = root.children[0] as Element;\n if (onlyChild && onlyChild.children.length === 0) {\n onlyChild.textContent = value;\n return;\n }\n }\n\n // Case 2: Replace text nodes directly while preserving structure\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null);\n const textNodes: Text[] = [];\n let n = walker.nextNode();\n while (n) {\n const t = n as Text;\n if ((t.nodeValue || '').trim().length > 0) {\n textNodes.push(t);\n }\n n = walker.nextNode();\n }\n\n if (textNodes.length === 0) {\n // As a last resort, fall back to setting textContent (no visible text nodes found)\n root.textContent = value;\n return;\n }\n\n // Put the forced value into the first non-empty text node,\n // and clear the remainder to avoid duplicated content\n textNodes[0].nodeValue = value;\n for (let i = 1; i < textNodes.length; i++) {\n textNodes[i].nodeValue = '';\n }\n };\n\n if (typeof forceResult === 'string' && forceResult.length > 0) {\n if (beforeText) {\n el.setAttribute(ATTR_ORIGINAL_PII, beforeText);\n }\n applyForcedText(el, forceResult);\n el.setAttribute(ATTR_OBFUSCATED_PII, (el.textContent || '').trim());\n continue;\n }\n\n let anyTextChanged = false;\n\n // Walk only text nodes to avoid touching markup and attributes\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);\n let node = walker.nextNode();\n\n while (node) {\n const txtNode = node as Text;\n const original = String(txtNode.textContent || '');\n\n // Whitespace fix 1/2: If the text node contains only whitespace, remove it entirely\n if (/^\\s*$/.test(original)) {\n const nextNode = walker.nextNode();\n txtNode.remove();\n node = nextNode;\n continue;\n }\n\n // Normalize all whitespace in non-empty text nodes to a single space\n const normalized = original.replace(/\\s+/g, ' ');\n const trimmed = normalized.trim();\n\n if (trimmed.length > 0) {\n const shuffled = shufflePii(normalized);\n if (shuffled !== normalized) {\n txtNode.textContent = shuffled;\n anyTextChanged = true;\n }\n }\n node = walker.nextNode();\n }\n\n // Whitespace fix 2/2: Restore spacing between adjacent text nodes\n const directTextNodes = Array.from(el.childNodes).filter(n => n.nodeType === Node.TEXT_NODE);\n for (let i = 0; i < directTextNodes.length - 1; i++) {\n const current = directTextNodes[i] as Text;\n const next = directTextNodes[i + 1] as Text;\n if (current.textContent?.trim() && next.textContent?.trim()) {\n const spacer = document.createTextNode(' ');\n current.parentNode?.insertBefore(spacer, next);\n }\n }\n\n const currentText = (el.textContent || '').trim();\n if (anyTextChanged && currentText) {\n el.setAttribute(ATTR_OBFUSCATED_PII, currentText);\n\n if (beforeText) {\n el.setAttribute('data-original-pii', beforeText);\n }\n }\n }\n};\n"],"names":["ATTR_DATA_PII","ATTR_ORIGINAL_PII","ATTR_OBFUSCATED_PII","fyShuffle","arr","i","j","tmp","isTextOrNumber","el","addRandomCharacter","chars","out","ensureMinLength","minLen","randomDigits","n","digits","ensureMinDigits","s","shuffle","alnums","nonAlnums","char","interiorSlots","interiorPositions","k","shuffleEmail","email","local","domain","cleanName","cleanDomain","paddedName","shuffledName","shuffleText","shuffledDomain","lang","parts","shufflePhone","phone","countryPrefix","allDigits","restDigits","paddedRest","shuffledRest","prefixLeft","inPrefixBlock","phoneNumber","str","preserveCase","lettersOnly","paddedToken","shuffled","shufflePii","text","phoneSeq","_m","pre","num","token","hidePiiData","target","forceResult","elements","beforeText","input","val","applyForcedText","root","value","onlyChild","walker","textNodes","t","anyTextChanged","node","txtNode","original","nextNode","normalized","directTextNodes","current","next","spacer","currentText"],"mappings":"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"}
1
+ {"version":3,"file":"hidePiiData.js","sources":["../../src/utils/hidePiiData.ts"],"sourcesContent":["/****\n * hidePiiData.ts\n *\n * Purpose\n * -------\n * Utilities for anonymizing Personally Identifiable Information (PII) in rendered DOM content.\n * The main entry point is `hidePiiData`, which shuffles visible text inside a target element.\n *\n * Integration / Activation\n * -----------------------\n * Activation can be toggled with **Ctrl+Shift+U / Cmd+Shift+U**, or by setting the\n * `<html>` attribute `data-hide-pii=\"shuffle\"`. When activated, new or changed content\n * marked with `data-pii=\"visible\"` is processed by this module.\n * This file does not attach observers by itself. It only exposes pure DOM utilities.\n *\n * High level behavior\n * -------------------\n * 1. Tokenize text on whitespace while preserving the original whitespace.\n * 2. For email tokens, clean punctuation, pad each part to at least six characters,\n * shuffle both parts independently, and rejoin with `@`.\n * 3. For normal tokens shorter than six characters, pad with random alphanumerics before shuffling.\n * 4. Preserve capitalization pattern for simple Name like tokens (e.g. `Alice`) after shuffling.\n *\n * Data attributes used\n * --------------------\n * - `data-pii=\"visible\"` marks elements that should be anonymized.\n * - `data-pii=\"hidden\"` is written to elements that have already been processed to help external code introspect state.\n * - `data-hide-pii=\"shuffle\"` on `<html>` is used by an external observer to decide when to call `hidePiiData`.\n */\n\nconst ATTR_DATA_PII = 'data-pii';\nconst ATTR_ORIGINAL_PII = 'data-original-pii';\nconst ATTR_OBFUSCATED_PII = 'data-obfuscated-pii';\n\n/**\n * In place Fisher Yates shuffle.\n * Randomizes the order of the given array using `Math.random()`.\n * This is sufficient for UI anonymization but is not cryptographically secure.\n */\nconst fyShuffle = <T>(arr: T[]): void => {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n }\n};\n\n/** Returns true if (A-Z, a-z, 0-9). */\nconst isTextOrNumber = (el: string): boolean => /[A-Za-z0-9]/.test(el);\n\n/**\n * Generate a random ASCII alphanumeric string of length `n`.\n * Used to pad very short tokens before shuffling to increase anonymity.\n */\nconst addRandomCharacter = (el: number): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n let out = '';\n for (let i = 0; i < el; i++) {\n out += chars.charAt(Math.floor(Math.random() * chars.length)).toLocaleLowerCase();\n }\n return out;\n};\n\n/**\n * Ensure a minimum length by appending random alphanumerics when `s` is shorter than `minLen`.\n * Defaults to 6 which balances privacy and UI density.\n */\nconst ensureMinLength = (el: string, minLen = 6): string => {\n if (el.length >= minLen) {\n return el;\n }\n return el + addRandomCharacter(minLen - el.length);\n};\n\n/** Generate a random numeric string of length `n`. */\nconst randomDigits = (n: number): string => {\n const digits = '0123456789';\n let out = '';\n for (let i = 0; i < n; i++) {\n out += digits.charAt(Math.floor(Math.random() * digits.length));\n }\n return out;\n};\n\n/** Ensure a minimum length by appending random digits (for phone numbers). */\nconst ensureMinDigits = (s: string, minLen = 6): string => {\n if (s.length >= minLen) {\n return s;\n }\n return s + randomDigits(minLen - s.length);\n};\n\n/**\n * Shuffle a token while trying to keep an alphanumeric character at both boundaries.\n *\n * Why boundaries matter\n * ---------------------\n * Many UI layouts expect words to begin and end with letters or digits. By forcing\n * alphanumeric characters to the first and last positions when possible, we avoid\n * odd leading punctuation or trailing punctuation that could break alignment or\n * cause misleading visual cues.\n *\n * Rules\n * -----\n * - If there are no alphanumerics, the original string is returned unchanged.\n * - If there is only one alphanumeric and length is at least 2, it also returns unchanged,\n * since we cannot satisfy both boundaries.\n * - Non alphanumeric characters are placed only in interior positions.\n */\nconst shuffle = (el: string): string => {\n const n = el.length;\n const chars = el.split('');\n\n // Separate alphanumeric and non-alphanumeric characters\n const alnums: string[] = [];\n const nonAlnums: string[] = [];\n\n for (const char of chars) {\n if (isTextOrNumber(char)) {\n alnums.push(char);\n } else {\n nonAlnums.push(char);\n }\n }\n\n // If we cannot satisfy the boundary rule, keep original\n if (alnums.length === 0) {\n return el;\n }\n\n if (n >= 2 && alnums.length === 1) {\n return el; // cannot put alnum at both ends\n }\n\n fyShuffle(alnums);\n fyShuffle(nonAlnums);\n\n // If there are more non alphanumerics than interior slots, bail out to keep boundaries valid\n const interiorSlots = Math.max(0, n - 2);\n if (nonAlnums.length > interiorSlots) {\n return el;\n }\n\n // Build output with alnum at boundaries\n const out: string[] = new Array(n);\n out[0] = alnums.pop() as string; // left boundary alnum (safe due to earlier guard)\n out[n - 1] = alnums.pop() as string; // right boundary alnum\n\n // Fill interior positions randomly with remaining characters\n const interiorPositions: number[] = [];\n for (let i = 1; i <= n - 2; i++) {\n interiorPositions.push(i);\n }\n fyShuffle(interiorPositions);\n\n let k = 0;\n for (const char of nonAlnums) {\n out[interiorPositions[k++]] = char; // place all non-alnums inside\n }\n for (const char of alnums) {\n out[interiorPositions[k++]] = char; // then remaining alnums\n }\n\n return out.join('');\n};\n\n/**\n * Shuffle an email address in a privacy aware way.\n *\n * Steps\n * -----\n * 1. Split on `@` into local and domain.\n * 2. Remove any non alphanumeric characters from both parts (drop dots and dashes).\n * 3. Pad each part to a minimum of six characters to avoid very short outputs.\n * 4. Shuffle the local and domain parts independently and rejoin with `@`.\n *\n * Rationale\n * ---------\n * Emails often contain structure that makes simple shuffling ineffective. By stripping\n * punctuation and enforcing a minimum length, we reduce the chance of hinting at the\n * original identity while still returning something that looks like an email.\n */\nconst shuffleEmail = (email: string): string => {\n const [local, domain] = email.split('@');\n // Remove all non-alphanumeric characters from both parts\n const cleanName = local.replace(/[^A-Za-z0-9]/g, '');\n const cleanDomain = domain.replace(/[^A-Za-z0-9]/g, '');\n const paddedName = ensureMinLength(cleanName, 6);\n const shuffledName = shuffleText(paddedName, false);\n const shuffledDomain = shuffleText(cleanDomain, false);\n\n /**\n * Get a two-letter locale suffix based on the user's browser locale.\n * Prefers the region subtag (e.g., \"en-US\" -> \"US\"). Falls back to the language\n * subtag (e.g., \"de\" -> \"DE\"). Returns \"XX\" if unavailable.\n */\n const getLocaleSuffix = (): string => {\n try {\n const langRaw =\n typeof navigator !== 'undefined' ? navigator.languages?.[0] || navigator.language || '' : '';\n const lang = (langRaw || '').replace('_', '-');\n if (!lang) {\n return 'com';\n }\n const parts = lang.split('-');\n const region = parts[1] || parts[0];\n const code = (region || '').slice(0, 2).toLocaleLowerCase();\n return code || 'com';\n } catch {\n return 'com';\n }\n };\n\n return `${shuffledName}@${shuffledDomain}.${getLocaleSuffix()}`;\n};\n\n/**\n * Shuffle a phone number while preserving its structure.\n * Removes non-digits, pads if too short, shuffles digits, then reinserts formatting.\n */\nconst shufflePhone = (phone: string): string => {\n const countryPrefix = phone.startsWith('+') ? phone.slice(1).match(/^\\d{1,3}/)?.[0] || '' : '';\n\n // Extract all digits and split into country code vs. rest\n const allDigits = phone.replace(/\\D/g, '');\n const restDigits = countryPrefix ? allDigits.slice(countryPrefix.length) : allDigits;\n\n if (restDigits.length < 4) {\n return phone; // too short to anonymize meaningfully beyond the country code\n }\n\n // Pad and shuffle only the rest (not the country code)\n const paddedRest = ensureMinDigits(restDigits, 6);\n const shuffledRest = shuffle(paddedRest);\n\n // Reinsert digits into original format:\n // - Keep the first `countryPrefix.length` digits after '+' unchanged\n // - Replace subsequent digits with shuffledRest\n let i = 0; // index into shuffledRest\n let prefixLeft = countryPrefix.length;\n let inPrefixBlock = !!countryPrefix; // true if we saw leading '+' and have prefix digits to preserve\n\n return phone.replace(/\\d/g, phoneNumber => {\n if (inPrefixBlock) {\n // We are preserving digits immediately after the leading '+'\n // Once we consume `prefixLeft` digits, we stop preserving\n if (prefixLeft > 0) {\n prefixLeft -= 1;\n if (prefixLeft === 0) {\n inPrefixBlock = false;\n }\n return phoneNumber; // keep country code digit as-is\n }\n inPrefixBlock = false;\n }\n // Replace with next shuffled digit (fallback '0' if exhausted, though length should suffice)\n return shuffledRest[i++] || '0';\n });\n};\n\n/**\n * Shuffle text while preserving whitespace.\n *\n * Behavior\n * --------\n * - Tokenization uses `\\S+` to process non whitespace runs and preserves the original whitespace.\n * - Email like tokens are handled by `shuffleEmail`.\n * - Non email tokens shorter than six characters are padded with random alphanumerics before shuffling.\n * - For simple Name like tokens (regex `^[A-Z][a-z]+$`), capitalization is preserved after shuffling.\n */\nexport const shuffleText = (str: string, preserveCase = true): string => {\n if (str.length < 2) {\n return str;\n }\n\n const lettersOnly = str.replace(/[^A-Za-z]/g, '');\n const paddedToken = ensureMinLength(lettersOnly, 6);\n const shuffled = shuffle(paddedToken);\n\n if (preserveCase) {\n return shuffled.charAt(0).toUpperCase() + shuffled.slice(1).toLowerCase();\n }\n\n return shuffled;\n};\n\nexport const shufflePii = (text: string): string => {\n // First pass: handle phone numbers that may span multiple tokens (spaces, dashes, parentheses)\n const phoneSeq = /(^|[^A-Za-z0-9])(\\+?\\d(?:[ \\t\\-()]*\\d){6,})(?=$|[^A-Za-z0-9])/g;\n const withPhonesShuffled = text.replace(\n phoneSeq,\n (_m: string, pre: string, num: string) => pre + shufflePhone(num)\n );\n\n // Second pass: token-wise processing for remaining tokens\n return withPhonesShuffled.replace(/\\S+/g, (token: string): string => {\n // Email detected: delegate to email specific logic\n if (/^[^@]+@[^@]+$/.test(token)) {\n return shuffleEmail(token);\n }\n\n // Phone number detected (single-token formats): delegate to phone logic\n if (/^\\+?[0-9][0-9\\s\\-()]{3,}$/.test(token)) {\n return shufflePhone(token);\n }\n\n // If the token has no letters at all, leave it unchanged (avoid turning digits into letters)\n if (!/[A-Za-z]/.test(token)) {\n return token;\n }\n\n // Enforce a minimum token length for short text tokens\n const paddedToken = token.length < 6 ? token + addRandomCharacter(6 - token.length) : token;\n const shuffled = shuffleText(paddedToken);\n return shuffled;\n });\n};\n\n/**\n * Shuffle text nodes or input values inside the provided element(s).\n *\n * Parameters\n * ----------\n * - `target`: either a single `Element` or a `NodeListOf<Element>`.\n * - `forceResult`: optional string to override output directly.\n *\n * How it works\n * ------------\n * - Marks each processed element with `data-pii=\"hidden\"`.\n * - If the element is an `<input>`, it shuffles the `value` string and writes it back.\n * - For non input elements, it walks text nodes with a `TreeWalker` and replaces the node values\n * with their shuffled variants.\n *\n * Performance notes\n * -----------------\n * - Work is proportional to the number of text nodes in `target`.\n * - Avoid calling this repeatedly on large subtrees without batching.\n */\nexport const hidePiiData = (target: Element | NodeListOf<Element>, forceResult?: string): void => {\n const elements: Element[] = target instanceof Element ? [target] : Array.from(target);\n\n for (const el of elements) {\n // Mark the element as processed so other parts of the app can detect its state\n el.setAttribute(ATTR_DATA_PII, 'hidden');\n\n const beforeText = (el.textContent || '').trim();\n\n // If the selected element is an <input>, shuffle its value instead of text nodes\n if (el.matches?.('input') || el.tagName === 'INPUT') {\n const input = el as HTMLInputElement;\n const val = input.value || '';\n\n if (typeof forceResult === 'string' && forceResult.length > 0) {\n el.setAttribute(ATTR_ORIGINAL_PII, val);\n input.value = forceResult;\n el.setAttribute(ATTR_OBFUSCATED_PII, input.value);\n continue;\n }\n\n el.setAttribute(ATTR_ORIGINAL_PII, val);\n const trimmed = val.trim();\n\n if (trimmed.length > 0) {\n const shuffled = shufflePii(val);\n if (shuffled !== val) {\n input.value = shuffled;\n }\n el.setAttribute(ATTR_OBFUSCATED_PII, input.value);\n }\n continue; // skip text-node processing for inputs\n }\n\n // Helper: safely apply a forced text replacement without destroying markup\n const applyForcedText = (root: Element, value: string): void => {\n // Case 1: Exactly one element child that itself has no element children\n // e.g. <td><span>Text</span></td> -> replace span textContent only\n if (root.children.length === 1) {\n const onlyChild = root.children[0] as Element;\n if (onlyChild && onlyChild.children.length === 0) {\n onlyChild.textContent = value;\n return;\n }\n }\n\n // Case 2: Replace text nodes directly while preserving structure\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null);\n const textNodes: Text[] = [];\n let n = walker.nextNode();\n while (n) {\n const t = n as Text;\n if ((t.nodeValue || '').trim().length > 0) {\n textNodes.push(t);\n }\n n = walker.nextNode();\n }\n\n if (textNodes.length === 0) {\n // As a last resort, fall back to setting textContent (no visible text nodes found)\n root.textContent = value;\n return;\n }\n\n // Put the forced value into the first non-empty text node,\n // and clear the remainder to avoid duplicated content\n textNodes[0].nodeValue = value;\n for (let i = 1; i < textNodes.length; i++) {\n textNodes[i].nodeValue = '';\n }\n };\n\n if (typeof forceResult === 'string' && forceResult.length > 0) {\n if (beforeText) {\n el.setAttribute(ATTR_ORIGINAL_PII, beforeText);\n }\n applyForcedText(el, forceResult);\n el.setAttribute(ATTR_OBFUSCATED_PII, (el.textContent || '').trim());\n continue;\n }\n\n let anyTextChanged = false;\n\n // Walk only text nodes to avoid touching markup and attributes\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);\n let node = walker.nextNode();\n\n while (node) {\n const txtNode = node as Text;\n const original = String(txtNode.textContent || '');\n\n // Whitespace fix 1/2: If the text node contains only whitespace, remove it entirely\n if (/^\\s*$/.test(original)) {\n const nextNode = walker.nextNode();\n txtNode.remove();\n node = nextNode;\n continue;\n }\n\n // Normalize all whitespace in non-empty text nodes to a single space\n const normalized = original.replace(/\\s+/g, ' ');\n const trimmed = normalized.trim();\n\n if (trimmed.length > 0) {\n const shuffled = shufflePii(normalized);\n if (shuffled !== normalized) {\n txtNode.textContent = shuffled;\n anyTextChanged = true;\n }\n }\n node = walker.nextNode();\n }\n\n // Whitespace fix 2/2: Restore spacing between adjacent text nodes\n const directTextNodes = Array.from(el.childNodes).filter(n => n.nodeType === Node.TEXT_NODE);\n for (let i = 0; i < directTextNodes.length - 1; i++) {\n const current = directTextNodes[i] as Text;\n const next = directTextNodes[i + 1] as Text;\n if (current.textContent?.trim() && next.textContent?.trim()) {\n const spacer = document.createTextNode(' ');\n current.parentNode?.insertBefore(spacer, next);\n }\n }\n\n const currentText = (el.textContent || '').trim();\n if (anyTextChanged && currentText) {\n el.setAttribute(ATTR_OBFUSCATED_PII, currentText);\n\n if (beforeText) {\n el.setAttribute('data-original-pii', beforeText);\n }\n }\n }\n};\n"],"names":["ATTR_DATA_PII","ATTR_ORIGINAL_PII","ATTR_OBFUSCATED_PII","fyShuffle","arr","i","j","tmp","isTextOrNumber","el","addRandomCharacter","chars","out","ensureMinLength","minLen","randomDigits","n","digits","ensureMinDigits","s","shuffle","alnums","nonAlnums","char","interiorSlots","interiorPositions","k","shuffleEmail","email","local","domain","cleanName","cleanDomain","paddedName","shuffledName","shuffleText","shuffledDomain","lang","parts","shufflePhone","phone","countryPrefix","allDigits","restDigits","paddedRest","shuffledRest","prefixLeft","inPrefixBlock","phoneNumber","str","preserveCase","lettersOnly","paddedToken","shuffled","shufflePii","text","phoneSeq","_m","pre","num","token","hidePiiData","target","forceResult","elements","beforeText","input","val","applyForcedText","root","value","onlyChild","walker","textNodes","t","anyTextChanged","node","txtNode","original","nextNode","normalized","directTextNodes","current","next","spacer","currentText"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { version as t } from "../../version.js";
2
- import { getConsoleStyle as r } from "./styledLogs.js";
3
- const i = "https://uikit.developers.rio.cloud/versionsList.json", a = async () => {
4
- const s = (e) => console.log("%c%s", r(), e);
2
+ import { getConsoleStyle as i } from "./styledLogs.js";
3
+ const r = "https://uikit.developers.rio.cloud/versionsList.json", a = async () => {
4
+ const s = (e) => console.log("%c%s", i(), e);
5
5
  try {
6
- const e = await fetch(i), { latest_release: o } = await e.json();
6
+ const e = await fetch(r), { latest_release: o } = await e.json();
7
7
  o > t && s(
8
8
  `🆕 You are using version ${t} of the UIKIT while the latest released version is ${o}. Please consider updating asap.`
9
9
  );
@@ -1 +1 @@
1
- {"version":3,"file":"checkForReleaseVersion.js","sources":["../../../src/utils/init/checkForReleaseVersion.ts"],"sourcesContent":["import { version } from '../../version';\nimport { getConsoleStyle } from './styledLogs';\n\nconst versionsListUrl = 'https://uikit.developers.rio.cloud/versionsList.json';\n\nexport const checkForReleaseVersion = async () => {\n const logStyled = (message: string) => console.log('%c%s', getConsoleStyle(), message);\n\n try {\n const response = await fetch(versionsListUrl);\n const { latest_release } = await response.json();\n\n if (latest_release > version) {\n logStyled(\n `🆕 You are using version ${version} of the UIKIT while the latest released version is ` +\n `${latest_release}. Please consider updating asap.`\n );\n }\n } catch (error) {\n logStyled('Failed to fetch UIKIT version list.');\n }\n};\n"],"names":["versionsListUrl","checkForReleaseVersion","logStyled","message","getConsoleStyle","response","latest_release","version"],"mappings":";;AAGA,MAAMA,IAAkB,wDAEXC,IAAyB,YAAY;AAC9C,QAAMC,IAAY,CAACC,MAAoB,QAAQ,IAAI,QAAQC,EAAA,GAAmBD,CAAO;AAErF,MAAI;AACA,UAAME,IAAW,MAAM,MAAML,CAAe,GACtC,EAAE,gBAAAM,EAAA,IAAmB,MAAMD,EAAS,KAAA;AAE1C,IAAIC,IAAiBC,KACjBL;AAAA,MACI,4BAA4BK,CAAO,sDAC5BD,CAAc;AAAA,IAAA;AAAA,EAGjC,QAAgB;AACZ,IAAAJ,EAAU,qCAAqC;AAAA,EACnD;AACJ;"}
1
+ {"version":3,"file":"checkForReleaseVersion.js","sources":["../../../src/utils/init/checkForReleaseVersion.ts"],"sourcesContent":["import { version } from '../../version';\nimport { getConsoleStyle } from './styledLogs';\n\nconst versionsListUrl = 'https://uikit.developers.rio.cloud/versionsList.json';\n\nexport const checkForReleaseVersion = async () => {\n const logStyled = (message: string) => console.log('%c%s', getConsoleStyle(), message);\n\n try {\n const response = await fetch(versionsListUrl);\n const { latest_release } = await response.json();\n\n if (latest_release > version) {\n logStyled(\n `🆕 You are using version ${version} of the UIKIT while the latest released version is ` +\n `${latest_release}. Please consider updating asap.`\n );\n }\n } catch {\n logStyled('Failed to fetch UIKIT version list.');\n }\n};\n"],"names":["versionsListUrl","checkForReleaseVersion","logStyled","message","getConsoleStyle","response","latest_release","version"],"mappings":";;AAGA,MAAMA,IAAkB,wDAEXC,IAAyB,YAAY;AAC9C,QAAMC,IAAY,CAACC,MAAoB,QAAQ,IAAI,QAAQC,EAAA,GAAmBD,CAAO;AAErF,MAAI;AACA,UAAME,IAAW,MAAM,MAAML,CAAe,GACtC,EAAE,gBAAAM,EAAA,IAAmB,MAAMD,EAAS,KAAA;AAE1C,IAAIC,IAAiBC,KACjBL;AAAA,MACI,4BAA4BK,CAAO,sDAC5BD,CAAc;AAAA,IAAA;AAAA,EAGjC,QAAQ;AACJ,IAAAJ,EAAU,qCAAqC;AAAA,EACnD;AACJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"styledLogs.js","sources":["../../../src/utils/init/styledLogs.ts"],"sourcesContent":["export const getConsoleStyle = (params?: { isBold?: boolean }) => {\n return `color: #697a8b; ${params?.isBold ? 'font-weight: 800' : ''}`;\n};\n"],"names":["getConsoleStyle","params"],"mappings":"AAAO,MAAMA,IAAkB,CAACC,MACrB;"}
1
+ {"version":3,"file":"styledLogs.js","sources":["../../../src/utils/init/styledLogs.ts"],"sourcesContent":["export const getConsoleStyle = (params?: { isBold?: boolean }) =>\n `color: #697a8b; ${params?.isBold ? 'font-weight: 800' : ''}`;\n"],"names":["getConsoleStyle","params"],"mappings":"AAAO,MAAMA,IAAkB,CAACC,MAC5B;"}
@@ -1,9 +1,9 @@
1
- const o = (n) => (e) => {
2
- n.forEach((t) => {
1
+ const c = (o) => (e) => {
2
+ o.forEach((t) => {
3
3
  typeof t == "function" ? t(e) : t && (t.current = e);
4
4
  });
5
5
  };
6
6
  export {
7
- o as default
7
+ c as default
8
8
  };
9
9
  //# sourceMappingURL=mergeRefs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mergeRefs.js","sources":["../../src/utils/mergeRefs.ts"],"sourcesContent":["import type React from 'react';\nimport type { Ref } from 'react';\n\n// Utility function to merge multiple refs\nconst mergeRefs = <T>(refs: Ref<T>[]): Ref<T> => {\n return (value: T) => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n};\n\nexport default mergeRefs;\n"],"names":["mergeRefs","refs","value","ref"],"mappings":"AAIA,MAAMA,IAAY,CAAIC,MACX,CAACC,MAAa;AACjB,EAAAD,EAAK,QAAQ,CAAAE,MAAO;AAChB,IAAI,OAAOA,KAAQ,aACfA,EAAID,CAAK,IACFC,MACNA,EAAyC,UAAUD;AAAA,EAE5D,CAAC;AACL;"}
1
+ {"version":3,"file":"mergeRefs.js","sources":["../../src/utils/mergeRefs.ts"],"sourcesContent":["import type React from 'react';\nimport type { Ref } from 'react';\n\n// Utility function to merge multiple refs\nconst mergeRefs =\n <T>(refs: Ref<T>[]): Ref<T> =>\n (value: T) => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n\nexport default mergeRefs;\n"],"names":["mergeRefs","refs","value","ref"],"mappings":"AAIA,MAAMA,IACF,CAAIC,MACJ,CAACC,MAAa;AACV,EAAAD,EAAK,QAAQ,CAAAE,MAAO;AAChB,IAAI,OAAOA,KAAQ,aACfA,EAAID,CAAK,IACFC,MACNA,EAAyC,UAAUD;AAAA,EAE5D,CAAC;AACL;"}