@collabdt/core 0.3.1 → 0.3.3

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 (300) hide show
  1. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  2. package/dist/core/components/authentication/ForgotPassword.js +0 -1
  3. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  4. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts +12 -2
  5. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  6. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js +137 -139
  7. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  8. package/dist/core/components/ui/Comments/Comment.d.ts +18 -1
  9. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  10. package/dist/core/components/ui/Comments/Comment.js +94 -23
  11. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  12. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts +38 -0
  13. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts.map +1 -0
  14. package/dist/core/components/ui/Comments/CommentActionButtons.js +134 -0
  15. package/dist/core/components/ui/Comments/CommentActionButtons.js.map +1 -0
  16. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  17. package/dist/core/components/ui/Comments/CommentInput.js +5 -2
  18. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  19. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  20. package/dist/core/components/ui/Comments/CommentsSection.js +86 -42
  21. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  22. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  23. package/dist/core/components/ui/Comments/commentUtils.js +2 -1
  24. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  25. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  26. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js +0 -1
  27. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  28. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  29. package/dist/core/components/ui/InfoSidebar/Container.js +16 -12
  30. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  31. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +1 -2
  32. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  33. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +66 -94
  34. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  35. package/dist/core/components/ui/Sensors/Sensor.d.ts +16 -3
  36. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  37. package/dist/core/components/ui/Sensors/Sensor.js +76 -37
  38. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  39. package/dist/core/components/ui/Sensors/SensorChart.d.ts +12 -2
  40. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  41. package/dist/core/components/ui/Sensors/SensorChart.js +49 -12
  42. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  43. package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts +9 -0
  44. package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts.map +1 -0
  45. package/dist/core/components/ui/Sensors/SensorDetailDialog.js +128 -0
  46. package/dist/core/components/ui/Sensors/SensorDetailDialog.js.map +1 -0
  47. package/dist/core/components/ui/Sensors/SensorInput.d.ts +6 -1
  48. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  49. package/dist/core/components/ui/Sensors/SensorInput.js +94 -9
  50. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  51. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts +3 -1
  52. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  53. package/dist/core/components/ui/Sensors/SensorTagsSection.js +4 -1
  54. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  55. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +1 -3
  56. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  57. package/dist/core/components/ui/Sensors/SensorsSection.js +33 -10
  58. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  59. package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts +7 -0
  60. package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts.map +1 -0
  61. package/dist/core/components/ui/Sensors/TimeZoneSelect.js +56 -0
  62. package/dist/core/components/ui/Sensors/TimeZoneSelect.js.map +1 -0
  63. package/dist/core/components/ui/Sensors/sensorData.d.ts +42 -0
  64. package/dist/core/components/ui/Sensors/sensorData.d.ts.map +1 -0
  65. package/dist/core/components/ui/Sensors/sensorData.js +118 -0
  66. package/dist/core/components/ui/Sensors/sensorData.js.map +1 -0
  67. package/dist/core/components/ui/Sensors/sensorRange.d.ts +24 -0
  68. package/dist/core/components/ui/Sensors/sensorRange.d.ts.map +1 -0
  69. package/dist/core/components/ui/Sensors/sensorRange.js +34 -0
  70. package/dist/core/components/ui/Sensors/sensorRange.js.map +1 -0
  71. package/dist/core/components/ui/Sensors/useSensorSeries.d.ts +15 -0
  72. package/dist/core/components/ui/Sensors/useSensorSeries.d.ts.map +1 -0
  73. package/dist/core/components/ui/Sensors/useSensorSeries.js +63 -0
  74. package/dist/core/components/ui/Sensors/useSensorSeries.js.map +1 -0
  75. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  76. package/dist/core/components/ui/Sidebar.js +27 -4
  77. package/dist/core/components/ui/Sidebar.js.map +1 -1
  78. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  79. package/dist/core/components/ui/ToolbarButton.js +0 -1
  80. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  81. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  82. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js +0 -2
  83. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  84. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  85. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js +0 -10
  86. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  87. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  88. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js +0 -1
  89. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  90. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  91. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js +0 -1
  92. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  93. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  94. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js +0 -1
  95. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  96. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  97. package/dist/core/components/viewers/Data/utils/filterHelper.js +0 -2
  98. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  99. package/dist/core/components/viewers/Viewer.js +1 -1
  100. package/dist/core/components/viewers/Viewer.js.map +1 -1
  101. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  102. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +0 -3
  103. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  104. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  105. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +1 -7
  106. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  107. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  108. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js +1 -9
  109. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  110. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +1 -3
  111. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  112. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  113. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  114. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  115. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js +4 -3
  116. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  117. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +1 -1
  118. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  119. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  120. package/dist/core/components/viewers/bim/src/ClippingPlane.js +0 -1
  121. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  122. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +1 -2
  123. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  124. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +25 -2
  125. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  126. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts +16 -10
  127. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  128. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js +26 -6
  129. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  130. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts +2 -0
  131. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts.map +1 -0
  132. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js +5 -0
  133. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js.map +1 -0
  134. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts +8 -1
  135. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  136. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +15 -3
  137. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  138. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts +44 -0
  139. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map +1 -0
  140. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js +77 -0
  141. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map +1 -0
  142. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts +3 -0
  143. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts.map +1 -0
  144. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js +5 -0
  145. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js.map +1 -0
  146. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts +33 -0
  147. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts.map +1 -0
  148. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js +90 -0
  149. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js.map +1 -0
  150. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  151. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js +2 -2
  152. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  153. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts +7 -1
  154. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  155. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js +50 -73
  156. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  157. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +7 -1
  158. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  159. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +39 -11
  160. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  161. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  162. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js +1 -5
  163. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  164. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  165. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js +0 -1
  166. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  167. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  168. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js +1 -2
  169. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  170. package/dist/core/components/viewers/map/MapViewer.d.ts +1 -2
  171. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  172. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  173. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  174. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  175. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js +11 -14
  176. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  177. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  178. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js +2 -5
  179. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  180. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  181. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +0 -3
  182. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  183. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  184. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js +0 -11
  185. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  186. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  187. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js +0 -1
  188. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  189. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  190. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +0 -1
  191. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  192. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  193. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js +0 -1
  194. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  195. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +1 -2
  196. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  197. package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -2
  198. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  199. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  200. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js +174 -53
  201. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  202. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  203. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js +2 -1
  204. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  205. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +1 -3
  206. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  207. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +74 -42
  208. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  209. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  210. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js +4 -3
  211. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  212. package/dist/core/components/viewers/map/src/MapSidebar/index.js +1 -1
  213. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  214. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  215. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js +0 -1
  216. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  217. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  218. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js +1 -5
  219. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  220. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +1 -3
  221. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  222. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  223. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  224. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  225. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js +1 -3
  226. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  227. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  228. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +0 -1
  229. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  230. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  231. package/dist/core/components/viewers/map/utils/flyToEach.js +0 -1
  232. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  233. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  234. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js +0 -2
  235. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  236. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts +19 -0
  237. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts.map +1 -0
  238. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js +108 -0
  239. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js.map +1 -0
  240. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts +24 -0
  241. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts.map +1 -0
  242. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js +27 -0
  243. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js.map +1 -0
  244. package/dist/core/components/viewers/shared/markers/types.d.ts +66 -0
  245. package/dist/core/components/viewers/shared/markers/types.d.ts.map +1 -0
  246. package/dist/core/components/viewers/shared/markers/types.js +1 -0
  247. package/dist/core/components/viewers/shared/markers/types.js.map +1 -0
  248. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts +22 -0
  249. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts.map +1 -0
  250. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js +233 -0
  251. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js.map +1 -0
  252. package/dist/core/hooks/comments/comments.d.ts +11 -0
  253. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  254. package/dist/core/hooks/comments/comments.js +3 -1
  255. package/dist/core/hooks/comments/comments.js.map +1 -1
  256. package/dist/core/hooks/comments/createCommentHooks.d.ts +11 -0
  257. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  258. package/dist/core/hooks/comments/createCommentHooks.js +30 -1
  259. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  260. package/dist/core/hooks/files/files.d.ts.map +1 -1
  261. package/dist/core/hooks/files/files.js +0 -1
  262. package/dist/core/hooks/files/files.js.map +1 -1
  263. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts +30 -0
  264. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts.map +1 -0
  265. package/dist/core/hooks/ui/useResizableSidebarWidth.js +75 -0
  266. package/dist/core/hooks/ui/useResizableSidebarWidth.js.map +1 -0
  267. package/dist/core/i18n/messages/en.json +10 -1
  268. package/dist/core/i18n/messages/es.json +11 -2
  269. package/dist/core/i18n/messages/fr.json +11 -2
  270. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  271. package/dist/core/store/AppConfig/context.js +4 -1
  272. package/dist/core/store/AppConfig/context.js.map +1 -1
  273. package/dist/core/store/AppConfig/reducer.d.ts +10 -0
  274. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  275. package/dist/core/store/AppConfig/reducer.js +10 -0
  276. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  277. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  278. package/dist/core/store/Datasets/reducer.js +0 -2
  279. package/dist/core/store/Datasets/reducer.js.map +1 -1
  280. package/dist/core/store/Files/reducer.js +0 -1
  281. package/dist/core/store/Files/reducer.js.map +1 -1
  282. package/dist/core/store/Menus/context.d.ts.map +1 -1
  283. package/dist/core/store/Menus/context.js +8 -2
  284. package/dist/core/store/Menus/context.js.map +1 -1
  285. package/dist/core/store/Menus/reducer.d.ts +65 -1
  286. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  287. package/dist/core/store/Menus/reducer.js +39 -3
  288. package/dist/core/store/Menus/reducer.js.map +1 -1
  289. package/dist/core/utils/markerUtils.d.ts +10 -0
  290. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  291. package/dist/core/utils/markerUtils.js +9 -1
  292. package/dist/core/utils/markerUtils.js.map +1 -1
  293. package/dist/core/utils/memcache.d.ts.map +1 -1
  294. package/dist/core/utils/memcache.js +0 -7
  295. package/dist/core/utils/memcache.js.map +1 -1
  296. package/dist/core/utils/timeUtils.d.ts +24 -1
  297. package/dist/core/utils/timeUtils.d.ts.map +1 -1
  298. package/dist/core/utils/timeUtils.js +52 -3
  299. package/dist/core/utils/timeUtils.js.map +1 -1
  300. package/package.json +4 -1
@@ -0,0 +1,118 @@
1
+ import { SensorDataFormat } from "../../../types/dbTypes";
2
+ function toEpoch(value) {
3
+ var _a;
4
+ const ms = Date.parse(value);
5
+ if (!Number.isNaN(ms)) return ms;
6
+ const m = /^(\d{1,2}):(\d{2})(?::(\d{2}))?$/.exec(value.trim());
7
+ if (!m) return NaN;
8
+ const now = /* @__PURE__ */ new Date();
9
+ return Date.UTC(
10
+ now.getUTCFullYear(),
11
+ now.getUTCMonth(),
12
+ now.getUTCDate(),
13
+ Number(m[1]),
14
+ Number(m[2]),
15
+ Number((_a = m[3]) != null ? _a : 0)
16
+ );
17
+ }
18
+ function coerceResult(result, labels, labelToIndex) {
19
+ if (typeof result === "number") return result;
20
+ if (typeof result === "boolean") return result ? 1 : 0;
21
+ if (typeof result === "string") {
22
+ const asNum = Number(result);
23
+ if (result.trim() !== "" && !Number.isNaN(asNum)) return asNum;
24
+ let idx = labelToIndex.get(result);
25
+ if (idx === void 0) {
26
+ idx = labelToIndex.size;
27
+ labelToIndex.set(result, idx);
28
+ labels[idx] = result;
29
+ }
30
+ return idx;
31
+ }
32
+ return NaN;
33
+ }
34
+ function parseCsv(raw) {
35
+ const points = raw.trim().split("\n").map((line) => {
36
+ const [time, valueStr] = line.split(",");
37
+ return { t: toEpoch((time != null ? time : "").trim()), value: parseFloat((valueStr != null ? valueStr : "").trim()) };
38
+ }).filter((p) => !Number.isNaN(p.value) && !Number.isNaN(p.t));
39
+ return { points };
40
+ }
41
+ function shortObservationType(iri) {
42
+ if (typeof iri !== "string" || !iri) return void 0;
43
+ const tail = iri.split("/").pop();
44
+ return tail || iri;
45
+ }
46
+ function extractStaMeta(doc) {
47
+ const uom = doc.unitOfMeasurement;
48
+ const op = doc.ObservedProperty;
49
+ const sensor = doc.Sensor;
50
+ return {
51
+ name: doc.name,
52
+ description: doc.description,
53
+ observationType: shortObservationType(doc.observationType),
54
+ unit: uom ? { name: uom.name, symbol: uom.symbol, definition: uom.definition } : void 0,
55
+ observedProperty: op ? { name: op.name, definition: op.definition, description: op.description } : void 0,
56
+ phenomenonTime: typeof doc.phenomenonTime === "string" ? doc.phenomenonTime : void 0,
57
+ resultTime: typeof doc.resultTime === "string" ? doc.resultTime : void 0,
58
+ observationCount: typeof doc["Observations@iot.count"] === "number" ? doc["Observations@iot.count"] : void 0,
59
+ sensor: sensor ? { name: sensor.name, description: sensor.description, metadata: sensor.metadata } : void 0,
60
+ properties: doc.properties && typeof doc.properties === "object" ? doc.properties : void 0,
61
+ selfLink: typeof doc["@iot.selfLink"] === "string" ? doc["@iot.selfLink"] : void 0
62
+ };
63
+ }
64
+ function parseJson(raw) {
65
+ var _a, _b, _c, _d, _e, _f, _g;
66
+ let doc;
67
+ try {
68
+ doc = JSON.parse(raw);
69
+ } catch (e) {
70
+ return { points: [] };
71
+ }
72
+ const labels = {};
73
+ const labelToIndex = /* @__PURE__ */ new Map();
74
+ const withLabels = (points, unit, meta) => ({
75
+ points,
76
+ unit,
77
+ valueLabels: Object.keys(labels).length ? labels : void 0,
78
+ meta
79
+ });
80
+ if (doc && Array.isArray(doc.dataArray)) {
81
+ const comps = Array.isArray(doc.components) ? doc.components : ["phenomenonTime", "result"];
82
+ const tIdx = comps.indexOf("phenomenonTime") === -1 ? 0 : comps.indexOf("phenomenonTime");
83
+ const rIdx = comps.indexOf("result") === -1 ? 1 : comps.indexOf("result");
84
+ const points = doc.dataArray.map((row) => ({
85
+ t: toEpoch(String(row[tIdx])),
86
+ value: coerceResult(row[rIdx], labels, labelToIndex)
87
+ })).filter((p) => !Number.isNaN(p.value) && !Number.isNaN(p.t));
88
+ return withLabels(points);
89
+ }
90
+ if (doc && Array.isArray(doc.Observations)) {
91
+ const unit = (_b = (_a = doc.unitOfMeasurement) == null ? void 0 : _a.symbol) != null ? _b : void 0;
92
+ const points = doc.Observations.map((obs) => ({
93
+ t: toEpoch(String(obs.phenomenonTime)),
94
+ value: coerceResult(obs.result, labels, labelToIndex)
95
+ })).filter((p) => !Number.isNaN(p.value) && !Number.isNaN(p.t));
96
+ return withLabels(points, unit, extractStaMeta(doc));
97
+ }
98
+ const single = (_c = doc == null ? void 0 : doc.result) != null ? _c : doc == null ? void 0 : doc.value;
99
+ if (single !== void 0) {
100
+ const value = coerceResult(single, labels, labelToIndex);
101
+ if (Number.isNaN(value)) return { points: [] };
102
+ const iso = (_d = doc.phenomenonTime) != null ? _d : doc.timestamp;
103
+ const t = iso ? toEpoch(String(iso)) : NaN;
104
+ const unit = (_g = (_f = doc.unit) != null ? _f : (_e = doc.unitOfMeasurement) == null ? void 0 : _e.symbol) != null ? _g : void 0;
105
+ if (Number.isNaN(t)) return { points: [] };
106
+ return withLabels([{ t, value }], unit);
107
+ }
108
+ return { points: [] };
109
+ }
110
+ function parseSensorSeries(raw, dataFormat) {
111
+ const series = dataFormat === SensorDataFormat.Csv ? parseCsv(raw) : parseJson(raw);
112
+ series.points.sort((a, b) => a.t - b.t);
113
+ return series;
114
+ }
115
+ export {
116
+ parseSensorSeries
117
+ };
118
+ //# sourceMappingURL=sensorData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Sensors/sensorData.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { SensorDataFormat } from '../../../types/dbTypes'\r\n\r\nexport interface SensorSeriesMeta {\r\n name?: string\r\n description?: string\r\n /** Short OGC observation type label, e.g. \"OM_Measurement\". */\r\n observationType?: string\r\n unit?: { name?: string; symbol?: string; definition?: string }\r\n observedProperty?: { name?: string; definition?: string; description?: string }\r\n phenomenonTime?: string\r\n resultTime?: string\r\n observationCount?: number\r\n sensor?: { name?: string; description?: string; metadata?: string }\r\n properties?: Record<string, unknown>\r\n selfLink?: string\r\n}\r\n\r\nexport interface SensorSeries {\r\n points: { t: number; value: number }[]\r\n /** Unit symbol from an STA Datastream's unitOfMeasurement, when present. */\r\n unit?: string\r\n /** For category sensors: ordinal index -> original label, for the chart tooltip. */\r\n valueLabels?: Record<number, string>\r\n /** Full STA Datastream metadata, populated only for STA JSON (for the detail dialog). */\r\n meta?: SensorSeriesMeta\r\n}\r\n\r\n/**\r\n * ISO 8601 (or any Date-parseable) string -> epoch ms. Falls back for a bare\r\n * \"H:MM:SS\" clock (the synthetic CSV shape, no date) by assuming today's UTC date.\r\n * That fallback is a known limitation; STA/ISO inputs are exact.\r\n */\r\nfunction toEpoch(value: string): number {\r\n const ms = Date.parse(value)\r\n if (!Number.isNaN(ms)) return ms\r\n const m = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec(value.trim())\r\n if (!m) return NaN\r\n const now = new Date()\r\n return Date.UTC(\r\n now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),\r\n Number(m[1]), Number(m[2]), Number(m[3] ?? 0),\r\n )\r\n}\r\n\r\nfunction coerceResult(\r\n result: unknown,\r\n labels: Record<number, string>,\r\n labelToIndex: Map<string, number>,\r\n): number {\r\n if (typeof result === 'number') return result\r\n if (typeof result === 'boolean') return result ? 1 : 0\r\n if (typeof result === 'string') {\r\n const asNum = Number(result)\r\n if (result.trim() !== '' && !Number.isNaN(asNum)) return asNum\r\n let idx = labelToIndex.get(result)\r\n if (idx === undefined) {\r\n idx = labelToIndex.size\r\n labelToIndex.set(result, idx)\r\n labels[idx] = result\r\n }\r\n return idx\r\n }\r\n return NaN\r\n}\r\n\r\nfunction parseCsv(raw: string): SensorSeries {\r\n const points = raw\r\n .trim()\r\n .split('\\n')\r\n .map(line => {\r\n const [time, valueStr] = line.split(',')\r\n return { t: toEpoch((time ?? '').trim()), value: parseFloat((valueStr ?? '').trim()) }\r\n })\r\n .filter(p => !Number.isNaN(p.value) && !Number.isNaN(p.t))\r\n return { points }\r\n}\r\n\r\n/** Short label from an OGC observationType IRI (\".../OM_Measurement\" -> \"OM_Measurement\"). */\r\nfunction shortObservationType(iri: unknown): string | undefined {\r\n if (typeof iri !== 'string' || !iri) return undefined\r\n const tail = iri.split('/').pop()\r\n return tail || iri\r\n}\r\n\r\nfunction extractStaMeta(doc: any): SensorSeriesMeta {\r\n const uom = doc.unitOfMeasurement\r\n const op = doc.ObservedProperty\r\n const sensor = doc.Sensor\r\n return {\r\n name: doc.name,\r\n description: doc.description,\r\n observationType: shortObservationType(doc.observationType),\r\n unit: uom ? { name: uom.name, symbol: uom.symbol, definition: uom.definition } : undefined,\r\n observedProperty: op ? { name: op.name, definition: op.definition, description: op.description } : undefined,\r\n phenomenonTime: typeof doc.phenomenonTime === 'string' ? doc.phenomenonTime : undefined,\r\n resultTime: typeof doc.resultTime === 'string' ? doc.resultTime : undefined,\r\n observationCount: typeof doc['Observations@iot.count'] === 'number' ? doc['Observations@iot.count'] : undefined,\r\n sensor: sensor ? { name: sensor.name, description: sensor.description, metadata: sensor.metadata } : undefined,\r\n properties: doc.properties && typeof doc.properties === 'object' ? doc.properties : undefined,\r\n selfLink: typeof doc['@iot.selfLink'] === 'string' ? doc['@iot.selfLink'] : undefined,\r\n }\r\n}\r\n\r\n// JSON shapes are external (OGC SensorThings); typed as `any` since we sniff by shape.\r\nfunction parseJson(raw: string): SensorSeries {\r\n let doc: any\r\n try {\r\n doc = JSON.parse(raw)\r\n } catch {\r\n return { points: [] }\r\n }\r\n\r\n const labels: Record<number, string> = {}\r\n const labelToIndex = new Map<string, number>()\r\n const withLabels = (\r\n points: SensorSeries['points'],\r\n unit?: string,\r\n meta?: SensorSeriesMeta,\r\n ): SensorSeries => ({\r\n points,\r\n unit,\r\n valueLabels: Object.keys(labels).length ? labels : undefined,\r\n meta,\r\n })\r\n\r\n // dataArray form: { components, dataArray: [[phenomenonTime, result], ...] }\r\n if (doc && Array.isArray(doc.dataArray)) {\r\n const comps: string[] = Array.isArray(doc.components) ? doc.components : ['phenomenonTime', 'result']\r\n const tIdx = comps.indexOf('phenomenonTime') === -1 ? 0 : comps.indexOf('phenomenonTime')\r\n const rIdx = comps.indexOf('result') === -1 ? 1 : comps.indexOf('result')\r\n const points = doc.dataArray\r\n .map((row: unknown[]) => ({\r\n t: toEpoch(String(row[tIdx])),\r\n value: coerceResult(row[rIdx], labels, labelToIndex),\r\n }))\r\n .filter((p: { t: number; value: number }) => !Number.isNaN(p.value) && !Number.isNaN(p.t))\r\n return withLabels(points)\r\n }\r\n\r\n // STA Datastream: { unitOfMeasurement, Observations: [{ phenomenonTime, result }] }\r\n if (doc && Array.isArray(doc.Observations)) {\r\n const unit: string | undefined = doc.unitOfMeasurement?.symbol ?? undefined\r\n const points = doc.Observations\r\n .map((obs: any) => ({\r\n t: toEpoch(String(obs.phenomenonTime)),\r\n value: coerceResult(obs.result, labels, labelToIndex),\r\n }))\r\n .filter((p: { t: number; value: number }) => !Number.isNaN(p.value) && !Number.isNaN(p.t))\r\n return withLabels(points, unit, extractStaMeta(doc))\r\n }\r\n\r\n // Single reading. ?format=reading emits { type, unit, timestamp, value, ... };\r\n // an STA-style single reading would use { phenomenonTime, result }. Handle both.\r\n const single = doc?.result ?? doc?.value\r\n if (single !== undefined) {\r\n const value = coerceResult(single, labels, labelToIndex)\r\n if (Number.isNaN(value)) return { points: [] }\r\n const iso = doc.phenomenonTime ?? doc.timestamp\r\n const t = iso ? toEpoch(String(iso)) : NaN\r\n const unit: string | undefined = doc.unit ?? doc.unitOfMeasurement?.symbol ?? undefined\r\n if (Number.isNaN(t)) return { points: [] }\r\n return withLabels([{ t, value }], unit)\r\n }\r\n\r\n return { points: [] }\r\n}\r\n\r\n/** Parse a sensor data payload into a chart-ready series. CSV is header-less time,value; JSON auto-detects STA / dataArray / single reading. */\r\nexport function parseSensorSeries(\r\n raw: string,\r\n dataFormat: SensorDataFormat | `${SensorDataFormat}`,\r\n): SensorSeries {\r\n const series = dataFormat === SensorDataFormat.Csv ? parseCsv(raw) : parseJson(raw)\r\n // Range filtering, the chart <Brush>, and the numeric time axis all assume points are\r\n // ascending by time. Source feeds are not guaranteed sorted (some OGC servers return\r\n // newest-first), so normalize here rather than depend on producer order.\r\n series.points.sort((a, b) => a.t - b.t)\r\n return series\r\n}\r\n"],"mappings":"AAGA,SAAS,wBAAwB;AAgCjC,SAAS,QAAQ,OAAuB;AAnCxC;AAoCE,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,MAAI,CAAC,OAAO,MAAM,EAAE,EAAG,QAAO;AAC9B,QAAM,IAAI,mCAAmC,KAAK,MAAM,KAAK,CAAC;AAC9D,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,MAAM,oBAAI,KAAK;AACrB,SAAO,KAAK;AAAA,IACV,IAAI,eAAe;AAAA,IAAG,IAAI,YAAY;AAAA,IAAG,IAAI,WAAW;AAAA,IACxD,OAAO,EAAE,CAAC,CAAC;AAAA,IAAG,OAAO,EAAE,CAAC,CAAC;AAAA,IAAG,QAAO,OAAE,CAAC,MAAH,YAAQ,CAAC;AAAA,EAC9C;AACF;AAEA,SAAS,aACP,QACA,QACA,cACQ;AACR,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,WAAW,UAAW,QAAO,SAAS,IAAI;AACrD,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,QAAQ,OAAO,MAAM;AAC3B,QAAI,OAAO,KAAK,MAAM,MAAM,CAAC,OAAO,MAAM,KAAK,EAAG,QAAO;AACzD,QAAI,MAAM,aAAa,IAAI,MAAM;AACjC,QAAI,QAAQ,QAAW;AACrB,YAAM,aAAa;AACnB,mBAAa,IAAI,QAAQ,GAAG;AAC5B,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,SAAS,KAA2B;AAC3C,QAAM,SAAS,IACZ,KAAK,EACL,MAAM,IAAI,EACV,IAAI,UAAQ;AACX,UAAM,CAAC,MAAM,QAAQ,IAAI,KAAK,MAAM,GAAG;AACvC,WAAO,EAAE,GAAG,SAAS,sBAAQ,IAAI,KAAK,CAAC,GAAG,OAAO,YAAY,8BAAY,IAAI,KAAK,CAAC,EAAE;AAAA,EACvF,CAAC,EACA,OAAO,OAAK,CAAC,OAAO,MAAM,EAAE,KAAK,KAAK,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;AAC3D,SAAO,EAAE,OAAO;AAClB;AAGA,SAAS,qBAAqB,KAAkC;AAC9D,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,QAAM,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI;AAChC,SAAO,QAAQ;AACjB;AAEA,SAAS,eAAe,KAA4B;AAClD,QAAM,MAAM,IAAI;AAChB,QAAM,KAAK,IAAI;AACf,QAAM,SAAS,IAAI;AACnB,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,aAAa,IAAI;AAAA,IACjB,iBAAiB,qBAAqB,IAAI,eAAe;AAAA,IACzD,MAAM,MAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,IAAI,QAAQ,YAAY,IAAI,WAAW,IAAI;AAAA,IACjF,kBAAkB,KAAK,EAAE,MAAM,GAAG,MAAM,YAAY,GAAG,YAAY,aAAa,GAAG,YAAY,IAAI;AAAA,IACnG,gBAAgB,OAAO,IAAI,mBAAmB,WAAW,IAAI,iBAAiB;AAAA,IAC9E,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,kBAAkB,OAAO,IAAI,wBAAwB,MAAM,WAAW,IAAI,wBAAwB,IAAI;AAAA,IACtG,QAAQ,SAAS,EAAE,MAAM,OAAO,MAAM,aAAa,OAAO,aAAa,UAAU,OAAO,SAAS,IAAI;AAAA,IACrG,YAAY,IAAI,cAAc,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IACpF,UAAU,OAAO,IAAI,eAAe,MAAM,WAAW,IAAI,eAAe,IAAI;AAAA,EAC9E;AACF;AAGA,SAAS,UAAU,KAA2B;AA3G9C;AA4GE,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,GAAG;AAAA,EACtB,SAAQ;AACN,WAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,EACtB;AAEA,QAAM,SAAiC,CAAC;AACxC,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,aAAa,CACjB,QACA,MACA,UACkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,aAAa,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,IACnD;AAAA,EACF;AAGA,MAAI,OAAO,MAAM,QAAQ,IAAI,SAAS,GAAG;AACvC,UAAM,QAAkB,MAAM,QAAQ,IAAI,UAAU,IAAI,IAAI,aAAa,CAAC,kBAAkB,QAAQ;AACpG,UAAM,OAAO,MAAM,QAAQ,gBAAgB,MAAM,KAAK,IAAI,MAAM,QAAQ,gBAAgB;AACxF,UAAM,OAAO,MAAM,QAAQ,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ;AACxE,UAAM,SAAS,IAAI,UAChB,IAAI,CAAC,SAAoB;AAAA,MACxB,GAAG,QAAQ,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,MAC5B,OAAO,aAAa,IAAI,IAAI,GAAG,QAAQ,YAAY;AAAA,IACrD,EAAE,EACD,OAAO,CAAC,MAAoC,CAAC,OAAO,MAAM,EAAE,KAAK,KAAK,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;AAC3F,WAAO,WAAW,MAAM;AAAA,EAC1B;AAGA,MAAI,OAAO,MAAM,QAAQ,IAAI,YAAY,GAAG;AAC1C,UAAM,QAA2B,eAAI,sBAAJ,mBAAuB,WAAvB,YAAiC;AAClE,UAAM,SAAS,IAAI,aAChB,IAAI,CAAC,SAAc;AAAA,MAClB,GAAG,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,MACrC,OAAO,aAAa,IAAI,QAAQ,QAAQ,YAAY;AAAA,IACtD,EAAE,EACD,OAAO,CAAC,MAAoC,CAAC,OAAO,MAAM,EAAE,KAAK,KAAK,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;AAC3F,WAAO,WAAW,QAAQ,MAAM,eAAe,GAAG,CAAC;AAAA,EACrD;AAIA,QAAM,UAAS,gCAAK,WAAL,YAAe,2BAAK;AACnC,MAAI,WAAW,QAAW;AACxB,UAAM,QAAQ,aAAa,QAAQ,QAAQ,YAAY;AACvD,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO,EAAE,QAAQ,CAAC,EAAE;AAC7C,UAAM,OAAM,SAAI,mBAAJ,YAAsB,IAAI;AACtC,UAAM,IAAI,MAAM,QAAQ,OAAO,GAAG,CAAC,IAAI;AACvC,UAAM,QAA2B,eAAI,SAAJ,aAAY,SAAI,sBAAJ,mBAAuB,WAAnC,YAA6C;AAC9E,QAAI,OAAO,MAAM,CAAC,EAAG,QAAO,EAAE,QAAQ,CAAC,EAAE;AACzC,WAAO,WAAW,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI;AAAA,EACxC;AAEA,SAAO,EAAE,QAAQ,CAAC,EAAE;AACtB;AAGO,SAAS,kBACd,KACA,YACc;AACd,QAAM,SAAS,eAAe,iBAAiB,MAAM,SAAS,GAAG,IAAI,UAAU,GAAG;AAIlF,SAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,SAAO;AACT;","names":[]}
@@ -0,0 +1,24 @@
1
+ export type RangePreset = 'all' | 'day' | 'hour' | 'custom';
2
+ export interface RangeBounds {
3
+ from: number;
4
+ to: number;
5
+ }
6
+ /** Bounds for a preset, computed from the latest point's time. `null` means "no filter" (all). */
7
+ export declare function rangeBounds(preset: RangePreset, points: {
8
+ t: number;
9
+ }[], custom?: RangeBounds | null): RangeBounds | null;
10
+ /** Inclusive filter. `null` bounds returns the points unchanged. */
11
+ export declare function filterByRange<T extends {
12
+ t: number;
13
+ }>(points: T[], bounds: RangeBounds | null): T[];
14
+ /**
15
+ * Start/end indices into `points` (assumed ascending by `t`) for a recharts <Brush>.
16
+ * `null` bounds spans the full series.
17
+ */
18
+ export declare function indicesForBounds(points: {
19
+ t: number;
20
+ }[], bounds: RangeBounds | null): {
21
+ startIndex: number;
22
+ endIndex: number;
23
+ };
24
+ //# sourceMappingURL=sensorRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensorRange.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/sensorRange.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE3D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAKD,kGAAkG;AAClG,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAC1B,WAAW,GAAG,IAAI,CAMpB;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC,EAAE,CAGnG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACvB,MAAM,EAAE,WAAW,GAAG,IAAI,GACzB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAW1C"}
@@ -0,0 +1,34 @@
1
+ const HOUR = 36e5;
2
+ const DAY = 24 * HOUR;
3
+ function rangeBounds(preset, points, custom) {
4
+ if (preset === "custom") return custom != null ? custom : null;
5
+ if (preset === "all" || points.length === 0) return null;
6
+ const to = points.reduce((m, p) => Math.max(m, p.t), points[0].t);
7
+ const span = preset === "hour" ? HOUR : DAY;
8
+ return { from: to - span, to };
9
+ }
10
+ function filterByRange(points, bounds) {
11
+ if (!bounds) return points;
12
+ return points.filter((p) => p.t >= bounds.from && p.t <= bounds.to);
13
+ }
14
+ function indicesForBounds(points, bounds) {
15
+ if (points.length === 0) return { startIndex: 0, endIndex: 0 };
16
+ if (!bounds) return { startIndex: 0, endIndex: points.length - 1 };
17
+ let startIndex = points.findIndex((p) => p.t >= bounds.from);
18
+ if (startIndex < 0) startIndex = points.length - 1;
19
+ let endIndex = -1;
20
+ for (let i = points.length - 1; i >= 0; i--) {
21
+ if (points[i].t <= bounds.to) {
22
+ endIndex = i;
23
+ break;
24
+ }
25
+ }
26
+ if (endIndex < startIndex) endIndex = startIndex;
27
+ return { startIndex, endIndex };
28
+ }
29
+ export {
30
+ filterByRange,
31
+ indicesForBounds,
32
+ rangeBounds
33
+ };
34
+ //# sourceMappingURL=sensorRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Sensors/sensorRange.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nexport type RangePreset = 'all' | 'day' | 'hour' | 'custom'\r\n\r\nexport interface RangeBounds {\r\n from: number\r\n to: number\r\n}\r\n\r\nconst HOUR = 3_600_000\r\nconst DAY = 24 * HOUR\r\n\r\n/** Bounds for a preset, computed from the latest point's time. `null` means \"no filter\" (all). */\r\nexport function rangeBounds(\r\n preset: RangePreset,\r\n points: { t: number }[],\r\n custom?: RangeBounds | null,\r\n): RangeBounds | null {\r\n if (preset === 'custom') return custom ?? null\r\n if (preset === 'all' || points.length === 0) return null\r\n const to = points.reduce((m, p) => Math.max(m, p.t), points[0].t)\r\n const span = preset === 'hour' ? HOUR : DAY\r\n return { from: to - span, to }\r\n}\r\n\r\n/** Inclusive filter. `null` bounds returns the points unchanged. */\r\nexport function filterByRange<T extends { t: number }>(points: T[], bounds: RangeBounds | null): T[] {\r\n if (!bounds) return points\r\n return points.filter(p => p.t >= bounds.from && p.t <= bounds.to)\r\n}\r\n\r\n/**\r\n * Start/end indices into `points` (assumed ascending by `t`) for a recharts <Brush>.\r\n * `null` bounds spans the full series.\r\n */\r\nexport function indicesForBounds(\r\n points: { t: number }[],\r\n bounds: RangeBounds | null,\r\n): { startIndex: number; endIndex: number } {\r\n if (points.length === 0) return { startIndex: 0, endIndex: 0 }\r\n if (!bounds) return { startIndex: 0, endIndex: points.length - 1 }\r\n let startIndex = points.findIndex(p => p.t >= bounds.from)\r\n if (startIndex < 0) startIndex = points.length - 1\r\n let endIndex = -1\r\n for (let i = points.length - 1; i >= 0; i--) {\r\n if (points[i].t <= bounds.to) { endIndex = i; break }\r\n }\r\n if (endIndex < startIndex) endIndex = startIndex\r\n return { startIndex, endIndex }\r\n}\r\n"],"mappings":"AAUA,MAAM,OAAO;AACb,MAAM,MAAM,KAAK;AAGV,SAAS,YACd,QACA,QACA,QACoB;AACpB,MAAI,WAAW,SAAU,QAAO,0BAAU;AAC1C,MAAI,WAAW,SAAS,OAAO,WAAW,EAAG,QAAO;AACpD,QAAM,KAAK,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;AAChE,QAAM,OAAO,WAAW,SAAS,OAAO;AACxC,SAAO,EAAE,MAAM,KAAK,MAAM,GAAG;AAC/B;AAGO,SAAS,cAAuC,QAAa,QAAiC;AACnG,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,OAAO,OAAK,EAAE,KAAK,OAAO,QAAQ,EAAE,KAAK,OAAO,EAAE;AAClE;AAMO,SAAS,iBACd,QACA,QAC0C;AAC1C,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,YAAY,GAAG,UAAU,EAAE;AAC7D,MAAI,CAAC,OAAQ,QAAO,EAAE,YAAY,GAAG,UAAU,OAAO,SAAS,EAAE;AACjE,MAAI,aAAa,OAAO,UAAU,OAAK,EAAE,KAAK,OAAO,IAAI;AACzD,MAAI,aAAa,EAAG,cAAa,OAAO,SAAS;AACjD,MAAI,WAAW;AACf,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,QAAI,OAAO,CAAC,EAAE,KAAK,OAAO,IAAI;AAAE,iBAAW;AAAG;AAAA,IAAM;AAAA,EACtD;AACA,MAAI,WAAW,WAAY,YAAW;AACtC,SAAO,EAAE,YAAY,SAAS;AAChC;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { type SensorSeries } from './sensorData';
2
+ import type { SensorDataFormat } from '../../../types/dbTypes';
3
+ export interface UseSensorSeriesResult extends SensorSeries {
4
+ isLoading: boolean;
5
+ }
6
+ /**
7
+ * Fetch `dataUrl`, parse it (CSV or OGC JSON via parseSensorSeries), and re-fetch on
8
+ * `updateFrequencyMs` (floored at 1s) while `enabled`. Each tick replaces the series (the
9
+ * synthetic API serves a rolling window ending "now"). Aborts in-flight fetches and clears
10
+ * the interval on disable/unmount/param change; a failed poll keeps the last good series.
11
+ */
12
+ export declare function useSensorSeries(dataUrl: string, dataFormat: SensorDataFormat | `${SensorDataFormat}`, updateFrequencyMs: number, opts: {
13
+ enabled: boolean;
14
+ }): UseSensorSeriesResult;
15
+ //# sourceMappingURL=useSensorSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSensorSeries.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/useSensorSeries.ts"],"names":[],"mappings":"AAOA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,gBAAgB,GAAG,GAAG,gBAAgB,EAAE,EACpD,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACzB,qBAAqB,CA0CvB"}
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ import * as React from "react";
22
+ import { parseSensorSeries } from "./sensorData";
23
+ const MIN_POLL_MS = 1e3;
24
+ function useSensorSeries(dataUrl, dataFormat, updateFrequencyMs, opts) {
25
+ const { enabled } = opts;
26
+ const [series, setSeries] = React.useState({ points: [] });
27
+ const [isLoading, setIsLoading] = React.useState(false);
28
+ React.useEffect(() => {
29
+ if (!enabled || !dataUrl) {
30
+ setSeries({ points: [] });
31
+ setIsLoading(false);
32
+ return;
33
+ }
34
+ let cancelled = false;
35
+ const controller = new AbortController();
36
+ const load = async (showLoading) => {
37
+ if (showLoading) setIsLoading(true);
38
+ try {
39
+ const res = await fetch(dataUrl, { signal: controller.signal });
40
+ const text = await res.text();
41
+ if (cancelled) return;
42
+ setSeries(parseSensorSeries(text, dataFormat));
43
+ } catch (err) {
44
+ if (cancelled || controller.signal.aborted) return;
45
+ console.error("Error fetching sensor data:", err);
46
+ } finally {
47
+ if (!cancelled && showLoading) setIsLoading(false);
48
+ }
49
+ };
50
+ void load(true);
51
+ const timer = setInterval(() => void load(false), Math.max(updateFrequencyMs || 0, MIN_POLL_MS));
52
+ return () => {
53
+ cancelled = true;
54
+ controller.abort();
55
+ clearInterval(timer);
56
+ };
57
+ }, [dataUrl, dataFormat, updateFrequencyMs, enabled]);
58
+ return __spreadProps(__spreadValues({}, series), { isLoading });
59
+ }
60
+ export {
61
+ useSensorSeries
62
+ };
63
+ //# sourceMappingURL=useSensorSeries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Sensors/useSensorSeries.ts"],"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 { parseSensorSeries, type SensorSeries } from './sensorData'\r\n\r\nimport type { SensorDataFormat } from '../../../types/dbTypes'\r\n\r\nconst MIN_POLL_MS = 1000\r\n\r\nexport interface UseSensorSeriesResult extends SensorSeries {\r\n isLoading: boolean\r\n}\r\n\r\n/**\r\n * Fetch `dataUrl`, parse it (CSV or OGC JSON via parseSensorSeries), and re-fetch on\r\n * `updateFrequencyMs` (floored at 1s) while `enabled`. Each tick replaces the series (the\r\n * synthetic API serves a rolling window ending \"now\"). Aborts in-flight fetches and clears\r\n * the interval on disable/unmount/param change; a failed poll keeps the last good series.\r\n */\r\nexport function useSensorSeries(\r\n dataUrl: string,\r\n dataFormat: SensorDataFormat | `${SensorDataFormat}`,\r\n updateFrequencyMs: number,\r\n opts: { enabled: boolean },\r\n): UseSensorSeriesResult {\r\n const { enabled } = opts\r\n const [series, setSeries] = React.useState<SensorSeries>({ points: [] })\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !dataUrl) {\r\n setSeries({ points: [] })\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n let cancelled = false\r\n const controller = new AbortController()\r\n\r\n const load = async (showLoading: boolean) => {\r\n if (showLoading) setIsLoading(true)\r\n try {\r\n const res = await fetch(dataUrl, { signal: controller.signal })\r\n const text = await res.text()\r\n if (cancelled) return\r\n setSeries(parseSensorSeries(text, dataFormat))\r\n } catch (err) {\r\n if (cancelled || controller.signal.aborted) return\r\n console.error('Error fetching sensor data:', err)\r\n // keep last good series\r\n } finally {\r\n if (!cancelled && showLoading) setIsLoading(false)\r\n }\r\n }\r\n\r\n void load(true)\r\n const timer = setInterval(() => void load(false), Math.max(updateFrequencyMs || 0, MIN_POLL_MS))\r\n\r\n return () => {\r\n cancelled = true\r\n controller.abort()\r\n clearInterval(timer)\r\n }\r\n }, [dataUrl, dataFormat, updateFrequencyMs, enabled])\r\n\r\n return { ...series, isLoading }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAKA,YAAY,WAAW;AAEvB,SAAS,yBAA4C;AAIrD,MAAM,cAAc;AAYb,SAAS,gBACd,SACA,YACA,mBACA,MACuB;AACvB,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAuB,EAAE,QAAQ,CAAC,EAAE,CAAC;AACvE,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AAEtD,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,WAAW,CAAC,SAAS;AACxB,gBAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;AACxB,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,UAAM,aAAa,IAAI,gBAAgB;AAEvC,UAAM,OAAO,OAAO,gBAAyB;AAC3C,UAAI,YAAa,cAAa,IAAI;AAClC,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,SAAS,EAAE,QAAQ,WAAW,OAAO,CAAC;AAC9D,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,UAAW;AACf,kBAAU,kBAAkB,MAAM,UAAU,CAAC;AAAA,MAC/C,SAAS,KAAK;AACZ,YAAI,aAAa,WAAW,OAAO,QAAS;AAC5C,gBAAQ,MAAM,+BAA+B,GAAG;AAAA,MAElD,UAAE;AACA,YAAI,CAAC,aAAa,YAAa,cAAa,KAAK;AAAA,MACnD;AAAA,IACF;AAEA,SAAK,KAAK,IAAI;AACd,UAAM,QAAQ,YAAY,MAAM,KAAK,KAAK,KAAK,GAAG,KAAK,IAAI,qBAAqB,GAAG,WAAW,CAAC;AAE/F,WAAO,MAAM;AACX,kBAAY;AACZ,iBAAW,MAAM;AACjB,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,mBAAmB,OAAO,CAAC;AAEpD,SAAO,iCAAK,SAAL,EAAa,UAAU;AAChC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Sidebar.tsx"],"names":[],"mappings":"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"}
@@ -37,6 +37,7 @@ import * as LR from "lucide-react";
37
37
  import { useTranslations } from "next-intl";
38
38
  import * as React from "react";
39
39
  import { useIsMobile } from "../../hooks/ui/use-mobile";
40
+ import { useResizableSidebarWidth } from "../../hooks/ui/useResizableSidebarWidth";
40
41
  import { MenusContext } from "../../store/Menus/context";
41
42
  import { cn } from "../../utils/utils";
42
43
  import NavigationBar from "../TopNavigationBar";
@@ -102,6 +103,13 @@ const SidebarProvider = React.forwardRef(
102
103
  "geocoderUrl"
103
104
  ]);
104
105
  const isMobile = useIsMobile();
106
+ const tInfo = useTranslations("InfoSidebar");
107
+ const {
108
+ width: infoWidth,
109
+ isResizing: infoResizing,
110
+ canResize: canResizeInfo,
111
+ startResize: startInfoResize
112
+ } = useResizableSidebarWidth();
105
113
  const [openMobile, setOpenMobile] = React.useState(false);
106
114
  const [openInfo, setOpenInfo] = React.useState(false);
107
115
  const [bugReportOpen, setBugReportOpen] = React.useState(false);
@@ -194,20 +202,35 @@ const SidebarProvider = React.forwardRef(
194
202
  }, props), {
195
203
  children: [
196
204
  children,
197
- /* @__PURE__ */ jsx(
205
+ /* @__PURE__ */ jsxs(
198
206
  "div",
199
207
  {
200
208
  "data-state": openInfo ? "open" : "closed",
201
209
  "aria-hidden": !openInfo,
202
210
  className: cn(
203
- "fixed inset-y-0 z-40 w-full sm:w-[410px] overflow-hidden transition-[transform,opacity] duration-300 ease-in-out will-change-transform",
211
+ "fixed inset-y-0 z-40 w-full overflow-hidden transition-[transform,opacity] duration-300 ease-in-out will-change-transform",
212
+ infoResizing && "select-none",
204
213
  openInfo ? "translate-x-0 opacity-100" : "-translate-x-full opacity-0 pointer-events-none"
205
214
  ),
206
215
  style: {
207
216
  left: isMobile ? "0" : open ? "var(--sidebar-width)" : "var(--sidebar-width-icon)",
208
- width: isMobile ? "100%" : "400px"
217
+ // Desktop: user-resizable width (persisted). Mobile: full-width.
218
+ width: isMobile ? "100%" : infoWidth
209
219
  },
210
- children: /* @__PURE__ */ jsx(InfoSidebar, { minioBaseUrl, martinBaseUrl, organization, pointcloudApiUrl })
220
+ children: [
221
+ /* @__PURE__ */ jsx(InfoSidebar, { minioBaseUrl, martinBaseUrl, organization, pointcloudApiUrl }),
222
+ canResizeInfo && /* @__PURE__ */ jsx(
223
+ "div",
224
+ {
225
+ role: "separator",
226
+ "aria-orientation": "vertical",
227
+ "aria-label": tInfo("resizeHandleLabel"),
228
+ onPointerDown: startInfoResize,
229
+ style: { touchAction: "none" },
230
+ className: "absolute inset-y-0 right-0 z-10 w-0.5 cursor-ew-resize bg-border/80 hover:bg-accent"
231
+ }
232
+ )
233
+ ]
211
234
  }
212
235
  )
213
236
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/ui/Sidebar.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 { Slot } from '@radix-ui/react-slot'\r\nimport { cva } from 'class-variance-authority'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMobile } from '../../hooks/ui/use-mobile'\r\nimport { MenusContext } from '../../store/Menus/context'\r\nimport { cn } from '../../utils/utils'\r\nimport NavigationBar from '../TopNavigationBar'\r\n\r\nimport { Button } from './Button'\r\nimport { InfoSidebar } from './InfoSidebar'\r\nimport { Input } from './Input'\r\nimport { Separator } from './Separator'\r\nimport {\r\n Sheet,\r\n SheetContent,\r\n SheetDescription,\r\n SheetHeader,\r\n SheetTitle,\r\n} from './Sheet'\r\nimport { Skeleton } from './Skeleton'\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from './Tooltip'\r\n\r\n// Menus context\r\n\r\n// Custom components\r\n\r\n\r\n\r\nimport type { VariantProps} from 'class-variance-authority';\r\n\r\n\r\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state'\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\r\nconst SIDEBAR_WIDTH = '16rem'\r\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\r\nconst SIDEBAR_WIDTH_ICON = '3rem'\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\r\n\r\ntype SidebarContextProps = {\r\n sidebarState: 'expanded' | 'collapsed'\r\n open: boolean\r\n setOpenMenu: (open: boolean) => void\r\n openMobile: boolean\r\n setOpenMobile: (open: boolean) => void\r\n openInfo: boolean\r\n setOpenInfo: (open: boolean) => void\r\n isMobile: boolean\r\n toggleMenuSidebar: () => void\r\n toggleInfoSidebar: () => void\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n // Rendered outside the mobile Sheet (see AppSidebar) so they survive the\r\n // Sheet closing — Radix unmounts the Sheet's whole subtree on close, which\r\n // would otherwise take these dialogs down with it right after they open.\r\n bugReportOpen: boolean\r\n setBugReportOpen: (open: boolean) => void\r\n featureRequestOpen: boolean\r\n setFeatureRequestOpen: (open: boolean) => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext)\r\n if (!context) {\r\n throw new Error('useSidebar must be used within a SidebarProvider.')\r\n }\r\n\r\n return context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n organization?: import('../../types/dbTypes').Organization\r\n pointcloudApiUrl?: string\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n }\r\n >(\r\n (\r\n {\r\n defaultOpen = false,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n minioBaseUrl,\r\n martinBaseUrl,\r\n organization,\r\n pointcloudApiUrl,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const isMobile = useIsMobile()\r\n const [openMobile, setOpenMobile] = React.useState(false)\r\n const [openInfo, setOpenInfo] = React.useState(false)\r\n const [bugReportOpen, setBugReportOpen] = React.useState(false)\r\n const [featureRequestOpen, setFeatureRequestOpen] = React.useState(false)\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(defaultOpen)\r\n const open = openProp ?? _open\r\n const setOpenMenu = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === 'function' ? value(open) : value\r\n if (setOpenProp) {\r\n setOpenProp(openState)\r\n }\r\n else {\r\n _setOpen(openState)\r\n }\r\n\r\n // This sets the cookie to keep the sidebar state.\r\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\r\n },\r\n [setOpenProp, open],\r\n )\r\n\r\n // Helper to toggle the menu sidebar.\r\n const toggleMenuSidebar = React.useCallback(() => {\r\n if (isMobile) {\r\n setOpenMobile(open => !open)\r\n }\r\n else {\r\n setOpenMenu((open) => {\r\n const newOpenState = !open\r\n // If opening menu sidebar, close info sidebar\r\n // if (newOpenState && openInfo) {\r\n // setOpenInfo(false)\r\n // }\r\n return newOpenState\r\n })\r\n }\r\n }, [isMobile, setOpenMenu, setOpenMobile, openInfo, setOpenInfo])\r\n\r\n // Helper to toggle the info sidebar.\r\n const toggleInfoSidebar = React.useCallback(() => {\r\n setOpenInfo((openInfoState) => {\r\n const newOpenInfoState = !openInfoState\r\n // If opening info sidebar, close menu sidebar\r\n if (newOpenInfoState && (isMobile ? openMobile : open)) {\r\n if (isMobile) {\r\n setOpenMobile(false)\r\n }\r\n else {\r\n setOpenMenu(false)\r\n }\r\n }\r\n return newOpenInfoState\r\n })\r\n }, [setOpenInfo, open, openMobile, isMobile, setOpenMenu, setOpenMobile])\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT\r\n && (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault()\r\n toggleMenuSidebar()\r\n }\r\n\r\n // Close InfoSidebar on Escape key\r\n if (event.key === 'Escape' && openInfo) {\r\n event.preventDefault()\r\n setOpenInfo(false)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', handleKeyDown)\r\n return () => window.removeEventListener('keydown', handleKeyDown)\r\n }, [toggleMenuSidebar, openInfo, setOpenInfo])\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // On mobile, reflect the Sheet open state; on desktop, reflect the sidebar open state.\r\n const sidebarState = (isMobile ? openMobile : open) ? 'expanded' : 'collapsed'\r\n\r\n const contextValue = React.useMemo<SidebarContextProps>(\r\n () => ({\r\n sidebarState,\r\n open,\r\n setOpenMenu,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n openInfo,\r\n setOpenInfo,\r\n toggleMenuSidebar,\r\n toggleInfoSidebar,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n bugReportOpen,\r\n setBugReportOpen,\r\n featureRequestOpen,\r\n setFeatureRequestOpen,\r\n }),\r\n [sidebarState, open, setOpenMenu, isMobile, openMobile, setOpenMobile, openInfo, setOpenInfo, toggleMenuSidebar, toggleInfoSidebar, geocodeEarthApiKey, geocoderUrl, bugReportOpen, featureRequestOpen],\r\n )\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n style={\r\n {\r\n '--sidebar-width': SIDEBAR_WIDTH,\r\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n className={cn(\r\n 'group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar',\r\n className,\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n\r\n {/* InfoSidebar overlay */}\r\n\r\n <div\r\n data-state={openInfo ? 'open' : 'closed'}\r\n aria-hidden={!openInfo}\r\n className={cn(\r\n 'fixed inset-y-0 z-40 w-full sm:w-[410px] overflow-hidden transition-[transform,opacity] duration-300 ease-in-out will-change-transform',\r\n openInfo\r\n ? 'translate-x-0 opacity-100'\r\n : '-translate-x-full opacity-0 pointer-events-none'\r\n )}\r\n style={{\r\n left: isMobile\r\n ? '0'\r\n : (open ? 'var(--sidebar-width)' : 'var(--sidebar-width-icon)'),\r\n width: isMobile ? '100%' : '400px',\r\n }}\r\n >\r\n <InfoSidebar minioBaseUrl={minioBaseUrl} martinBaseUrl={martinBaseUrl} organization={organization} pointcloudApiUrl={pointcloudApiUrl} />\r\n </div>\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n )\r\n },\r\n )\r\nSidebarProvider.displayName = 'SidebarProvider'\r\nconst Sidebar = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n side?: 'left' | 'right'\r\n variant?: 'sidebar' | 'floating' | 'inset'\r\n collapsible?: 'offcanvas' | 'icon' | 'none'\r\n }\r\n>(\r\n (\r\n {\r\n side = 'left',\r\n variant = 'sidebar',\r\n collapsible = 'offcanvas',\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n // Get auth state from MenusContext\r\n const { state, isAuthPage } = React.useContext(MenusContext)\r\n const { isMobile, sidebarState, openMobile, setOpenMobile } = useSidebar()\r\n\r\n // Translation\r\n const t = useTranslations('Sidebar')\r\n\r\n // Don't render sidebar at all for auth pages\r\n if (isAuthPage || state.menus.currentViewer === 'auth') {\r\n return null\r\n }\r\n\r\n if (collapsible === 'none') {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground',\r\n className,\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\r\n style={\r\n {\r\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetHeader className=\"sr-only\">\r\n <SheetTitle>{t('title')}</SheetTitle>\r\n <SheetDescription>{t('description')}</SheetDescription>\r\n </SheetHeader>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"group peer text-sidebar-foreground md:block\" // removed default hidden class\r\n data-state={sidebarState}\r\n data-collapsible={sidebarState === 'collapsed' ? collapsible : ''}\r\n data-variant={variant}\r\n data-side={side}\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n 'relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear',\r\n 'group-data-[collapsible=offcanvas]:w-0',\r\n 'group-data-[side=right]:rotate-180',\r\n variant === 'floating' || variant === 'inset'\r\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'\r\n : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon]',\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n // removed default hidden class\r\n 'fixed inset-y-0 z-10 h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex',\r\n side === 'left'\r\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\r\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\r\n // Adjust the padding for floating and inset variants.\r\n variant === 'floating' || variant === 'inset'\r\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'\r\n : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n },\r\n)\r\nSidebar.displayName = 'Sidebar'\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n React.ElementRef<typeof Button>,\r\n React.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n const { toggleMenuSidebar, geocodeEarthApiKey, geocoderUrl } = useSidebar()\r\n\r\n const { state } = React.useContext(MenusContext)\r\n const currentViewer = state.menus.currentViewer\r\n\r\n if (currentViewer === 'auth') return null\r\n\r\n // Render MenuButtons only for interactive viewers\r\n if (currentViewer === 'map' || currentViewer === 'bim' || currentViewer === 'pointcloud') {\r\n return <NavigationBar geocodeEarthApiKey={geocodeEarthApiKey} geocoderUrl={geocoderUrl} />\r\n }\r\n\r\n // Default trigger for all other content types\r\n return (\r\n <Button\r\n ref={ref}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n data-sidebar=\"trigger\"\r\n onClick={(e) => {\r\n toggleMenuSidebar()\r\n onClick?.(e)\r\n }}\r\n\r\n className={cn(\r\n '',\r\n className,\r\n 'opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent',\r\n )}\r\n {...props}\r\n >\r\n <LR.PanelLeft />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n )\r\n})\r\nSidebarTrigger.displayName = 'SidebarTrigger'\r\n\r\nconst SidebarRail = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'>\r\n>(({ className, ...props }, ref) => {\r\n const { toggleMenuSidebar } = useSidebar()\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n data-sidebar=\"rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleMenuSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n // removed default hidden class\r\n 'absolute inset-y-0 z-20 w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\r\n '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',\r\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\r\n 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar',\r\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\r\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarRail.displayName = 'SidebarRail'\r\n\r\nconst SidebarInset = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'main'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <main\r\n ref={ref}\r\n className={cn(\r\n 'relative flex w-full flex-1 flex-col bg-background',\r\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInset.displayName = 'SidebarInset'\r\n\r\nconst SidebarInput = React.forwardRef<\r\n React.ElementRef<typeof Input>,\r\n React.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n data-sidebar=\"input\"\r\n className={cn(\r\n 'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInput.displayName = 'SidebarInput'\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"header\"\r\n className={cn('flex flex-col gap-2 p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarHeader.displayName = 'SidebarHeader'\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"footer\"\r\n className={cn('flex flex-col gap-2 p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarFooter.displayName = 'SidebarFooter'\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n React.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Separator\r\n ref={ref}\r\n data-sidebar=\"separator\"\r\n className={cn('mx-2 w-auto bg-sidebar-border', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarSeparator.displayName = 'SidebarSeparator'\r\n\r\nconst SidebarContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"content\"\r\n className={cn(\r\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarContent.displayName = 'SidebarContent'\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group\"\r\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroup.displayName = 'SidebarGroup'\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'div'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n 'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n 'absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n // Increases the hit area of the button on mobile.\r\n 'after:absolute after:-inset-2 after:md:hidden',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupAction.displayName = 'SidebarGroupAction'\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group-content\"\r\n className={cn('w-full text-sm', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarGroupContent.displayName = 'SidebarGroupContent'\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu\"\r\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenu.displayName = 'SidebarMenu'\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<'li'>\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n data-sidebar=\"menu-item\"\r\n className={cn('group/menu-item relative', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuItem.displayName = 'SidebarMenuItem'\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\r\n outline:\r\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\r\n },\r\n size: {\r\n default: 'h-8 text-sm',\r\n sm: 'h-7 text-xs',\r\n lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & {\r\n asChild?: boolean\r\n isActive?: boolean\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n } & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n (\r\n {\r\n asChild = false,\r\n isActive = false,\r\n variant = 'default',\r\n size = 'default',\r\n tooltip,\r\n className,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const Comp = asChild ? Slot : 'button'\r\n const { isMobile, sidebarState } = useSidebar()\r\n\r\n const button = (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n )\r\n\r\n if (!tooltip) {\r\n return button\r\n }\r\n\r\n if (typeof tooltip === 'string') {\r\n tooltip = {\r\n children: tooltip,\r\n }\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={sidebarState !== 'collapsed' || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n )\r\n },\r\n)\r\nSidebarMenuButton.displayName = 'SidebarMenuButton'\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & {\r\n asChild?: boolean\r\n showOnHover?: boolean\r\n }\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n 'absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\r\n // Increases the hit area of the button on mobile.\r\n 'after:absolute after:-inset-2 after:md:hidden',\r\n 'peer-data-[size=sm]/menu-button:top-1',\r\n 'peer-data-[size=default]/menu-button:top-1.5',\r\n 'peer-data-[size=lg]/menu-button:top-2.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n showOnHover\r\n && 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuAction.displayName = 'SidebarMenuAction'\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n 'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground',\r\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\r\n 'peer-data-[size=sm]/menu-button:top-1',\r\n 'peer-data-[size=default]/menu-button:top-1.5',\r\n 'peer-data-[size=lg]/menu-button:top-2.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n showIcon?: boolean\r\n }\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <Skeleton\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <Skeleton\r\n className=\"h-4 max-w-[--skeleton-width] flex-1\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n '--skeleton-width': width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n )\r\n})\r\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n 'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuSub.displayName = 'SidebarMenuSub'\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<'li'>\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentProps<'a'> & {\r\n asChild?: boolean\r\n size?: 'sm' | 'md'\r\n isActive?: boolean\r\n }\r\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'a'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\r\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\r\n size === 'sm' && 'text-xs',\r\n size === 'md' && 'text-sm',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n}\r\n"],"mappings":"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","names":["open"]}
1
+ {"version":3,"sources":["../../../../src/core/components/ui/Sidebar.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 { Slot } from '@radix-ui/react-slot'\r\nimport { cva } from 'class-variance-authority'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMobile } from '../../hooks/ui/use-mobile'\r\nimport { useResizableSidebarWidth } from '../../hooks/ui/useResizableSidebarWidth'\r\nimport { MenusContext } from '../../store/Menus/context'\r\nimport { cn } from '../../utils/utils'\r\nimport NavigationBar from '../TopNavigationBar'\r\n\r\nimport { Button } from './Button'\r\nimport { InfoSidebar } from './InfoSidebar'\r\nimport { Input } from './Input'\r\nimport { Separator } from './Separator'\r\nimport {\r\n Sheet,\r\n SheetContent,\r\n SheetDescription,\r\n SheetHeader,\r\n SheetTitle,\r\n} from './Sheet'\r\nimport { Skeleton } from './Skeleton'\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from './Tooltip'\r\n\r\n// Menus context\r\n\r\n// Custom components\r\n\r\n\r\n\r\nimport type { VariantProps } from 'class-variance-authority';\r\n\r\n\r\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state'\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\r\nconst SIDEBAR_WIDTH = '16rem'\r\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\r\nconst SIDEBAR_WIDTH_ICON = '3rem'\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\r\n\r\ntype SidebarContextProps = {\r\n sidebarState: 'expanded' | 'collapsed'\r\n open: boolean\r\n setOpenMenu: (open: boolean) => void\r\n openMobile: boolean\r\n setOpenMobile: (open: boolean) => void\r\n openInfo: boolean\r\n setOpenInfo: (open: boolean) => void\r\n isMobile: boolean\r\n toggleMenuSidebar: () => void\r\n toggleInfoSidebar: () => void\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n // Rendered outside the mobile Sheet (see AppSidebar) so they survive the\r\n // Sheet closing — Radix unmounts the Sheet's whole subtree on close, which\r\n // would otherwise take these dialogs down with it right after they open.\r\n bugReportOpen: boolean\r\n setBugReportOpen: (open: boolean) => void\r\n featureRequestOpen: boolean\r\n setFeatureRequestOpen: (open: boolean) => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext)\r\n if (!context) {\r\n throw new Error('useSidebar must be used within a SidebarProvider.')\r\n }\r\n\r\n return context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n organization?: import('../../types/dbTypes').Organization\r\n pointcloudApiUrl?: string\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n }\r\n>(\r\n (\r\n {\r\n defaultOpen = false,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n minioBaseUrl,\r\n martinBaseUrl,\r\n organization,\r\n pointcloudApiUrl,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const isMobile = useIsMobile()\r\n const tInfo = useTranslations('InfoSidebar')\r\n // User-resizable width for the InfoSidebar overlay (desktop only; persisted).\r\n const {\r\n width: infoWidth,\r\n isResizing: infoResizing,\r\n canResize: canResizeInfo,\r\n startResize: startInfoResize,\r\n } = useResizableSidebarWidth()\r\n const [openMobile, setOpenMobile] = React.useState(false)\r\n const [openInfo, setOpenInfo] = React.useState(false)\r\n const [bugReportOpen, setBugReportOpen] = React.useState(false)\r\n const [featureRequestOpen, setFeatureRequestOpen] = React.useState(false)\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(defaultOpen)\r\n const open = openProp ?? _open\r\n const setOpenMenu = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === 'function' ? value(open) : value\r\n if (setOpenProp) {\r\n setOpenProp(openState)\r\n }\r\n else {\r\n _setOpen(openState)\r\n }\r\n\r\n // This sets the cookie to keep the sidebar state.\r\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\r\n },\r\n [setOpenProp, open],\r\n )\r\n\r\n // Helper to toggle the menu sidebar.\r\n const toggleMenuSidebar = React.useCallback(() => {\r\n if (isMobile) {\r\n setOpenMobile(open => !open)\r\n }\r\n else {\r\n setOpenMenu((open) => {\r\n const newOpenState = !open\r\n // If opening menu sidebar, close info sidebar\r\n // if (newOpenState && openInfo) {\r\n // setOpenInfo(false)\r\n // }\r\n return newOpenState\r\n })\r\n }\r\n }, [isMobile, setOpenMenu, setOpenMobile, openInfo, setOpenInfo])\r\n\r\n // Helper to toggle the info sidebar.\r\n const toggleInfoSidebar = React.useCallback(() => {\r\n setOpenInfo((openInfoState) => {\r\n const newOpenInfoState = !openInfoState\r\n // If opening info sidebar, close menu sidebar\r\n if (newOpenInfoState && (isMobile ? openMobile : open)) {\r\n if (isMobile) {\r\n setOpenMobile(false)\r\n }\r\n else {\r\n setOpenMenu(false)\r\n }\r\n }\r\n return newOpenInfoState\r\n })\r\n }, [setOpenInfo, open, openMobile, isMobile, setOpenMenu, setOpenMobile])\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT\r\n && (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault()\r\n toggleMenuSidebar()\r\n }\r\n\r\n // Close InfoSidebar on Escape key\r\n if (event.key === 'Escape' && openInfo) {\r\n event.preventDefault()\r\n setOpenInfo(false)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', handleKeyDown)\r\n return () => window.removeEventListener('keydown', handleKeyDown)\r\n }, [toggleMenuSidebar, openInfo, setOpenInfo])\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // On mobile, reflect the Sheet open state; on desktop, reflect the sidebar open state.\r\n const sidebarState = (isMobile ? openMobile : open) ? 'expanded' : 'collapsed'\r\n\r\n const contextValue = React.useMemo<SidebarContextProps>(\r\n () => ({\r\n sidebarState,\r\n open,\r\n setOpenMenu,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n openInfo,\r\n setOpenInfo,\r\n toggleMenuSidebar,\r\n toggleInfoSidebar,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n bugReportOpen,\r\n setBugReportOpen,\r\n featureRequestOpen,\r\n setFeatureRequestOpen,\r\n }),\r\n [sidebarState, open, setOpenMenu, isMobile, openMobile, setOpenMobile, openInfo, setOpenInfo, toggleMenuSidebar, toggleInfoSidebar, geocodeEarthApiKey, geocoderUrl, bugReportOpen, featureRequestOpen],\r\n )\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n style={\r\n {\r\n '--sidebar-width': SIDEBAR_WIDTH,\r\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n className={cn(\r\n 'group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar',\r\n className,\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n\r\n {/* InfoSidebar overlay */}\r\n\r\n <div\r\n data-state={openInfo ? 'open' : 'closed'}\r\n aria-hidden={!openInfo}\r\n className={cn(\r\n 'fixed inset-y-0 z-40 w-full overflow-hidden transition-[transform,opacity] duration-300 ease-in-out will-change-transform',\r\n infoResizing && 'select-none',\r\n openInfo\r\n ? 'translate-x-0 opacity-100'\r\n : '-translate-x-full opacity-0 pointer-events-none'\r\n )}\r\n style={{\r\n left: isMobile\r\n ? '0'\r\n : (open ? 'var(--sidebar-width)' : 'var(--sidebar-width-icon)'),\r\n // Desktop: user-resizable width (persisted). Mobile: full-width.\r\n width: isMobile ? '100%' : infoWidth,\r\n }}\r\n >\r\n <InfoSidebar minioBaseUrl={minioBaseUrl} martinBaseUrl={martinBaseUrl} organization={organization} pointcloudApiUrl={pointcloudApiUrl} />\r\n\r\n {/* Right-edge drag handle (desktop only). Drag to resize the sidebar width. */}\r\n {canResizeInfo && (\r\n <div\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label={tInfo('resizeHandleLabel')}\r\n onPointerDown={startInfoResize}\r\n style={{ touchAction: 'none' }}\r\n className=\"absolute inset-y-0 right-0 z-10 w-0.5 cursor-ew-resize bg-border/80 hover:bg-accent\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n )\r\n },\r\n)\r\nSidebarProvider.displayName = 'SidebarProvider'\r\nconst Sidebar = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n side?: 'left' | 'right'\r\n variant?: 'sidebar' | 'floating' | 'inset'\r\n collapsible?: 'offcanvas' | 'icon' | 'none'\r\n }\r\n>(\r\n (\r\n {\r\n side = 'left',\r\n variant = 'sidebar',\r\n collapsible = 'offcanvas',\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n // Get auth state from MenusContext\r\n const { state, isAuthPage } = React.useContext(MenusContext)\r\n const { isMobile, sidebarState, openMobile, setOpenMobile } = useSidebar()\r\n\r\n // Translation\r\n const t = useTranslations('Sidebar')\r\n\r\n // Don't render sidebar at all for auth pages\r\n if (isAuthPage || state.menus.currentViewer === 'auth') {\r\n return null\r\n }\r\n\r\n if (collapsible === 'none') {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground',\r\n className,\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\r\n style={\r\n {\r\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetHeader className=\"sr-only\">\r\n <SheetTitle>{t('title')}</SheetTitle>\r\n <SheetDescription>{t('description')}</SheetDescription>\r\n </SheetHeader>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"group peer text-sidebar-foreground md:block\" // removed default hidden class\r\n data-state={sidebarState}\r\n data-collapsible={sidebarState === 'collapsed' ? collapsible : ''}\r\n data-variant={variant}\r\n data-side={side}\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n 'relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear',\r\n 'group-data-[collapsible=offcanvas]:w-0',\r\n 'group-data-[side=right]:rotate-180',\r\n variant === 'floating' || variant === 'inset'\r\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'\r\n : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon]',\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n // removed default hidden class\r\n 'fixed inset-y-0 z-10 h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex',\r\n side === 'left'\r\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\r\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\r\n // Adjust the padding for floating and inset variants.\r\n variant === 'floating' || variant === 'inset'\r\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'\r\n : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n },\r\n)\r\nSidebar.displayName = 'Sidebar'\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n React.ElementRef<typeof Button>,\r\n React.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n const { toggleMenuSidebar, geocodeEarthApiKey, geocoderUrl } = useSidebar()\r\n\r\n const { state } = React.useContext(MenusContext)\r\n const currentViewer = state.menus.currentViewer\r\n\r\n if (currentViewer === 'auth') return null\r\n\r\n // Render MenuButtons only for interactive viewers\r\n if (currentViewer === 'map' || currentViewer === 'bim' || currentViewer === 'pointcloud') {\r\n return <NavigationBar geocodeEarthApiKey={geocodeEarthApiKey} geocoderUrl={geocoderUrl} />\r\n }\r\n\r\n // Default trigger for all other content types\r\n return (\r\n <Button\r\n ref={ref}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n data-sidebar=\"trigger\"\r\n onClick={(e) => {\r\n toggleMenuSidebar()\r\n onClick?.(e)\r\n }}\r\n\r\n className={cn(\r\n '',\r\n className,\r\n 'opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent',\r\n )}\r\n {...props}\r\n >\r\n <LR.PanelLeft />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n )\r\n})\r\nSidebarTrigger.displayName = 'SidebarTrigger'\r\n\r\nconst SidebarRail = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'>\r\n>(({ className, ...props }, ref) => {\r\n const { toggleMenuSidebar } = useSidebar()\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n data-sidebar=\"rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleMenuSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n // removed default hidden class\r\n 'absolute inset-y-0 z-20 w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\r\n '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',\r\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\r\n 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar',\r\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\r\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarRail.displayName = 'SidebarRail'\r\n\r\nconst SidebarInset = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'main'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <main\r\n ref={ref}\r\n className={cn(\r\n 'relative flex w-full flex-1 flex-col bg-background',\r\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInset.displayName = 'SidebarInset'\r\n\r\nconst SidebarInput = React.forwardRef<\r\n React.ElementRef<typeof Input>,\r\n React.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n data-sidebar=\"input\"\r\n className={cn(\r\n 'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInput.displayName = 'SidebarInput'\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"header\"\r\n className={cn('flex flex-col gap-2 p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarHeader.displayName = 'SidebarHeader'\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"footer\"\r\n className={cn('flex flex-col gap-2 p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarFooter.displayName = 'SidebarFooter'\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n React.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Separator\r\n ref={ref}\r\n data-sidebar=\"separator\"\r\n className={cn('mx-2 w-auto bg-sidebar-border', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarSeparator.displayName = 'SidebarSeparator'\r\n\r\nconst SidebarContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"content\"\r\n className={cn(\r\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarContent.displayName = 'SidebarContent'\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group\"\r\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroup.displayName = 'SidebarGroup'\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'div'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n 'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n 'absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n // Increases the hit area of the button on mobile.\r\n 'after:absolute after:-inset-2 after:md:hidden',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupAction.displayName = 'SidebarGroupAction'\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group-content\"\r\n className={cn('w-full text-sm', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarGroupContent.displayName = 'SidebarGroupContent'\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu\"\r\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenu.displayName = 'SidebarMenu'\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<'li'>\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n data-sidebar=\"menu-item\"\r\n className={cn('group/menu-item relative', className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuItem.displayName = 'SidebarMenuItem'\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\r\n outline:\r\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\r\n },\r\n size: {\r\n default: 'h-8 text-sm',\r\n sm: 'h-7 text-xs',\r\n lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & {\r\n asChild?: boolean\r\n isActive?: boolean\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n } & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n (\r\n {\r\n asChild = false,\r\n isActive = false,\r\n variant = 'default',\r\n size = 'default',\r\n tooltip,\r\n className,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const Comp = asChild ? Slot : 'button'\r\n const { isMobile, sidebarState } = useSidebar()\r\n\r\n const button = (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n )\r\n\r\n if (!tooltip) {\r\n return button\r\n }\r\n\r\n if (typeof tooltip === 'string') {\r\n tooltip = {\r\n children: tooltip,\r\n }\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={sidebarState !== 'collapsed' || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n )\r\n },\r\n)\r\nSidebarMenuButton.displayName = 'SidebarMenuButton'\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<'button'> & {\r\n asChild?: boolean\r\n showOnHover?: boolean\r\n }\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n 'absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\r\n // Increases the hit area of the button on mobile.\r\n 'after:absolute after:-inset-2 after:md:hidden',\r\n 'peer-data-[size=sm]/menu-button:top-1',\r\n 'peer-data-[size=default]/menu-button:top-1.5',\r\n 'peer-data-[size=lg]/menu-button:top-2.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n showOnHover\r\n && 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuAction.displayName = 'SidebarMenuAction'\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n 'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground',\r\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\r\n 'peer-data-[size=sm]/menu-button:top-1',\r\n 'peer-data-[size=default]/menu-button:top-1.5',\r\n 'peer-data-[size=lg]/menu-button:top-2.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<'div'> & {\r\n showIcon?: boolean\r\n }\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <Skeleton\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <Skeleton\r\n className=\"h-4 max-w-[--skeleton-width] flex-1\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n '--skeleton-width': width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n )\r\n})\r\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n 'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuSub.displayName = 'SidebarMenuSub'\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<'li'>\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentProps<'a'> & {\r\n asChild?: boolean\r\n size?: 'sm' | 'md'\r\n isActive?: boolean\r\n }\r\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'a'\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\r\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\r\n size === 'sm' && 'text-xs',\r\n size === 'md' && 'text-sm',\r\n 'group-data-[collapsible=icon]:hidden',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n}\r\n"],"mappings":"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","names":["open"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/ToolbarButton.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAmB,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE9D,UAAU,KAAK;IACb,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,qBAiE7D"}
1
+ {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/ToolbarButton.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAmB,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE9D,UAAU,KAAK;IACb,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,qBA+D7D"}