@collabdt/core 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1338) hide show
  1. package/dist/core/components/AppSidebarContent.d.ts +1 -1
  2. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  3. package/dist/core/components/AppSidebarContent.js +9 -9
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/ConfirmDialog.js.map +1 -1
  6. package/dist/core/components/DataTableSkeleton.d.ts.map +1 -1
  7. package/dist/core/components/DataTableSkeleton.js.map +1 -1
  8. package/dist/core/components/LanguageSwitch.d.ts.map +1 -1
  9. package/dist/core/components/LanguageSwitch.js +4 -4
  10. package/dist/core/components/LanguageSwitch.js.map +1 -1
  11. package/dist/core/components/Logo.js +1 -1
  12. package/dist/core/components/Logo.js.map +1 -1
  13. package/dist/core/components/Toolbar.d.ts +1 -1
  14. package/dist/core/components/Toolbar.d.ts.map +1 -1
  15. package/dist/core/components/Toolbar.js +1 -1
  16. package/dist/core/components/Toolbar.js.map +1 -1
  17. package/dist/core/components/ToolbarBody.d.ts +1 -1
  18. package/dist/core/components/ToolbarBody.d.ts.map +1 -1
  19. package/dist/core/components/ToolbarBody.js +1 -1
  20. package/dist/core/components/ToolbarBody.js.map +1 -1
  21. package/dist/core/components/ToolbarSubmenu.d.ts +1 -1
  22. package/dist/core/components/ToolbarSubmenu.d.ts.map +1 -1
  23. package/dist/core/components/ToolbarSubmenu.js +2 -2
  24. package/dist/core/components/ToolbarSubmenu.js.map +1 -1
  25. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  26. package/dist/core/components/TopNavigationBar.js +5 -5
  27. package/dist/core/components/TopNavigationBar.js.map +1 -1
  28. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  29. package/dist/core/components/authentication/AuthPage.js +5 -5
  30. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  31. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  32. package/dist/core/components/authentication/ForgotPassword.js +3 -4
  33. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  34. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  35. package/dist/core/components/authentication/Signin.js +5 -5
  36. package/dist/core/components/authentication/Signin.js.map +1 -1
  37. package/dist/core/components/authentication/Signup.d.ts.map +1 -1
  38. package/dist/core/components/authentication/Signup.js +7 -7
  39. package/dist/core/components/authentication/Signup.js.map +1 -1
  40. package/dist/core/components/instance-not-found/index.d.ts.map +1 -1
  41. package/dist/core/components/instance-not-found/index.js +4 -4
  42. package/dist/core/components/instance-not-found/index.js.map +1 -1
  43. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  44. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js +3 -3
  45. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  46. package/dist/core/components/organizationConfig/index.d.ts.map +1 -1
  47. package/dist/core/components/organizationConfig/index.js +4 -4
  48. package/dist/core/components/organizationConfig/index.js.map +1 -1
  49. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +2 -2
  50. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  51. package/dist/core/components/settings/index.d.ts.map +1 -1
  52. package/dist/core/components/settings/index.js +2 -2
  53. package/dist/core/components/settings/index.js.map +1 -1
  54. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  55. package/dist/core/components/settings/src/AccountSettingsPanel.js +8 -8
  56. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  57. package/dist/core/components/settings/src/ChangePassword.d.ts.map +1 -1
  58. package/dist/core/components/settings/src/ChangePassword.js +5 -5
  59. package/dist/core/components/settings/src/ChangePassword.js.map +1 -1
  60. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  61. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +7 -7
  62. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  63. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  64. package/dist/core/components/settings/src/SettingsContent.js +1 -1
  65. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  66. package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
  67. package/dist/core/components/settings/src/SettingsSidebar.js +3 -3
  68. package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
  69. package/dist/core/components/settings/src/UsersSettingsPanel.js +1 -1
  70. package/dist/core/components/settings/src/UsersSettingsPanel.js.map +1 -1
  71. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
  72. package/dist/core/components/support/BugReportDialog.js +8 -8
  73. package/dist/core/components/support/BugReportDialog.js.map +1 -1
  74. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
  75. package/dist/core/components/support/FeatureRequestDialog.js +6 -6
  76. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
  77. package/dist/core/components/support/SupportMenu.d.ts.map +1 -1
  78. package/dist/core/components/support/SupportMenu.js +1 -1
  79. package/dist/core/components/support/SupportMenu.js.map +1 -1
  80. package/dist/core/components/ui/Accordion.d.ts +1 -1
  81. package/dist/core/components/ui/Accordion.d.ts.map +1 -1
  82. package/dist/core/components/ui/Accordion.js +1 -1
  83. package/dist/core/components/ui/Accordion.js.map +1 -1
  84. package/dist/core/components/ui/AddItemDialog.d.ts.map +1 -1
  85. package/dist/core/components/ui/AddItemDialog.js +1 -1
  86. package/dist/core/components/ui/AddItemDialog.js.map +1 -1
  87. package/dist/core/components/ui/AlertDialog.d.ts +1 -1
  88. package/dist/core/components/ui/AlertDialog.d.ts.map +1 -1
  89. package/dist/core/components/ui/AlertDialog.js +1 -1
  90. package/dist/core/components/ui/AlertDialog.js.map +1 -1
  91. package/dist/core/components/ui/AnimatedBackground.js +1 -1
  92. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  93. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  94. package/dist/core/components/ui/AppSidebar.js +7 -7
  95. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  96. package/dist/core/components/ui/Avatar.d.ts +1 -1
  97. package/dist/core/components/ui/Avatar.d.ts.map +1 -1
  98. package/dist/core/components/ui/Avatar.js +1 -1
  99. package/dist/core/components/ui/Avatar.js.map +1 -1
  100. package/dist/core/components/ui/Badge.d.ts.map +1 -1
  101. package/dist/core/components/ui/Badge.js.map +1 -1
  102. package/dist/core/components/ui/Breadcrumb.d.ts.map +1 -1
  103. package/dist/core/components/ui/Breadcrumb.js +2 -2
  104. package/dist/core/components/ui/Breadcrumb.js.map +1 -1
  105. package/dist/core/components/ui/Button.d.ts.map +1 -1
  106. package/dist/core/components/ui/Button.js +1 -1
  107. package/dist/core/components/ui/Button.js.map +1 -1
  108. package/dist/core/components/ui/Calendar.d.ts +2 -1
  109. package/dist/core/components/ui/Calendar.d.ts.map +1 -1
  110. package/dist/core/components/ui/Calendar.js +1 -1
  111. package/dist/core/components/ui/Calendar.js.map +1 -1
  112. package/dist/core/components/ui/Checkbox.d.ts +1 -1
  113. package/dist/core/components/ui/Checkbox.d.ts.map +1 -1
  114. package/dist/core/components/ui/Checkbox.js +1 -1
  115. package/dist/core/components/ui/Checkbox.js.map +1 -1
  116. package/dist/core/components/ui/CollapsibleSection.d.ts.map +1 -1
  117. package/dist/core/components/ui/CollapsibleSection.js +2 -2
  118. package/dist/core/components/ui/CollapsibleSection.js.map +1 -1
  119. package/dist/core/components/ui/Command.d.ts +8 -8
  120. package/dist/core/components/ui/Command.d.ts.map +1 -1
  121. package/dist/core/components/ui/Command.js +1 -1
  122. package/dist/core/components/ui/Command.js.map +1 -1
  123. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts +13 -3
  124. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  125. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js +144 -146
  126. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  127. package/dist/core/components/ui/Comments/Comment.d.ts +18 -1
  128. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  129. package/dist/core/components/ui/Comments/Comment.js +97 -26
  130. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  131. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts +34 -0
  132. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts.map +1 -0
  133. package/dist/core/components/ui/Comments/CommentActionButtons.js +106 -0
  134. package/dist/core/components/ui/Comments/CommentActionButtons.js.map +1 -0
  135. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  136. package/dist/core/components/ui/Comments/CommentInput.js +11 -8
  137. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  138. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  139. package/dist/core/components/ui/Comments/CommentsSection.js +89 -45
  140. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  141. package/dist/core/components/ui/Comments/commentUtils.d.ts +1 -1
  142. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  143. package/dist/core/components/ui/Comments/commentUtils.js +2 -1
  144. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  145. package/dist/core/components/ui/Countdown.d.ts.map +1 -1
  146. package/dist/core/components/ui/Countdown.js +1 -1
  147. package/dist/core/components/ui/Countdown.js.map +1 -1
  148. package/dist/core/components/ui/DataTable.d.ts +1 -1
  149. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  150. package/dist/core/components/ui/DataTable.js +17 -17
  151. package/dist/core/components/ui/DataTable.js.map +1 -1
  152. package/dist/core/components/ui/DatePicker.d.ts.map +1 -1
  153. package/dist/core/components/ui/DatePicker.js +2 -2
  154. package/dist/core/components/ui/DatePicker.js.map +1 -1
  155. package/dist/core/components/ui/DescriptionList.d.ts.map +1 -1
  156. package/dist/core/components/ui/DescriptionList.js +2 -2
  157. package/dist/core/components/ui/DescriptionList.js.map +1 -1
  158. package/dist/core/components/ui/Dialog.d.ts +1 -1
  159. package/dist/core/components/ui/Dialog.d.ts.map +1 -1
  160. package/dist/core/components/ui/Dialog.js +1 -1
  161. package/dist/core/components/ui/Dialog.js.map +1 -1
  162. package/dist/core/components/ui/DropdownMenu.d.ts +1 -1
  163. package/dist/core/components/ui/DropdownMenu.d.ts.map +1 -1
  164. package/dist/core/components/ui/DropdownMenu.js +1 -1
  165. package/dist/core/components/ui/DropdownMenu.js.map +1 -1
  166. package/dist/core/components/ui/ExportData.d.ts +2 -2
  167. package/dist/core/components/ui/ExportData.d.ts.map +1 -1
  168. package/dist/core/components/ui/ExportData.js +5 -5
  169. package/dist/core/components/ui/ExportData.js.map +1 -1
  170. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  171. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js +3 -3
  172. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  173. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  174. package/dist/core/components/ui/FilesManager/src/FileMarker.js +2 -2
  175. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  176. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.d.ts.map +1 -1
  177. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.js +1 -1
  178. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.js.map +1 -1
  179. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  180. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  181. package/dist/core/components/ui/FilesManager/src/downloadUtils.d.ts +1 -1
  182. package/dist/core/components/ui/FilesManager/src/downloadUtils.d.ts.map +1 -1
  183. package/dist/core/components/ui/FilesManager/src/downloadUtils.js.map +1 -1
  184. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.js.map +1 -1
  185. package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts +2 -2
  186. package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts.map +1 -1
  187. package/dist/core/components/ui/FilesManager/src/useFileActions.js +2 -2
  188. package/dist/core/components/ui/FilesManager/src/useFileActions.js.map +1 -1
  189. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.js +1 -1
  190. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.js.map +1 -1
  191. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js +3 -3
  192. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  193. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  194. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js +0 -1
  195. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  196. package/dist/core/components/ui/GenericTool.d.ts +1 -1
  197. package/dist/core/components/ui/GenericTool.d.ts.map +1 -1
  198. package/dist/core/components/ui/GenericTool.js +2 -2
  199. package/dist/core/components/ui/GenericTool.js.map +1 -1
  200. package/dist/core/components/ui/Icons/FloorPlanIcon.js +1 -1
  201. package/dist/core/components/ui/Icons/FloorPlanIcon.js.map +1 -1
  202. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  203. package/dist/core/components/ui/InfoSidebar/Container.js +16 -12
  204. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  205. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  206. package/dist/core/components/ui/InfoSidebar/Header.js +4 -4
  207. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  208. package/dist/core/components/ui/InfoSidebar/index.d.ts +1 -1
  209. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  210. package/dist/core/components/ui/InfoSidebar/index.js +1 -1
  211. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  212. package/dist/core/components/ui/Label.d.ts +1 -1
  213. package/dist/core/components/ui/Label.d.ts.map +1 -1
  214. package/dist/core/components/ui/Label.js +1 -1
  215. package/dist/core/components/ui/Label.js.map +1 -1
  216. package/dist/core/components/ui/LanguageToggle.d.ts +1 -1
  217. package/dist/core/components/ui/LanguageToggle.d.ts.map +1 -1
  218. package/dist/core/components/ui/LanguageToggle.js +1 -1
  219. package/dist/core/components/ui/LanguageToggle.js.map +1 -1
  220. package/dist/core/components/ui/Menubar.d.ts +1 -1
  221. package/dist/core/components/ui/Menubar.d.ts.map +1 -1
  222. package/dist/core/components/ui/Menubar.js +1 -1
  223. package/dist/core/components/ui/Menubar.js.map +1 -1
  224. package/dist/core/components/ui/NavUser.js +7 -7
  225. package/dist/core/components/ui/NavUser.js.map +1 -1
  226. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  227. package/dist/core/components/ui/Navbar.js +2 -2
  228. package/dist/core/components/ui/Navbar.js.map +1 -1
  229. package/dist/core/components/ui/Popover.d.ts +1 -1
  230. package/dist/core/components/ui/Popover.d.ts.map +1 -1
  231. package/dist/core/components/ui/Popover.js +1 -1
  232. package/dist/core/components/ui/Popover.js.map +1 -1
  233. package/dist/core/components/ui/Progress.d.ts +1 -1
  234. package/dist/core/components/ui/Progress.d.ts.map +1 -1
  235. package/dist/core/components/ui/Progress.js +1 -1
  236. package/dist/core/components/ui/Progress.js.map +1 -1
  237. package/dist/core/components/ui/ScrollArea.d.ts +1 -1
  238. package/dist/core/components/ui/ScrollArea.d.ts.map +1 -1
  239. package/dist/core/components/ui/ScrollArea.js +1 -1
  240. package/dist/core/components/ui/ScrollArea.js.map +1 -1
  241. package/dist/core/components/ui/SearchInput.d.ts.map +1 -1
  242. package/dist/core/components/ui/SearchInput.js +2 -2
  243. package/dist/core/components/ui/SearchInput.js.map +1 -1
  244. package/dist/core/components/ui/Select.d.ts +1 -1
  245. package/dist/core/components/ui/Select.d.ts.map +1 -1
  246. package/dist/core/components/ui/Select.js +3 -3
  247. package/dist/core/components/ui/Select.js.map +1 -1
  248. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +1 -1
  249. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  250. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +10 -10
  251. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  252. package/dist/core/components/ui/Sensors/Sensor.d.ts +2 -1
  253. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  254. package/dist/core/components/ui/Sensors/Sensor.js +3 -3
  255. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  256. package/dist/core/components/ui/Sensors/SensorChart.d.ts +1 -1
  257. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  258. package/dist/core/components/ui/Sensors/SensorChart.js +1 -1
  259. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  260. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  261. package/dist/core/components/ui/Sensors/SensorInput.js +9 -10
  262. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  263. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  264. package/dist/core/components/ui/Sensors/SensorTagsSection.js +3 -3
  265. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  266. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  267. package/dist/core/components/ui/Sensors/SensorsSection.js +7 -9
  268. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  269. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.d.ts.map +1 -1
  270. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.js.map +1 -1
  271. package/dist/core/components/ui/Sensors/sensorUtils.d.ts +1 -1
  272. package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
  273. package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
  274. package/dist/core/components/ui/Separator.d.ts +1 -1
  275. package/dist/core/components/ui/Separator.d.ts.map +1 -1
  276. package/dist/core/components/ui/Separator.js +1 -1
  277. package/dist/core/components/ui/Separator.js.map +1 -1
  278. package/dist/core/components/ui/SettingsButton.d.ts.map +1 -1
  279. package/dist/core/components/ui/SettingsButton.js +4 -4
  280. package/dist/core/components/ui/SettingsButton.js.map +1 -1
  281. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts +1 -1
  282. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  283. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js +14 -14
  284. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  285. package/dist/core/components/ui/Sheet.d.ts +1 -1
  286. package/dist/core/components/ui/Sheet.d.ts.map +1 -1
  287. package/dist/core/components/ui/Sheet.js +1 -1
  288. package/dist/core/components/ui/Sheet.js.map +1 -1
  289. package/dist/core/components/ui/Sidebar.d.ts +1 -1
  290. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  291. package/dist/core/components/ui/Sidebar.js +33 -10
  292. package/dist/core/components/ui/Sidebar.js.map +1 -1
  293. package/dist/core/components/ui/Slider.d.ts +1 -1
  294. package/dist/core/components/ui/Slider.d.ts.map +1 -1
  295. package/dist/core/components/ui/Slider.js +1 -1
  296. package/dist/core/components/ui/Slider.js.map +1 -1
  297. package/dist/core/components/ui/Switch.d.ts +1 -1
  298. package/dist/core/components/ui/Switch.d.ts.map +1 -1
  299. package/dist/core/components/ui/Switch.js +1 -1
  300. package/dist/core/components/ui/Switch.js.map +1 -1
  301. package/dist/core/components/ui/Tabs.d.ts +1 -1
  302. package/dist/core/components/ui/Tabs.d.ts.map +1 -1
  303. package/dist/core/components/ui/Tabs.js +1 -1
  304. package/dist/core/components/ui/Tabs.js.map +1 -1
  305. package/dist/core/components/ui/Toggle.d.ts +1 -1
  306. package/dist/core/components/ui/Toggle.d.ts.map +1 -1
  307. package/dist/core/components/ui/Toggle.js +1 -1
  308. package/dist/core/components/ui/Toggle.js.map +1 -1
  309. package/dist/core/components/ui/ToggleGroup.d.ts +1 -1
  310. package/dist/core/components/ui/ToggleGroup.d.ts.map +1 -1
  311. package/dist/core/components/ui/ToggleGroup.js +1 -1
  312. package/dist/core/components/ui/ToggleGroup.js.map +1 -1
  313. package/dist/core/components/ui/ToolbarButton.d.ts +1 -1
  314. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  315. package/dist/core/components/ui/ToolbarButton.js +1 -2
  316. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  317. package/dist/core/components/ui/Tooltip.d.ts +1 -1
  318. package/dist/core/components/ui/Tooltip.d.ts.map +1 -1
  319. package/dist/core/components/ui/Tooltip.js +1 -1
  320. package/dist/core/components/ui/Tooltip.js.map +1 -1
  321. package/dist/core/components/ui/UserAvatar.d.ts.map +1 -1
  322. package/dist/core/components/ui/UserAvatar.js +1 -1
  323. package/dist/core/components/ui/UserAvatar.js.map +1 -1
  324. package/dist/core/components/ui/downloadUtils.d.ts.map +1 -1
  325. package/dist/core/components/ui/downloadUtils.js.map +1 -1
  326. package/dist/core/components/ui/stats.d.ts.map +1 -1
  327. package/dist/core/components/ui/stats.js.map +1 -1
  328. package/dist/core/components/ui/uploadFile.js +1 -1
  329. package/dist/core/components/ui/uploadFile.js.map +1 -1
  330. package/dist/core/components/viewers/Data/DataMenu.d.ts +1 -1
  331. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  332. package/dist/core/components/viewers/Data/DataMenu.js +11 -11
  333. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  334. package/dist/core/components/viewers/Data/FilterButtons.d.ts +1 -1
  335. package/dist/core/components/viewers/Data/FilterButtons.d.ts.map +1 -1
  336. package/dist/core/components/viewers/Data/FilterButtons.js +7 -7
  337. package/dist/core/components/viewers/Data/FilterButtons.js.map +1 -1
  338. package/dist/core/components/viewers/Data/HeaderButtons.d.ts +1 -1
  339. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  340. package/dist/core/components/viewers/Data/HeaderButtons.js +9 -9
  341. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  342. package/dist/core/components/viewers/Data/MoreOptions.d.ts +1 -1
  343. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  344. package/dist/core/components/viewers/Data/MoreOptions.js +16 -16
  345. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  346. package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts +1 -1
  347. package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts.map +1 -1
  348. package/dist/core/components/viewers/Data/advancedFilter/Filters.js +2 -2
  349. package/dist/core/components/viewers/Data/advancedFilter/Filters.js.map +1 -1
  350. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts +1 -1
  351. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  352. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js +6 -8
  353. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  354. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  355. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +3 -3
  356. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  357. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
  358. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js +10 -10
  359. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
  360. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.d.ts.map +1 -1
  361. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js +11 -11
  362. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js.map +1 -1
  363. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  364. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +10 -10
  365. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  366. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  367. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  368. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.d.ts.map +1 -1
  369. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.js.map +1 -1
  370. package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts +1 -1
  371. package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts.map +1 -1
  372. package/dist/core/components/viewers/Data/details/AttachedFiles.js +3 -3
  373. package/dist/core/components/viewers/Data/details/AttachedFiles.js.map +1 -1
  374. package/dist/core/components/viewers/Data/details/DetailActions.d.ts +1 -1
  375. package/dist/core/components/viewers/Data/details/DetailActions.d.ts.map +1 -1
  376. package/dist/core/components/viewers/Data/details/DetailActions.js +2 -2
  377. package/dist/core/components/viewers/Data/details/DetailActions.js.map +1 -1
  378. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  379. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  380. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  381. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js +4 -14
  382. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  383. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  384. package/dist/core/components/viewers/Data/details/FieldValue.js +2 -2
  385. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  386. package/dist/core/components/viewers/Data/details/FileUpload.d.ts.map +1 -1
  387. package/dist/core/components/viewers/Data/details/FileUpload.js +2 -2
  388. package/dist/core/components/viewers/Data/details/FileUpload.js.map +1 -1
  389. package/dist/core/components/viewers/Data/details/FilterFiles.d.ts.map +1 -1
  390. package/dist/core/components/viewers/Data/details/FilterFiles.js +2 -2
  391. package/dist/core/components/viewers/Data/details/FilterFiles.js.map +1 -1
  392. package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
  393. package/dist/core/components/viewers/Data/details/TabSidebar.js +3 -3
  394. package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
  395. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  396. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js +3 -4
  397. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  398. package/dist/core/components/viewers/Data/files/FileDetails.d.ts.map +1 -1
  399. package/dist/core/components/viewers/Data/files/FileDetails.js +8 -8
  400. package/dist/core/components/viewers/Data/files/FileDetails.js.map +1 -1
  401. package/dist/core/components/viewers/Data/files/FileMoreOptions.d.ts.map +1 -1
  402. package/dist/core/components/viewers/Data/files/FileMoreOptions.js +8 -8
  403. package/dist/core/components/viewers/Data/files/FileMoreOptions.js.map +1 -1
  404. package/dist/core/components/viewers/Data/files/FilePreview.d.ts +1 -1
  405. package/dist/core/components/viewers/Data/files/FilePreview.d.ts.map +1 -1
  406. package/dist/core/components/viewers/Data/files/FilePreview.js +1 -1
  407. package/dist/core/components/viewers/Data/files/FilePreview.js.map +1 -1
  408. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  409. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js +0 -1
  410. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  411. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.d.ts.map +1 -1
  412. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js +3 -3
  413. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js.map +1 -1
  414. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
  415. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js +2 -2
  416. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
  417. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
  418. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js +6 -6
  419. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
  420. package/dist/core/components/viewers/Data/siteDetails/AddSite.d.ts.map +1 -1
  421. package/dist/core/components/viewers/Data/siteDetails/AddSite.js +5 -5
  422. package/dist/core/components/viewers/Data/siteDetails/AddSite.js.map +1 -1
  423. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  424. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +10 -10
  425. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  426. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.d.ts.map +1 -1
  427. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js +9 -9
  428. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js.map +1 -1
  429. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  430. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +11 -11
  431. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  432. package/dist/core/components/viewers/Data/userDetails/AddUser.d.ts.map +1 -1
  433. package/dist/core/components/viewers/Data/userDetails/AddUser.js +3 -3
  434. package/dist/core/components/viewers/Data/userDetails/AddUser.js.map +1 -1
  435. package/dist/core/components/viewers/Data/userDetails/UserDetails.d.ts.map +1 -1
  436. package/dist/core/components/viewers/Data/userDetails/UserDetails.js +12 -12
  437. package/dist/core/components/viewers/Data/userDetails/UserDetails.js.map +1 -1
  438. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  439. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js +12 -13
  440. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  441. package/dist/core/components/viewers/Data/utils/Columns.d.ts +2 -2
  442. package/dist/core/components/viewers/Data/utils/Columns.d.ts.map +1 -1
  443. package/dist/core/components/viewers/Data/utils/Columns.js +7 -7
  444. package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
  445. package/dist/core/components/viewers/Data/utils/Headers.d.ts.map +1 -1
  446. package/dist/core/components/viewers/Data/utils/Headers.js.map +1 -1
  447. package/dist/core/components/viewers/Data/utils/csvUtils.js.map +1 -1
  448. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  449. package/dist/core/components/viewers/Data/utils/filterHelper.js +0 -2
  450. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  451. package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
  452. package/dist/core/components/viewers/Data/utils/useViewerData.d.ts +2 -2
  453. package/dist/core/components/viewers/Data/utils/useViewerData.d.ts.map +1 -1
  454. package/dist/core/components/viewers/Data/utils/useViewerData.js.map +1 -1
  455. package/dist/core/components/viewers/Viewer.d.ts +1 -1
  456. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  457. package/dist/core/components/viewers/Viewer.js +6 -6
  458. package/dist/core/components/viewers/Viewer.js.map +1 -1
  459. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  460. package/dist/core/components/viewers/bim/BimToolbar.js +1 -1
  461. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  462. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  463. package/dist/core/components/viewers/bim/BimViewer.js +7 -7
  464. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  465. package/dist/core/components/viewers/bim/src/BCFTopicsManager.d.ts.map +1 -1
  466. package/dist/core/components/viewers/bim/src/BCFTopicsManager.js.map +1 -1
  467. package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts +2 -2
  468. package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts.map +1 -1
  469. package/dist/core/components/viewers/bim/src/BIMManager/index.js.map +1 -1
  470. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  471. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +9 -9
  472. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  473. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.d.ts.map +1 -1
  474. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js +1 -1
  475. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js.map +1 -1
  476. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts +1 -1
  477. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  478. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js +1 -1
  479. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js.map +1 -1
  480. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts +1 -1
  481. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts.map +1 -1
  482. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js +5 -5
  483. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js.map +1 -1
  484. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts +1 -1
  485. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts.map +1 -1
  486. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js +9 -9
  487. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js.map +1 -1
  488. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  489. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +6 -9
  490. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  491. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.d.ts.map +1 -1
  492. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.js +4 -4
  493. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.js.map +1 -1
  494. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts +1 -1
  495. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  496. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +11 -17
  497. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  498. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  499. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js +10 -18
  500. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  501. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.d.ts.map +1 -1
  502. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js +1 -1
  503. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js.map +1 -1
  504. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.d.ts.map +1 -1
  505. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.js +2 -2
  506. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.js.map +1 -1
  507. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  508. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
  509. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  510. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.d.ts.map +1 -1
  511. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js +6 -6
  512. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js.map +1 -1
  513. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +1 -1
  514. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  515. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  516. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.d.ts.map +1 -1
  517. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js +2 -2
  518. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js.map +1 -1
  519. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  520. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js +5 -5
  521. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  522. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.d.ts.map +1 -1
  523. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js +3 -3
  524. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js.map +1 -1
  525. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.d.ts.map +1 -1
  526. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js +3 -3
  527. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js.map +1 -1
  528. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.d.ts.map +1 -1
  529. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js +4 -4
  530. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js.map +1 -1
  531. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts +1 -1
  532. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  533. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js +5 -4
  534. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  535. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  536. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +5 -5
  537. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  538. package/dist/core/components/viewers/bim/src/CameraProjection.d.ts.map +1 -1
  539. package/dist/core/components/viewers/bim/src/CameraProjection.js.map +1 -1
  540. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  541. package/dist/core/components/viewers/bim/src/ClippingPlane.js +1 -2
  542. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  543. package/dist/core/components/viewers/bim/src/Cursor.d.ts +1 -1
  544. package/dist/core/components/viewers/bim/src/Cursor.d.ts.map +1 -1
  545. package/dist/core/components/viewers/bim/src/Cursor.js.map +1 -1
  546. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +1 -1
  547. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  548. package/dist/core/components/viewers/bim/src/DXFLoader/index.js +1 -1
  549. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  550. package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts +1 -1
  551. package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts.map +1 -1
  552. package/dist/core/components/viewers/bim/src/ElevationsTool/index.js +1 -1
  553. package/dist/core/components/viewers/bim/src/ElevationsTool/index.js.map +1 -1
  554. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts +1 -1
  555. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts.map +1 -1
  556. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.js.map +1 -1
  557. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts +4 -4
  558. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts.map +1 -1
  559. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.js.map +1 -1
  560. package/dist/core/components/viewers/bim/src/FitCamera.d.ts.map +1 -1
  561. package/dist/core/components/viewers/bim/src/FitCamera.js +1 -1
  562. package/dist/core/components/viewers/bim/src/FitCamera.js.map +1 -1
  563. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +3 -3
  564. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  565. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +1 -1
  566. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  567. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts +3 -3
  568. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts.map +1 -1
  569. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.js.map +1 -1
  570. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts +1 -1
  571. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts.map +1 -1
  572. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.js.map +1 -1
  573. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts +2 -2
  574. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts.map +1 -1
  575. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.js.map +1 -1
  576. package/dist/core/components/viewers/bim/src/GhostMode.d.ts +1 -1
  577. package/dist/core/components/viewers/bim/src/GhostMode.d.ts.map +1 -1
  578. package/dist/core/components/viewers/bim/src/GhostMode.js.map +1 -1
  579. package/dist/core/components/viewers/bim/src/Highlighter/index.d.ts.map +1 -1
  580. package/dist/core/components/viewers/bim/src/Highlighter/index.js +1 -1
  581. package/dist/core/components/viewers/bim/src/Highlighter/index.js.map +1 -1
  582. package/dist/core/components/viewers/bim/src/IDSManager/index.d.ts.map +1 -1
  583. package/dist/core/components/viewers/bim/src/IDSManager/index.js +3 -3
  584. package/dist/core/components/viewers/bim/src/IDSManager/index.js.map +1 -1
  585. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.d.ts.map +1 -1
  586. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js +2 -2
  587. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js.map +1 -1
  588. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.d.ts.map +1 -1
  589. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.js.map +1 -1
  590. package/dist/core/components/viewers/bim/src/LoadModels.d.ts +1 -1
  591. package/dist/core/components/viewers/bim/src/LoadModels.d.ts.map +1 -1
  592. package/dist/core/components/viewers/bim/src/LoadModels.js +1 -1
  593. package/dist/core/components/viewers/bim/src/LoadModels.js.map +1 -1
  594. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts +1 -1
  595. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  596. package/dist/core/components/viewers/bim/src/ModelManager/index.js +4 -4
  597. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  598. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts +1 -1
  599. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  600. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js +8 -8
  601. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  602. package/dist/core/components/viewers/bim/src/SpatialStructure.js.map +1 -1
  603. package/dist/core/components/viewers/bim/src/ViewportGizmo.d.ts.map +1 -1
  604. package/dist/core/components/viewers/bim/src/ViewportGizmo.js +2 -2
  605. package/dist/core/components/viewers/bim/src/ViewportGizmo.js.map +1 -1
  606. package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts +1 -1
  607. package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts.map +1 -1
  608. package/dist/core/components/viewers/bim/src/lib/CameraController.js.map +1 -1
  609. package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts +1 -1
  610. package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts.map +1 -1
  611. package/dist/core/components/viewers/bim/src/lib/ChromeController.js.map +1 -1
  612. package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts +1 -1
  613. package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts.map +1 -1
  614. package/dist/core/components/viewers/bim/src/lib/ClipController.js.map +1 -1
  615. package/dist/core/components/viewers/bim/src/lib/GridController.d.ts.map +1 -1
  616. package/dist/core/components/viewers/bim/src/lib/GridController.js.map +1 -1
  617. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  618. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js +1 -1
  619. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  620. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts +2 -2
  621. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts.map +1 -1
  622. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js +1 -1
  623. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js.map +1 -1
  624. package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts +1 -1
  625. package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts.map +1 -1
  626. package/dist/core/components/viewers/bim/src/lib/drawingProjection.js.map +1 -1
  627. package/dist/core/components/viewers/bim/src/lib/useBuildingName.d.ts.map +1 -1
  628. package/dist/core/components/viewers/bim/src/lib/useBuildingName.js.map +1 -1
  629. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +1 -1
  630. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  631. package/dist/core/components/viewers/bim/src/propertiesMenu/index.d.ts.map +1 -1
  632. package/dist/core/components/viewers/bim/src/propertiesMenu/index.js +4 -4
  633. package/dist/core/components/viewers/bim/src/propertiesMenu/index.js.map +1 -1
  634. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.d.ts.map +1 -1
  635. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js +1 -1
  636. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js.map +1 -1
  637. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.d.ts.map +1 -1
  638. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js +2 -2
  639. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js.map +1 -1
  640. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.d.ts.map +1 -1
  641. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.js.map +1 -1
  642. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts +1 -1
  643. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts.map +1 -1
  644. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js +2 -2
  645. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js.map +1 -1
  646. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.d.ts.map +1 -1
  647. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.js.map +1 -1
  648. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  649. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +9 -9
  650. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  651. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +1 -1
  652. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  653. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +2 -2
  654. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  655. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.d.ts.map +1 -1
  656. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js +2 -2
  657. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js.map +1 -1
  658. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts +1 -1
  659. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
  660. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
  661. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.d.ts.map +1 -1
  662. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js +3 -3
  663. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js.map +1 -1
  664. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts +16 -10
  665. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  666. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js +26 -6
  667. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  668. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts +23 -0
  669. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts.map +1 -0
  670. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js +108 -0
  671. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js.map +1 -0
  672. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts +2 -2
  673. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  674. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  675. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts +5 -5
  676. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  677. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  678. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  679. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +2 -2
  680. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  681. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  682. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +1 -1
  683. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  684. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts +44 -0
  685. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map +1 -0
  686. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js +77 -0
  687. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map +1 -0
  688. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts +24 -0
  689. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts.map +1 -0
  690. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js +27 -0
  691. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js.map +1 -0
  692. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts +1 -1
  693. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  694. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js +3 -3
  695. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  696. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  697. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js +244 -63
  698. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  699. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +2 -2
  700. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  701. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +4 -4
  702. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  703. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  704. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +6 -6
  705. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  706. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.d.ts.map +1 -1
  707. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js +2 -2
  708. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js.map +1 -1
  709. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts +1 -1
  710. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  711. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js +6 -10
  712. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  713. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts +1 -1
  714. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  715. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js +3 -4
  716. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  717. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts +1 -1
  718. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts.map +1 -1
  719. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js +2 -2
  720. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js.map +1 -1
  721. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts +1 -1
  722. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts.map +1 -1
  723. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js +4 -4
  724. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js.map +1 -1
  725. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +1 -1
  726. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  727. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -4
  728. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  729. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts +1 -1
  730. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  731. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js +6 -7
  732. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  733. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts +1 -1
  734. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts.map +1 -1
  735. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js +5 -5
  736. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js.map +1 -1
  737. package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts +1 -1
  738. package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts.map +1 -1
  739. package/dist/core/components/viewers/bim/src/tools/shareBimTool.js.map +1 -1
  740. package/dist/core/components/viewers/bim/utils/GizmoController.d.ts +1 -1
  741. package/dist/core/components/viewers/bim/utils/GizmoController.d.ts.map +1 -1
  742. package/dist/core/components/viewers/bim/utils/GizmoController.js.map +1 -1
  743. package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts +1 -1
  744. package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts.map +1 -1
  745. package/dist/core/components/viewers/bim/utils/setCameraLookAt.js.map +1 -1
  746. package/dist/core/components/viewers/map/MapViewer.d.ts +1 -1
  747. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  748. package/dist/core/components/viewers/map/MapViewer.js +7 -7
  749. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  750. package/dist/core/components/viewers/map/datasets/AddPortalDialog.d.ts.map +1 -1
  751. package/dist/core/components/viewers/map/datasets/AddPortalDialog.js +4 -4
  752. package/dist/core/components/viewers/map/datasets/AddPortalDialog.js.map +1 -1
  753. package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts +1 -1
  754. package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts.map +1 -1
  755. package/dist/core/components/viewers/map/datasets/DatasetDetails.js +4 -4
  756. package/dist/core/components/viewers/map/datasets/DatasetDetails.js.map +1 -1
  757. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  758. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +13 -13
  759. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  760. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.d.ts.map +1 -1
  761. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js +2 -2
  762. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js.map +1 -1
  763. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.d.ts.map +1 -1
  764. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.js.map +1 -1
  765. package/dist/core/components/viewers/map/datasets/Filters.d.ts.map +1 -1
  766. package/dist/core/components/viewers/map/datasets/Filters.js +2 -2
  767. package/dist/core/components/viewers/map/datasets/Filters.js.map +1 -1
  768. package/dist/core/components/viewers/map/datasets/NestedFilter.d.ts.map +1 -1
  769. package/dist/core/components/viewers/map/datasets/NestedFilter.js +1 -1
  770. package/dist/core/components/viewers/map/datasets/NestedFilter.js.map +1 -1
  771. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  772. package/dist/core/components/viewers/map/datasets/RowActions.js +3 -3
  773. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  774. package/dist/core/components/viewers/map/datasets/data.d.ts +1 -1
  775. package/dist/core/components/viewers/map/datasets/data.d.ts.map +1 -1
  776. package/dist/core/components/viewers/map/datasets/data.js +2 -2
  777. package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
  778. package/dist/core/components/viewers/map/datasets/index.d.ts +1 -1
  779. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  780. package/dist/core/components/viewers/map/datasets/index.js +11 -11
  781. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  782. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts +1 -1
  783. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  784. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js +13 -16
  785. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  786. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -1
  787. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -1
  788. package/dist/core/components/viewers/map/datasets/src/cache.js.map +1 -1
  789. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts +1 -1
  790. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  791. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js +3 -6
  792. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  793. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts +1 -1
  794. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  795. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +3 -6
  796. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  797. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  798. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  799. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts +1 -1
  800. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  801. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js +1 -12
  802. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  803. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +1 -1
  804. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -1
  805. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -1
  806. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.d.ts.map +1 -1
  807. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js +1 -1
  808. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js.map +1 -1
  809. package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts +1 -12
  810. package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts.map +1 -1
  811. package/dist/core/components/viewers/map/datasets/src/urlSources.js +1 -1
  812. package/dist/core/components/viewers/map/datasets/src/urlSources.js.map +1 -1
  813. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.d.ts.map +1 -1
  814. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js +1 -1
  815. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js.map +1 -1
  816. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts +1 -1
  817. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts.map +1 -1
  818. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.js.map +1 -1
  819. package/dist/core/components/viewers/map/datasets/utils.d.ts +1 -1
  820. package/dist/core/components/viewers/map/datasets/utils.d.ts.map +1 -1
  821. package/dist/core/components/viewers/map/datasets/utils.js.map +1 -1
  822. package/dist/core/components/viewers/map/legends/MapLegendHost.d.ts.map +1 -1
  823. package/dist/core/components/viewers/map/legends/MapLegendHost.js +3 -3
  824. package/dist/core/components/viewers/map/legends/MapLegendHost.js.map +1 -1
  825. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  826. package/dist/core/components/viewers/map/src/Geocoder.js +8 -8
  827. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  828. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts +1 -1
  829. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts.map +1 -1
  830. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.js.map +1 -1
  831. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts +1 -1
  832. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts.map +1 -1
  833. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js +3 -3
  834. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js.map +1 -1
  835. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts +1 -1
  836. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  837. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js +11 -11
  838. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  839. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  840. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +23 -56
  841. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  842. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  843. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js +4 -5
  844. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  845. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.d.ts.map +1 -1
  846. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.js +2 -2
  847. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.js.map +1 -1
  848. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  849. package/dist/core/components/viewers/map/src/MapLayers/index.js +5 -5
  850. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  851. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  852. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +5 -5
  853. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  854. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.d.ts.map +1 -1
  855. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js +4 -4
  856. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js.map +1 -1
  857. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts +1 -1
  858. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts.map +1 -1
  859. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.js.map +1 -1
  860. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  861. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js +182 -61
  862. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  863. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  864. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +1 -1
  865. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  866. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.d.ts.map +1 -1
  867. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.js +3 -3
  868. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.js.map +1 -1
  869. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts +1 -1
  870. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  871. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js +1 -1
  872. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  873. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.d.ts.map +1 -1
  874. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.js.map +1 -1
  875. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts +1 -1
  876. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts.map +1 -1
  877. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js +3 -3
  878. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js.map +1 -1
  879. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  880. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js +4 -3
  881. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  882. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.d.ts.map +1 -1
  883. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.js.map +1 -1
  884. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.d.ts.map +1 -1
  885. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.js +6 -6
  886. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.js.map +1 -1
  887. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts +1 -1
  888. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  889. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  890. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts +1 -1
  891. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts.map +1 -1
  892. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.js.map +1 -1
  893. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -1
  894. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -1
  895. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  896. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +3 -3
  897. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  898. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.d.ts.map +1 -1
  899. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js +3 -3
  900. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js.map +1 -1
  901. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  902. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +11 -14
  903. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  904. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -1
  905. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +2 -2
  906. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -1
  907. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -1
  908. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +4 -4
  909. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -1
  910. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts +1 -1
  911. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts.map +1 -1
  912. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.js.map +1 -1
  913. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -1
  914. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -1
  915. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -1
  916. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -1
  917. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts +1 -1
  918. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  919. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js +5 -4
  920. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  921. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +1 -1
  922. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  923. package/dist/core/components/viewers/map/src/MapSidebar/index.js +4 -4
  924. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  925. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts +1 -1
  926. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  927. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.js.map +1 -1
  928. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.d.ts.map +1 -1
  929. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.js +2 -2
  930. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.js.map +1 -1
  931. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts +1 -1
  932. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  933. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js +5 -6
  934. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  935. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  936. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js +6 -10
  937. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  938. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +1 -1
  939. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  940. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +4 -4
  941. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  942. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.d.ts.map +1 -1
  943. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js +4 -4
  944. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js.map +1 -1
  945. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.d.ts.map +1 -1
  946. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js +2 -2
  947. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js.map +1 -1
  948. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +1 -1
  949. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  950. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  951. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  952. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  953. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  954. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +3 -3
  955. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  956. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.d.ts.map +1 -1
  957. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js +3 -3
  958. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js.map +1 -1
  959. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
  960. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js +3 -3
  961. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js.map +1 -1
  962. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  963. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +3 -3
  964. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  965. package/dist/core/components/viewers/map/src/SimpleMap.d.ts.map +1 -1
  966. package/dist/core/components/viewers/map/src/SimpleMap.js +1 -1
  967. package/dist/core/components/viewers/map/src/SimpleMap.js.map +1 -1
  968. package/dist/core/components/viewers/map/src/compare/AddItem.d.ts +1 -1
  969. package/dist/core/components/viewers/map/src/compare/AddItem.d.ts.map +1 -1
  970. package/dist/core/components/viewers/map/src/compare/AddItem.js +6 -6
  971. package/dist/core/components/viewers/map/src/compare/AddItem.js.map +1 -1
  972. package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts +2 -2
  973. package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts.map +1 -1
  974. package/dist/core/components/viewers/map/src/compare/CompareDialog.js +5 -5
  975. package/dist/core/components/viewers/map/src/compare/CompareDialog.js.map +1 -1
  976. package/dist/core/components/viewers/map/src/compare/index.d.ts +1 -1
  977. package/dist/core/components/viewers/map/src/compare/index.d.ts.map +1 -1
  978. package/dist/core/components/viewers/map/src/compare/index.js +6 -6
  979. package/dist/core/components/viewers/map/src/compare/index.js.map +1 -1
  980. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.d.ts.map +1 -1
  981. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js +3 -3
  982. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js.map +1 -1
  983. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.d.ts.map +1 -1
  984. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js +5 -5
  985. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js.map +1 -1
  986. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  987. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js +1 -3
  988. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  989. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -1
  990. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +3 -3
  991. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -1
  992. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  993. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +7 -7
  994. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  995. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -1
  996. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +1 -1
  997. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -1
  998. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +2 -2
  999. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  1000. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -8
  1001. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  1002. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +2 -2
  1003. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  1004. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +1 -1
  1005. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  1006. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +2 -2
  1007. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  1008. package/dist/core/components/viewers/map/src/tools/mapTools.js +4 -4
  1009. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  1010. package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts +1 -1
  1011. package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts.map +1 -1
  1012. package/dist/core/components/viewers/map/src/tools/measureMapTool.js +3 -3
  1013. package/dist/core/components/viewers/map/src/tools/measureMapTool.js.map +1 -1
  1014. package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts +1 -1
  1015. package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts.map +1 -1
  1016. package/dist/core/components/viewers/map/src/tools/shareMapTool.js.map +1 -1
  1017. package/dist/core/components/viewers/map/utils/ClusterManager.d.ts +1 -1
  1018. package/dist/core/components/viewers/map/utils/ClusterManager.d.ts.map +1 -1
  1019. package/dist/core/components/viewers/map/utils/ClusterManager.js.map +1 -1
  1020. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  1021. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +0 -1
  1022. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  1023. package/dist/core/components/viewers/map/utils/MarkerManager.d.ts +1 -1
  1024. package/dist/core/components/viewers/map/utils/MarkerManager.d.ts.map +1 -1
  1025. package/dist/core/components/viewers/map/utils/MarkerManager.js.map +1 -1
  1026. package/dist/core/components/viewers/map/utils/extractCoordinates.js.map +1 -1
  1027. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts +1 -1
  1028. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts.map +1 -1
  1029. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.js.map +1 -1
  1030. package/dist/core/components/viewers/map/utils/flyToEach.d.ts +1 -1
  1031. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  1032. package/dist/core/components/viewers/map/utils/flyToEach.js +0 -1
  1033. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  1034. package/dist/core/components/viewers/map/utils/geocoder.d.ts +1 -1
  1035. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  1036. package/dist/core/components/viewers/map/utils/geocoder.js +1 -1
  1037. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  1038. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +1 -1
  1039. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -1
  1040. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -1
  1041. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +1 -1
  1042. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  1043. package/dist/core/components/viewers/map/utils/geocoding/index.js +1 -1
  1044. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  1045. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +1 -1
  1046. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  1047. package/dist/core/components/viewers/map/utils/geocoding/osm.js +1 -1
  1048. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  1049. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +1 -1
  1050. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  1051. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  1052. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts +1 -1
  1053. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts.map +1 -1
  1054. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.js.map +1 -1
  1055. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  1056. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js +0 -2
  1057. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  1058. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  1059. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js +1 -1
  1060. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  1061. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  1062. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +5 -5
  1063. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  1064. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  1065. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +7 -7
  1066. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  1067. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  1068. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  1069. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  1070. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +15 -15
  1071. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  1072. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  1073. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +3 -3
  1074. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  1075. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts +1 -1
  1076. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts.map +1 -1
  1077. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js +1 -1
  1078. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js.map +1 -1
  1079. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  1080. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +2 -2
  1081. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  1082. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  1083. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +3 -3
  1084. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  1085. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts +1 -1
  1086. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  1087. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +4 -4
  1088. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  1089. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +1 -1
  1090. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  1091. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +5 -5
  1092. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  1093. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.d.ts.map +1 -1
  1094. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js +1 -1
  1095. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js.map +1 -1
  1096. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.d.ts.map +1 -1
  1097. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js +3 -3
  1098. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js.map +1 -1
  1099. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  1100. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js +4 -4
  1101. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  1102. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.d.ts.map +1 -1
  1103. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js +10 -10
  1104. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js.map +1 -1
  1105. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.js.map +1 -1
  1106. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts +1 -1
  1107. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts.map +1 -1
  1108. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js +3 -3
  1109. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js.map +1 -1
  1110. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.d.ts.map +1 -1
  1111. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.js.map +1 -1
  1112. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.d.ts.map +1 -1
  1113. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.js.map +1 -1
  1114. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.d.ts.map +1 -1
  1115. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.js.map +1 -1
  1116. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.d.ts.map +1 -1
  1117. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.js.map +1 -1
  1118. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts +1 -1
  1119. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts.map +1 -1
  1120. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js +6 -6
  1121. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js.map +1 -1
  1122. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.d.ts.map +1 -1
  1123. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js +2 -2
  1124. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js.map +1 -1
  1125. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.d.ts.map +1 -1
  1126. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +2 -2
  1127. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  1128. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.d.ts.map +1 -1
  1129. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js +3 -3
  1130. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js.map +1 -1
  1131. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.d.ts.map +1 -1
  1132. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js +1 -1
  1133. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js.map +1 -1
  1134. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.d.ts.map +1 -1
  1135. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js +1 -1
  1136. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js.map +1 -1
  1137. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.d.ts.map +1 -1
  1138. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js +1 -1
  1139. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js.map +1 -1
  1140. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.d.ts.map +1 -1
  1141. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js +4 -4
  1142. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js.map +1 -1
  1143. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts +1 -1
  1144. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts.map +1 -1
  1145. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js +1 -1
  1146. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js.map +1 -1
  1147. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts +1 -1
  1148. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts.map +1 -1
  1149. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js +2 -2
  1150. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js.map +1 -1
  1151. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts +1 -1
  1152. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts.map +1 -1
  1153. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.js.map +1 -1
  1154. package/dist/core/hooks/buildings/createBuildingHooks.d.ts +1 -1
  1155. package/dist/core/hooks/buildings/createBuildingHooks.d.ts.map +1 -1
  1156. package/dist/core/hooks/buildings/createBuildingHooks.js.map +1 -1
  1157. package/dist/core/hooks/comments/comments.d.ts +11 -0
  1158. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  1159. package/dist/core/hooks/comments/comments.js +3 -1
  1160. package/dist/core/hooks/comments/comments.js.map +1 -1
  1161. package/dist/core/hooks/comments/createCommentHooks.d.ts +12 -1
  1162. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  1163. package/dist/core/hooks/comments/createCommentHooks.js +31 -2
  1164. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  1165. package/dist/core/hooks/files/createFileHooks.d.ts +1 -1
  1166. package/dist/core/hooks/files/createFileHooks.d.ts.map +1 -1
  1167. package/dist/core/hooks/files/createFileHooks.js.map +1 -1
  1168. package/dist/core/hooks/files/files.d.ts.map +1 -1
  1169. package/dist/core/hooks/files/files.js +1 -2
  1170. package/dist/core/hooks/files/files.js.map +1 -1
  1171. package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts +1 -1
  1172. package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts.map +1 -1
  1173. package/dist/core/hooks/infrastructures/createInfrastructureHooks.js.map +1 -1
  1174. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts +1 -1
  1175. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts.map +1 -1
  1176. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.js.map +1 -1
  1177. package/dist/core/hooks/organizations/createOrganizationHooks.d.ts +1 -1
  1178. package/dist/core/hooks/organizations/createOrganizationHooks.d.ts.map +1 -1
  1179. package/dist/core/hooks/organizations/createOrganizationHooks.js.map +1 -1
  1180. package/dist/core/hooks/provider.d.ts +5 -5
  1181. package/dist/core/hooks/provider.d.ts.map +1 -1
  1182. package/dist/core/hooks/provider.js +4 -4
  1183. package/dist/core/hooks/provider.js.map +1 -1
  1184. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts +1 -1
  1185. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts.map +1 -1
  1186. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.js.map +1 -1
  1187. package/dist/core/hooks/sensors/createSensorHooks.d.ts +1 -1
  1188. package/dist/core/hooks/sensors/createSensorHooks.d.ts.map +1 -1
  1189. package/dist/core/hooks/sensors/createSensorHooks.js +1 -1
  1190. package/dist/core/hooks/sensors/createSensorHooks.js.map +1 -1
  1191. package/dist/core/hooks/sites/createSiteHooks.d.ts +1 -1
  1192. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  1193. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  1194. package/dist/core/hooks/sites/sites.d.ts.map +1 -1
  1195. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts +30 -0
  1196. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts.map +1 -0
  1197. package/dist/core/hooks/ui/useResizableSidebarWidth.js +75 -0
  1198. package/dist/core/hooks/ui/useResizableSidebarWidth.js.map +1 -0
  1199. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -1
  1200. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -1
  1201. package/dist/core/hooks/useCurrentViewerPosition.d.ts.map +1 -1
  1202. package/dist/core/hooks/useCurrentViewerPosition.js +1 -1
  1203. package/dist/core/hooks/useCurrentViewerPosition.js.map +1 -1
  1204. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +1 -1
  1205. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -1
  1206. package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -1
  1207. package/dist/core/hooks/useShareUrl.d.ts.map +1 -1
  1208. package/dist/core/hooks/useShareUrl.js +1 -1
  1209. package/dist/core/hooks/useShareUrl.js.map +1 -1
  1210. package/dist/core/hooks/users/createUserHooks.d.ts +1 -1
  1211. package/dist/core/hooks/users/createUserHooks.d.ts.map +1 -1
  1212. package/dist/core/hooks/users/createUserHooks.js.map +1 -1
  1213. package/dist/core/i18n/index.js +1 -1
  1214. package/dist/core/i18n/index.js.map +1 -1
  1215. package/dist/core/i18n/messages/en.json +1877 -1872
  1216. package/dist/core/i18n/messages/es.json +1875 -1870
  1217. package/dist/core/i18n/messages/fr.json +1875 -1870
  1218. package/dist/core/plugins/host/context.d.ts +1 -1
  1219. package/dist/core/plugins/host/context.d.ts.map +1 -1
  1220. package/dist/core/plugins/host/context.js.map +1 -1
  1221. package/dist/core/plugins/host/host.d.ts +1 -1
  1222. package/dist/core/plugins/host/host.d.ts.map +1 -1
  1223. package/dist/core/plugins/host/host.js.map +1 -1
  1224. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  1225. package/dist/core/plugins/host/provider.js +2 -2
  1226. package/dist/core/plugins/host/provider.js.map +1 -1
  1227. package/dist/core/store/AppConfig/context.d.ts +1 -1
  1228. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  1229. package/dist/core/store/AppConfig/context.js.map +1 -1
  1230. package/dist/core/store/AppConfig/reducer.d.ts +2 -2
  1231. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  1232. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  1233. package/dist/core/store/BIM/context.d.ts +1 -1
  1234. package/dist/core/store/BIM/context.d.ts.map +1 -1
  1235. package/dist/core/store/BIM/context.js.map +1 -1
  1236. package/dist/core/store/BIM/reducer.d.ts +3 -3
  1237. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  1238. package/dist/core/store/BIM/reducer.js.map +1 -1
  1239. package/dist/core/store/Buildings/context.d.ts +1 -1
  1240. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  1241. package/dist/core/store/Buildings/context.js.map +1 -1
  1242. package/dist/core/store/Buildings/reducer.d.ts +2 -2
  1243. package/dist/core/store/Buildings/reducer.d.ts.map +1 -1
  1244. package/dist/core/store/Buildings/reducer.js.map +1 -1
  1245. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  1246. package/dist/core/store/CombineProviders.js +7 -7
  1247. package/dist/core/store/CombineProviders.js.map +1 -1
  1248. package/dist/core/store/Content/context.d.ts +1 -1
  1249. package/dist/core/store/Content/context.d.ts.map +1 -1
  1250. package/dist/core/store/Content/context.js.map +1 -1
  1251. package/dist/core/store/Datasets/context.d.ts +1 -1
  1252. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  1253. package/dist/core/store/Datasets/context.js.map +1 -1
  1254. package/dist/core/store/Datasets/reducer.d.ts +1 -1
  1255. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  1256. package/dist/core/store/Datasets/reducer.js +0 -2
  1257. package/dist/core/store/Datasets/reducer.js.map +1 -1
  1258. package/dist/core/store/Files/context.d.ts +1 -1
  1259. package/dist/core/store/Files/context.d.ts.map +1 -1
  1260. package/dist/core/store/Files/context.js.map +1 -1
  1261. package/dist/core/store/Files/reducer.d.ts +3 -3
  1262. package/dist/core/store/Files/reducer.d.ts.map +1 -1
  1263. package/dist/core/store/Files/reducer.js +0 -1
  1264. package/dist/core/store/Files/reducer.js.map +1 -1
  1265. package/dist/core/store/Map/context.d.ts +1 -1
  1266. package/dist/core/store/Map/context.d.ts.map +1 -1
  1267. package/dist/core/store/Map/context.js +1 -1
  1268. package/dist/core/store/Map/context.js.map +1 -1
  1269. package/dist/core/store/Map/reducer.d.ts +6 -5
  1270. package/dist/core/store/Map/reducer.d.ts.map +1 -1
  1271. package/dist/core/store/Map/reducer.js.map +1 -1
  1272. package/dist/core/store/MapSites/context.d.ts +1 -1
  1273. package/dist/core/store/MapSites/context.d.ts.map +1 -1
  1274. package/dist/core/store/MapSites/context.js.map +1 -1
  1275. package/dist/core/store/MapSites/reducer.d.ts +1 -1
  1276. package/dist/core/store/MapSites/reducer.d.ts.map +1 -1
  1277. package/dist/core/store/MapSites/reducer.js.map +1 -1
  1278. package/dist/core/store/Menus/context.d.ts +1 -1
  1279. package/dist/core/store/Menus/context.d.ts.map +1 -1
  1280. package/dist/core/store/Menus/context.js +6 -3
  1281. package/dist/core/store/Menus/context.js.map +1 -1
  1282. package/dist/core/store/Menus/reducer.d.ts +21 -1
  1283. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  1284. package/dist/core/store/Menus/reducer.js +21 -3
  1285. package/dist/core/store/Menus/reducer.js.map +1 -1
  1286. package/dist/core/store/Permissions/context.d.ts +1 -1
  1287. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  1288. package/dist/core/store/Permissions/context.js +2 -2
  1289. package/dist/core/store/Permissions/context.js.map +1 -1
  1290. package/dist/core/store/PointCloud/context.d.ts +1 -1
  1291. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  1292. package/dist/core/store/PointCloud/context.js.map +1 -1
  1293. package/dist/core/store/PointCloud/reducer.d.ts +1 -1
  1294. package/dist/core/store/PointCloud/reducer.d.ts.map +1 -1
  1295. package/dist/core/store/PointCloud/reducer.js.map +1 -1
  1296. package/dist/core/store/Tools/context.d.ts +1 -1
  1297. package/dist/core/store/Tools/context.d.ts.map +1 -1
  1298. package/dist/core/store/Tools/context.js.map +1 -1
  1299. package/dist/core/store/Tools/reducer.d.ts +1 -1
  1300. package/dist/core/store/Tools/reducer.d.ts.map +1 -1
  1301. package/dist/core/store/Tools/reducer.js.map +1 -1
  1302. package/dist/core/styles/globals.css +17 -16
  1303. package/dist/core/styles/tailwindMerge.d.ts +1 -1
  1304. package/dist/core/styles/tailwindMerge.d.ts.map +1 -1
  1305. package/dist/core/styles/tailwindMerge.js.map +1 -1
  1306. package/dist/core/types/datasetTypes.d.ts +2 -2
  1307. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  1308. package/dist/core/types/dbTypes.d.ts +1 -1
  1309. package/dist/core/types/dbTypes.d.ts.map +1 -1
  1310. package/dist/core/types/dbTypes.js.map +1 -1
  1311. package/dist/core/types/files.d.ts +2 -2
  1312. package/dist/core/types/files.d.ts.map +1 -1
  1313. package/dist/core/types/global.d.ts +3 -3
  1314. package/dist/core/types/global.d.ts.map +1 -1
  1315. package/dist/core/types/global.js.map +1 -1
  1316. package/dist/core/types/map.d.ts +2 -2
  1317. package/dist/core/types/map.d.ts.map +1 -1
  1318. package/dist/core/types/tools.d.ts +3 -3
  1319. package/dist/core/types/tools.d.ts.map +1 -1
  1320. package/dist/core/types/users.d.ts +2 -2
  1321. package/dist/core/types/users.d.ts.map +1 -1
  1322. package/dist/core/utils/getFileIcon.d.ts +1 -1
  1323. package/dist/core/utils/getFileIcon.d.ts.map +1 -1
  1324. package/dist/core/utils/getFileIcon.js.map +1 -1
  1325. package/dist/core/utils/markerUtils.d.ts +10 -0
  1326. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  1327. package/dist/core/utils/markerUtils.js +9 -1
  1328. package/dist/core/utils/markerUtils.js.map +1 -1
  1329. package/dist/core/utils/memcache.d.ts.map +1 -1
  1330. package/dist/core/utils/memcache.js +0 -7
  1331. package/dist/core/utils/memcache.js.map +1 -1
  1332. package/dist/core/utils/roles.d.ts.map +1 -1
  1333. package/dist/core/utils/roles.js.map +1 -1
  1334. package/dist/core/utils/timeUtils.js.map +1 -1
  1335. package/dist/core/utils/utils.d.ts +1 -1
  1336. package/dist/core/utils/utils.d.ts.map +1 -1
  1337. package/dist/core/utils/utils.js.map +1 -1
  1338. package/package.json +8 -2
@@ -2,15 +2,15 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { Marker } from "react-map-gl/maplibre";
5
- import { FilesContext, MapContext } from "../../../../../../../store";
6
- import MapFileMarker from "./components/MapFileMarker";
7
- import MapFileManager from "./components/MapFileManager";
8
- import { openPopupWindow } from "./utils/openFileInPopUpWindow";
9
- import { FileModelLayer } from "./FileModelLayer/FileModelLayer";
10
5
  import { useFile, useFiles, useDeleteFile } from "../../../../../../../hooks/files/files";
6
+ import { FilesContext, MapContext } from "../../../../../../../store";
7
+ import { downloadDbFile, ViewerContextMenu } from "../../../../../../ui/FilesManager";
11
8
  import { EditPosition } from "../EditPosition";
12
9
  import { PlaceOnMap } from "../PlaceOnMap";
13
- import { downloadDbFile, ViewerContextMenu } from "../../../../../../ui/FilesManager";
10
+ import MapFileManager from "./components/MapFileManager";
11
+ import MapFileMarker from "./components/MapFileMarker";
12
+ import { FileModelLayer } from "./FileModelLayer/FileModelLayer";
13
+ import { openPopupWindow } from "./utils/openFileInPopUpWindow";
14
14
  const is3DModelFile = (extension) => {
15
15
  if (!extension) return false;
16
16
  return ["glb", "gltf", "fbx", "obj", "collada"].includes(extension.toLowerCase());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { Marker } from 'react-map-gl/maplibre'\r\nimport { FilesContext, MapContext } from '../../../../../../../store'\r\nimport MapFileMarker from './components/MapFileMarker'\r\nimport MapFileManager from './components/MapFileManager'\r\nimport { openPopupWindow } from './utils/openFileInPopUpWindow'\r\nimport { FileModelLayer } from './FileModelLayer/FileModelLayer'\r\nimport { useFile, useFiles, useDeleteFile } from '../../../../../../../hooks/files/files'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { EditPosition } from '../EditPosition'\r\nimport { PlaceOnMap } from '../PlaceOnMap'\r\nimport type { FileAction } from '../../../../../../../types/global'\r\nimport { downloadDbFile, ViewerContextMenu } from '../../../../../../ui/FilesManager'\r\n\r\nconst is3DModelFile = (extension?: string | null): boolean => {\r\n if (!extension) return false\r\n return ['glb', 'gltf', 'fbx', 'obj', 'collada'].includes(extension.toLowerCase())\r\n}\r\n\r\nconst isHiddenFileType = (extension?: string | null): boolean => {\r\n if (!extension) return false\r\n const ext = extension.toLowerCase()\r\n return ext === 'frag' || ext === 'ifc'\r\n}\r\n\r\nconst shouldExcludeByTag = (tag?: string | null): boolean => {\r\n if (!tag) return false\r\n return tag === 'user' || tag === 'bim-file' || tag === 'fragment-file' || tag === 'bimModel'\r\n}\r\n\r\n// ── Per-marker component — fetches its own file data via useFile(id) ──────────\r\ninterface FileMarkerItemProps {\r\n id: number\r\n editingFileId?: number\r\n onContextMenu: (e: React.MouseEvent, file: DbFile) => void\r\n}\r\n\r\nconst FileMarkerItem = React.memo(({ id, editingFileId, onContextMenu }: FileMarkerItemProps) => {\r\n const { file } = useFile(id)\r\n\r\n if (!file) return null\r\n if (file.id === editingFileId) return null\r\n if (is3DModelFile(file.extension) || isHiddenFileType(file.extension) || shouldExcludeByTag(file.tag)) return null\r\n if (!file.lat || !file.lng) return null\r\n\r\n return (\r\n <Marker latitude={file.lat} longitude={file.lng}>\r\n <div onContextMenu={e => onContextMenu(e, file)}>\r\n <MapFileMarker\r\n mimeType={file.mimeType}\r\n extension={file.extension}\r\n url={file.url}\r\n onDbClick={() => openPopupWindow(file)}\r\n />\r\n </div>\r\n </Marker>\r\n )\r\n})\r\nFileMarkerItem.displayName = 'FileMarkerItem'\r\n\r\n// ── Main layer ────────────────────────────────────────────────────────────────\r\nexport const FileLayers = () => {\r\n const { state: fileState, dispatch: fileDispatch } = React.useContext(FilesContext)\r\n const { mapFileIds, isMapFileManagerOpen, editingFile } = fileState.files\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n const handleMapRepaint = React.useCallback(() => {\r\n map?.triggerRepaint()\r\n }, [map])\r\n\r\n const tempPositionsRef = React.useRef<Record<string, { lat: number; lng: number }>>({})\r\n const tempRotationsRef = React.useRef<Record<string, number>>({})\r\n const tempElevationsRef = React.useRef<Record<string, number>>({})\r\n const editingFileNameRef = React.useRef<string | null>(null)\r\n\r\n React.useEffect(() => {\r\n editingFileNameRef.current = editingFile?.name ?? null\r\n }, [editingFile])\r\n\r\n const handleExitEditFileMode = React.useCallback(() => {\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file: null } })\r\n }, [fileDispatch])\r\n\r\n const handleFileSaveSuccess = React.useCallback((file: DbFile, lat: number, lng: number, elevation?: number, rotation?: number) => {\r\n fileDispatch({\r\n type: 'UPDATE_FILE_COORDS',\r\n payload: { id: file.id, lat, lng, elevation, rotation },\r\n })\r\n }, [fileDispatch])\r\n\r\n // Sync SWR files into the store (for FileModelLayer and other consumers)\r\n const { files, isLoading, isError } = useFiles()\r\n React.useEffect(() => {\r\n if (isLoading || isError) return\r\n fileDispatch({ type: 'SET_FILES', payload: { files } })\r\n }, [files, isLoading, isError])\r\n\r\n const { deleteFile } = useDeleteFile()\r\n\r\n const [contextMenu, setContextMenu] = React.useState<{ x: number; y: number; file: DbFile } | null>(null)\r\n\r\n const handleContextMenu = React.useCallback((e: React.MouseEvent, file: DbFile) => {\r\n e.preventDefault()\r\n setContextMenu({ x: e.clientX, y: e.clientY, file })\r\n }, [])\r\n\r\n const handleContextMenuAction = React.useCallback((action: FileAction, file: DbFile) => {\r\n if (action === 'view') {\r\n const isOnMap = mapFileIds.includes(file.id)\r\n fileDispatch({\r\n type: isOnMap ? 'REMOVE_FROM_MAP' : 'ADD_TO_MAP',\r\n payload: { id: file.id },\r\n })\r\n }\r\n else if (action === 'move') {\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file } })\r\n }\r\n else if (action === 'download') {\r\n downloadDbFile(file)\r\n }\r\n else if (action === 'delete') {\r\n // Optimistically remove from local state, then delete from DB\r\n fileDispatch({ type: 'REMOVE_FILE', payload: { id: file.id } })\r\n deleteFile(file.id).catch(err => {\r\n // Re-add to store on failure so the UI stays consistent\r\n console.error('Failed to delete file:', err)\r\n fileDispatch({ type: 'ADD_FILE', payload: { file } })\r\n })\r\n }\r\n }, [fileDispatch, mapFileIds, deleteFile])\r\n\r\n return (\r\n <>\r\n <FileModelLayer\r\n tempPositionsRef={tempPositionsRef}\r\n editingFileNameRef={editingFileNameRef}\r\n tempRotationsRef={tempRotationsRef}\r\n tempElevationsRef={tempElevationsRef}\r\n onContextMenu={(file, x, y) => setContextMenu({ x, y, file })}\r\n />\r\n\r\n {mapFileIds.map(id => (\r\n <FileMarkerItem\r\n key={id}\r\n id={id}\r\n editingFileId={editingFile?.id}\r\n onContextMenu={handleContextMenu}\r\n />\r\n ))}\r\n\r\n {editingFile && (() => {\r\n if (editingFile.lat == null || editingFile.lng == null) {\r\n return (\r\n <PlaceOnMap\r\n file={editingFile}\r\n onPlaced={(file, lat, lng) => {\r\n fileDispatch({ type: 'UPDATE_FILE_COORDS', payload: { id: file.id, lat, lng, type: 'map-file' } })\r\n fileDispatch({ type: 'ADD_TO_MAP', payload: { id: file.id } })\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file: null } })\r\n }}\r\n onCancel={handleExitEditFileMode}\r\n />\r\n )\r\n }\r\n\r\n const editing3D = is3DModelFile(editingFile.extension)\r\n return (\r\n <EditPosition\r\n file={editingFile}\r\n mode={editing3D ? '3d' : '2d'}\r\n onExitEditMode={handleExitEditFileMode}\r\n onSaveSuccess={handleFileSaveSuccess}\r\n tempPositionsRef={tempPositionsRef}\r\n tempRotationsRef={editing3D ? tempRotationsRef : undefined}\r\n tempElevationsRef={editing3D ? tempElevationsRef : undefined}\r\n onMapRepaint={handleMapRepaint}\r\n dragHandle={!editing3D ? (\r\n <MapFileMarker\r\n mimeType={editingFile.mimeType}\r\n extension={editingFile.extension}\r\n />\r\n ) : undefined}\r\n />\r\n )\r\n })()}\r\n\r\n <div className={isMapFileManagerOpen ? 'block' : 'hidden'}>\r\n <MapFileManager closeFileManager={() => fileDispatch({ type: 'HIDE_MAP_FILE_MANAGER' })} />\r\n </div>\r\n\r\n {contextMenu && (\r\n <ViewerContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n file={contextMenu.file}\r\n options={['view', 'move', 'download', 'delete']}\r\n onAction={handleContextMenuAction}\r\n onClose={() => setContextMenu(null)}\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { Marker } from 'react-map-gl/maplibre'\r\n\r\nimport { useFile, useFiles, useDeleteFile } from '../../../../../../../hooks/files/files'\r\nimport { FilesContext, MapContext } from '../../../../../../../store'\r\nimport { downloadDbFile, ViewerContextMenu } from '../../../../../../ui/FilesManager'\r\nimport { EditPosition } from '../EditPosition'\r\nimport { PlaceOnMap } from '../PlaceOnMap'\r\n\r\nimport MapFileManager from './components/MapFileManager'\r\nimport MapFileMarker from './components/MapFileMarker'\r\nimport { FileModelLayer } from './FileModelLayer/FileModelLayer'\r\nimport { openPopupWindow } from './utils/openFileInPopUpWindow'\r\n\r\nimport type { DbFile } from '../../../../../../../types/dbTypes'\r\nimport type { FileAction } from '../../../../../../../types/global'\r\n\r\n\r\nconst is3DModelFile = (extension?: string | null): boolean => {\r\n if (!extension) return false\r\n return ['glb', 'gltf', 'fbx', 'obj', 'collada'].includes(extension.toLowerCase())\r\n}\r\n\r\nconst isHiddenFileType = (extension?: string | null): boolean => {\r\n if (!extension) return false\r\n const ext = extension.toLowerCase()\r\n return ext === 'frag' || ext === 'ifc'\r\n}\r\n\r\nconst shouldExcludeByTag = (tag?: string | null): boolean => {\r\n if (!tag) return false\r\n return tag === 'user' || tag === 'bim-file' || tag === 'fragment-file' || tag === 'bimModel'\r\n}\r\n\r\n// ── Per-marker component — fetches its own file data via useFile(id) ──────────\r\ninterface FileMarkerItemProps {\r\n id: number\r\n editingFileId?: number\r\n onContextMenu: (e: React.MouseEvent, file: DbFile) => void\r\n}\r\n\r\nconst FileMarkerItem = React.memo(({ id, editingFileId, onContextMenu }: FileMarkerItemProps) => {\r\n const { file } = useFile(id)\r\n\r\n if (!file) return null\r\n if (file.id === editingFileId) return null\r\n if (is3DModelFile(file.extension) || isHiddenFileType(file.extension) || shouldExcludeByTag(file.tag)) return null\r\n if (!file.lat || !file.lng) return null\r\n\r\n return (\r\n <Marker latitude={file.lat} longitude={file.lng}>\r\n <div onContextMenu={e => onContextMenu(e, file)}>\r\n <MapFileMarker\r\n mimeType={file.mimeType}\r\n extension={file.extension}\r\n url={file.url}\r\n onDbClick={() => openPopupWindow(file)}\r\n />\r\n </div>\r\n </Marker>\r\n )\r\n})\r\nFileMarkerItem.displayName = 'FileMarkerItem'\r\n\r\n// ── Main layer ────────────────────────────────────────────────────────────────\r\nexport const FileLayers = () => {\r\n const { state: fileState, dispatch: fileDispatch } = React.useContext(FilesContext)\r\n const { mapFileIds, isMapFileManagerOpen, editingFile } = fileState.files\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n const handleMapRepaint = React.useCallback(() => {\r\n map?.triggerRepaint()\r\n }, [map])\r\n\r\n const tempPositionsRef = React.useRef<Record<string, { lat: number; lng: number }>>({})\r\n const tempRotationsRef = React.useRef<Record<string, number>>({})\r\n const tempElevationsRef = React.useRef<Record<string, number>>({})\r\n const editingFileNameRef = React.useRef<string | null>(null)\r\n\r\n React.useEffect(() => {\r\n editingFileNameRef.current = editingFile?.name ?? null\r\n }, [editingFile])\r\n\r\n const handleExitEditFileMode = React.useCallback(() => {\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file: null } })\r\n }, [fileDispatch])\r\n\r\n const handleFileSaveSuccess = React.useCallback((file: DbFile, lat: number, lng: number, elevation?: number, rotation?: number) => {\r\n fileDispatch({\r\n type: 'UPDATE_FILE_COORDS',\r\n payload: { id: file.id, lat, lng, elevation, rotation },\r\n })\r\n }, [fileDispatch])\r\n\r\n // Sync SWR files into the store (for FileModelLayer and other consumers)\r\n const { files, isLoading, isError } = useFiles()\r\n React.useEffect(() => {\r\n if (isLoading || isError) return\r\n fileDispatch({ type: 'SET_FILES', payload: { files } })\r\n }, [files, isLoading, isError])\r\n\r\n const { deleteFile } = useDeleteFile()\r\n\r\n const [contextMenu, setContextMenu] = React.useState<{ x: number; y: number; file: DbFile } | null>(null)\r\n\r\n const handleContextMenu = React.useCallback((e: React.MouseEvent, file: DbFile) => {\r\n e.preventDefault()\r\n setContextMenu({ x: e.clientX, y: e.clientY, file })\r\n }, [])\r\n\r\n const handleContextMenuAction = React.useCallback((action: FileAction, file: DbFile) => {\r\n if (action === 'view') {\r\n const isOnMap = mapFileIds.includes(file.id)\r\n fileDispatch({\r\n type: isOnMap ? 'REMOVE_FROM_MAP' : 'ADD_TO_MAP',\r\n payload: { id: file.id },\r\n })\r\n }\r\n else if (action === 'move') {\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file } })\r\n }\r\n else if (action === 'download') {\r\n downloadDbFile(file)\r\n }\r\n else if (action === 'delete') {\r\n // Optimistically remove from local state, then delete from DB\r\n fileDispatch({ type: 'REMOVE_FILE', payload: { id: file.id } })\r\n deleteFile(file.id).catch(err => {\r\n // Re-add to store on failure so the UI stays consistent\r\n console.error('Failed to delete file:', err)\r\n fileDispatch({ type: 'ADD_FILE', payload: { file } })\r\n })\r\n }\r\n }, [fileDispatch, mapFileIds, deleteFile])\r\n\r\n return (\r\n <>\r\n <FileModelLayer\r\n tempPositionsRef={tempPositionsRef}\r\n editingFileNameRef={editingFileNameRef}\r\n tempRotationsRef={tempRotationsRef}\r\n tempElevationsRef={tempElevationsRef}\r\n onContextMenu={(file, x, y) => setContextMenu({ x, y, file })}\r\n />\r\n\r\n {mapFileIds.map(id => (\r\n <FileMarkerItem\r\n key={id}\r\n id={id}\r\n editingFileId={editingFile?.id}\r\n onContextMenu={handleContextMenu}\r\n />\r\n ))}\r\n\r\n {editingFile && (() => {\r\n if (editingFile.lat == null || editingFile.lng == null) {\r\n return (\r\n <PlaceOnMap\r\n file={editingFile}\r\n onPlaced={(file, lat, lng) => {\r\n fileDispatch({ type: 'UPDATE_FILE_COORDS', payload: { id: file.id, lat, lng, type: 'map-file' } })\r\n fileDispatch({ type: 'ADD_TO_MAP', payload: { id: file.id } })\r\n fileDispatch({ type: 'EDIT_FILE', payload: { file: null } })\r\n }}\r\n onCancel={handleExitEditFileMode}\r\n />\r\n )\r\n }\r\n\r\n const editing3D = is3DModelFile(editingFile.extension)\r\n return (\r\n <EditPosition\r\n file={editingFile}\r\n mode={editing3D ? '3d' : '2d'}\r\n onExitEditMode={handleExitEditFileMode}\r\n onSaveSuccess={handleFileSaveSuccess}\r\n tempPositionsRef={tempPositionsRef}\r\n tempRotationsRef={editing3D ? tempRotationsRef : undefined}\r\n tempElevationsRef={editing3D ? tempElevationsRef : undefined}\r\n onMapRepaint={handleMapRepaint}\r\n dragHandle={!editing3D ? (\r\n <MapFileMarker\r\n mimeType={editingFile.mimeType}\r\n extension={editingFile.extension}\r\n />\r\n ) : undefined}\r\n />\r\n )\r\n })()}\r\n\r\n <div className={isMapFileManagerOpen ? 'block' : 'hidden'}>\r\n <MapFileManager closeFileManager={() => fileDispatch({ type: 'HIDE_MAP_FILE_MANAGER' })} />\r\n </div>\r\n\r\n {contextMenu && (\r\n <ViewerContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n file={contextMenu.file}\r\n options={['view', 'move', 'download', 'delete']}\r\n onAction={handleContextMenuAction}\r\n onClose={() => setContextMenu(null)}\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { type Map } from 'maplibre-gl';
2
2
  import * as THREE from 'three';
3
- import { DbFile } from '../../../../../../../../types/dbTypes';
3
+ import type { DbFile } from '../../../../../../../../types/dbTypes';
4
4
  type TempPositionsRef = React.MutableRefObject<Record<string, {
5
5
  lat: number;
6
6
  lng: number;
@@ -1 +1 @@
1
- {"version":3,"file":"CustomModelLayer.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8C,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAG9D,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAA;AAC5F,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AACtE,KAAK,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AACvE,KAAK,kBAAkB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AA8B/D,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,KAAK,GAAG,EACR,UAAU,KAAK,CAAC,aAAa,EAC7B,mBAAmB,gBAAgB,EACnC,qBAAqB,kBAAkB,EACvC,mBAAmB,gBAAgB,EACnC,oBAAoB,iBAAiB,KACpC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAgQ7F,CAAA"}
1
+ {"version":3,"file":"CustomModelLayer.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8C,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAEnE,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAA;AAC5F,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AACtE,KAAK,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AACvE,KAAK,kBAAkB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AA8B/D,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,KAAK,GAAG,EACR,UAAU,KAAK,CAAC,aAAa,EAC7B,mBAAmB,gBAAgB,EACnC,qBAAqB,kBAAkB,EACvC,mBAAmB,gBAAgB,EACnC,oBAAoB,iBAAiB,KACpC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAgQ7F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { type CustomLayerInterface, type LngLatLike, type Map } from 'maplibre-gl'\r\nimport * as THREE from 'three'\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'\r\nimport { DbFile } from '../../../../../../../../types/dbTypes'\r\nimport { disposeThreeScene } from '../../disposeThreeScene'\r\n\r\ntype TempPositionsRef = React.MutableRefObject<Record<string, { lat: number; lng: number }>>\r\ntype TempRotationsRef = React.MutableRefObject<Record<string, number>>\r\ntype TempElevationsRef = React.MutableRefObject<Record<string, number>>\r\ntype EditingFileNameRef = React.MutableRefObject<string | null>\r\n\r\nfunction resolveModelCoordinates(file: DbFile): { lng: number, lat: number } {\r\n if (typeof file.lng === 'number' && typeof file.lat === 'number') {\r\n return { lng: file.lng, lat: file.lat }\r\n }\r\n\r\n const rawPosition = file.position as unknown\r\n if (rawPosition && typeof rawPosition === 'object') {\r\n const pos = rawPosition as { lng?: number, lat?: number }\r\n if (typeof pos.lng === 'number' && typeof pos.lat === 'number') {\r\n return { lng: pos.lng, lat: pos.lat }\r\n }\r\n }\r\n\r\n if (typeof rawPosition === 'string') {\r\n try {\r\n const parsed = JSON.parse(rawPosition) as { lng?: number, lat?: number }\r\n if (typeof parsed.lng === 'number' && typeof parsed.lat === 'number') {\r\n return { lng: parsed.lng, lat: parsed.lat }\r\n }\r\n }\r\n catch {\r\n // Ignore malformed legacy position payloads.\r\n }\r\n }\r\n\r\n return { lng: 0, lat: 0 }\r\n}\r\n\r\nexport const CustomModelLayer = (\r\n modelFile: DbFile,\r\n map: Map,\r\n renderer: THREE.WebGLRenderer,\r\n tempPositionsRef?: TempPositionsRef,\r\n editingFileNameRef?: EditingFileNameRef,\r\n tempRotationsRef?: TempRotationsRef,\r\n tempElevationsRef?: TempElevationsRef,\r\n): { cleanup: () => void, remove: () => void, hitTest: (ndcX: number, ndcY: number) => boolean } => {\r\n let components = null\r\n let customLayer: CustomLayerInterface | null = null\r\n\r\n if (!map || !modelFile) {\r\n return { cleanup: () => {}, remove: () => {}, hitTest: () => false }\r\n }\r\n\r\n // Refs into the layer's camera and scene so raycasting can read the last\r\n // rendered frame's transform without entering the render loop.\r\n let cameraRef: THREE.Camera | null = null\r\n let sceneRef: THREE.Scene | null = null\r\n\r\n // Reused temps for hitTest raycasting — avoid per-call allocation.\r\n const _hitInv = new THREE.Matrix4()\r\n const _hitNear = new THREE.Vector3()\r\n const _hitFar = new THREE.Vector3()\r\n const _hitDir = new THREE.Vector3()\r\n const _raycaster = new THREE.Raycaster()\r\n\r\n const createCustomLayer = (): CustomLayerInterface => {\r\n // Track last applied rotation so we can apply delta increments (same as BimLayer)\r\n let lastAppliedRotation = modelFile.rotation ?? 0\r\n // Layer-removed-mid-load guard + reused per-frame matrices\r\n let disposed = false\r\n const _m = new THREE.Matrix4()\r\n const _l = new THREE.Matrix4()\r\n // Render-on-demand: cache terrain elevation off the per-frame path and only\r\n // keep repainting while the camera recently moved or an animation is playing,\r\n // so an idle map with a placed model stops re-rendering instead of pinning the\r\n // main thread (this was the freeze after a flyTo to high zoom).\r\n let cachedTerrainElev = 0\r\n let lastMoveTime = performance.now()\r\n const SETTLE_MS = 1000\r\n let onMapMove: (() => void) | undefined\r\n let onMapMoveEnd: (() => void) | undefined\r\n const recomputeTerrainElev = () => {\r\n const { lng, lat } = resolveModelCoordinates(modelFile)\r\n if (!(lng === 0 && lat === 0)) {\r\n const e = map.queryTerrainElevation([lng, lat])\r\n if (e !== null && e !== undefined) cachedTerrainElev = e\r\n }\r\n }\r\n\r\n return {\r\n id: `model-${modelFile.id}`,\r\n type: 'custom',\r\n renderingMode: '3d',\r\n onAdd(map, gl) {\r\n this.camera = new THREE.Camera()\r\n this.scene = new THREE.Scene()\r\n this.renderer = renderer\r\n\r\n // Expose to closure for raycasting\r\n cameraRef = this.camera as THREE.Camera\r\n sceneRef = this.scene as THREE.Scene\r\n\r\n const scene = this.scene as THREE.Scene\r\n\r\n // Apply initial rotation\r\n if (lastAppliedRotation !== 0) {\r\n scene.rotateY(lastAppliedRotation * (Math.PI / 180))\r\n }\r\n\r\n // Lighting to match OBC library setup\r\n scene.background = null\r\n scene.fog = new THREE.Fog(0x20_29_32, 10, 200)\r\n scene.add(new THREE.AmbientLight(0xFF_FF_FF, 1))\r\n scene.add(new THREE.HemisphereLight(0xFF_FF_BB, 0x08_08_20, 0.5))\r\n\r\n const sun = new THREE.DirectionalLight(0xFF_FF_FF, 1.5)\r\n sun.position.set(0, -70, 100).normalize()\r\n sun.castShadow = true\r\n sun.shadow.mapSize.set(2048, 2048)\r\n scene.add(sun)\r\n\r\n const fill = new THREE.DirectionalLight(0xFF_FF_FF, 1)\r\n fill.position.set(0, 70, 100).normalize()\r\n scene.add(fill)\r\n\r\n this.renderer.toneMapping = THREE.ACESFilmicToneMapping\r\n this.renderer.autoClear = false\r\n this.clock = new THREE.Clock()\r\n\r\n const loader = new GLTFLoader()\r\n loader.load(\r\n modelFile.url!,\r\n (gltf) => {\r\n // Layer was removed before the async load resolved — don't attach to a\r\n // dead scene; let the gltf be GC'd (no GPU upload happened yet).\r\n if (disposed) return\r\n gltf.scene.scale.setScalar(1)\r\n\r\n if (gltf.animations && gltf.animations.length > 0) {\r\n this.mixer = new THREE.AnimationMixer(gltf.scene)\r\n for (const clip of gltf.animations) {\r\n this.mixer!.clipAction(clip).play()\r\n }\r\n }\r\n\r\n scene.add(gltf.scene)\r\n // Open the settle window so the just-loaded model paints, then idle.\r\n lastMoveTime = performance.now()\r\n recomputeTerrainElev()\r\n map.triggerRepaint()\r\n },\r\n undefined,\r\n (error) => { console.error('Error loading model:', error) },\r\n )\r\n\r\n // Track camera movement for render-on-demand: keep repainting only\r\n // during/just-after movement; refresh cached terrain elevation on settle.\r\n onMapMove = () => { lastMoveTime = performance.now() }\r\n onMapMoveEnd = () => {\r\n lastMoveTime = performance.now()\r\n recomputeTerrainElev()\r\n map.triggerRepaint()\r\n }\r\n map.on('move', onMapMove)\r\n map.on('moveend', onMapMoveEnd)\r\n },\r\n\r\n render(gl, args) {\r\n if (map.getZoom() < 15.5) return\r\n\r\n const isEditing = editingFileNameRef?.current === modelFile.name\r\n\r\n // ── Position ──────────────────────────────────────────────────────────\r\n let lng: number\r\n let lat: number\r\n if (isEditing && tempPositionsRef?.current[modelFile.name]) {\r\n const tp = tempPositionsRef.current[modelFile.name]\r\n lng = tp.lng\r\n lat = tp.lat\r\n } else {\r\n const coords = resolveModelCoordinates(modelFile)\r\n lng = coords.lng\r\n lat = coords.lat\r\n }\r\n\r\n if (lng === 0 && lat === 0) return\r\n\r\n // ── Rotation (delta-increment, same pattern as BimLayer) ──────────────\r\n const targetRotation = (isEditing && tempRotationsRef?.current[modelFile.name] !== undefined)\r\n ? tempRotationsRef.current[modelFile.name]\r\n : (modelFile.rotation ?? 0)\r\n\r\n if (targetRotation !== lastAppliedRotation) {\r\n ;(this.scene as THREE.Scene).rotateY(\r\n (targetRotation - lastAppliedRotation) * (Math.PI / 180)\r\n )\r\n lastAppliedRotation = targetRotation\r\n }\r\n\r\n // ── Elevation ─────────────────────────────────────────────────────────\r\n const fileElevation = (isEditing && tempElevationsRef?.current[modelFile.name] !== undefined)\r\n ? tempElevationsRef.current[modelFile.name]\r\n : (modelFile.elevation ?? 0)\r\n\r\n const modelOrigin = [lng, lat] as LngLatLike\r\n // Cached terrain elevation (refreshed on moveend); query live only while\r\n // editing this model's position. Keeps queryTerrainElevation off the hot\r\n // path — the per-frame query drove the high-zoom freeze.\r\n const terrainAltitude = isEditing\r\n ? (map.queryTerrainElevation([lng, lat]) ?? cachedTerrainElev)\r\n : cachedTerrainElev\r\n const altitude = terrainAltitude + fileElevation\r\n\r\n const modelMatrix = map.transform.getMatrixForModel(modelOrigin, altitude)\r\n // Reuse temps and write into the camera's own matrix — no per-frame\r\n // allocation. The previous `.scale(1,1,1)` was an identity no-op.\r\n _m.fromArray(args.defaultProjectionData.mainMatrix)\r\n _l.fromArray(modelMatrix)\r\n this.camera.projectionMatrix.multiplyMatrices(_m, _l)\r\n\r\n if (this.mixer) {\r\n this.mixer.update((this.clock as THREE.Clock).getDelta())\r\n }\r\n\r\n this.renderer.resetState()\r\n this.renderer.render(this.scene, this.camera)\r\n\r\n // Render-on-demand: keep the frame loop alive only while an animation is\r\n // playing, the camera recently moved (settle window), or this model is\r\n // being edited. Idle static model ⇒ no self-scheduled repaints ⇒ no freeze.\r\n if (this.mixer || isEditing || performance.now() - lastMoveTime < SETTLE_MS) {\r\n map.triggerRepaint()\r\n }\r\n },\r\n\r\n onRemove() {\r\n disposed = true\r\n if (onMapMove) map.off('move', onMapMove)\r\n if (onMapMoveEnd) map.off('moveend', onMapMoveEnd)\r\n // Stop + release the animation mixer so it isn't left running/holding the\r\n // scene after removal.\r\n if (this.mixer) {\r\n ;(this.mixer as THREE.AnimationMixer).stopAllAction()\r\n this.mixer = null\r\n }\r\n if (this.scene) disposeThreeScene(this.scene as THREE.Scene)\r\n cameraRef = null\r\n sceneRef = null\r\n this.renderer = null\r\n this.camera = null\r\n this.scene = null\r\n },\r\n }\r\n }\r\n\r\n /**\r\n * Raycast against this model using the last rendered frame's camera matrix.\r\n *\r\n * The camera.projectionMatrix = VP * M (view-projection × model-to-world),\r\n * so its inverse transforms clip-space → model-space, which is exactly the\r\n * coordinate system the Three.js scene lives in. We manually unproject near/far\r\n * clip-space points through that inverse to build the ray.\r\n */\r\n const hitTest = (ndcX: number, ndcY: number): boolean => {\r\n if (!cameraRef || !sceneRef) return false\r\n\r\n // Invert the combined VP*M matrix to go clip-space → model-space.\r\n // Reuses module-scope temps + a singleton raycaster.\r\n _hitInv.copy(cameraRef.projectionMatrix).invert()\r\n\r\n // Unproject near and far clip-space points into model space\r\n _hitNear.set(ndcX, ndcY, -1).applyMatrix4(_hitInv)\r\n _hitFar.set(ndcX, ndcY, 1).applyMatrix4(_hitInv)\r\n\r\n _hitDir.copy(_hitFar).sub(_hitNear).normalize()\r\n\r\n _raycaster.set(_hitNear, _hitDir)\r\n\r\n const intersects = _raycaster.intersectObjects(sceneRef.children, true)\r\n return intersects.length > 0\r\n }\r\n\r\n customLayer = createCustomLayer()\r\n\r\n if (!map.getLayer(customLayer.id)) {\r\n map.addLayer(customLayer)\r\n }\r\n\r\n const removeLayer = () => {\r\n if (customLayer && map.getLayer(customLayer.id)) {\r\n map.removeLayer(customLayer.id)\r\n }\r\n }\r\n\r\n const cleanup = () => {\r\n removeLayer()\r\n components = null\r\n customLayer = null\r\n }\r\n\r\n return { cleanup, remove: removeLayer, hitTest }\r\n}\r\n"],"mappings":"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","names":["map","_a"]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { type CustomLayerInterface, type LngLatLike, type Map } from 'maplibre-gl'\r\nimport * as THREE from 'three'\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'\r\n\r\nimport { disposeThreeScene } from '../../disposeThreeScene'\r\n\r\nimport type { DbFile } from '../../../../../../../../types/dbTypes'\r\n\r\ntype TempPositionsRef = React.MutableRefObject<Record<string, { lat: number; lng: number }>>\r\ntype TempRotationsRef = React.MutableRefObject<Record<string, number>>\r\ntype TempElevationsRef = React.MutableRefObject<Record<string, number>>\r\ntype EditingFileNameRef = React.MutableRefObject<string | null>\r\n\r\nfunction resolveModelCoordinates(file: DbFile): { lng: number, lat: number } {\r\n if (typeof file.lng === 'number' && typeof file.lat === 'number') {\r\n return { lng: file.lng, lat: file.lat }\r\n }\r\n\r\n const rawPosition = file.position as unknown\r\n if (rawPosition && typeof rawPosition === 'object') {\r\n const pos = rawPosition as { lng?: number, lat?: number }\r\n if (typeof pos.lng === 'number' && typeof pos.lat === 'number') {\r\n return { lng: pos.lng, lat: pos.lat }\r\n }\r\n }\r\n\r\n if (typeof rawPosition === 'string') {\r\n try {\r\n const parsed = JSON.parse(rawPosition) as { lng?: number, lat?: number }\r\n if (typeof parsed.lng === 'number' && typeof parsed.lat === 'number') {\r\n return { lng: parsed.lng, lat: parsed.lat }\r\n }\r\n }\r\n catch {\r\n // Ignore malformed legacy position payloads.\r\n }\r\n }\r\n\r\n return { lng: 0, lat: 0 }\r\n}\r\n\r\nexport const CustomModelLayer = (\r\n modelFile: DbFile,\r\n map: Map,\r\n renderer: THREE.WebGLRenderer,\r\n tempPositionsRef?: TempPositionsRef,\r\n editingFileNameRef?: EditingFileNameRef,\r\n tempRotationsRef?: TempRotationsRef,\r\n tempElevationsRef?: TempElevationsRef,\r\n): { cleanup: () => void, remove: () => void, hitTest: (ndcX: number, ndcY: number) => boolean } => {\r\n let components = null\r\n let customLayer: CustomLayerInterface | null = null\r\n\r\n if (!map || !modelFile) {\r\n return { cleanup: () => {}, remove: () => {}, hitTest: () => false }\r\n }\r\n\r\n // Refs into the layer's camera and scene so raycasting can read the last\r\n // rendered frame's transform without entering the render loop.\r\n let cameraRef: THREE.Camera | null = null\r\n let sceneRef: THREE.Scene | null = null\r\n\r\n // Reused temps for hitTest raycasting — avoid per-call allocation.\r\n const _hitInv = new THREE.Matrix4()\r\n const _hitNear = new THREE.Vector3()\r\n const _hitFar = new THREE.Vector3()\r\n const _hitDir = new THREE.Vector3()\r\n const _raycaster = new THREE.Raycaster()\r\n\r\n const createCustomLayer = (): CustomLayerInterface => {\r\n // Track last applied rotation so we can apply delta increments (same as BimLayer)\r\n let lastAppliedRotation = modelFile.rotation ?? 0\r\n // Layer-removed-mid-load guard + reused per-frame matrices\r\n let disposed = false\r\n const _m = new THREE.Matrix4()\r\n const _l = new THREE.Matrix4()\r\n // Render-on-demand: cache terrain elevation off the per-frame path and only\r\n // keep repainting while the camera recently moved or an animation is playing,\r\n // so an idle map with a placed model stops re-rendering instead of pinning the\r\n // main thread (this was the freeze after a flyTo to high zoom).\r\n let cachedTerrainElev = 0\r\n let lastMoveTime = performance.now()\r\n const SETTLE_MS = 1000\r\n let onMapMove: (() => void) | undefined\r\n let onMapMoveEnd: (() => void) | undefined\r\n const recomputeTerrainElev = () => {\r\n const { lng, lat } = resolveModelCoordinates(modelFile)\r\n if (!(lng === 0 && lat === 0)) {\r\n const e = map.queryTerrainElevation([lng, lat])\r\n if (e !== null && e !== undefined) cachedTerrainElev = e\r\n }\r\n }\r\n\r\n return {\r\n id: `model-${modelFile.id}`,\r\n type: 'custom',\r\n renderingMode: '3d',\r\n onAdd(map, gl) {\r\n this.camera = new THREE.Camera()\r\n this.scene = new THREE.Scene()\r\n this.renderer = renderer\r\n\r\n // Expose to closure for raycasting\r\n cameraRef = this.camera as THREE.Camera\r\n sceneRef = this.scene as THREE.Scene\r\n\r\n const scene = this.scene as THREE.Scene\r\n\r\n // Apply initial rotation\r\n if (lastAppliedRotation !== 0) {\r\n scene.rotateY(lastAppliedRotation * (Math.PI / 180))\r\n }\r\n\r\n // Lighting to match OBC library setup\r\n scene.background = null\r\n scene.fog = new THREE.Fog(0x20_29_32, 10, 200)\r\n scene.add(new THREE.AmbientLight(0xFF_FF_FF, 1))\r\n scene.add(new THREE.HemisphereLight(0xFF_FF_BB, 0x08_08_20, 0.5))\r\n\r\n const sun = new THREE.DirectionalLight(0xFF_FF_FF, 1.5)\r\n sun.position.set(0, -70, 100).normalize()\r\n sun.castShadow = true\r\n sun.shadow.mapSize.set(2048, 2048)\r\n scene.add(sun)\r\n\r\n const fill = new THREE.DirectionalLight(0xFF_FF_FF, 1)\r\n fill.position.set(0, 70, 100).normalize()\r\n scene.add(fill)\r\n\r\n this.renderer.toneMapping = THREE.ACESFilmicToneMapping\r\n this.renderer.autoClear = false\r\n this.clock = new THREE.Clock()\r\n\r\n const loader = new GLTFLoader()\r\n loader.load(\r\n modelFile.url!,\r\n (gltf) => {\r\n // Layer was removed before the async load resolved — don't attach to a\r\n // dead scene; let the gltf be GC'd (no GPU upload happened yet).\r\n if (disposed) return\r\n gltf.scene.scale.setScalar(1)\r\n\r\n if (gltf.animations && gltf.animations.length > 0) {\r\n this.mixer = new THREE.AnimationMixer(gltf.scene)\r\n for (const clip of gltf.animations) {\r\n this.mixer!.clipAction(clip).play()\r\n }\r\n }\r\n\r\n scene.add(gltf.scene)\r\n // Open the settle window so the just-loaded model paints, then idle.\r\n lastMoveTime = performance.now()\r\n recomputeTerrainElev()\r\n map.triggerRepaint()\r\n },\r\n undefined,\r\n (error) => { console.error('Error loading model:', error) },\r\n )\r\n\r\n // Track camera movement for render-on-demand: keep repainting only\r\n // during/just-after movement; refresh cached terrain elevation on settle.\r\n onMapMove = () => { lastMoveTime = performance.now() }\r\n onMapMoveEnd = () => {\r\n lastMoveTime = performance.now()\r\n recomputeTerrainElev()\r\n map.triggerRepaint()\r\n }\r\n map.on('move', onMapMove)\r\n map.on('moveend', onMapMoveEnd)\r\n },\r\n\r\n render(gl, args) {\r\n if (map.getZoom() < 15.5) return\r\n\r\n const isEditing = editingFileNameRef?.current === modelFile.name\r\n\r\n // ── Position ──────────────────────────────────────────────────────────\r\n let lng: number\r\n let lat: number\r\n if (isEditing && tempPositionsRef?.current[modelFile.name]) {\r\n const tp = tempPositionsRef.current[modelFile.name]\r\n lng = tp.lng\r\n lat = tp.lat\r\n } else {\r\n const coords = resolveModelCoordinates(modelFile)\r\n lng = coords.lng\r\n lat = coords.lat\r\n }\r\n\r\n if (lng === 0 && lat === 0) return\r\n\r\n // ── Rotation (delta-increment, same pattern as BimLayer) ──────────────\r\n const targetRotation = (isEditing && tempRotationsRef?.current[modelFile.name] !== undefined)\r\n ? tempRotationsRef.current[modelFile.name]\r\n : (modelFile.rotation ?? 0)\r\n\r\n if (targetRotation !== lastAppliedRotation) {\r\n ;(this.scene as THREE.Scene).rotateY(\r\n (targetRotation - lastAppliedRotation) * (Math.PI / 180)\r\n )\r\n lastAppliedRotation = targetRotation\r\n }\r\n\r\n // ── Elevation ─────────────────────────────────────────────────────────\r\n const fileElevation = (isEditing && tempElevationsRef?.current[modelFile.name] !== undefined)\r\n ? tempElevationsRef.current[modelFile.name]\r\n : (modelFile.elevation ?? 0)\r\n\r\n const modelOrigin = [lng, lat] as LngLatLike\r\n // Cached terrain elevation (refreshed on moveend); query live only while\r\n // editing this model's position. Keeps queryTerrainElevation off the hot\r\n // path — the per-frame query drove the high-zoom freeze.\r\n const terrainAltitude = isEditing\r\n ? (map.queryTerrainElevation([lng, lat]) ?? cachedTerrainElev)\r\n : cachedTerrainElev\r\n const altitude = terrainAltitude + fileElevation\r\n\r\n const modelMatrix = map.transform.getMatrixForModel(modelOrigin, altitude)\r\n // Reuse temps and write into the camera's own matrix — no per-frame\r\n // allocation. The previous `.scale(1,1,1)` was an identity no-op.\r\n _m.fromArray(args.defaultProjectionData.mainMatrix)\r\n _l.fromArray(modelMatrix)\r\n this.camera.projectionMatrix.multiplyMatrices(_m, _l)\r\n\r\n if (this.mixer) {\r\n this.mixer.update((this.clock as THREE.Clock).getDelta())\r\n }\r\n\r\n this.renderer.resetState()\r\n this.renderer.render(this.scene, this.camera)\r\n\r\n // Render-on-demand: keep the frame loop alive only while an animation is\r\n // playing, the camera recently moved (settle window), or this model is\r\n // being edited. Idle static model ⇒ no self-scheduled repaints ⇒ no freeze.\r\n if (this.mixer || isEditing || performance.now() - lastMoveTime < SETTLE_MS) {\r\n map.triggerRepaint()\r\n }\r\n },\r\n\r\n onRemove() {\r\n disposed = true\r\n if (onMapMove) map.off('move', onMapMove)\r\n if (onMapMoveEnd) map.off('moveend', onMapMoveEnd)\r\n // Stop + release the animation mixer so it isn't left running/holding the\r\n // scene after removal.\r\n if (this.mixer) {\r\n ;(this.mixer as THREE.AnimationMixer).stopAllAction()\r\n this.mixer = null\r\n }\r\n if (this.scene) disposeThreeScene(this.scene as THREE.Scene)\r\n cameraRef = null\r\n sceneRef = null\r\n this.renderer = null\r\n this.camera = null\r\n this.scene = null\r\n },\r\n }\r\n }\r\n\r\n /**\r\n * Raycast against this model using the last rendered frame's camera matrix.\r\n *\r\n * The camera.projectionMatrix = VP * M (view-projection × model-to-world),\r\n * so its inverse transforms clip-space → model-space, which is exactly the\r\n * coordinate system the Three.js scene lives in. We manually unproject near/far\r\n * clip-space points through that inverse to build the ray.\r\n */\r\n const hitTest = (ndcX: number, ndcY: number): boolean => {\r\n if (!cameraRef || !sceneRef) return false\r\n\r\n // Invert the combined VP*M matrix to go clip-space → model-space.\r\n // Reuses module-scope temps + a singleton raycaster.\r\n _hitInv.copy(cameraRef.projectionMatrix).invert()\r\n\r\n // Unproject near and far clip-space points into model space\r\n _hitNear.set(ndcX, ndcY, -1).applyMatrix4(_hitInv)\r\n _hitFar.set(ndcX, ndcY, 1).applyMatrix4(_hitInv)\r\n\r\n _hitDir.copy(_hitFar).sub(_hitNear).normalize()\r\n\r\n _raycaster.set(_hitNear, _hitDir)\r\n\r\n const intersects = _raycaster.intersectObjects(sceneRef.children, true)\r\n return intersects.length > 0\r\n }\r\n\r\n customLayer = createCustomLayer()\r\n\r\n if (!map.getLayer(customLayer.id)) {\r\n map.addLayer(customLayer)\r\n }\r\n\r\n const removeLayer = () => {\r\n if (customLayer && map.getLayer(customLayer.id)) {\r\n map.removeLayer(customLayer.id)\r\n }\r\n }\r\n\r\n const cleanup = () => {\r\n removeLayer()\r\n components = null\r\n customLayer = null\r\n }\r\n\r\n return { cleanup, remove: removeLayer, hitTest }\r\n}\r\n"],"mappings":"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","names":["map","_a"]}
@@ -1,3 +1,3 @@
1
- import { DbFile } from '../../../../../../../../types/dbTypes';
1
+ import type { DbFile } from '../../../../../../../../types/dbTypes';
2
2
  export declare const openPopupWindow: (file: DbFile) => void;
3
3
  //# sourceMappingURL=openFileInPopUpWindow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openFileInPopUpWindow.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAE9D,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,SAqH3C,CAAA"}
1
+ {"version":3,"file":"openFileInPopUpWindow.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAEnE,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,SAqH3C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { DbFile } from '../../../../../../../../types/dbTypes'\r\n\r\nexport const openPopupWindow = (file: DbFile) => {\r\n const width = Math.floor(screen.width * 0.8)\r\n const height = Math.floor(screen.height * 0.8)\r\n const left = Math.floor((screen.width - width) / 2)\r\n const top = Math.floor((screen.height - height) / 2)\r\n\r\n const scale = 0.9\r\n\r\n const windowFeatures = `\r\n width=${width * scale},\r\n height=${height * scale},\r\n left=${left},\r\n top=${top},\r\n resizable=yes,\r\n scrollbars=yes,\r\n status=no,\r\n location=no,\r\n toolbar=no,\r\n menubar=no\r\n `.replaceAll(/\\s/g, '')\r\n\r\n // Determine file type from MIME type and extension\r\n const getFileType = (file: DbFile): string => {\r\n // First check MIME type\r\n if (file.mimeType.startsWith('image/')) return 'image'\r\n if (file.mimeType.startsWith('video/')) return 'video'\r\n if (file.mimeType === 'application/pdf') return 'pdf'\r\n\r\n // Fall back to extension\r\n const extension = file.name.split('.').pop()?.toLowerCase()\r\n switch (extension) {\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'png':\r\n case 'gif':\r\n case 'webp':\r\n case 'svg':\r\n return 'image'\r\n case 'mp4':\r\n case 'webm':\r\n case 'ogg':\r\n case 'avi':\r\n case 'mov':\r\n return 'video'\r\n case 'pdf':\r\n return 'pdf'\r\n default:\r\n return 'iframe'\r\n }\r\n }\r\n\r\n const detectedType = getFileType(file)\r\n const title = file.name || 'CDT - File Viewer'\r\n\r\n const newWindow = window.open('', '_blank', windowFeatures)\r\n\r\n if (newWindow) {\r\n let content = ''\r\n\r\n switch (detectedType) {\r\n case 'image':\r\n content = `<img src=\"${file.url}\" alt=\"${file.name}\" />`\r\n break\r\n case 'video':\r\n content = `\r\n <video controls autoplay style=\"max-width: 100%; max-height: 100%;\">\r\n <source src=\"${file.url}\" type=\"${file.mimeType || 'video/mp4'}\">\r\n Your browser does not support the video tag.\r\n </video>`\r\n break\r\n case 'pdf':\r\n content = `<iframe src=\"${file.url}\" style=\"width: 100%; height: 100%; border: none;\"></iframe>`\r\n break\r\n default:\r\n content = `<iframe src=\"${file.url}\" style=\"width: 100%; height: 100%; border: none;\"></iframe>`\r\n }\r\n\r\n newWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${title}</title>\r\n <style>\r\n body, html {\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: ${detectedType === 'pdf' ? 'hidden' : 'auto'};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n }\r\n img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n }\r\n video {\r\n max-width: 100%;\r\n max-height: 100%;\r\n }\r\n iframe {\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${content}\r\n </body>\r\n </html>\r\n `)\r\n newWindow.document.close()\r\n }\r\n}\r\n"],"mappings":"AAKO,MAAM,kBAAkB,CAAC,SAAiB;AAC/C,QAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,GAAG;AAC3C,QAAM,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG;AAC7C,QAAM,OAAO,KAAK,OAAO,OAAO,QAAQ,SAAS,CAAC;AAClD,QAAM,MAAM,KAAK,OAAO,OAAO,SAAS,UAAU,CAAC;AAEnD,QAAM,QAAQ;AAEd,QAAM,iBAAiB;AAAA,YACb,QAAQ,KAAK;AAAA,aACZ,SAAS,KAAK;AAAA,WAChB,IAAI;AAAA,UACL,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOP,WAAW,OAAO,EAAE;AAGxB,QAAM,cAAc,CAACA,UAAyB;AA3BhD;AA6BI,QAAIA,MAAK,SAAS,WAAW,QAAQ,EAAG,QAAO;AAC/C,QAAIA,MAAK,SAAS,WAAW,QAAQ,EAAG,QAAO;AAC/C,QAAIA,MAAK,aAAa,kBAAmB,QAAO;AAGhD,UAAM,aAAY,KAAAA,MAAK,KAAK,MAAM,GAAG,EAAE,IAAI,MAAzB,mBAA4B;AAC9C,YAAQ,WAAW;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,IAAI;AACrC,QAAM,QAAQ,KAAK,QAAQ;AAE3B,QAAM,YAAY,OAAO,KAAK,IAAI,UAAU,cAAc;AAE1D,MAAI,WAAW;AACb,QAAI,UAAU;AAEd,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,kBAAU,aAAa,KAAK,GAAG,UAAU,KAAK,IAAI;AAClD;AAAA,MACF,KAAK;AACH,kBAAU;AAAA;AAAA,mCAEiB,KAAK,GAAG,WAAW,KAAK,YAAY,WAAW;AAAA;AAAA;AAG1E;AAAA,MACF,KAAK;AACH,kBAAU,gBAAgB,KAAK,GAAG;AAClC;AAAA,MACF;AACE,kBAAU,gBAAgB,KAAK,GAAG;AAAA,IACtC;AAEA,cAAU,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA,yBAIJ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAOM,iBAAiB,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAuB5D,OAAO;AAAA;AAAA;AAAA,SAGhB;AACL,cAAU,SAAS,MAAM;AAAA,EAC3B;AACF;","names":["file"]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { DbFile } from '../../../../../../../../types/dbTypes'\r\n\r\nexport const openPopupWindow = (file: DbFile) => {\r\n const width = Math.floor(screen.width * 0.8)\r\n const height = Math.floor(screen.height * 0.8)\r\n const left = Math.floor((screen.width - width) / 2)\r\n const top = Math.floor((screen.height - height) / 2)\r\n\r\n const scale = 0.9\r\n\r\n const windowFeatures = `\r\n width=${width * scale},\r\n height=${height * scale},\r\n left=${left},\r\n top=${top},\r\n resizable=yes,\r\n scrollbars=yes,\r\n status=no,\r\n location=no,\r\n toolbar=no,\r\n menubar=no\r\n `.replaceAll(/\\s/g, '')\r\n\r\n // Determine file type from MIME type and extension\r\n const getFileType = (file: DbFile): string => {\r\n // First check MIME type\r\n if (file.mimeType.startsWith('image/')) return 'image'\r\n if (file.mimeType.startsWith('video/')) return 'video'\r\n if (file.mimeType === 'application/pdf') return 'pdf'\r\n\r\n // Fall back to extension\r\n const extension = file.name.split('.').pop()?.toLowerCase()\r\n switch (extension) {\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'png':\r\n case 'gif':\r\n case 'webp':\r\n case 'svg':\r\n return 'image'\r\n case 'mp4':\r\n case 'webm':\r\n case 'ogg':\r\n case 'avi':\r\n case 'mov':\r\n return 'video'\r\n case 'pdf':\r\n return 'pdf'\r\n default:\r\n return 'iframe'\r\n }\r\n }\r\n\r\n const detectedType = getFileType(file)\r\n const title = file.name || 'CDT - File Viewer'\r\n\r\n const newWindow = window.open('', '_blank', windowFeatures)\r\n\r\n if (newWindow) {\r\n let content = ''\r\n\r\n switch (detectedType) {\r\n case 'image':\r\n content = `<img src=\"${file.url}\" alt=\"${file.name}\" />`\r\n break\r\n case 'video':\r\n content = `\r\n <video controls autoplay style=\"max-width: 100%; max-height: 100%;\">\r\n <source src=\"${file.url}\" type=\"${file.mimeType || 'video/mp4'}\">\r\n Your browser does not support the video tag.\r\n </video>`\r\n break\r\n case 'pdf':\r\n content = `<iframe src=\"${file.url}\" style=\"width: 100%; height: 100%; border: none;\"></iframe>`\r\n break\r\n default:\r\n content = `<iframe src=\"${file.url}\" style=\"width: 100%; height: 100%; border: none;\"></iframe>`\r\n }\r\n\r\n newWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${title}</title>\r\n <style>\r\n body, html {\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: ${detectedType === 'pdf' ? 'hidden' : 'auto'};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n }\r\n img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n }\r\n video {\r\n max-width: 100%;\r\n max-height: 100%;\r\n }\r\n iframe {\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${content}\r\n </body>\r\n </html>\r\n `)\r\n newWindow.document.close()\r\n }\r\n}\r\n"],"mappings":"AAKO,MAAM,kBAAkB,CAAC,SAAiB;AAC/C,QAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,GAAG;AAC3C,QAAM,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG;AAC7C,QAAM,OAAO,KAAK,OAAO,OAAO,QAAQ,SAAS,CAAC;AAClD,QAAM,MAAM,KAAK,OAAO,OAAO,SAAS,UAAU,CAAC;AAEnD,QAAM,QAAQ;AAEd,QAAM,iBAAiB;AAAA,YACb,QAAQ,KAAK;AAAA,aACZ,SAAS,KAAK;AAAA,WAChB,IAAI;AAAA,UACL,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOP,WAAW,OAAO,EAAE;AAGxB,QAAM,cAAc,CAACA,UAAyB;AA3BhD;AA6BI,QAAIA,MAAK,SAAS,WAAW,QAAQ,EAAG,QAAO;AAC/C,QAAIA,MAAK,SAAS,WAAW,QAAQ,EAAG,QAAO;AAC/C,QAAIA,MAAK,aAAa,kBAAmB,QAAO;AAGhD,UAAM,aAAY,KAAAA,MAAK,KAAK,MAAM,GAAG,EAAE,IAAI,MAAzB,mBAA4B;AAC9C,YAAQ,WAAW;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,IAAI;AACrC,QAAM,QAAQ,KAAK,QAAQ;AAE3B,QAAM,YAAY,OAAO,KAAK,IAAI,UAAU,cAAc;AAE1D,MAAI,WAAW;AACb,QAAI,UAAU;AAEd,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,kBAAU,aAAa,KAAK,GAAG,UAAU,KAAK,IAAI;AAClD;AAAA,MACF,KAAK;AACH,kBAAU;AAAA;AAAA,mCAEiB,KAAK,GAAG,WAAW,KAAK,YAAY,WAAW;AAAA;AAAA;AAG1E;AAAA,MACF,KAAK;AACH,kBAAU,gBAAgB,KAAK,GAAG;AAClC;AAAA,MACF;AACE,kBAAU,gBAAgB,KAAK,GAAG;AAAA,IACtC;AAEA,cAAU,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA,yBAIJ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAOM,iBAAiB,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAuB5D,OAAO;AAAA;AAAA;AAAA,SAGhB;AACL,cAAU,SAAS,MAAM;AAAA,EAC3B;AACF;","names":["file"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WmsTimeControl.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,mBAAmB;IAC3B,oDAAoD;IACpD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0GxD,CAAC"}
1
+ {"version":3,"file":"WmsTimeControl.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,mBAAmB;IAC3B,oDAAoD;IACpD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0GxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { formatFrameTime } from \"../../../../../datasets/src/wmsTime\";\r\n\r\ninterface WmsTimeControlProps {\r\n /** Ascending frame timestamps (oldest → newest). */\r\n frames: string[];\r\n /** Called with the active frame timestamp whenever it changes. */\r\n onTimeChange: (time: string) => void;\r\n /** Card title (e.g. the dataset name). */\r\n label?: string;\r\n /** Frame advance interval while playing, ms. */\r\n stepMs?: number;\r\n /** WMS GetLegendGraphic image URL; shown under the slider when it loads. */\r\n legendUrl?: string;\r\n}\r\n\r\n/**\r\n * Floating scrub + play/pause control for a WMS time dimension. Defaults to the\r\n * latest frame; play advances oldest→newest on a loop. Purely presentational —\r\n * it owns only the current index + playing state and reports the active time up.\r\n */\r\nexport const WmsTimeControl: React.FC<WmsTimeControlProps> = ({\r\n frames,\r\n onTimeChange,\r\n label,\r\n stepMs = 500,\r\n legendUrl,\r\n}) => {\r\n const [index, setIndex] = React.useState(Math.max(0, frames.length - 1));\r\n const [playing, setPlaying] = React.useState(false);\r\n const [legendOk, setLegendOk] = React.useState(true);\r\n\r\n // Reset legend visibility if the URL changes (different layer).\r\n React.useEffect(() => { setLegendOk(true); }, [legendUrl]);\r\n\r\n // Clamp + re-seat at the latest frame whenever the frame list changes.\r\n React.useEffect(() => {\r\n setIndex(Math.max(0, frames.length - 1));\r\n }, [frames.length]);\r\n\r\n // Report the active frame up whenever the index (or frame list) changes.\r\n React.useEffect(() => {\r\n const time = frames[index];\r\n if (time) onTimeChange(time);\r\n }, [index, frames, onTimeChange]);\r\n\r\n // Play loop.\r\n React.useEffect(() => {\r\n if (!playing || frames.length < 2) return;\r\n const timer = setInterval(() => {\r\n setIndex(prev => (prev + 1) % frames.length);\r\n }, stepMs);\r\n return () => clearInterval(timer);\r\n }, [playing, frames.length, stepMs]);\r\n\r\n if (frames.length === 0) return null;\r\n\r\n const activeTime = frames[index];\r\n\r\n return (\r\n <div\r\n style={{\r\n // Laid out by the bottom-left flex stack it portals into (see MapViewer),\r\n // so no absolute positioning — it sits above the legend / dataset-manager cards.\r\n background: \"#ffffff\",\r\n borderRadius: 8,\r\n boxShadow: \"0 1px 4px rgba(0,0,0,0.3)\",\r\n padding: \"10px 12px\",\r\n width: 260,\r\n font: \"13px/1.3 system-ui, sans-serif\",\r\n color: \"#1a1a1a\",\r\n pointerEvents: \"auto\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 6 }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setPlaying(p => !p)}\r\n aria-label={playing ? \"Pause\" : \"Play\"}\r\n style={{\r\n cursor: \"pointer\",\r\n border: \"none\",\r\n background: \"#0d9488\",\r\n color: \"#fff\",\r\n borderRadius: 4,\r\n width: 28,\r\n height: 28,\r\n fontSize: 14,\r\n lineHeight: 1,\r\n }}\r\n >\r\n {playing ? \"❚❚\" : \"▶\"}\r\n </button>\r\n <div style={{ fontWeight: 600, flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\r\n {label ?? \"WMS time\"}\r\n </div>\r\n <div style={{ fontVariantNumeric: \"tabular-nums\", color: \"#475569\" }}>\r\n {formatFrameTime(activeTime)}\r\n </div>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={frames.length - 1}\r\n value={index}\r\n onChange={e => {\r\n setPlaying(false);\r\n setIndex(Number(e.target.value));\r\n }}\r\n style={{ width: \"100%\", display: \"block\", accentColor: \"#0d9488\" }}\r\n />\r\n {legendUrl && legendOk && (\r\n <img\r\n src={legendUrl}\r\n alt=\"Legend\"\r\n onError={() => setLegendOk(false)}\r\n style={{\r\n display: \"block\",\r\n marginTop: 8,\r\n maxWidth: \"100%\",\r\n maxHeight: 220,\r\n objectFit: \"contain\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\nWmsTimeControl.displayName = \"WmsTimeControl\";\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\n\r\nimport { formatFrameTime } from \"../../../../../datasets/src/wmsTime\";\r\n\r\ninterface WmsTimeControlProps {\r\n /** Ascending frame timestamps (oldest → newest). */\r\n frames: string[];\r\n /** Called with the active frame timestamp whenever it changes. */\r\n onTimeChange: (time: string) => void;\r\n /** Card title (e.g. the dataset name). */\r\n label?: string;\r\n /** Frame advance interval while playing, ms. */\r\n stepMs?: number;\r\n /** WMS GetLegendGraphic image URL; shown under the slider when it loads. */\r\n legendUrl?: string;\r\n}\r\n\r\n/**\r\n * Floating scrub + play/pause control for a WMS time dimension. Defaults to the\r\n * latest frame; play advances oldest→newest on a loop. Purely presentational —\r\n * it owns only the current index + playing state and reports the active time up.\r\n */\r\nexport const WmsTimeControl: React.FC<WmsTimeControlProps> = ({\r\n frames,\r\n onTimeChange,\r\n label,\r\n stepMs = 500,\r\n legendUrl,\r\n}) => {\r\n const [index, setIndex] = React.useState(Math.max(0, frames.length - 1));\r\n const [playing, setPlaying] = React.useState(false);\r\n const [legendOk, setLegendOk] = React.useState(true);\r\n\r\n // Reset legend visibility if the URL changes (different layer).\r\n React.useEffect(() => { setLegendOk(true); }, [legendUrl]);\r\n\r\n // Clamp + re-seat at the latest frame whenever the frame list changes.\r\n React.useEffect(() => {\r\n setIndex(Math.max(0, frames.length - 1));\r\n }, [frames.length]);\r\n\r\n // Report the active frame up whenever the index (or frame list) changes.\r\n React.useEffect(() => {\r\n const time = frames[index];\r\n if (time) onTimeChange(time);\r\n }, [index, frames, onTimeChange]);\r\n\r\n // Play loop.\r\n React.useEffect(() => {\r\n if (!playing || frames.length < 2) return;\r\n const timer = setInterval(() => {\r\n setIndex(prev => (prev + 1) % frames.length);\r\n }, stepMs);\r\n return () => clearInterval(timer);\r\n }, [playing, frames.length, stepMs]);\r\n\r\n if (frames.length === 0) return null;\r\n\r\n const activeTime = frames[index];\r\n\r\n return (\r\n <div\r\n style={{\r\n // Laid out by the bottom-left flex stack it portals into (see MapViewer),\r\n // so no absolute positioning — it sits above the legend / dataset-manager cards.\r\n background: \"#ffffff\",\r\n borderRadius: 8,\r\n boxShadow: \"0 1px 4px rgba(0,0,0,0.3)\",\r\n padding: \"10px 12px\",\r\n width: 260,\r\n font: \"13px/1.3 system-ui, sans-serif\",\r\n color: \"#1a1a1a\",\r\n pointerEvents: \"auto\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 6 }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setPlaying(p => !p)}\r\n aria-label={playing ? \"Pause\" : \"Play\"}\r\n style={{\r\n cursor: \"pointer\",\r\n border: \"none\",\r\n background: \"#0d9488\",\r\n color: \"#fff\",\r\n borderRadius: 4,\r\n width: 28,\r\n height: 28,\r\n fontSize: 14,\r\n lineHeight: 1,\r\n }}\r\n >\r\n {playing ? \"❚❚\" : \"▶\"}\r\n </button>\r\n <div style={{ fontWeight: 600, flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\r\n {label ?? \"WMS time\"}\r\n </div>\r\n <div style={{ fontVariantNumeric: \"tabular-nums\", color: \"#475569\" }}>\r\n {formatFrameTime(activeTime)}\r\n </div>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={frames.length - 1}\r\n value={index}\r\n onChange={e => {\r\n setPlaying(false);\r\n setIndex(Number(e.target.value));\r\n }}\r\n style={{ width: \"100%\", display: \"block\", accentColor: \"#0d9488\" }}\r\n />\r\n {legendUrl && legendOk && (\r\n <img\r\n src={legendUrl}\r\n alt=\"Legend\"\r\n onError={() => setLegendOk(false)}\r\n style={{\r\n display: \"block\",\r\n marginTop: 8,\r\n maxWidth: \"100%\",\r\n maxHeight: 220,\r\n objectFit: \"contain\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\nWmsTimeControl.displayName = \"WmsTimeControl\";\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA+c/B,eAAO,MAAM,cAAc,yBAqM1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkd/B,eAAO,MAAM,cAAc,yBAqM1B,CAAC"}
@@ -20,14 +20,14 @@ var __spreadValues = (a, b) => {
20
20
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
21
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
22
  import * as React from "react";
23
+ import { createPortal } from "react-dom";
23
24
  import { Source, Layer, Popup } from "react-map-gl/maplibre";
24
- import { MapContext } from "../../../../../../../../store/Map/context";
25
25
  import { DatasetsContext } from "../../../../../../../../store";
26
+ import { MapContext } from "../../../../../../../../store/Map/context";
27
+ import { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from "../../../../../datasets/src/wmsTime";
26
28
  import { MapLayerClickPriority } from "../../../../../utils/MapEventManager/MapClickManager";
27
29
  import MapFeaturePopoverMenu from "../../../../MapFeaturePopoverMenu";
28
- import { createPortal } from "react-dom";
29
30
  import { WmsTimeControl } from "./WmsTimeControl";
30
- import { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from "../../../../../datasets/src/wmsTime";
31
31
  const isBuildingDataset = (dataset) => {
32
32
  return dataset.type === "buildings" && "data" in dataset;
33
33
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { Source, Layer, Popup } from \"react-map-gl/maplibre\";\r\nimport type { MapMouseEvent } from \"maplibre-gl\";\r\n\r\nimport { MapContext } from \"../../../../../../../../store/Map/context\";\r\nimport type { Building } from '../../../../../../../../types/dbTypes';\r\nimport { DatasetsContext } from '../../../../../../../../store';\r\nimport { MapLayerClickPriority } from \"../../../../../utils/MapEventManager/MapClickManager\";\r\nimport MapFeaturePopoverMenu from \"../../../../MapFeaturePopoverMenu\";\r\nimport { fitGeoJsonBounds } from \"../../../../../utils/fitGeojsonBounds\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { WmsTimeControl } from \"./WmsTimeControl\";\r\nimport { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from \"../../../../../datasets/src/wmsTime\";\r\n\r\ninterface BuildingDataset {\r\n \"type\": \"buildings\";\r\n \"data\": Building[];\r\n \"name\": string;\r\n \"visible\"?: boolean;\r\n}\r\n\r\nconst isBuildingDataset = (dataset: any): dataset is BuildingDataset => {\r\n return dataset.type === \"buildings\" && \"data\" in dataset;\r\n};\r\n\r\nconst parseNumericValue = (value: unknown): number | null => {\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value !== 'string') return null;\r\n const cleaned = value.replace(/[$%\\s]/g, '').replace(/,/g, '');\r\n const parsed = Number.parseFloat(cleaned);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n};\r\n\r\nconst computeMinMax = (\r\n features: import('geojson').Feature[],\r\n fieldName: string,\r\n): { min: number; max: number } | null => {\r\n let min = Number.POSITIVE_INFINITY;\r\n let max = Number.NEGATIVE_INFINITY;\r\n let found = false;\r\n for (const feature of features) {\r\n const properties = (feature.properties || {}) as Record<string, unknown>;\r\n const value = parseNumericValue(properties[fieldName]);\r\n if (value === null) continue;\r\n found = true;\r\n if (value < min) min = value;\r\n if (value > max) max = value;\r\n }\r\n if (!found) return null;\r\n return { min, max: max === min ? min + 1 : max };\r\n};\r\n\r\n// ─── Per-dataset GeoJSON layer ────────────────────────────────────────\r\n// Each dataset manages its own fetch lifecycle. This means:\r\n// • datasets render PROGRESSIVELY as each one loads (no blocking)\r\n// • unmounting a dataset cancels only ITS fetch\r\n// • re-renders of one dataset never cancel fetches for another\r\n\r\ninterface GeoJsonDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst GeoJsonDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: GeoJsonDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const [featureCollection, setFeatureCollection] = React.useState<import('geojson').FeatureCollection | null>(null);\r\n const fitBoundsAppliedRef = React.useRef(false);\r\n\r\n // Fetch features once when the component mounts (or dataset identity changes)\r\n React.useEffect(() => {\r\n if (!map) return;\r\n let cancelled = false;\r\n\r\n const load = async () => {\r\n try {\r\n const fetched = await dataset.getFeatures();\r\n if (cancelled) return;\r\n\r\n const fc: import('geojson').FeatureCollection =\r\n fetched?.type === 'FeatureCollection'\r\n ? fetched\r\n : { type: 'FeatureCollection', features: [] };\r\n\r\n setFeatureCollection(fc);\r\n } catch (error) {\r\n console.error(`OpenDataLayers: Error fetching features for \"${dataset.name}\":`, error);\r\n }\r\n };\r\n\r\n load();\r\n return () => { cancelled = true; };\r\n }, [map, dataset.name]);\r\n\r\n // Build the layer JSX from the loaded feature collection\r\n const layerContent = React.useMemo(() => {\r\n if (!featureCollection || featureCollection.features.length === 0) return null;\r\n\r\n const geometryType = featureCollection.features[0]?.geometry?.type;\r\n if (!geometryType) return null;\r\n\r\n // ── colour resolution ──\r\n let layerColor: any = dataset.layerColor?.color || '#0d9488';\r\n let numericFieldName: string | undefined;\r\n\r\n if (dataset.selectedFieldName) {\r\n const selectedField = dataset.fields?.find((field: any) => field.name === dataset.selectedFieldName);\r\n if (selectedField?.layerColor) {\r\n if (selectedField.colorType === 'single') {\r\n layerColor = selectedField.layerColor.color;\r\n }\r\n if (selectedField.colorType === 'minMax') {\r\n try {\r\n const fieldName = dataset.selectedFieldName;\r\n numericFieldName = `__numeric_${fieldName}`;\r\n const range = computeMinMax(featureCollection.features, fieldName);\r\n if (range) {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n layerColor = [\r\n 'interpolate', ['linear'],\r\n ['to-number', ['get', numericFieldName], range.min],\r\n range.min, minColor,\r\n range.max, maxColor,\r\n ];\r\n }\r\n } catch (error) {\r\n console.warn('Failed to build interpolate for field', dataset.selectedFieldName, error);\r\n }\r\n }\r\n if (selectedField.colorType === 'boolean') {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n const fieldName = dataset.selectedFieldName;\r\n layerColor = [\r\n 'case',\r\n ['any',\r\n ['==', ['get', fieldName], true],\r\n ['==', ['get', fieldName], 1],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'true'],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'yes'],\r\n ],\r\n maxColor,\r\n minColor,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n // ── inject datasetName + numeric shadow field into each feature ──\r\n const enrichedFC: import('geojson').FeatureCollection = {\r\n ...featureCollection,\r\n features: featureCollection.features.map((feature) => {\r\n let numericVal: number | undefined;\r\n if (numericFieldName && dataset.selectedFieldName) {\r\n const v = parseNumericValue((feature.properties || {})[dataset.selectedFieldName]);\r\n if (v !== null) numericVal = v;\r\n }\r\n return {\r\n ...feature,\r\n properties: {\r\n ...feature.properties,\r\n datasetName: dataset.name,\r\n layer_color: layerColor,\r\n ...(numericFieldName && numericVal !== undefined ? { [numericFieldName]: numericVal } : {}),\r\n },\r\n };\r\n }),\r\n };\r\n\r\n // ── build layer props per geometry type ──\r\n const registeredIds: string[] = [];\r\n\r\n if (geometryType === 'Point' || geometryType === 'MultiPoint') {\r\n const paint = {\r\n 'circle-radius': 6,\r\n 'circle-color': layerColor,\r\n 'circle-opacity': 0.8,\r\n 'circle-stroke-width': 2,\r\n 'circle-stroke-color': '#ffffff',\r\n };\r\n registeredIds.push(`${dataset.name}-unclustered-point`);\r\n\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n cluster={true}\r\n clusterMaxZoom={11}\r\n clusterRadius={50}\r\n >\r\n <Layer\r\n id={`${dataset.name}-clusters`}\r\n filter={['has', 'point_count']}\r\n type=\"circle\"\r\n paint={{\r\n 'circle-color': dataset.layerColor?.color || '#0d9488',\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n 'circle-opacity': 0.9,\r\n }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-cluster-count`}\r\n filter={['has', 'point_count']}\r\n type=\"symbol\"\r\n layout={{\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n }}\r\n paint={{ 'text-color': '#fff' }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-unclustered-point`}\r\n filter={['!', ['has', 'point_count']]}\r\n type=\"circle\"\r\n paint={paint}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'LineString' || geometryType === 'MultiLineString') {\r\n const mainId = `${dataset.name}-line`;\r\n registeredIds.push(mainId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={mainId}\r\n type=\"line\"\r\n paint={{ 'line-color': layerColor, 'line-width': 3, 'line-opacity': 1 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {\r\n const fillId = `${dataset.name}-fill`;\r\n const outlineId = `${dataset.name}-outline`;\r\n registeredIds.push(fillId, outlineId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={fillId}\r\n type=\"fill\"\r\n paint={{ 'fill-color': layerColor, 'fill-opacity': 0.5 }}\r\n />\r\n <Layer\r\n id={outlineId}\r\n type=\"line\"\r\n paint={{ 'line-color': '#ffffff', 'line-width': 2 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }, [featureCollection, dataset.name, dataset.layerColor, dataset.selectedFieldName, dataset.fields, index]);\r\n\r\n // Register / unregister interactive layer IDs with the parent\r\n React.useEffect(() => {\r\n if (layerContent?.registeredIds) {\r\n onLayerReady(dataset.name, layerContent.registeredIds);\r\n }\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [layerContent?.registeredIds, dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n return layerContent?.jsx ?? null;\r\n});\r\nGeoJsonDatasetLayer.displayName = 'GeoJsonDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset MVT layer ────────────────────────────────────────────\r\n\r\ninterface MVTDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst MVTDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: MVTDatasetLayerProps) => {\r\n const tileUrl = dataset.url || dataset.information;\r\n const sourceLayer = (dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name.toLowerCase().replace(/\\s+/g, '_');\r\n const layerColor = dataset.layerColor?.color || '#0d9488';\r\n const isPointLayer = dataset.layerType === 'circle' || /point/i.test(sourceLayer);\r\n const isMartinBuilding = /buildings?/i.test((dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name);\r\n // Only extrude actual building layers. A polygon dataset resolves to layerType\r\n // 'fill', so keying extrusion off 'fill' alone routed every polygon (e.g. published\r\n // open-data boundaries) into the zero-height, minzoom-15.5 extrusion branch — leaving\r\n // only the outline visible. Non-building polygons fall through to the flat-fill branch.\r\n const extraIsBuilding = isMartinBuilding && !isPointLayer;\r\n\r\n const mainLayerId = isPointLayer\r\n ? `${dataset.name}-points`\r\n : extraIsBuilding\r\n ? `${dataset.name}-extrusion`\r\n : `${dataset.name}-fill`;\r\n const outlineLayerId = `${dataset.name}-outline`;\r\n\r\n // Register interactive layer IDs\r\n React.useEffect(() => {\r\n const ids = isPointLayer ? [mainLayerId] : [mainLayerId, outlineLayerId];\r\n onLayerReady(dataset.name, ids);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, mainLayerId, outlineLayerId, isPointLayer, onLayerReady, onLayerRemoved]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for MVT dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n if (extraIsBuilding) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"fill-extrusion\" source-layer={sourceLayer}\r\n paint={{\r\n 'fill-extrusion-color': layerColor,\r\n 'fill-extrusion-height': ['coalesce', ['to-number', ['get', 'heightmax']], 0],\r\n 'fill-extrusion-opacity': 0.8,\r\n }}\r\n minzoom={15.5}\r\n />\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': layerColor, 'line-width': 1, 'line-opacity': 0.8 }} />\r\n </Source>\r\n );\r\n }\r\n\r\n if (isPointLayer) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"circle\" source-layer={sourceLayer}\r\n paint={{ 'circle-radius': 6, 'circle-color': layerColor, 'circle-opacity': 0.8, 'circle-stroke-width': 2, 'circle-stroke-color': '#ffffff' }}\r\n />\r\n </Source>\r\n );\r\n }\r\n\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer id={mainLayerId} type=\"fill\" source-layer={sourceLayer} paint={{ 'fill-color': layerColor, 'fill-opacity': 0.6 }} />\r\n {/* White outline (matches the original GeoJSON polygon style) so subdivision\r\n boundaries stay legible — a same-colour outline read as one solid blob. */}\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': '#ffffff', 'line-width': 2 }} />\r\n </Source>\r\n );\r\n});\r\nMVTDatasetLayer.displayName = 'MVTDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset WMS raster layer ─────────────────────────────────────\r\n// Live/federated WMS overlays (e.g. the GeoMet weather radar). The dataset's\r\n// `url` is a MapLibre raster tile template (GetMap with a literal\r\n// {bbox-epsg-3857}); MapLibre fetches tiles directly, so there's nothing to\r\n// parse and no features to query (raster → not interactive).\r\n\r\ninterface WMSDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst WMSDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: WMSDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const tileUrl = dataset.url || dataset.information;\r\n const layerId = `${dataset.name}-wms`;\r\n const sourceId = `${dataset.name}-source`;\r\n\r\n const timeEnabled = !!dataset.timeEnabled && !!dataset.wms;\r\n const [frames, setFrames] = React.useState<string[]>([]);\r\n const [activeTime, setActiveTime] = React.useState<string | null>(null);\r\n // The bottom-left overlay stack's portal slot (MapViewer renders it). Resolved\r\n // in an effect so the node exists (post-commit) before we portal into it.\r\n const [controlSlot, setControlSlot] = React.useState<HTMLElement | null>(null);\r\n React.useEffect(() => {\r\n if (timeEnabled) setControlSlot(document.getElementById('wms-time-slot'));\r\n }, [timeEnabled]);\r\n\r\n // Register with no interactive layer ids — a raster has no queryable features.\r\n React.useEffect(() => {\r\n onLayerReady(dataset.name, []);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n // Load the WMS time extent once (time-enabled datasets only).\r\n React.useEffect(() => {\r\n if (!timeEnabled || !dataset.wms) return;\r\n let cancelled = false;\r\n fetchWmsFrames(dataset.wms.baseUrl, dataset.wms.layers)\r\n .then(f => { if (!cancelled) setFrames(f); })\r\n .catch(() => { /* fetchWmsFrames already swallows; keep static */ });\r\n return () => { cancelled = true; };\r\n }, [timeEnabled, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n // Imperatively swap the raster source's tiles per frame. The <Source tiles>\r\n // prop below never changes after mount, so there's no react-map-gl tug-of-war\r\n // and no flicker — this setTiles call is the single source of truth for TIME.\r\n React.useEffect(() => {\r\n if (!map || !activeTime || !dataset.wms) return;\r\n const src = map.getSource(sourceId) as { setTiles?: (t: string[]) => void } | undefined;\r\n if (src?.setTiles) {\r\n src.setTiles([buildWmsTimeUrl(dataset.wms.baseUrl, dataset.wms.layers, activeTime)]);\r\n }\r\n }, [map, activeTime, sourceId, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for WMS dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n const showControl = timeEnabled && frames.length > 1 && map && controlSlot;\r\n\r\n return (\r\n <>\r\n <Source id={sourceId} key={`${index}-${dataset.name}-source`} type=\"raster\" tiles={[tileUrl]} tileSize={256}>\r\n <Layer id={layerId} type=\"raster\" paint={{ 'raster-opacity': 0.85 }} />\r\n </Source>\r\n {showControl && createPortal(\r\n <WmsTimeControl\r\n frames={frames}\r\n onTimeChange={setActiveTime}\r\n label={dataset.name}\r\n legendUrl={dataset.wms ? wmsLegendUrl(dataset.wms.baseUrl, dataset.wms.layers) : undefined}\r\n />,\r\n controlSlot,\r\n )}\r\n </>\r\n );\r\n});\r\nWMSDatasetLayer.displayName = 'WMSDatasetLayer';\r\n\r\n\r\n// ─── Main orchestrator ────────────────────────────────────────────────\r\n\r\nexport const OpenDataLayers = () => {\r\n const { \"state\": mapState, \"dispatch\": mapDispatch } = React.useContext(MapContext);\r\n const { map, mapClickManager } = mapState.map;\r\n\r\n const { state: datasetState } = React.useContext(DatasetsContext);\r\n const { addedDatasets } = datasetState.datasets;\r\n\r\n const [clickedFeature, setClickedFeature] = React.useState<any>(null);\r\n const [addedFeaturesPopup, setAddedFeaturesPopup] = React.useState<Array<{\r\n id: string | number;\r\n popup: React.ReactElement;\r\n }>>([]);\r\n\r\n // Track interactive layer IDs per dataset for click handling\r\n const layerIdsMapRef = React.useRef<Record<string, string[]>>({});\r\n const [allLayerNames, setAllLayerNames] = React.useState<string[]>([]);\r\n\r\n const handleLayerReady = React.useCallback((datasetName: string, layerIds: string[]) => {\r\n layerIdsMapRef.current[datasetName] = layerIds;\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n const handleLayerRemoved = React.useCallback((datasetName: string) => {\r\n delete layerIdsMapRef.current[datasetName];\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n // ── Click handling ──\r\n React.useEffect(() => {\r\n if (!map || !mapClickManager || allLayerNames.length === 0) return;\r\n\r\n const handleMapClick = (e: MapMouseEvent) => {\r\n const clicked = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n const localClickedFeature = clicked?.[0];\r\n\r\n if (!localClickedFeature) {\r\n setClickedFeature(null);\r\n return;\r\n }\r\n\r\n const lng = e.lngLat.lng;\r\n const lat = e.lngLat.lat;\r\n const coordinates = [lng, lat];\r\n const properties = localClickedFeature.properties || {};\r\n const _name = Object.entries(properties).find(([key]) => key.toLowerCase().includes('name'))?.[1] || undefined;\r\n\r\n let datasetNameFromFeature = properties.datasetName;\r\n if (!datasetNameFromFeature && localClickedFeature.layer) {\r\n const layerId = localClickedFeature.layer.id;\r\n const suffixes = ['-unclustered-point', '-clusters', '-cluster-count', '-outline', '-fill', '-line', '-circle', '-extrusion', '-points'];\r\n let extractedName = layerId;\r\n for (const suffix of suffixes) {\r\n if (layerId.endsWith(suffix)) {\r\n extractedName = layerId.slice(0, -suffix.length);\r\n break;\r\n }\r\n }\r\n if (extractedName === layerId && layerId.includes('-')) {\r\n extractedName = layerId.slice(0, layerId.lastIndexOf('-'));\r\n }\r\n datasetNameFromFeature = extractedName;\r\n }\r\n\r\n const featureId = properties.globalid || properties.id || `temp-${Date.now()}`;\r\n localClickedFeature.id = featureId;\r\n localClickedFeature.properties = { ...properties, coordinates, _name, datasetName: datasetNameFromFeature };\r\n setClickedFeature(localClickedFeature);\r\n };\r\n\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.register(layerId, MapLayerClickPriority.OpenDataLayerClickPriority, handleMapClick);\r\n }\r\n\r\n return () => {\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.unregister(layerId);\r\n }\r\n };\r\n }, [map, mapClickManager, allLayerNames]);\r\n\r\n // ── Hover cursor handling ──\r\n React.useEffect(() => {\r\n if (!map) return;\r\n\r\n const canvas = map.getCanvas();\r\n\r\n const setDefaultCursor = () => {\r\n canvas.style.cursor = 'default';\r\n };\r\n\r\n if (allLayerNames.length === 0) {\r\n setDefaultCursor();\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MapMouseEvent) => {\r\n const hoveredFeatures = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n canvas.style.cursor = hoveredFeatures.length > 0 ? 'pointer' : 'default';\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setDefaultCursor();\r\n };\r\n\r\n map.on('mousemove', handleMouseMove);\r\n map.on('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n map.off('mousemove', handleMouseMove);\r\n map.off('mouseleave', handleMouseLeave);\r\n setDefaultCursor();\r\n };\r\n }, [map, allLayerNames]);\r\n\r\n // ── Popup ──\r\n React.useEffect(() => {\r\n if (!clickedFeature || !clickedFeature.properties?.coordinates) {\r\n setAddedFeaturesPopup([]);\r\n return;\r\n }\r\n const popup = (\r\n <Popup\r\n anchor=\"bottom\"\r\n closeButton={true}\r\n closeOnClick={false}\r\n closeOnMove={false}\r\n focusAfterOpen={true}\r\n key={clickedFeature.id}\r\n latitude={clickedFeature.properties.coordinates[1]}\r\n longitude={clickedFeature.properties.coordinates[0]}\r\n >\r\n <MapFeaturePopoverMenu\r\n feature={clickedFeature}\r\n onCloseAction={() => clearClickedFeature()}\r\n />\r\n </Popup>\r\n );\r\n setAddedFeaturesPopup([{ id: clickedFeature.id as string | number, popup }]);\r\n }, [clickedFeature]);\r\n\r\n function clearClickedFeature() {\r\n mapDispatch({ type: \"SET_CLICKED_FEATURE\", payload: { clickedFeature: null } });\r\n setClickedFeature(null);\r\n }\r\n\r\n // ── Sort datasets by display order ──\r\n const sortedDatasets = React.useMemo(() => {\r\n if (!addedDatasets?.length) return [];\r\n return [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }, [addedDatasets]);\r\n\r\n return (\r\n <>\r\n {sortedDatasets.map((dataset, index) => {\r\n if (dataset.visible === false) return null;\r\n if (isBuildingDataset(dataset)) return null;\r\n\r\n if (dataset.type === 'WMS' || dataset.datasetType === 'WMS') {\r\n return (\r\n <WMSDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n if (dataset.type === 'MVT' || dataset.datasetType === 'MVT') {\r\n return (\r\n <MVTDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <GeoJsonDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n })}\r\n\r\n {addedFeaturesPopup.map((popup) => (\r\n <React.Fragment key={popup.id}>{popup.popup}</React.Fragment>\r\n ))}\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { Source, Layer, Popup } from \"react-map-gl/maplibre\";\r\n\r\n\r\nimport { DatasetsContext } from '../../../../../../../../store';\r\nimport { MapContext } from \"../../../../../../../../store/Map/context\";\r\nimport { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from \"../../../../../datasets/src/wmsTime\";\r\nimport { fitGeoJsonBounds } from \"../../../../../utils/fitGeojsonBounds\";\r\nimport { MapLayerClickPriority } from \"../../../../../utils/MapEventManager/MapClickManager\";\r\nimport MapFeaturePopoverMenu from \"../../../../MapFeaturePopoverMenu\";\r\n\r\nimport { WmsTimeControl } from \"./WmsTimeControl\";\r\n\r\nimport type { Building } from '../../../../../../../../types/dbTypes';\r\nimport type { MapMouseEvent } from \"maplibre-gl\";\r\n\r\ninterface BuildingDataset {\r\n \"type\": \"buildings\";\r\n \"data\": Building[];\r\n \"name\": string;\r\n \"visible\"?: boolean;\r\n}\r\n\r\nconst isBuildingDataset = (dataset: any): dataset is BuildingDataset => {\r\n return dataset.type === \"buildings\" && \"data\" in dataset;\r\n};\r\n\r\nconst parseNumericValue = (value: unknown): number | null => {\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value !== 'string') return null;\r\n const cleaned = value.replace(/[$%\\s]/g, '').replace(/,/g, '');\r\n const parsed = Number.parseFloat(cleaned);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n};\r\n\r\nconst computeMinMax = (\r\n features: import('geojson').Feature[],\r\n fieldName: string,\r\n): { min: number; max: number } | null => {\r\n let min = Number.POSITIVE_INFINITY;\r\n let max = Number.NEGATIVE_INFINITY;\r\n let found = false;\r\n for (const feature of features) {\r\n const properties = (feature.properties || {}) as Record<string, unknown>;\r\n const value = parseNumericValue(properties[fieldName]);\r\n if (value === null) continue;\r\n found = true;\r\n if (value < min) min = value;\r\n if (value > max) max = value;\r\n }\r\n if (!found) return null;\r\n return { min, max: max === min ? min + 1 : max };\r\n};\r\n\r\n// ─── Per-dataset GeoJSON layer ────────────────────────────────────────\r\n// Each dataset manages its own fetch lifecycle. This means:\r\n// • datasets render PROGRESSIVELY as each one loads (no blocking)\r\n// • unmounting a dataset cancels only ITS fetch\r\n// • re-renders of one dataset never cancel fetches for another\r\n\r\ninterface GeoJsonDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst GeoJsonDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: GeoJsonDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const [featureCollection, setFeatureCollection] = React.useState<import('geojson').FeatureCollection | null>(null);\r\n const fitBoundsAppliedRef = React.useRef(false);\r\n\r\n // Fetch features once when the component mounts (or dataset identity changes)\r\n React.useEffect(() => {\r\n if (!map) return;\r\n let cancelled = false;\r\n\r\n const load = async () => {\r\n try {\r\n const fetched = await dataset.getFeatures();\r\n if (cancelled) return;\r\n\r\n const fc: import('geojson').FeatureCollection =\r\n fetched?.type === 'FeatureCollection'\r\n ? fetched\r\n : { type: 'FeatureCollection', features: [] };\r\n\r\n setFeatureCollection(fc);\r\n } catch (error) {\r\n console.error(`OpenDataLayers: Error fetching features for \"${dataset.name}\":`, error);\r\n }\r\n };\r\n\r\n load();\r\n return () => { cancelled = true; };\r\n }, [map, dataset.name]);\r\n\r\n // Build the layer JSX from the loaded feature collection\r\n const layerContent = React.useMemo(() => {\r\n if (!featureCollection || featureCollection.features.length === 0) return null;\r\n\r\n const geometryType = featureCollection.features[0]?.geometry?.type;\r\n if (!geometryType) return null;\r\n\r\n // ── colour resolution ──\r\n let layerColor: any = dataset.layerColor?.color || '#0d9488';\r\n let numericFieldName: string | undefined;\r\n\r\n if (dataset.selectedFieldName) {\r\n const selectedField = dataset.fields?.find((field: any) => field.name === dataset.selectedFieldName);\r\n if (selectedField?.layerColor) {\r\n if (selectedField.colorType === 'single') {\r\n layerColor = selectedField.layerColor.color;\r\n }\r\n if (selectedField.colorType === 'minMax') {\r\n try {\r\n const fieldName = dataset.selectedFieldName;\r\n numericFieldName = `__numeric_${fieldName}`;\r\n const range = computeMinMax(featureCollection.features, fieldName);\r\n if (range) {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n layerColor = [\r\n 'interpolate', ['linear'],\r\n ['to-number', ['get', numericFieldName], range.min],\r\n range.min, minColor,\r\n range.max, maxColor,\r\n ];\r\n }\r\n } catch (error) {\r\n console.warn('Failed to build interpolate for field', dataset.selectedFieldName, error);\r\n }\r\n }\r\n if (selectedField.colorType === 'boolean') {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n const fieldName = dataset.selectedFieldName;\r\n layerColor = [\r\n 'case',\r\n ['any',\r\n ['==', ['get', fieldName], true],\r\n ['==', ['get', fieldName], 1],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'true'],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'yes'],\r\n ],\r\n maxColor,\r\n minColor,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n // ── inject datasetName + numeric shadow field into each feature ──\r\n const enrichedFC: import('geojson').FeatureCollection = {\r\n ...featureCollection,\r\n features: featureCollection.features.map((feature) => {\r\n let numericVal: number | undefined;\r\n if (numericFieldName && dataset.selectedFieldName) {\r\n const v = parseNumericValue((feature.properties || {})[dataset.selectedFieldName]);\r\n if (v !== null) numericVal = v;\r\n }\r\n return {\r\n ...feature,\r\n properties: {\r\n ...feature.properties,\r\n datasetName: dataset.name,\r\n layer_color: layerColor,\r\n ...(numericFieldName && numericVal !== undefined ? { [numericFieldName]: numericVal } : {}),\r\n },\r\n };\r\n }),\r\n };\r\n\r\n // ── build layer props per geometry type ──\r\n const registeredIds: string[] = [];\r\n\r\n if (geometryType === 'Point' || geometryType === 'MultiPoint') {\r\n const paint = {\r\n 'circle-radius': 6,\r\n 'circle-color': layerColor,\r\n 'circle-opacity': 0.8,\r\n 'circle-stroke-width': 2,\r\n 'circle-stroke-color': '#ffffff',\r\n };\r\n registeredIds.push(`${dataset.name}-unclustered-point`);\r\n\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n cluster={true}\r\n clusterMaxZoom={11}\r\n clusterRadius={50}\r\n >\r\n <Layer\r\n id={`${dataset.name}-clusters`}\r\n filter={['has', 'point_count']}\r\n type=\"circle\"\r\n paint={{\r\n 'circle-color': dataset.layerColor?.color || '#0d9488',\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n 'circle-opacity': 0.9,\r\n }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-cluster-count`}\r\n filter={['has', 'point_count']}\r\n type=\"symbol\"\r\n layout={{\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n }}\r\n paint={{ 'text-color': '#fff' }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-unclustered-point`}\r\n filter={['!', ['has', 'point_count']]}\r\n type=\"circle\"\r\n paint={paint}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'LineString' || geometryType === 'MultiLineString') {\r\n const mainId = `${dataset.name}-line`;\r\n registeredIds.push(mainId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={mainId}\r\n type=\"line\"\r\n paint={{ 'line-color': layerColor, 'line-width': 3, 'line-opacity': 1 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {\r\n const fillId = `${dataset.name}-fill`;\r\n const outlineId = `${dataset.name}-outline`;\r\n registeredIds.push(fillId, outlineId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={fillId}\r\n type=\"fill\"\r\n paint={{ 'fill-color': layerColor, 'fill-opacity': 0.5 }}\r\n />\r\n <Layer\r\n id={outlineId}\r\n type=\"line\"\r\n paint={{ 'line-color': '#ffffff', 'line-width': 2 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }, [featureCollection, dataset.name, dataset.layerColor, dataset.selectedFieldName, dataset.fields, index]);\r\n\r\n // Register / unregister interactive layer IDs with the parent\r\n React.useEffect(() => {\r\n if (layerContent?.registeredIds) {\r\n onLayerReady(dataset.name, layerContent.registeredIds);\r\n }\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [layerContent?.registeredIds, dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n return layerContent?.jsx ?? null;\r\n});\r\nGeoJsonDatasetLayer.displayName = 'GeoJsonDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset MVT layer ────────────────────────────────────────────\r\n\r\ninterface MVTDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst MVTDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: MVTDatasetLayerProps) => {\r\n const tileUrl = dataset.url || dataset.information;\r\n const sourceLayer = (dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name.toLowerCase().replace(/\\s+/g, '_');\r\n const layerColor = dataset.layerColor?.color || '#0d9488';\r\n const isPointLayer = dataset.layerType === 'circle' || /point/i.test(sourceLayer);\r\n const isMartinBuilding = /buildings?/i.test((dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name);\r\n // Only extrude actual building layers. A polygon dataset resolves to layerType\r\n // 'fill', so keying extrusion off 'fill' alone routed every polygon (e.g. published\r\n // open-data boundaries) into the zero-height, minzoom-15.5 extrusion branch — leaving\r\n // only the outline visible. Non-building polygons fall through to the flat-fill branch.\r\n const extraIsBuilding = isMartinBuilding && !isPointLayer;\r\n\r\n const mainLayerId = isPointLayer\r\n ? `${dataset.name}-points`\r\n : extraIsBuilding\r\n ? `${dataset.name}-extrusion`\r\n : `${dataset.name}-fill`;\r\n const outlineLayerId = `${dataset.name}-outline`;\r\n\r\n // Register interactive layer IDs\r\n React.useEffect(() => {\r\n const ids = isPointLayer ? [mainLayerId] : [mainLayerId, outlineLayerId];\r\n onLayerReady(dataset.name, ids);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, mainLayerId, outlineLayerId, isPointLayer, onLayerReady, onLayerRemoved]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for MVT dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n if (extraIsBuilding) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"fill-extrusion\" source-layer={sourceLayer}\r\n paint={{\r\n 'fill-extrusion-color': layerColor,\r\n 'fill-extrusion-height': ['coalesce', ['to-number', ['get', 'heightmax']], 0],\r\n 'fill-extrusion-opacity': 0.8,\r\n }}\r\n minzoom={15.5}\r\n />\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': layerColor, 'line-width': 1, 'line-opacity': 0.8 }} />\r\n </Source>\r\n );\r\n }\r\n\r\n if (isPointLayer) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"circle\" source-layer={sourceLayer}\r\n paint={{ 'circle-radius': 6, 'circle-color': layerColor, 'circle-opacity': 0.8, 'circle-stroke-width': 2, 'circle-stroke-color': '#ffffff' }}\r\n />\r\n </Source>\r\n );\r\n }\r\n\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer id={mainLayerId} type=\"fill\" source-layer={sourceLayer} paint={{ 'fill-color': layerColor, 'fill-opacity': 0.6 }} />\r\n {/* White outline (matches the original GeoJSON polygon style) so subdivision\r\n boundaries stay legible — a same-colour outline read as one solid blob. */}\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': '#ffffff', 'line-width': 2 }} />\r\n </Source>\r\n );\r\n});\r\nMVTDatasetLayer.displayName = 'MVTDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset WMS raster layer ─────────────────────────────────────\r\n// Live/federated WMS overlays (e.g. the GeoMet weather radar). The dataset's\r\n// `url` is a MapLibre raster tile template (GetMap with a literal\r\n// {bbox-epsg-3857}); MapLibre fetches tiles directly, so there's nothing to\r\n// parse and no features to query (raster → not interactive).\r\n\r\ninterface WMSDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst WMSDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: WMSDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const tileUrl = dataset.url || dataset.information;\r\n const layerId = `${dataset.name}-wms`;\r\n const sourceId = `${dataset.name}-source`;\r\n\r\n const timeEnabled = !!dataset.timeEnabled && !!dataset.wms;\r\n const [frames, setFrames] = React.useState<string[]>([]);\r\n const [activeTime, setActiveTime] = React.useState<string | null>(null);\r\n // The bottom-left overlay stack's portal slot (MapViewer renders it). Resolved\r\n // in an effect so the node exists (post-commit) before we portal into it.\r\n const [controlSlot, setControlSlot] = React.useState<HTMLElement | null>(null);\r\n React.useEffect(() => {\r\n if (timeEnabled) setControlSlot(document.getElementById('wms-time-slot'));\r\n }, [timeEnabled]);\r\n\r\n // Register with no interactive layer ids — a raster has no queryable features.\r\n React.useEffect(() => {\r\n onLayerReady(dataset.name, []);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n // Load the WMS time extent once (time-enabled datasets only).\r\n React.useEffect(() => {\r\n if (!timeEnabled || !dataset.wms) return;\r\n let cancelled = false;\r\n fetchWmsFrames(dataset.wms.baseUrl, dataset.wms.layers)\r\n .then(f => { if (!cancelled) setFrames(f); })\r\n .catch(() => { /* fetchWmsFrames already swallows; keep static */ });\r\n return () => { cancelled = true; };\r\n }, [timeEnabled, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n // Imperatively swap the raster source's tiles per frame. The <Source tiles>\r\n // prop below never changes after mount, so there's no react-map-gl tug-of-war\r\n // and no flicker — this setTiles call is the single source of truth for TIME.\r\n React.useEffect(() => {\r\n if (!map || !activeTime || !dataset.wms) return;\r\n const src = map.getSource(sourceId) as { setTiles?: (t: string[]) => void } | undefined;\r\n if (src?.setTiles) {\r\n src.setTiles([buildWmsTimeUrl(dataset.wms.baseUrl, dataset.wms.layers, activeTime)]);\r\n }\r\n }, [map, activeTime, sourceId, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for WMS dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n const showControl = timeEnabled && frames.length > 1 && map && controlSlot;\r\n\r\n return (\r\n <>\r\n <Source id={sourceId} key={`${index}-${dataset.name}-source`} type=\"raster\" tiles={[tileUrl]} tileSize={256}>\r\n <Layer id={layerId} type=\"raster\" paint={{ 'raster-opacity': 0.85 }} />\r\n </Source>\r\n {showControl && createPortal(\r\n <WmsTimeControl\r\n frames={frames}\r\n onTimeChange={setActiveTime}\r\n label={dataset.name}\r\n legendUrl={dataset.wms ? wmsLegendUrl(dataset.wms.baseUrl, dataset.wms.layers) : undefined}\r\n />,\r\n controlSlot,\r\n )}\r\n </>\r\n );\r\n});\r\nWMSDatasetLayer.displayName = 'WMSDatasetLayer';\r\n\r\n\r\n// ─── Main orchestrator ────────────────────────────────────────────────\r\n\r\nexport const OpenDataLayers = () => {\r\n const { \"state\": mapState, \"dispatch\": mapDispatch } = React.useContext(MapContext);\r\n const { map, mapClickManager } = mapState.map;\r\n\r\n const { state: datasetState } = React.useContext(DatasetsContext);\r\n const { addedDatasets } = datasetState.datasets;\r\n\r\n const [clickedFeature, setClickedFeature] = React.useState<any>(null);\r\n const [addedFeaturesPopup, setAddedFeaturesPopup] = React.useState<Array<{\r\n id: string | number;\r\n popup: React.ReactElement;\r\n }>>([]);\r\n\r\n // Track interactive layer IDs per dataset for click handling\r\n const layerIdsMapRef = React.useRef<Record<string, string[]>>({});\r\n const [allLayerNames, setAllLayerNames] = React.useState<string[]>([]);\r\n\r\n const handleLayerReady = React.useCallback((datasetName: string, layerIds: string[]) => {\r\n layerIdsMapRef.current[datasetName] = layerIds;\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n const handleLayerRemoved = React.useCallback((datasetName: string) => {\r\n delete layerIdsMapRef.current[datasetName];\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n // ── Click handling ──\r\n React.useEffect(() => {\r\n if (!map || !mapClickManager || allLayerNames.length === 0) return;\r\n\r\n const handleMapClick = (e: MapMouseEvent) => {\r\n const clicked = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n const localClickedFeature = clicked?.[0];\r\n\r\n if (!localClickedFeature) {\r\n setClickedFeature(null);\r\n return;\r\n }\r\n\r\n const lng = e.lngLat.lng;\r\n const lat = e.lngLat.lat;\r\n const coordinates = [lng, lat];\r\n const properties = localClickedFeature.properties || {};\r\n const _name = Object.entries(properties).find(([key]) => key.toLowerCase().includes('name'))?.[1] || undefined;\r\n\r\n let datasetNameFromFeature = properties.datasetName;\r\n if (!datasetNameFromFeature && localClickedFeature.layer) {\r\n const layerId = localClickedFeature.layer.id;\r\n const suffixes = ['-unclustered-point', '-clusters', '-cluster-count', '-outline', '-fill', '-line', '-circle', '-extrusion', '-points'];\r\n let extractedName = layerId;\r\n for (const suffix of suffixes) {\r\n if (layerId.endsWith(suffix)) {\r\n extractedName = layerId.slice(0, -suffix.length);\r\n break;\r\n }\r\n }\r\n if (extractedName === layerId && layerId.includes('-')) {\r\n extractedName = layerId.slice(0, layerId.lastIndexOf('-'));\r\n }\r\n datasetNameFromFeature = extractedName;\r\n }\r\n\r\n const featureId = properties.globalid || properties.id || `temp-${Date.now()}`;\r\n localClickedFeature.id = featureId;\r\n localClickedFeature.properties = { ...properties, coordinates, _name, datasetName: datasetNameFromFeature };\r\n setClickedFeature(localClickedFeature);\r\n };\r\n\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.register(layerId, MapLayerClickPriority.OpenDataLayerClickPriority, handleMapClick);\r\n }\r\n\r\n return () => {\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.unregister(layerId);\r\n }\r\n };\r\n }, [map, mapClickManager, allLayerNames]);\r\n\r\n // ── Hover cursor handling ──\r\n React.useEffect(() => {\r\n if (!map) return;\r\n\r\n const canvas = map.getCanvas();\r\n\r\n const setDefaultCursor = () => {\r\n canvas.style.cursor = 'default';\r\n };\r\n\r\n if (allLayerNames.length === 0) {\r\n setDefaultCursor();\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MapMouseEvent) => {\r\n const hoveredFeatures = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n canvas.style.cursor = hoveredFeatures.length > 0 ? 'pointer' : 'default';\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setDefaultCursor();\r\n };\r\n\r\n map.on('mousemove', handleMouseMove);\r\n map.on('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n map.off('mousemove', handleMouseMove);\r\n map.off('mouseleave', handleMouseLeave);\r\n setDefaultCursor();\r\n };\r\n }, [map, allLayerNames]);\r\n\r\n // ── Popup ──\r\n React.useEffect(() => {\r\n if (!clickedFeature || !clickedFeature.properties?.coordinates) {\r\n setAddedFeaturesPopup([]);\r\n return;\r\n }\r\n const popup = (\r\n <Popup\r\n anchor=\"bottom\"\r\n closeButton={true}\r\n closeOnClick={false}\r\n closeOnMove={false}\r\n focusAfterOpen={true}\r\n key={clickedFeature.id}\r\n latitude={clickedFeature.properties.coordinates[1]}\r\n longitude={clickedFeature.properties.coordinates[0]}\r\n >\r\n <MapFeaturePopoverMenu\r\n feature={clickedFeature}\r\n onCloseAction={() => clearClickedFeature()}\r\n />\r\n </Popup>\r\n );\r\n setAddedFeaturesPopup([{ id: clickedFeature.id as string | number, popup }]);\r\n }, [clickedFeature]);\r\n\r\n function clearClickedFeature() {\r\n mapDispatch({ type: \"SET_CLICKED_FEATURE\", payload: { clickedFeature: null } });\r\n setClickedFeature(null);\r\n }\r\n\r\n // ── Sort datasets by display order ──\r\n const sortedDatasets = React.useMemo(() => {\r\n if (!addedDatasets?.length) return [];\r\n return [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }, [addedDatasets]);\r\n\r\n return (\r\n <>\r\n {sortedDatasets.map((dataset, index) => {\r\n if (dataset.visible === false) return null;\r\n if (isBuildingDataset(dataset)) return null;\r\n\r\n if (dataset.type === 'WMS' || dataset.datasetType === 'WMS') {\r\n return (\r\n <WMSDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n if (dataset.type === 'MVT' || dataset.datasetType === 'MVT') {\r\n return (\r\n <MVTDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <GeoJsonDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n })}\r\n\r\n {addedFeaturesPopup.map((popup) => (\r\n <React.Fragment key={popup.id}>{popup.popup}</React.Fragment>\r\n ))}\r\n </>\r\n );\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqMoB,SA6PZ,UApPgB,KATJ;AAhMpB,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAC7B,SAAS,QAAQ,OAAO,aAAa;AAGrC,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB,iBAAiB,oBAAoB;AAE9D,SAAS,6BAA6B;AACtC,OAAO,2BAA2B;AAElC,SAAS,sBAAsB;AAY/B,MAAM,oBAAoB,CAAC,YAA6C;AACpE,SAAO,QAAQ,SAAS,eAAe,UAAU;AACrD;AAEA,MAAM,oBAAoB,CAAC,UAAkC;AACzD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,EAAE,QAAQ,MAAM,EAAE;AAC7D,QAAM,SAAS,OAAO,WAAW,OAAO;AACxC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,MAAM,gBAAgB,CAClB,UACA,cACsC;AACtC,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,OAAO;AACjB,MAAI,QAAQ;AACZ,aAAW,WAAW,UAAU;AAC5B,UAAM,aAAc,QAAQ,cAAc,CAAC;AAC3C,UAAM,QAAQ,kBAAkB,WAAW,SAAS,CAAC;AACrD,QAAI,UAAU,KAAM;AACpB,YAAQ;AACR,QAAI,QAAQ,IAAK,OAAM;AACvB,QAAI,QAAQ,IAAK,OAAM;AAAA,EAC3B;AACA,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,KAAK,KAAK,QAAQ,MAAM,MAAM,IAAI,IAAI;AACnD;AAeA,MAAM,sBAAsB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAAgC;AAzEvH;AA0EI,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAqD,IAAI;AACjH,QAAM,sBAAsB,MAAM,OAAO,KAAK;AAG9C,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AACV,QAAI,YAAY;AAEhB,UAAM,OAAO,YAAY;AACrB,UAAI;AACA,cAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,YAAI,UAAW;AAEf,cAAM,MACF,mCAAS,UAAS,sBACZ,UACA,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE;AAEpD,6BAAqB,EAAE;AAAA,MAC3B,SAAS,OAAO;AACZ,gBAAQ,MAAM,gDAAgD,QAAQ,IAAI,MAAM,KAAK;AAAA,MACzF;AAAA,IACJ;AAEA,SAAK;AACL,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACrC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC;AAGtB,QAAM,eAAe,MAAM,QAAQ,MAAM;AA1G7C,QAAAA,KAAA;AA2GQ,QAAI,CAAC,qBAAqB,kBAAkB,SAAS,WAAW,EAAG,QAAO;AAE1E,UAAM,gBAAe,MAAAA,MAAA,kBAAkB,SAAS,CAAC,MAA5B,gBAAAA,IAA+B,aAA/B,mBAAyC;AAC9D,QAAI,CAAC,aAAc,QAAO;AAG1B,QAAI,eAAkB,aAAQ,eAAR,mBAAoB,UAAS;AACnD,QAAI;AAEJ,QAAI,QAAQ,mBAAmB;AAC3B,YAAM,iBAAgB,aAAQ,WAAR,mBAAgB,KAAK,CAAC,UAAe,MAAM,SAAS,QAAQ;AAClF,UAAI,+CAAe,YAAY;AAC3B,YAAI,cAAc,cAAc,UAAU;AACtC,uBAAa,cAAc,WAAW;AAAA,QAC1C;AACA,YAAI,cAAc,cAAc,UAAU;AACtC,cAAI;AACA,kBAAM,YAAY,QAAQ;AAC1B,+BAAmB,aAAa,SAAS;AACzC,kBAAM,QAAQ,cAAc,kBAAkB,UAAU,SAAS;AACjE,gBAAI,OAAO;AACP,oBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,oBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,2BAAa;AAAA,gBACT;AAAA,gBAAe,CAAC,QAAQ;AAAA,gBACxB,CAAC,aAAa,CAAC,OAAO,gBAAgB,GAAG,MAAM,GAAG;AAAA,gBAClD,MAAM;AAAA,gBAAK;AAAA,gBACX,MAAM;AAAA,gBAAK;AAAA,cACf;AAAA,YACJ;AAAA,UACJ,SAAS,OAAO;AACZ,oBAAQ,KAAK,yCAAyC,QAAQ,mBAAmB,KAAK;AAAA,UAC1F;AAAA,QACJ;AACA,YAAI,cAAc,cAAc,WAAW;AACvC,gBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,gBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,gBAAM,YAAY,QAAQ;AAC1B,uBAAa;AAAA,YACT;AAAA,YACA;AAAA,cAAC;AAAA,cACG,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,IAAI;AAAA,cAC/B,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,CAAC;AAAA,cAC5B,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,MAAM;AAAA,cAC9D,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK;AAAA,YACjE;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,aAAkD,iCACjD,oBADiD;AAAA,MAEpD,UAAU,kBAAkB,SAAS,IAAI,CAAC,YAAY;AAClD,YAAI;AACJ,YAAI,oBAAoB,QAAQ,mBAAmB;AAC/C,gBAAM,IAAI,mBAAmB,QAAQ,cAAc,CAAC,GAAG,QAAQ,iBAAiB,CAAC;AACjF,cAAI,MAAM,KAAM,cAAa;AAAA,QACjC;AACA,eAAO,iCACA,UADA;AAAA,UAEH,YAAY,gDACL,QAAQ,aADH;AAAA,YAER,aAAa,QAAQ;AAAA,YACrB,aAAa;AAAA,cACT,oBAAoB,eAAe,SAAY,EAAE,CAAC,gBAAgB,GAAG,WAAW,IAAI,CAAC;AAAA,QAEjG;AAAA,MACJ,CAAC;AAAA,IACL;AAGA,UAAM,gBAA0B,CAAC;AAEjC,QAAI,iBAAiB,WAAW,iBAAiB,cAAc;AAC3D,YAAM,QAAQ;AAAA,QACV,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,MAC3B;AACA,oBAAc,KAAK,GAAG,QAAQ,IAAI,oBAAoB;AAEtD,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe;AAAA,YAEf;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,OAAO,aAAa;AAAA,kBAC7B,MAAK;AAAA,kBACL,OAAO;AAAA,oBACH,kBAAgB,aAAQ,eAAR,mBAAoB,UAAS;AAAA,oBAC7C,iBAAiB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,oBACtE,kBAAkB;AAAA,kBACtB;AAAA;AAAA,cACJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,OAAO,aAAa;AAAA,kBAC7B,MAAK;AAAA,kBACL,QAAQ;AAAA,oBACJ,cAAc;AAAA,oBACd,aAAa,CAAC,uBAAuB,uBAAuB;AAAA,oBAC5D,aAAa;AAAA,kBACjB;AAAA,kBACA,OAAO,EAAE,cAAc,OAAO;AAAA;AAAA,cAClC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC;AAAA,kBACpC,MAAK;AAAA,kBACL;AAAA;AAAA,cACJ;AAAA;AAAA;AAAA,UAjCK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QAkCjC;AAAA,MAER;AAAA,IACJ;AAEA,QAAI,iBAAiB,gBAAgB,iBAAiB,mBAAmB;AACrE,YAAM,SAAS,GAAG,QAAQ,IAAI;AAC9B,oBAAc,KAAK,MAAM;AACzB,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YAEN;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,OAAO,EAAE,cAAc,YAAY,cAAc,GAAG,gBAAgB,EAAE;AAAA;AAAA,YAC1E;AAAA;AAAA,UARK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QASjC;AAAA,MAER;AAAA,IACJ;AAEA,QAAI,iBAAiB,aAAa,iBAAiB,gBAAgB;AAC/D,YAAM,SAAS,GAAG,QAAQ,IAAI;AAC9B,YAAM,YAAY,GAAG,QAAQ,IAAI;AACjC,oBAAc,KAAK,QAAQ,SAAS;AACpC,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YAEN;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,OAAO,EAAE,cAAc,YAAY,gBAAgB,IAAI;AAAA;AAAA,cAC3D;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,OAAO,EAAE,cAAc,WAAW,cAAc,EAAE;AAAA;AAAA,cACtD;AAAA;AAAA;AAAA,UAbK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QAcjC;AAAA,MAER;AAAA,IACJ;AAEA,WAAO;AAAA,EACX,GAAG,CAAC,mBAAmB,QAAQ,MAAM,QAAQ,YAAY,QAAQ,mBAAmB,QAAQ,QAAQ,KAAK,CAAC;AAG1G,QAAM,UAAU,MAAM;AAClB,QAAI,6CAAc,eAAe;AAC7B,mBAAa,QAAQ,MAAM,aAAa,aAAa;AAAA,IACzD;AACA,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,6CAAc,eAAe,QAAQ,MAAM,cAAc,cAAc,CAAC;AAE5E,UAAO,kDAAc,QAAd,YAAqB;AAChC,CAAC;AACD,oBAAoB,cAAc;AAYlC,MAAM,kBAAkB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAA4B;AAzT/G;AA0TI,QAAM,UAAU,QAAQ,OAAO,QAAQ;AACvC,QAAM,gBAAe,wCAAiB,gBAAjB,mBAA8B,gBAAe,QAAQ,MAAM,QAAQ,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC9H,QAAM,eAAa,aAAQ,eAAR,mBAAoB,UAAS;AAChD,QAAM,eAAe,QAAQ,cAAc,YAAY,SAAS,KAAK,WAAW;AAChF,QAAM,mBAAmB,cAAc,OAAM,wCAAiB,gBAAjB,mBAA8B,gBAAe,QAAQ,MAAM,QAAQ,IAAI;AAKpH,QAAM,kBAAkB,oBAAoB,CAAC;AAE7C,QAAM,cAAc,eACd,GAAG,QAAQ,IAAI,YACf,kBACI,GAAG,QAAQ,IAAI,eACf,GAAG,QAAQ,IAAI;AACzB,QAAM,iBAAiB,GAAG,QAAQ,IAAI;AAGtC,QAAM,UAAU,MAAM;AAClB,UAAM,MAAM,eAAe,CAAC,WAAW,IAAI,CAAC,aAAa,cAAc;AACvE,iBAAa,QAAQ,MAAM,GAAG;AAC9B,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,QAAQ,MAAM,aAAa,gBAAgB,cAAc,cAAc,cAAc,CAAC;AAE1F,MAAI,CAAC,SAAS;AACV,YAAQ,MAAM,6DAAwD,QAAQ,IAAI,GAAG;AACrF,WAAO;AAAA,EACX;AAEA,MAAI,iBAAiB;AACjB,WACI,qBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,IAAI;AAAA,UAAa,MAAK;AAAA,UAAiB,gBAAc;AAAA,UACrD,OAAO;AAAA,YACH,wBAAwB;AAAA,YACxB,yBAAyB,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC;AAAA,YAC5E,0BAA0B;AAAA,UAC9B;AAAA,UACA,SAAS;AAAA;AAAA,MACb;AAAA,MACA,oBAAC,SAAM,IAAI,gBAAgB,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,YAAY,cAAc,GAAG,gBAAgB,IAAI,GAAG;AAAA,SAVtG,GAAG,KAAK,IAAI,QAAQ,IAAI,SAWnE;AAAA,EAER;AAEA,MAAI,cAAc;AACd,WACI,oBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA,MAAC;AAAA;AAAA,QACG,IAAI;AAAA,QAAa,MAAK;AAAA,QAAS,gBAAc;AAAA,QAC7C,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,YAAY,kBAAkB,KAAK,uBAAuB,GAAG,uBAAuB,UAAU;AAAA;AAAA,IAC/I,KAJuC,GAAG,KAAK,IAAI,QAAQ,IAAI,SAKnE;AAAA,EAER;AAEA,SACI,qBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA,wBAAC,SAAM,IAAI,aAAa,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,YAAY,gBAAgB,IAAI,GAAG;AAAA,IAGzH,oBAAC,SAAM,IAAI,gBAAgB,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,WAAW,cAAc,EAAE,GAAG;AAAA,OAJhF,GAAG,KAAK,IAAI,QAAQ,IAAI,SAKnE;AAER,CAAC;AACD,gBAAgB,cAAc;AAgB9B,MAAM,kBAAkB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAA4B;AA7Y/G;AA8YI,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,QAAM,UAAU,QAAQ,OAAO,QAAQ;AACvC,QAAM,UAAU,GAAG,QAAQ,IAAI;AAC/B,QAAM,WAAW,GAAG,QAAQ,IAAI;AAEhC,QAAM,cAAc,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ;AACvD,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAmB,CAAC,CAAC;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAwB,IAAI;AAGtE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAA6B,IAAI;AAC7E,QAAM,UAAU,MAAM;AAClB,QAAI,YAAa,gBAAe,SAAS,eAAe,eAAe,CAAC;AAAA,EAC5E,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,UAAU,MAAM;AAClB,iBAAa,QAAQ,MAAM,CAAC,CAAC;AAC7B,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,QAAQ,MAAM,cAAc,cAAc,CAAC;AAG/C,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,eAAe,CAAC,QAAQ,IAAK;AAClC,QAAI,YAAY;AAChB,mBAAe,QAAQ,IAAI,SAAS,QAAQ,IAAI,MAAM,EACjD,KAAK,OAAK;AAAE,UAAI,CAAC,UAAW,WAAU,CAAC;AAAA,IAAG,CAAC,EAC3C,MAAM,MAAM;AAAA,IAAqD,CAAC;AACvE,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACrC,GAAG,CAAC,cAAa,aAAQ,QAAR,mBAAa,UAAS,aAAQ,QAAR,mBAAa,MAAM,CAAC;AAK3D,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,IAAK;AACzC,UAAM,MAAM,IAAI,UAAU,QAAQ;AAClC,QAAI,2BAAK,UAAU;AACf,UAAI,SAAS,CAAC,gBAAgB,QAAQ,IAAI,SAAS,QAAQ,IAAI,QAAQ,UAAU,CAAC,CAAC;AAAA,IACvF;AAAA,EACJ,GAAG,CAAC,KAAK,YAAY,WAAU,aAAQ,QAAR,mBAAa,UAAS,aAAQ,QAAR,mBAAa,MAAM,CAAC;AAEzE,MAAI,CAAC,SAAS;AACV,YAAQ,MAAM,6DAAwD,QAAQ,IAAI,GAAG;AACrF,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,eAAe,OAAO,SAAS,KAAK,OAAO;AAE/D,SACI,iCACI;AAAA,wBAAC,UAAO,IAAI,UAAkD,MAAK,UAAS,OAAO,CAAC,OAAO,GAAG,UAAU,KACpG,8BAAC,SAAM,IAAI,SAAS,MAAK,UAAS,OAAO,EAAE,kBAAkB,KAAK,GAAG,KAD9C,GAAG,KAAK,IAAI,QAAQ,IAAI,SAEnD;AAAA,IACC,eAAe;AAAA,MACZ;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,cAAc;AAAA,UACd,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,MAAM,aAAa,QAAQ,IAAI,SAAS,QAAQ,IAAI,MAAM,IAAI;AAAA;AAAA,MACrF;AAAA,MACA;AAAA,IACJ;AAAA,KACJ;AAER,CAAC;AACD,gBAAgB,cAAc;AAKvB,MAAM,iBAAiB,MAAM;AAChC,QAAM,EAAE,SAAS,UAAU,YAAY,YAAY,IAAI,MAAM,WAAW,UAAU;AAClF,QAAM,EAAE,KAAK,gBAAgB,IAAI,SAAS;AAE1C,QAAM,EAAE,OAAO,aAAa,IAAI,MAAM,WAAW,eAAe;AAChE,QAAM,EAAE,cAAc,IAAI,aAAa;AAEvC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAc,IAAI;AACpE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAGtD,CAAC,CAAC;AAGN,QAAM,iBAAiB,MAAM,OAAiC,CAAC,CAAC;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAmB,CAAC,CAAC;AAErE,QAAM,mBAAmB,MAAM,YAAY,CAAC,aAAqB,aAAuB;AACpF,mBAAe,QAAQ,WAAW,IAAI;AACtC,qBAAiB,OAAO,OAAO,eAAe,OAAO,EAAE,KAAK,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM,YAAY,CAAC,gBAAwB;AAClE,WAAO,eAAe,QAAQ,WAAW;AACzC,qBAAiB,OAAO,OAAO,eAAe,OAAO,EAAE,KAAK,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAGL,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,OAAO,CAAC,mBAAmB,cAAc,WAAW,EAAG;AAE5D,UAAM,iBAAiB,CAAC,MAAqB;AAtfrD;AAufY,YAAM,UAAU,IAAI,sBAAsB,EAAE,OAAO,EAAE,QAAQ,cAAc,CAAC;AAC5E,YAAM,sBAAsB,mCAAU;AAEtC,UAAI,CAAC,qBAAqB;AACtB,0BAAkB,IAAI;AACtB;AAAA,MACJ;AAEA,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,cAAc,CAAC,KAAK,GAAG;AAC7B,YAAM,aAAa,oBAAoB,cAAc,CAAC;AACtD,YAAM,UAAQ,YAAO,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,SAAS,MAAM,CAAC,MAA7E,mBAAiF,OAAM;AAErG,UAAI,yBAAyB,WAAW;AACxC,UAAI,CAAC,0BAA0B,oBAAoB,OAAO;AACtD,cAAM,UAAU,oBAAoB,MAAM;AAC1C,cAAM,WAAW,CAAC,sBAAsB,aAAa,kBAAkB,YAAY,SAAS,SAAS,WAAW,cAAc,SAAS;AACvI,YAAI,gBAAgB;AACpB,mBAAW,UAAU,UAAU;AAC3B,cAAI,QAAQ,SAAS,MAAM,GAAG;AAC1B,4BAAgB,QAAQ,MAAM,GAAG,CAAC,OAAO,MAAM;AAC/C;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,kBAAkB,WAAW,QAAQ,SAAS,GAAG,GAAG;AACpD,0BAAgB,QAAQ,MAAM,GAAG,QAAQ,YAAY,GAAG,CAAC;AAAA,QAC7D;AACA,iCAAyB;AAAA,MAC7B;AAEA,YAAM,YAAY,WAAW,YAAY,WAAW,MAAM,QAAQ,KAAK,IAAI,CAAC;AAC5E,0BAAoB,KAAK;AACzB,0BAAoB,aAAa,iCAAK,aAAL,EAAiB,aAAa,OAAO,aAAa,uBAAuB;AAC1G,wBAAkB,mBAAmB;AAAA,IACzC;AAEA,eAAW,WAAW,eAAe;AACjC,sBAAgB,SAAS,SAAS,sBAAsB,4BAA4B,cAAc;AAAA,IACtG;AAEA,WAAO,MAAM;AACT,iBAAW,WAAW,eAAe;AACjC,wBAAgB,WAAW,OAAO;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,KAAK,iBAAiB,aAAa,CAAC;AAGxC,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,IAAI,UAAU;AAE7B,UAAM,mBAAmB,MAAM;AAC3B,aAAO,MAAM,SAAS;AAAA,IAC1B;AAEA,QAAI,cAAc,WAAW,GAAG;AAC5B,uBAAiB;AACjB;AAAA,IACJ;AAEA,UAAM,kBAAkB,CAAC,MAAqB;AAC1C,YAAM,kBAAkB,IAAI,sBAAsB,EAAE,OAAO,EAAE,QAAQ,cAAc,CAAC;AACpF,aAAO,MAAM,SAAS,gBAAgB,SAAS,IAAI,YAAY;AAAA,IACnE;AAEA,UAAM,mBAAmB,MAAM;AAC3B,uBAAiB;AAAA,IACrB;AAEA,QAAI,GAAG,aAAa,eAAe;AACnC,QAAI,GAAG,cAAc,gBAAgB;AAErC,WAAO,MAAM;AACT,UAAI,IAAI,aAAa,eAAe;AACpC,UAAI,IAAI,cAAc,gBAAgB;AACtC,uBAAiB;AAAA,IACrB;AAAA,EACJ,GAAG,CAAC,KAAK,aAAa,CAAC;AAGvB,QAAM,UAAU,MAAM;AA1kB1B;AA2kBQ,QAAI,CAAC,kBAAkB,GAAC,oBAAe,eAAf,mBAA2B,cAAa;AAC5D,4BAAsB,CAAC,CAAC;AACxB;AAAA,IACJ;AACA,UAAM,QACF;AAAA,MAAC;AAAA;AAAA,QACG,QAAO;AAAA,QACP,aAAa;AAAA,QACb,cAAc;AAAA,QACd,aAAa;AAAA,QACb,gBAAgB;AAAA,QAEhB,UAAU,eAAe,WAAW,YAAY,CAAC;AAAA,QACjD,WAAW,eAAe,WAAW,YAAY,CAAC;AAAA,QAElD;AAAA,UAAC;AAAA;AAAA,YACG,SAAS;AAAA,YACT,eAAe,MAAM,oBAAoB;AAAA;AAAA,QAC7C;AAAA;AAAA,MAPK,eAAe;AAAA,IAQxB;AAEJ,0BAAsB,CAAC,EAAE,IAAI,eAAe,IAAuB,MAAM,CAAC,CAAC;AAAA,EAC/E,GAAG,CAAC,cAAc,CAAC;AAEnB,WAAS,sBAAsB;AAC3B,gBAAY,EAAE,MAAM,uBAAuB,SAAS,EAAE,gBAAgB,KAAK,EAAE,CAAC;AAC9E,sBAAkB,IAAI;AAAA,EAC1B;AAGA,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACvC,QAAI,EAAC,+CAAe,QAAQ,QAAO,CAAC;AACpC,WAAO,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,MAAG;AA3mB9C;AA2mBkD,sBAAE,UAAF,YAAW,OAAM,OAAE,UAAF,YAAW;AAAA,KAAE;AAAA,EAC5E,GAAG,CAAC,aAAa,CAAC;AAElB,SACI,iCACK;AAAA,mBAAe,IAAI,CAAC,SAAS,UAAU;AACpC,UAAI,QAAQ,YAAY,MAAO,QAAO;AACtC,UAAI,kBAAkB,OAAO,EAAG,QAAO;AAEvC,UAAI,QAAQ,SAAS,SAAS,QAAQ,gBAAgB,OAAO;AACzD,eACI;AAAA,UAAC;AAAA;AAAA,YAEG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,gBAAgB;AAAA;AAAA,UAJX,QAAQ;AAAA,QAKjB;AAAA,MAER;AAEA,UAAI,QAAQ,SAAS,SAAS,QAAQ,gBAAgB,OAAO;AACzD,eACI;AAAA,UAAC;AAAA;AAAA,YAEG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,gBAAgB;AAAA;AAAA,UAJX,QAAQ;AAAA,QAKjB;AAAA,MAER;AAEA,aACI;AAAA,QAAC;AAAA;AAAA,UAEG;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,gBAAgB;AAAA;AAAA,QAJX,QAAQ;AAAA,MAKjB;AAAA,IAER,CAAC;AAAA,IAEA,mBAAmB,IAAI,CAAC,UACrB,oBAAC,MAAM,UAAN,EAA+B,gBAAM,SAAjB,MAAM,EAAiB,CAC/C;AAAA,KACL;AAER;","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlaceOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAK7D,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkEhD,CAAA"}
1
+ {"version":3,"file":"PlaceOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAK7D,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkEhD,CAAA"}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
+ import { useTranslations } from "next-intl";
2
3
  import * as React from "react";
3
- import { MapContext } from "../../../../../../store";
4
- import { useFile } from "../../../../../../hooks/files/files";
5
4
  import { toast } from "sonner";
6
- import { useTranslations } from "next-intl";
5
+ import { useFile } from "../../../../../../hooks/files/files";
6
+ import { MapContext } from "../../../../../../store";
7
7
  const PlaceOnMap = ({ file, onPlaced, onCancel }) => {
8
8
  const { state: mapState } = React.useContext(MapContext);
9
9
  const { map } = mapState.map;