@collabdt/core 0.0.42 → 0.0.43

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 (264) hide show
  1. package/dist/core/components/Toolbar.d.ts.map +1 -1
  2. package/dist/core/components/Toolbar.js.map +1 -1
  3. package/dist/core/components/ToolbarBody.js.map +1 -1
  4. package/dist/core/components/TopNavigationBar.js.map +1 -1
  5. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  6. package/dist/core/components/authentication/Signin.js.map +1 -1
  7. package/dist/core/components/authentication/Signup.js.map +1 -1
  8. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  9. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  10. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  11. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  12. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  13. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  14. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  15. package/dist/core/components/ui/DataTable.js +7 -0
  16. package/dist/core/components/ui/DataTable.js.map +1 -1
  17. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  18. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  19. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts +5 -2
  20. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  21. package/dist/core/components/ui/FilesManager/src/FileMarker.js +84 -21
  22. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  23. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  24. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  25. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  26. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  27. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  28. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  29. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  30. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  31. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  32. package/dist/core/components/ui/Navbar.js.map +1 -1
  33. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  34. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  35. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  36. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  37. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  38. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  39. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  40. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  41. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +2 -2
  42. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  43. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +2 -2
  44. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  45. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  46. package/dist/core/components/viewers/Viewer.js +5 -1
  47. package/dist/core/components/viewers/Viewer.js.map +1 -1
  48. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  49. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  50. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  51. package/dist/core/components/viewers/bim/BimViewer.js +14 -5
  52. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  53. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  54. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +6 -0
  55. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  56. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  57. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +168 -39
  58. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  59. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  60. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  61. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  62. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
  63. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  64. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +14 -37
  65. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  66. package/dist/core/components/viewers/bim/src/DXFLoader/index.js +31 -318
  67. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  68. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +66 -7
  69. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  70. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +253 -21
  71. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  72. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  73. package/dist/core/components/viewers/bim/src/ModelManager/index.js +9 -0
  74. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  75. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  76. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  77. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts +3 -2
  78. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  79. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  80. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  81. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +3 -4
  82. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  83. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  84. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +40 -18
  85. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  86. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +2 -5
  87. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  88. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +45 -59
  89. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  90. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +1 -0
  91. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  92. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts +10 -1
  93. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  94. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js +25 -73
  95. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  96. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts +7 -3
  97. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  98. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +42 -78
  99. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  100. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  101. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +52 -75
  102. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  103. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +15 -3
  104. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  105. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +165 -105
  106. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  107. package/dist/core/components/viewers/index.d.ts.map +1 -1
  108. package/dist/core/components/viewers/index.js.map +1 -1
  109. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  110. package/dist/core/components/viewers/map/MapViewer.js +1 -0
  111. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  112. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  113. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +4 -3
  114. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  115. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  116. package/dist/core/components/viewers/map/datasets/RowActions.js +148 -0
  117. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  118. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  119. package/dist/core/components/viewers/map/datasets/index.js +32 -15
  120. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  121. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts +4 -0
  122. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -0
  123. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js +43 -0
  124. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -0
  125. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  126. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +39 -3
  127. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  128. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  129. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  130. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +2 -1
  131. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  132. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +47 -0
  133. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -0
  134. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js +114 -0
  135. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -0
  136. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +49 -0
  137. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -0
  138. package/dist/core/components/viewers/map/datasets/src/wmsTime.js +100 -0
  139. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -0
  140. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  141. package/dist/core/components/viewers/map/src/Geocoder.js +9 -9
  142. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  143. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  144. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +25 -43
  145. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  146. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  147. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  148. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  149. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +19 -2
  150. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  151. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts +9 -0
  152. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -0
  153. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js +28 -0
  154. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -0
  155. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  156. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +1 -16
  157. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  158. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  159. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  160. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js +31 -2
  162. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  163. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts +21 -0
  164. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -0
  165. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js +111 -0
  166. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -0
  167. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  168. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +77 -2
  169. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  170. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +10 -3
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  177. package/dist/core/components/viewers/map/utils/geocoder.d.ts +6 -2
  178. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  179. package/dist/core/components/viewers/map/utils/geocoder.js +10 -62
  180. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  181. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +5 -0
  182. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -0
  183. package/dist/core/components/viewers/map/utils/geocoding/adapters.js +192 -0
  184. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -0
  185. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +6 -0
  186. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -0
  187. package/dist/core/components/viewers/map/utils/geocoding/config.js +14 -0
  188. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -0
  189. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +8 -0
  190. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -0
  191. package/dist/core/components/viewers/map/utils/geocoding/index.js +44 -0
  192. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -0
  193. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +6 -0
  194. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -0
  195. package/dist/core/components/viewers/map/utils/geocoding/osm.js +39 -0
  196. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -0
  197. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +8 -0
  198. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -0
  199. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +35 -0
  200. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -0
  201. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  202. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  203. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +1 -3
  204. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  205. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  206. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -3
  207. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  208. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  209. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +8 -2
  210. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  211. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  212. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  213. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +9 -9
  214. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  215. package/dist/core/hooks/provider.js.map +1 -1
  216. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  217. package/dist/core/plugins/host/provider.js.map +1 -1
  218. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  219. package/dist/core/store/AppConfig/context.js.map +1 -1
  220. package/dist/core/store/BIM/context.d.ts.map +1 -1
  221. package/dist/core/store/BIM/context.js.map +1 -1
  222. package/dist/core/store/BIM/reducer.d.ts +0 -1
  223. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  224. package/dist/core/store/BIM/reducer.js +0 -4
  225. package/dist/core/store/BIM/reducer.js.map +1 -1
  226. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  227. package/dist/core/store/Buildings/context.js.map +1 -1
  228. package/dist/core/store/Content/context.d.ts.map +1 -1
  229. package/dist/core/store/Content/context.js.map +1 -1
  230. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  231. package/dist/core/store/Datasets/context.js +2 -1
  232. package/dist/core/store/Datasets/context.js.map +1 -1
  233. package/dist/core/store/Datasets/reducer.d.ts +2 -0
  234. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  235. package/dist/core/store/Datasets/reducer.js +9 -4
  236. package/dist/core/store/Datasets/reducer.js.map +1 -1
  237. package/dist/core/store/Files/context.d.ts.map +1 -1
  238. package/dist/core/store/Files/context.js.map +1 -1
  239. package/dist/core/store/Map/context.d.ts.map +1 -1
  240. package/dist/core/store/Map/context.js.map +1 -1
  241. package/dist/core/store/Menus/context.d.ts.map +1 -1
  242. package/dist/core/store/Menus/context.js.map +1 -1
  243. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  244. package/dist/core/store/Permissions/context.js.map +1 -1
  245. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  246. package/dist/core/store/PointCloud/context.js.map +1 -1
  247. package/dist/core/store/Tools/context.d.ts.map +1 -1
  248. package/dist/core/store/Tools/context.js.map +1 -1
  249. package/dist/core/types/datasetTypes.d.ts +8 -1
  250. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  251. package/dist/core/types/dbTypes.d.ts +13 -13
  252. package/dist/core/types/dbTypes.d.ts.map +1 -1
  253. package/dist/core/types/dbTypes.js +13 -13
  254. package/dist/core/types/dbTypes.js.map +1 -1
  255. package/dist/core/types/index.d.ts +1 -1
  256. package/dist/core/types/index.d.ts.map +1 -1
  257. package/dist/core/types/index.js.map +1 -1
  258. package/dist/core/utils/imageUtils.js +1 -1
  259. package/dist/core/utils/imageUtils.js.map +1 -1
  260. package/package.json +4 -3
  261. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts +0 -3
  262. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts.map +0 -1
  263. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js +0 -173
  264. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/core/components/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAsBtC,UAAU,KAAK;IACb,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,qBAWxC"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/core/components/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAoBtC,UAAU,KAAK;IACb,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,qBAWxC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/Toolbar.tsx"],"sourcesContent":["'use client'\n\n// Components\nimport * as React from 'react'\nimport dynamic from 'next/dynamic'\nimport { ViewerNames } from '../types'\nimport { mapToolbarTools } from '../components/viewers/map/src/tools/mapTools'\nimport { ToolbarBody } from './ToolbarBody'\n\n// Audit Phase 1.A (F-1e): the BIM and PointCloud toolbar tool registries\n// transitively import @thatopen and Potree-adjacent code. Statically\n// importing them here (which Toolbar.tsx used to do, eagerly mounted by\n// Viewer.tsx) kept ~456 KB of @thatopen on the map route's first-load JS\n// even after F-1, F-1b, F-1c and F-1d. Dynamic-importing both per-viewer\n// toolbars finally cuts that path.\n//\n// MapToolbar stays inline (no separate file, no dynamic) because the map\n// is the default landing surface and every user pays its cost anyway.\nconst BimToolbar = dynamic(\n () => import('./viewers/bim/BimToolbar').then(m => ({ default: m.BimToolbar })),\n { ssr: false },\n)\nconst PointCloudToolbar = dynamic(\n () => import('./viewers/pointcloud/PointCloudToolbar').then(m => ({ default: m.PointCloudToolbar })),\n { ssr: false },\n)\n\ninterface Props {\n viewer: ViewerNames\n}\n\nexport function Toolbar({ viewer }: Props) {\n if (viewer === ViewerNames.map) {\n return <ToolbarBody viewer=\"map\" tools={mapToolbarTools()} />\n }\n if (viewer === ViewerNames.bim) {\n return <BimToolbar />\n }\n if (viewer === ViewerNames.pointcloud) {\n return <PointCloudToolbar />\n }\n return null\n}\n"],"mappings":";AAiCW;AA7BX,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAW5B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,0BAA0B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC9E,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,wCAAwC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EACnG,EAAE,KAAK,MAAM;AACf;AAMO,SAAS,QAAQ,EAAE,OAAO,GAAU;AACzC,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,GAAG;AAAA,EAC7D;AACA,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,cAAW;AAAA,EACrB;AACA,MAAI,WAAW,YAAY,YAAY;AACrC,WAAO,oBAAC,qBAAkB;AAAA,EAC5B;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/Toolbar.tsx"],"sourcesContent":["'use client'\n\n// Components\nimport * as React from 'react'\nimport dynamic from 'next/dynamic'\nimport { ViewerNames } from '../types'\nimport { mapToolbarTools } from '../components/viewers/map/src/tools/mapTools'\nimport { ToolbarBody } from './ToolbarBody'\n\n// The BIM and PointCloud toolbar tool registries transitively import\n// @thatopen and Potree-adjacent code. Statically importing them here (eagerly\n// mounted by Viewer.tsx) kept ~456 KB of @thatopen on the map route's\n// first-load JS. Dynamic-importing both per-viewer toolbars cuts that path.\n//\n// MapToolbar stays inline (no separate file, no dynamic) because the map\n// is the default landing surface and every user pays its cost anyway.\nconst BimToolbar = dynamic(\n () => import('./viewers/bim/BimToolbar').then(m => ({ default: m.BimToolbar })),\n { ssr: false },\n)\nconst PointCloudToolbar = dynamic(\n () => import('./viewers/pointcloud/PointCloudToolbar').then(m => ({ default: m.PointCloudToolbar })),\n { ssr: false },\n)\n\ninterface Props {\n viewer: ViewerNames\n}\n\nexport function Toolbar({ viewer }: Props) {\n if (viewer === ViewerNames.map) {\n return <ToolbarBody viewer=\"map\" tools={mapToolbarTools()} />\n }\n if (viewer === ViewerNames.bim) {\n return <BimToolbar />\n }\n if (viewer === ViewerNames.pointcloud) {\n return <PointCloudToolbar />\n }\n return null\n}\n"],"mappings":";AA+BW;AA3BX,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAS5B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,0BAA0B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC9E,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,wCAAwC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EACnG,EAAE,KAAK,MAAM;AACf;AAMO,SAAS,QAAQ,EAAE,OAAO,GAAU;AACzC,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,GAAG;AAAA,EAC7D;AACA,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,cAAW;AAAA,EACrB;AACA,MAAI,WAAW,YAAY,YAAY;AACrC,WAAO,oBAAC,qBAAkB;AAAA,EAC5B;AACA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/ToolbarBody.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Menubar } from './ui/Menubar'\nimport { Tool } from '../types/tools'\nimport ToolbarButton from './ui/ToolbarButton'\nimport { SubmenuProvider } from './ToolbarSubmenu'\n\n// Audit Phase 1.A (F-1e): shared menubar wrapper used by the per-viewer\n// toolbars (MapToolbar inline in Toolbar.tsx, BimToolbar + PointCloudToolbar\n// in their respective viewer folders so they ride the viewer's lazy chunk).\n// Extracted from Toolbar.tsx to avoid duplicating the JSX across three sites.\n\ninterface Props {\n viewer: string\n tools: Tool[]\n}\n\nexport function ToolbarBody({ viewer, tools }: Props) {\n return (\n <div className=\"fixed left-1/2 transform -translate-x-1/2 bottom-[10px] flex items-center pointer-events-none z-10\">\n <SubmenuProvider>\n <Menubar\n id={`${viewer}-toolbar`}\n className=\"flex flex-row px-1 gap-1 justify-center w-fit bg-primary-light rounded space-y-0\"\n >\n {tools.map((tool, index) => (\n <div key={index} className=\"flex items-center\">\n <ToolbarButton tool={tool} />\n </div>\n ))}\n </Menubar>\n </SubmenuProvider>\n </div>\n )\n}\n"],"mappings":";AA4Bc;AAzBd,SAAS,eAAe;AAExB,OAAO,mBAAmB;AAC1B,SAAS,uBAAuB;AAYzB,SAAS,YAAY,EAAE,QAAQ,MAAM,GAAU;AACpD,SACE,oBAAC,SAAI,WAAU,sGACb,8BAAC,mBACC;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,GAAG,MAAM;AAAA,MACb,WAAU;AAAA,MAET,gBAAM,IAAI,CAAC,MAAM,UAChB,oBAAC,SAAgB,WAAU,qBACzB,8BAAC,iBAAc,MAAY,KADnB,KAEV,CACD;AAAA;AAAA,EACH,GACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/ToolbarBody.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Menubar } from './ui/Menubar'\nimport { Tool } from '../types/tools'\nimport ToolbarButton from './ui/ToolbarButton'\nimport { SubmenuProvider } from './ToolbarSubmenu'\n\n// Shared menubar wrapper used by the per-viewer toolbars (MapToolbar inline\n// in Toolbar.tsx, BimToolbar + PointCloudToolbar in their respective viewer\n// folders so they ride the viewer's lazy chunk). Extracted from Toolbar.tsx\n// to avoid duplicating the JSX across three sites.\n\ninterface Props {\n viewer: string\n tools: Tool[]\n}\n\nexport function ToolbarBody({ viewer, tools }: Props) {\n return (\n <div className=\"fixed left-1/2 transform -translate-x-1/2 bottom-[10px] flex items-center pointer-events-none z-10\">\n <SubmenuProvider>\n <Menubar\n id={`${viewer}-toolbar`}\n className=\"flex flex-row px-1 gap-1 justify-center w-fit bg-primary-light rounded space-y-0\"\n >\n {tools.map((tool, index) => (\n <div key={index} className=\"flex items-center\">\n <ToolbarButton tool={tool} />\n </div>\n ))}\n </Menubar>\n </SubmenuProvider>\n </div>\n )\n}\n"],"mappings":";AA4Bc;AAzBd,SAAS,eAAe;AAExB,OAAO,mBAAmB;AAC1B,SAAS,uBAAuB;AAYzB,SAAS,YAAY,EAAE,QAAQ,MAAM,GAAU;AACpD,SACE,oBAAC,SAAI,WAAU,sGACb,8BAAC,mBACC;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,GAAG,MAAM;AAAA,MACb,WAAU;AAAA,MAET,gBAAM,IAAI,CAAC,MAAM,UAChB,oBAAC,SAAgB,WAAU,qBACzB,8BAAC,iBAAc,MAAY,KADnB,KAEV,CACD;AAAA;AAAA,EACH,GACF,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/TopNavigationBar.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// Shadcn Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MenusContext } from '../store'\r\nimport { Button } from '../components/ui/Button'\r\nimport { useSidebar } from '../components/ui/Sidebar'\r\nimport * as LR from 'lucide-react'\r\nimport {\r\n Menubar,\r\n MenubarContent,\r\n MenubarMenu,\r\n MenubarTrigger,\r\n} from '../components/ui/Menubar'\r\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\r\n\r\nimport { ViewerNames } from '../types'\r\nimport Geocoder from './viewers/map/src/Geocoder'\r\n\r\n// Audit Phase 1.A (F-1e): the BIM and PointCloud search tools used to be\r\n// statically imported at the top of this file, even though the JSX below\r\n// only renders them when the matching viewer is active. The static imports\r\n// pulled @thatopen and Potree-adjacent code into the eager bundle. Switching\r\n// to next/dynamic ties their code to the matching viewer's lazy chunk.\r\nconst BIMSearchTool = dynamic(\r\n () => import('./viewers/bim/src/tools/BIMSearchTool'),\r\n { ssr: false },\r\n)\r\nconst PCSearchTool = dynamic(\r\n () => import('./viewers/pointcloud/src/tools/PCSearchTool'),\r\n { ssr: false },\r\n)\r\n\r\n\r\n\r\n// Components\r\n\r\nexport default function NavigationBar() {\r\n // Translations\r\n const t = useTranslations('NavigationBar')\r\n\r\n // Access the sidebar context to trigger state changes\r\n const { toggleInfoSidebar, openInfo } = useSidebar()\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const needsInfoSidebar = currentViewer === ViewerNames.bim || currentViewer === ViewerNames.pointcloud || currentViewer === ViewerNames.map\r\n\r\n // Hide the NavigationBar when InfoSidebar is open in BIM mode\r\n if (needsInfoSidebar && openInfo) {\r\n return null\r\n }\r\n\r\n return (\r\n <Menubar className=\"flex-row absolute z-20 m-3 bg-transparent border-none shadow-none w-auto h-auto\">\r\n <Menubar className=\"flex px-3 gap-1 h-full justify-between items-start\">\r\n <MenubarMenu>\r\n <VisuallyHidden>\r\n <MenubarTrigger />\r\n <MenubarContent />\r\n </VisuallyHidden>\r\n </MenubarMenu>\r\n\r\n {needsInfoSidebar && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger w-6 justify-end opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={toggleInfoSidebar}\r\n title={t('openInfoTitle')}\r\n >\r\n <LR.Menu className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n\r\n {/* geocode search */}\r\n {currentViewer === ViewerNames.map && <Geocoder />}\r\n {currentViewer === ViewerNames.bim && <BIMSearchTool />}\r\n {currentViewer === ViewerNames.pointcloud && <PCSearchTool />}\r\n </Menubar>\r\n </Menubar>\r\n )\r\n}"],"mappings":";AA2DU,SACE,KADF;AAxDV,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAE/B,SAAS,mBAAmB;AAC5B,OAAO,cAAc;AAOrB,MAAM,gBAAgB;AAAA,EACpB,MAAM,OAAO,uCAAuC;AAAA,EACpD,EAAE,KAAK,MAAM;AACf;AACA,MAAM,eAAe;AAAA,EACnB,MAAM,OAAO,6CAA6C;AAAA,EAC1D,EAAE,KAAK,MAAM;AACf;AAMe,SAAR,gBAAiC;AAEtC,QAAM,IAAI,gBAAgB,eAAe;AAGzC,QAAM,EAAE,mBAAmB,SAAS,IAAI,WAAW;AACnD,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,QAAM,mBAAmB,kBAAkB,YAAY,OAAO,kBAAkB,YAAY,cAAc,kBAAkB,YAAY;AAGxI,MAAI,oBAAoB,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,WAAQ,WAAU,mFACjB,+BAAC,WAAQ,WAAU,sDACjB;AAAA,wBAAC,eACC,+BAAC,kBACC;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,kBAAe;AAAA,OAClB,GACF;AAAA,IAEG,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,EAAE,eAAe;AAAA,QAExB,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA;AAAA,IAC/B;AAAA,IAIL,kBAAkB,YAAY,OAAO,oBAAC,YAAS;AAAA,IAC/C,kBAAkB,YAAY,OAAO,oBAAC,iBAAc;AAAA,IACpD,kBAAkB,YAAY,cAAc,oBAAC,gBAAa;AAAA,KAC3D,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/TopNavigationBar.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// Shadcn Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MenusContext } from '../store'\r\nimport { Button } from '../components/ui/Button'\r\nimport { useSidebar } from '../components/ui/Sidebar'\r\nimport * as LR from 'lucide-react'\r\nimport {\r\n Menubar,\r\n MenubarContent,\r\n MenubarMenu,\r\n MenubarTrigger,\r\n} from '../components/ui/Menubar'\r\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\r\n\r\nimport { ViewerNames } from '../types'\r\nimport Geocoder from './viewers/map/src/Geocoder'\r\n\r\n// The BIM and PointCloud search tools used to be statically imported at the\r\n// top of this file, even though the JSX below only renders them when the\r\n// matching viewer is active. The static imports pulled @thatopen and\r\n// Potree-adjacent code into the eager bundle. Switching to next/dynamic ties\r\n// their code to the matching viewer's lazy chunk.\r\nconst BIMSearchTool = dynamic(\r\n () => import('./viewers/bim/src/tools/BIMSearchTool'),\r\n { ssr: false },\r\n)\r\nconst PCSearchTool = dynamic(\r\n () => import('./viewers/pointcloud/src/tools/PCSearchTool'),\r\n { ssr: false },\r\n)\r\n\r\n\r\n\r\n// Components\r\n\r\nexport default function NavigationBar() {\r\n // Translations\r\n const t = useTranslations('NavigationBar')\r\n\r\n // Access the sidebar context to trigger state changes\r\n const { toggleInfoSidebar, openInfo } = useSidebar()\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const needsInfoSidebar = currentViewer === ViewerNames.bim || currentViewer === ViewerNames.pointcloud || currentViewer === ViewerNames.map\r\n\r\n // Hide the NavigationBar when InfoSidebar is open in BIM mode\r\n if (needsInfoSidebar && openInfo) {\r\n return null\r\n }\r\n\r\n return (\r\n <Menubar className=\"flex-row absolute z-20 m-3 bg-transparent border-none shadow-none w-auto h-auto\">\r\n <Menubar className=\"flex px-3 gap-1 h-full justify-between items-start\">\r\n <MenubarMenu>\r\n <VisuallyHidden>\r\n <MenubarTrigger />\r\n <MenubarContent />\r\n </VisuallyHidden>\r\n </MenubarMenu>\r\n\r\n {needsInfoSidebar && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger w-6 justify-end opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={toggleInfoSidebar}\r\n title={t('openInfoTitle')}\r\n >\r\n <LR.Menu className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n\r\n {/* geocode search */}\r\n {currentViewer === ViewerNames.map && <Geocoder />}\r\n {currentViewer === ViewerNames.bim && <BIMSearchTool />}\r\n {currentViewer === ViewerNames.pointcloud && <PCSearchTool />}\r\n </Menubar>\r\n </Menubar>\r\n )\r\n}"],"mappings":";AA2DU,SACE,KADF;AAxDV,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAE/B,SAAS,mBAAmB;AAC5B,OAAO,cAAc;AAOrB,MAAM,gBAAgB;AAAA,EACpB,MAAM,OAAO,uCAAuC;AAAA,EACpD,EAAE,KAAK,MAAM;AACf;AACA,MAAM,eAAe;AAAA,EACnB,MAAM,OAAO,6CAA6C;AAAA,EAC1D,EAAE,KAAK,MAAM;AACf;AAMe,SAAR,gBAAiC;AAEtC,QAAM,IAAI,gBAAgB,eAAe;AAGzC,QAAM,EAAE,mBAAmB,SAAS,IAAI,WAAW;AACnD,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,QAAM,mBAAmB,kBAAkB,YAAY,OAAO,kBAAkB,YAAY,cAAc,kBAAkB,YAAY;AAGxI,MAAI,oBAAoB,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,WAAQ,WAAU,mFACjB,+BAAC,WAAQ,WAAU,sDACjB;AAAA,wBAAC,eACC,+BAAC,kBACC;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,kBAAe;AAAA,OAClB,GACF;AAAA,IAEG,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,EAAE,eAAe;AAAA,QAExB,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA;AAAA,IAC/B;AAAA,IAIL,kBAAkB,YAAY,OAAO,oBAAC,YAAS;AAAA,IAC/C,kBAAkB,YAAY,OAAO,oBAAC,iBAAc;AAAA,IACpD,kBAAkB,YAAY,cAAc,oBAAC,gBAAa;AAAA,KAC3D,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/authentication/ForgotPassword.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport { useTranslations } from 'next-intl'\r\n// Audit Phase 1.B (F-2b): direct file imports — see Signin.tsx for rationale.\r\nimport { Button } from '../ui/Button'\r\nimport { Input } from '../ui/Input'\r\nimport { Eye, EyeClosed } from 'lucide-react'\r\nimport { PasswordError } from './PasswordError'\r\nimport { AuthPage } from './AuthPage'\r\n\r\nexport function ForgotPassword() {\r\n console.log('Executing ForgotPassword()')\r\n const [password, setPassword] = React.useState('')\r\n const [confirmPassword, setConfirmPassword] = React.useState('')\r\n const [error, setError] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const t = useTranslations('forgotPassword')\r\n\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n const [showConfirmPassword, setShowConfirmPassword] = React.useState(false)\r\n const [passwordErrors, setPasswordErrors] = React.useState<string[]>([])\r\n const [confirmPasswordError, setConfirmPasswordError] = React.useState('')\r\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = []\r\n if (password.length < 12) errors.push('Password must be at least 12 characters')\r\n if (password.length > 65) errors.push('Password must be less than 65 characters')\r\n return errors\r\n }\r\n\r\n const handlePasswordChange = (e) => {\r\n const newPassword = e.target.value\r\n setPassword(newPassword)\r\n if (newPassword) setPasswordErrors(validatePassword(newPassword))\r\n else setPasswordErrors([])\r\n if (confirmPassword) {\r\n setConfirmPasswordError(newPassword === confirmPassword ? '' : 'Passwords do not match')\r\n }\r\n }\r\n\r\n const handleConfirmPasswordChange = (e) => {\r\n const newConfirmPassword = e.target.value\r\n setConfirmPassword(newConfirmPassword)\r\n if (newConfirmPassword && password) {\r\n setConfirmPasswordError(newConfirmPassword === password ? '' : 'Passwords do not match')\r\n } else {\r\n setConfirmPasswordError('')\r\n }\r\n }\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setHasAttemptedSubmit(true)\r\n const errors = validatePassword(password)\r\n setPasswordErrors(errors)\r\n if (password === confirmPassword) setConfirmPasswordError('')\r\n else setConfirmPasswordError('Passwords do not match')\r\n if (errors.length > 0 || password !== confirmPassword) return\r\n setError('')\r\n setIsLoading(true)\r\n // password reset logic here\r\n }\r\n\r\n return (\r\n <AuthPage>\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1\r\n className=\"font-display font-bold\"\r\n style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n fontFamily: \"'Space Grotesk', sans-serif\",\r\n }}\r\n >\r\n {t('h1')}\r\n </h1>\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {t('subHeader')}\r\n </p>\r\n </div>\r\n\r\n {/* Form */}\r\n <form id=\"resetForm\" onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Password */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"password\" className=\"auth-label\">{t('inputLabel')}</label>\r\n {hasAttemptedSubmit && passwordErrors.length > 0 && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder1')}\r\n value={password}\r\n onChange={handlePasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && passwordErrors.length > 0 ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && passwordErrors.map((err, i) => (\r\n <PasswordError key={i} message={err} />\r\n ))}\r\n {(!hasAttemptedSubmit || passwordErrors.length === 0) && (\r\n <p className=\"text-xs\" style={{ color: 'var(--hp-on-surface-variant)' }}>{t('lenError')}</p>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"confirmPassword\" className=\"auth-label\">{t('confirmInputLabel')}</label>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={confirmPassword}\r\n onChange={handleConfirmPasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && confirmPasswordError ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showConfirmPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <PasswordError message={confirmPasswordError} />\r\n )}\r\n </div>\r\n </form>\r\n\r\n {/* Submit + link */}\r\n <div className=\"space-y-4 pt-2\">\r\n <Button type=\"submit\" form=\"resetForm\" className=\"auth-btn-primary w-full h-10\">\r\n {t('submit')}\r\n </Button>\r\n <p className=\"text-sm text-center\" style={{ color: 'var(--hp-on-surface-variant)' }}>\r\n <Link className=\"underline\" href=\"/cdt/auth/Signin\" style={{ color: 'var(--hp-primary-container)' }}>\r\n {t('linkSignin')}\r\n </Link>\r\n </p>\r\n </div>\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":";AAqEM,SACE,KADF;AAnEN,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,uBAAuB;AAEhC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,KAAK,iBAAiB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAElB,SAAS,iBAAiB;AAC/B,UAAQ,IAAI,4BAA4B;AACxC,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,EAAE;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,IAAI,gBAAgB,gBAAgB;AAE1C,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,SAAS,KAAK;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAmB,CAAC,CAAC;AACvE,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAS,EAAE;AACzE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AAExE,QAAM,mBAAmB,CAACA,cAA+B;AACvD,UAAM,SAAmB,CAAC;AAC1B,QAAIA,UAAS,SAAS,GAAI,QAAO,KAAK,yCAAyC;AAC/E,QAAIA,UAAS,SAAS,GAAI,QAAO,KAAK,0CAA0C;AAChF,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,MAAM;AAClC,UAAM,cAAc,EAAE,OAAO;AAC7B,gBAAY,WAAW;AACvB,QAAI,YAAa,mBAAkB,iBAAiB,WAAW,CAAC;AAAA,QAC3D,mBAAkB,CAAC,CAAC;AACzB,QAAI,iBAAiB;AACnB,8BAAwB,gBAAgB,kBAAkB,KAAK,wBAAwB;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,8BAA8B,CAAC,MAAM;AACzC,UAAM,qBAAqB,EAAE,OAAO;AACpC,uBAAmB,kBAAkB;AACrC,QAAI,sBAAsB,UAAU;AAClC,8BAAwB,uBAAuB,WAAW,KAAK,wBAAwB;AAAA,IACzF,OAAO;AACL,8BAAwB,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAM;AAChC,MAAE,eAAe;AACjB,0BAAsB,IAAI;AAC1B,UAAM,SAAS,iBAAiB,QAAQ;AACxC,sBAAkB,MAAM;AACxB,QAAI,aAAa,gBAAiB,yBAAwB,EAAE;AAAA,QACvD,yBAAwB,wBAAwB;AACrD,QAAI,OAAO,SAAS,KAAK,aAAa,gBAAiB;AACvD,aAAS,EAAE;AACX,iBAAa,IAAI;AAAA,EAEnB;AAEA,SACE,qBAAC,YAEC;AAAA,yBAAC,SAAI,WAAU,uBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,OAAO;AAAA,YACP,YAAY;AAAA,UACd;AAAA,UAEC,YAAE,IAAI;AAAA;AAAA,MACT;AAAA,MACA,oBAAC,OAAE,OAAO,EAAE,OAAO,gCAAgC,UAAU,SAAS,GACnE,YAAE,WAAW,GAChB;AAAA,OACF;AAAA,IAGA,qBAAC,UAAK,IAAG,aAAY,UAAU,cAAc,WAAU,aAErD;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,WAAM,SAAQ,YAAW,WAAU,cAAc,YAAE,YAAY,GAAE;AAAA,UACjE,sBAAsB,eAAe,SAAS,KAC7C,oBAAC,SAAI,WAAU,4BAA2B,OAAO,EAAE,YAAY,UAAU,GAAG;AAAA,WAEhF;AAAA,QACA,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAM,eAAe,SAAS;AAAA,cAC9B,aAAa,EAAE,cAAc;AAAA,cAC7B,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAQ;AAAA,cACR,WAAW,oBAAoB,sBAAsB,eAAe,SAAS,IAAI,uBAAuB,EAAE;AAAA;AAAA,UAC5G;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,cAC5C,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,cAE9C,yBAAe,oBAAC,aAAU,WAAU,WAAU,IAAK,oBAAC,OAAI,WAAU,WAAU;AAAA;AAAA,UAC/E;AAAA,WACF;AAAA,QACC,sBAAsB,eAAe,IAAI,CAAC,KAAK,MAC9C,oBAAC,iBAAsB,SAAS,OAAZ,CAAiB,CACtC;AAAA,SACC,CAAC,sBAAsB,eAAe,WAAW,MACjD,oBAAC,OAAE,WAAU,WAAU,OAAO,EAAE,OAAO,+BAA+B,GAAI,YAAE,UAAU,GAAE;AAAA,SAE5F;AAAA,MAGA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,WAAM,SAAQ,mBAAkB,WAAU,cAAc,YAAE,mBAAmB,GAAE;AAAA,UAC/E,sBAAsB,wBACrB,oBAAC,SAAI,WAAU,4BAA2B,OAAO,EAAE,YAAY,UAAU,GAAG;AAAA,WAEhF;AAAA,QACA,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAM,sBAAsB,SAAS;AAAA,cACrC,aAAa,EAAE,cAAc;AAAA,cAC7B,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAQ;AAAA,cACR,WAAW,oBAAoB,sBAAsB,uBAAuB,uBAAuB,EAAE;AAAA;AAAA,UACvG;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,uBAAuB,CAAC,mBAAmB;AAAA,cAC1D,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,cAE9C,gCAAsB,oBAAC,aAAU,WAAU,WAAU,IAAK,oBAAC,OAAI,WAAU,WAAU;AAAA;AAAA,UACtF;AAAA,WACF;AAAA,QACC,sBAAsB,wBACrB,oBAAC,iBAAc,SAAS,sBAAsB;AAAA,SAElD;AAAA,OACF;AAAA,IAGA,qBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,UAAO,MAAK,UAAS,MAAK,aAAY,WAAU,gCAC9C,YAAE,QAAQ,GACb;AAAA,MACA,oBAAC,OAAE,WAAU,uBAAsB,OAAO,EAAE,OAAO,+BAA+B,GAChF,8BAAC,QAAK,WAAU,aAAY,MAAK,oBAAmB,OAAO,EAAE,OAAO,8BAA8B,GAC/F,YAAE,YAAY,GACjB,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["password"]}
1
+ {"version":3,"sources":["../../../../src/core/components/authentication/ForgotPassword.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport { useTranslations } from 'next-intl'\r\n// Direct file imports (not the ui barrel) — see Signin.tsx for rationale.\r\nimport { Button } from '../ui/Button'\r\nimport { Input } from '../ui/Input'\r\nimport { Eye, EyeClosed } from 'lucide-react'\r\nimport { PasswordError } from './PasswordError'\r\nimport { AuthPage } from './AuthPage'\r\n\r\nexport function ForgotPassword() {\r\n console.log('Executing ForgotPassword()')\r\n const [password, setPassword] = React.useState('')\r\n const [confirmPassword, setConfirmPassword] = React.useState('')\r\n const [error, setError] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const t = useTranslations('forgotPassword')\r\n\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n const [showConfirmPassword, setShowConfirmPassword] = React.useState(false)\r\n const [passwordErrors, setPasswordErrors] = React.useState<string[]>([])\r\n const [confirmPasswordError, setConfirmPasswordError] = React.useState('')\r\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = []\r\n if (password.length < 12) errors.push('Password must be at least 12 characters')\r\n if (password.length > 65) errors.push('Password must be less than 65 characters')\r\n return errors\r\n }\r\n\r\n const handlePasswordChange = (e) => {\r\n const newPassword = e.target.value\r\n setPassword(newPassword)\r\n if (newPassword) setPasswordErrors(validatePassword(newPassword))\r\n else setPasswordErrors([])\r\n if (confirmPassword) {\r\n setConfirmPasswordError(newPassword === confirmPassword ? '' : 'Passwords do not match')\r\n }\r\n }\r\n\r\n const handleConfirmPasswordChange = (e) => {\r\n const newConfirmPassword = e.target.value\r\n setConfirmPassword(newConfirmPassword)\r\n if (newConfirmPassword && password) {\r\n setConfirmPasswordError(newConfirmPassword === password ? '' : 'Passwords do not match')\r\n } else {\r\n setConfirmPasswordError('')\r\n }\r\n }\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setHasAttemptedSubmit(true)\r\n const errors = validatePassword(password)\r\n setPasswordErrors(errors)\r\n if (password === confirmPassword) setConfirmPasswordError('')\r\n else setConfirmPasswordError('Passwords do not match')\r\n if (errors.length > 0 || password !== confirmPassword) return\r\n setError('')\r\n setIsLoading(true)\r\n // password reset logic here\r\n }\r\n\r\n return (\r\n <AuthPage>\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1\r\n className=\"font-display font-bold\"\r\n style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n fontFamily: \"'Space Grotesk', sans-serif\",\r\n }}\r\n >\r\n {t('h1')}\r\n </h1>\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {t('subHeader')}\r\n </p>\r\n </div>\r\n\r\n {/* Form */}\r\n <form id=\"resetForm\" onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Password */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"password\" className=\"auth-label\">{t('inputLabel')}</label>\r\n {hasAttemptedSubmit && passwordErrors.length > 0 && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder1')}\r\n value={password}\r\n onChange={handlePasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && passwordErrors.length > 0 ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && passwordErrors.map((err, i) => (\r\n <PasswordError key={i} message={err} />\r\n ))}\r\n {(!hasAttemptedSubmit || passwordErrors.length === 0) && (\r\n <p className=\"text-xs\" style={{ color: 'var(--hp-on-surface-variant)' }}>{t('lenError')}</p>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"confirmPassword\" className=\"auth-label\">{t('confirmInputLabel')}</label>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={confirmPassword}\r\n onChange={handleConfirmPasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && confirmPasswordError ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showConfirmPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <PasswordError message={confirmPasswordError} />\r\n )}\r\n </div>\r\n </form>\r\n\r\n {/* Submit + link */}\r\n <div className=\"space-y-4 pt-2\">\r\n <Button type=\"submit\" form=\"resetForm\" className=\"auth-btn-primary w-full h-10\">\r\n {t('submit')}\r\n </Button>\r\n <p className=\"text-sm text-center\" style={{ color: 'var(--hp-on-surface-variant)' }}>\r\n <Link className=\"underline\" href=\"/cdt/auth/Signin\" style={{ color: 'var(--hp-primary-container)' }}>\r\n {t('linkSignin')}\r\n </Link>\r\n </p>\r\n </div>\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":"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","names":["password"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/authentication/Signin.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { signIn } from 'next-auth/react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast, Toaster } from 'sonner'\r\n// Audit Phase 1.B (F-2b): the ui barrel `src/core/components/ui/index.ts`\r\n// re-exports dozens of components plus `useFileUploadHandler` and\r\n// `InfoSidebar`, the latter of which transitively pulls in @thatopen and\r\n// the BIM viewer tree. Importing through the barrel kept the auth pages\r\n// at 1.09 MB. Direct file imports drop that significantly.\r\nimport { Button } from '../ui/Button'\r\nimport { GoogleIcon } from '../ui/Icons/GoogleIcon'\r\nimport { Input } from '../ui/Input'\r\nimport { LoadingSpinner } from '../ui/LoadingSpinner'\r\nimport { AuthPage, useAuthTheme } from './AuthPage'\r\nimport { useParams,useSearchParams  } from 'next/navigation'\r\nimport ReCAPTCHA from 'react-google-recaptcha'\r\n\r\nfunction SignInContent() {\r\n const [step, setStep] = React.useState<'login' | 'mfa'>('login')\r\n\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [code, setCode] = React.useState('')\r\n\r\n const [captchaStatus, setCaptchaStatus] = React.useState(false)\r\n const [captchaToken, setCaptchaToken] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [error, setError] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n const searchParams = useSearchParams()\r\n const params = useParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n //Clean up the Google query error in URL, and have it only return /orgName/signin to clear frontend error responses \r\n React.useEffect(() => {\r\n if (googleError) {\r\n window.history.replaceState({}, '', `/${orgName}/signin`)\r\n }\r\n}, [googleError, orgName])\r\n\r\n const t = useTranslations('Signin')\r\n const tMfa = useTranslations('MFA')\r\n const authTheme = useAuthTheme()\r\n\r\n const reCaptchaSiteKey = `${process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY}`\r\n\r\n const onReCaptchaSuccess = (token) => {\r\n setCaptchaToken(token)\r\n setCaptchaStatus(true)\r\n }\r\n\r\n // Initial LOGIN\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setGoogleError(null)\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const result = await signIn('credentials', {\r\n redirect: false,\r\n email,\r\n password,\r\n captchaToken,\r\n })\r\n\r\n if (result?.error) {\r\n\r\n if (result.code === 'rate_limit_error') {\r\n\r\n setIsLoading(true)\r\n setError('Too many failed login attempts. Please try again later.') \r\n return\r\n }\r\n else if(result.code === 'invalid_credentials'){\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n return \r\n }\r\n //Commenting out Captcha code for Development \r\n else if(!captchaStatus){\r\n setTimeout(() => {\r\n setError('Captcha Verification Failed.')\r\n }, 500) \r\n setIsLoading(false) \r\n return\r\n }\r\n //MFA TRIGGER\r\n else if (result.code === 'mfa_required') {\r\n setStep('mfa')\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n else{\r\n setError('Captcha Verification Expired. Please try again later.')\r\n setIsLoading(false)\r\n return\r\n }\r\n }\r\n\r\n // Completed Login + MFA - Redirect to the Platform's Organization Dashboard \r\n window.location.href = `/${orgName}`\r\n\r\n } catch (err) {\r\n setError('Unexpected error. Please try again.')\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n // VERIFY OTP for MFA\r\n const handleVerifyOTP = async () => {\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const res = await fetch('/api/mfa', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ email, code }),\r\n })\r\n\r\n if (!res.ok) {\r\n toast.error(tMfa('invalidCode'))\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n toast.success(tMfa('success'))\r\n\r\n // FINAL LOGIN after successful MFA process\r\n await signIn('credentials', {\r\n email,\r\n password,\r\n mfaVerified: true,\r\n redirect: true,\r\n redirectTo: `/${orgName}`,\r\n })\r\n\r\n } catch (err) {\r\n toast.error(tMfa('verificationFailed'))\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <Toaster richColors position=\"top-right\" />\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1 className=\"font-display font-bold\" style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n }}>\r\n {step === 'login' ? t('title') : tMfa('title')}\r\n </h1>\r\n\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {step === 'login'\r\n ? t('message')\r\n : tMfa('subtitle', { email })}\r\n </p>\r\n </div>\r\n\r\n {/* LOGIN FORM */}\r\n {step === 'login' && (\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n\r\n <Input\r\n type=\"email\"\r\n placeholder={t('placeholder1')}\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n />\r\n\r\n <div className=\"relative\">\r\n <Input\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(v => !v)}\r\n tabIndex={-1}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <LR.EyeOff size={16}/> : <LR.Eye size={16}/>}\r\n </button>\r\n </div>\r\n {/* Google Not Linked Error */}\r\n {googleError === 'google_not_linked' && (\r\n   <div className=\"auth-pw-error\">\r\n     Your Google account is not linked. Please sign in with your credentials first, then link your Google account.\r\n   </div>\r\n )}\r\n {error && <div className=\"auth-pw-error\">{error}</div>}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button type=\"submit\" disabled={isLoading} className=\"flex-1 auth-btn-primary\">\r\n {isLoading ? <LoadingSpinner /> : 'Login'}\r\n </Button>\r\n\r\n {/* Google button */} \r\n { <button \r\n type=\"button\"\r\n onClick={() => signIn('google', { redirectTo: `/${orgName}` })}\r\n disabled={isLoading}\r\n aria-label=\"Sign in with Google\"\r\n className=\"auth-google-btn\"\r\n >\r\n <GoogleIcon size={20} />\r\n </button> } \r\n \r\n </div>\r\n\r\n {/* Reset Password link */}\r\n <div className=\"flex justify-start\">\r\n <a\r\n href={`/${orgName}/auth/reset-password`}\r\n className=\"text-sm underline underline-offset-4 hover:opacity-80\"\r\n style={{ color: 'var(--hp-primary)' }}\r\n >\r\n Reset your password\r\n </a>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* MFA FORM */}\r\n {step === 'mfa' && (\r\n <div className=\"space-y-4\">\r\n\r\n <Input\r\n placeholder={tMfa('placeholder')}\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n disabled={isLoading}\r\n />\r\n\r\n <Button onClick={handleVerifyOTP} disabled={isLoading} className=\"w-full\">\r\n {isLoading ? <LoadingSpinner /> : tMfa('verify')}\r\n </Button>\r\n\r\n {/* Back */}\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setStep('login')}\r\n className=\"w-full mt-3 inline-flex items-center justify-center gap-2\"\r\n >\r\n <LR.ArrowLeft size={16} />\r\n {tMfa('backToLogin')}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* CAPTCHA only on Credentials(Username and Password) Provider login */}\r\n {step === 'login' && (\r\n <div className=\"auth-captcha-wrapper\">\r\n <ReCAPTCHA\r\n key={`recaptcha-${authTheme}`}\r\n sitekey={reCaptchaSiteKey}\r\n onChange={onReCaptchaSuccess}\r\n theme={authTheme}\r\n />\r\n </div> \r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport function SignIn() {\r\n return (\r\n <AuthPage>\r\n <SignInContent />\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/authentication/Signin.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { signIn } from 'next-auth/react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast, Toaster } from 'sonner'\r\n// Direct file imports (not the ui barrel). The ui barrel\r\n// `src/core/components/ui/index.ts` re-exports dozens of components plus\r\n// `useFileUploadHandler` and `InfoSidebar`, the latter of which transitively\r\n// pulls in @thatopen and the BIM viewer tree. Importing through the barrel\r\n// would drag all of that into the auth pages; direct file imports avoid it.\r\nimport { Button } from '../ui/Button'\r\nimport { GoogleIcon } from '../ui/Icons/GoogleIcon'\r\nimport { Input } from '../ui/Input'\r\nimport { LoadingSpinner } from '../ui/LoadingSpinner'\r\nimport { AuthPage, useAuthTheme } from './AuthPage'\r\nimport { useParams,useSearchParams  } from 'next/navigation'\r\nimport ReCAPTCHA from 'react-google-recaptcha'\r\n\r\nfunction SignInContent() {\r\n const [step, setStep] = React.useState<'login' | 'mfa'>('login')\r\n\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [code, setCode] = React.useState('')\r\n\r\n const [captchaStatus, setCaptchaStatus] = React.useState(false)\r\n const [captchaToken, setCaptchaToken] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [error, setError] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n const searchParams = useSearchParams()\r\n const params = useParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n //Clean up the Google query error in URL, and have it only return /orgName/signin to clear frontend error responses \r\n React.useEffect(() => {\r\n if (googleError) {\r\n window.history.replaceState({}, '', `/${orgName}/signin`)\r\n }\r\n}, [googleError, orgName])\r\n\r\n const t = useTranslations('Signin')\r\n const tMfa = useTranslations('MFA')\r\n const authTheme = useAuthTheme()\r\n\r\n const reCaptchaSiteKey = `${process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY}`\r\n\r\n const onReCaptchaSuccess = (token) => {\r\n setCaptchaToken(token)\r\n setCaptchaStatus(true)\r\n }\r\n\r\n // Initial LOGIN\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setGoogleError(null)\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const result = await signIn('credentials', {\r\n redirect: false,\r\n email,\r\n password,\r\n captchaToken,\r\n })\r\n\r\n if (result?.error) {\r\n\r\n if (result.code === 'rate_limit_error') {\r\n\r\n setIsLoading(true)\r\n setError('Too many failed login attempts. Please try again later.') \r\n return\r\n }\r\n else if(result.code === 'invalid_credentials'){\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n return \r\n }\r\n //Commenting out Captcha code for Development \r\n else if(!captchaStatus){\r\n setTimeout(() => {\r\n setError('Captcha Verification Failed.')\r\n }, 500) \r\n setIsLoading(false) \r\n return\r\n }\r\n //MFA TRIGGER\r\n else if (result.code === 'mfa_required') {\r\n setStep('mfa')\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n else{\r\n setError('Captcha Verification Expired. Please try again later.')\r\n setIsLoading(false)\r\n return\r\n }\r\n }\r\n\r\n // Completed Login + MFA - Redirect to the Platform's Organization Dashboard \r\n window.location.href = `/${orgName}`\r\n\r\n } catch (err) {\r\n setError('Unexpected error. Please try again.')\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n // VERIFY OTP for MFA\r\n const handleVerifyOTP = async () => {\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const res = await fetch('/api/mfa', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ email, code }),\r\n })\r\n\r\n if (!res.ok) {\r\n toast.error(tMfa('invalidCode'))\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n toast.success(tMfa('success'))\r\n\r\n // FINAL LOGIN after successful MFA process\r\n await signIn('credentials', {\r\n email,\r\n password,\r\n mfaVerified: true,\r\n redirect: true,\r\n redirectTo: `/${orgName}`,\r\n })\r\n\r\n } catch (err) {\r\n toast.error(tMfa('verificationFailed'))\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <Toaster richColors position=\"top-right\" />\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1 className=\"font-display font-bold\" style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n }}>\r\n {step === 'login' ? t('title') : tMfa('title')}\r\n </h1>\r\n\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {step === 'login'\r\n ? t('message')\r\n : tMfa('subtitle', { email })}\r\n </p>\r\n </div>\r\n\r\n {/* LOGIN FORM */}\r\n {step === 'login' && (\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n\r\n <Input\r\n type=\"email\"\r\n placeholder={t('placeholder1')}\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n />\r\n\r\n <div className=\"relative\">\r\n <Input\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(v => !v)}\r\n tabIndex={-1}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <LR.EyeOff size={16}/> : <LR.Eye size={16}/>}\r\n </button>\r\n </div>\r\n {/* Google Not Linked Error */}\r\n {googleError === 'google_not_linked' && (\r\n   <div className=\"auth-pw-error\">\r\n     Your Google account is not linked. Please sign in with your credentials first, then link your Google account.\r\n   </div>\r\n )}\r\n {error && <div className=\"auth-pw-error\">{error}</div>}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button type=\"submit\" disabled={isLoading} className=\"flex-1 auth-btn-primary\">\r\n {isLoading ? <LoadingSpinner /> : 'Login'}\r\n </Button>\r\n\r\n {/* Google button */} \r\n { <button \r\n type=\"button\"\r\n onClick={() => signIn('google', { redirectTo: `/${orgName}` })}\r\n disabled={isLoading}\r\n aria-label=\"Sign in with Google\"\r\n className=\"auth-google-btn\"\r\n >\r\n <GoogleIcon size={20} />\r\n </button> } \r\n \r\n </div>\r\n\r\n {/* Reset Password link */}\r\n <div className=\"flex justify-start\">\r\n <a\r\n href={`/${orgName}/auth/reset-password`}\r\n className=\"text-sm underline underline-offset-4 hover:opacity-80\"\r\n style={{ color: 'var(--hp-primary)' }}\r\n >\r\n Reset your password\r\n </a>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* MFA FORM */}\r\n {step === 'mfa' && (\r\n <div className=\"space-y-4\">\r\n\r\n <Input\r\n placeholder={tMfa('placeholder')}\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n disabled={isLoading}\r\n />\r\n\r\n <Button onClick={handleVerifyOTP} disabled={isLoading} className=\"w-full\">\r\n {isLoading ? <LoadingSpinner /> : tMfa('verify')}\r\n </Button>\r\n\r\n {/* Back */}\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setStep('login')}\r\n className=\"w-full mt-3 inline-flex items-center justify-center gap-2\"\r\n >\r\n <LR.ArrowLeft size={16} />\r\n {tMfa('backToLogin')}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* CAPTCHA only on Credentials(Username and Password) Provider login */}\r\n {step === 'login' && (\r\n <div className=\"auth-captcha-wrapper\">\r\n <ReCAPTCHA\r\n key={`recaptcha-${authTheme}`}\r\n sitekey={reCaptchaSiteKey}\r\n onChange={onReCaptchaSuccess}\r\n theme={authTheme}\r\n />\r\n </div> \r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport function SignIn() {\r\n return (\r\n <AuthPage>\r\n <SignInContent />\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/authentication/Signup.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport Image from 'next/image'\r\nimport { AuthPage } from './AuthPage'\r\n// Audit Phase 1.B (F-2b): direct file imports — see Signin.tsx for rationale.\r\nimport { Button } from '../ui/Button'\r\nimport { Input } from '../ui/Input'\r\nimport { Eye, EyeClosed } from 'lucide-react'\r\nimport { PasswordError } from './PasswordError'\r\nimport { signIn } from 'next-auth/react'\r\nimport { useParams } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nexport function SignUp() {\r\n const t = useTranslations('Signup')\r\n const params = useParams()\r\n const { theme } = params\r\n\r\n const [firstName, setFirstName] = React.useState('')\r\n const [lastName, setLastName] = React.useState('')\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [confirmPassword, setConfirmPassword] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n const [showConfirmPassword, setShowConfirmPassword] = React.useState(false)\r\n const [passwordErrors, setPasswordErrors] = React.useState<string[]>([])\r\n const [confirmPasswordError, setConfirmPasswordError] = React.useState('')\r\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = []\r\n if (password.length < 12) errors.push('Password must be at least 12 characters')\r\n if (password.length > 65) errors.push('Password must be less than 65 characters')\r\n return errors\r\n }\r\n\r\n const handlePasswordChange = (e) => {\r\n const newPassword = e.target.value\r\n setPassword(newPassword)\r\n if (newPassword) setPasswordErrors(validatePassword(newPassword))\r\n else setPasswordErrors([])\r\n if (confirmPassword) {\r\n setConfirmPasswordError(newPassword === confirmPassword ? '' : 'Passwords do not match')\r\n }\r\n }\r\n\r\n const handleConfirmPasswordChange = (e) => {\r\n const newConfirmPassword = e.target.value\r\n setConfirmPassword(newConfirmPassword)\r\n if (newConfirmPassword && password) {\r\n setConfirmPasswordError(newConfirmPassword === password ? '' : 'Passwords do not match')\r\n } else {\r\n setConfirmPasswordError('')\r\n }\r\n }\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setHasAttemptedSubmit(true)\r\n const errors = validatePassword(password)\r\n setPasswordErrors(errors)\r\n if (password === confirmPassword) setConfirmPasswordError('')\r\n else setConfirmPasswordError('Passwords do not match')\r\n if (errors.length > 0 || password !== confirmPassword) return\r\n // signup logic here\r\n }\r\n\r\n return (\r\n <AuthPage>\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1\r\n className=\"font-display font-bold\"\r\n style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n fontFamily: \"'Space Grotesk', sans-serif\",\r\n }}\r\n >\r\n {t('h1')}\r\n </h1>\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {t('subHeader')}\r\n </p>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div className=\"flex gap-x-4\">\r\n <div className=\"space-y-2 flex-1\">\r\n <label htmlFor=\"firstName\" className=\"auth-label\">{t('inputLabel1')}</label>\r\n <Input\r\n id=\"firstName\"\r\n placeholder={t('placeholder1')}\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n <div className=\"space-y-2 flex-1\">\r\n <label htmlFor=\"lastName\" className=\"auth-label\">{t('inputLabel2')}</label>\r\n <Input\r\n id=\"lastName\"\r\n placeholder=\"Last Name\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <label htmlFor=\"email\" className=\"auth-label\">{t('inputLabel3')}</label>\r\n <Input\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"Email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"password\" className=\"auth-label\">{t('passwordLabel1')}</label>\r\n {hasAttemptedSubmit && passwordErrors.length > 0 && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder=\"Password\"\r\n value={password}\r\n onChange={handlePasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && passwordErrors.length > 0 ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && passwordErrors.map((error, index) => (\r\n <PasswordError key={index} message={error} />\r\n ))}\r\n {(!hasAttemptedSubmit || passwordErrors.length === 0) && (\r\n <p className=\"text-xs\" style={{ color: 'var(--hp-on-surface-variant)' }}>{t('lenError')}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"confirmPassword\" className=\"auth-label\">{t('passwordLabel2')}</label>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n placeholder=\"Confirm Password\"\r\n value={confirmPassword}\r\n onChange={handleConfirmPasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && confirmPasswordError ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showConfirmPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <PasswordError message={confirmPasswordError} />\r\n )}\r\n </div>\r\n\r\n <Button type=\"submit\" className=\"auth-btn-primary w-full h-10\">{t('submit')}</Button>\r\n </form>\r\n\r\n {/* Divider */}\r\n <div className=\"w-full relative py-2\">\r\n <div\r\n className=\"text-xs px-3 absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\"\r\n style={{ color: 'var(--hp-on-surface-variant)', background: 'var(--hp-mid)' }}\r\n >\r\n {t('or')}\r\n </div>\r\n <div className=\"auth-separator w-full\" />\r\n </div>\r\n\r\n {/* Google auth */}\r\n <Button\r\n onClick={() => signIn('google', { callbackUrl: '/' })}\r\n className=\"auth-btn-outline w-full h-10\"\r\n >\r\n <Image src=\"/images/Google__G__logo.svg\" alt=\"Google logo\" width={16} height={16} />\r\n {t('authProvider1')}\r\n </Button>\r\n\r\n <p className=\"text-sm text-center\" style={{ color: 'var(--hp-on-surface-variant)' }}>\r\n {t('linkLabel')}{' '}\r\n <Link className=\"underline\" href={`/${theme}/auth/signin`} style={{ color: 'var(--hp-primary-container)' }}>\r\n {t('linkSignIn')}\r\n </Link>\r\n </p>\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":"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","names":["password"]}
1
+ {"version":3,"sources":["../../../../src/core/components/authentication/Signup.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport Image from 'next/image'\r\nimport { AuthPage } from './AuthPage'\r\n// Direct file imports (not the ui barrel) — see Signin.tsx for rationale.\r\nimport { Button } from '../ui/Button'\r\nimport { Input } from '../ui/Input'\r\nimport { Eye, EyeClosed } from 'lucide-react'\r\nimport { PasswordError } from './PasswordError'\r\nimport { signIn } from 'next-auth/react'\r\nimport { useParams } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nexport function SignUp() {\r\n const t = useTranslations('Signup')\r\n const params = useParams()\r\n const { theme } = params\r\n\r\n const [firstName, setFirstName] = React.useState('')\r\n const [lastName, setLastName] = React.useState('')\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [confirmPassword, setConfirmPassword] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n const [showConfirmPassword, setShowConfirmPassword] = React.useState(false)\r\n const [passwordErrors, setPasswordErrors] = React.useState<string[]>([])\r\n const [confirmPasswordError, setConfirmPasswordError] = React.useState('')\r\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = []\r\n if (password.length < 12) errors.push('Password must be at least 12 characters')\r\n if (password.length > 65) errors.push('Password must be less than 65 characters')\r\n return errors\r\n }\r\n\r\n const handlePasswordChange = (e) => {\r\n const newPassword = e.target.value\r\n setPassword(newPassword)\r\n if (newPassword) setPasswordErrors(validatePassword(newPassword))\r\n else setPasswordErrors([])\r\n if (confirmPassword) {\r\n setConfirmPasswordError(newPassword === confirmPassword ? '' : 'Passwords do not match')\r\n }\r\n }\r\n\r\n const handleConfirmPasswordChange = (e) => {\r\n const newConfirmPassword = e.target.value\r\n setConfirmPassword(newConfirmPassword)\r\n if (newConfirmPassword && password) {\r\n setConfirmPasswordError(newConfirmPassword === password ? '' : 'Passwords do not match')\r\n } else {\r\n setConfirmPasswordError('')\r\n }\r\n }\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setHasAttemptedSubmit(true)\r\n const errors = validatePassword(password)\r\n setPasswordErrors(errors)\r\n if (password === confirmPassword) setConfirmPasswordError('')\r\n else setConfirmPasswordError('Passwords do not match')\r\n if (errors.length > 0 || password !== confirmPassword) return\r\n // signup logic here\r\n }\r\n\r\n return (\r\n <AuthPage>\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1\r\n className=\"font-display font-bold\"\r\n style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n fontFamily: \"'Space Grotesk', sans-serif\",\r\n }}\r\n >\r\n {t('h1')}\r\n </h1>\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {t('subHeader')}\r\n </p>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div className=\"flex gap-x-4\">\r\n <div className=\"space-y-2 flex-1\">\r\n <label htmlFor=\"firstName\" className=\"auth-label\">{t('inputLabel1')}</label>\r\n <Input\r\n id=\"firstName\"\r\n placeholder={t('placeholder1')}\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n <div className=\"space-y-2 flex-1\">\r\n <label htmlFor=\"lastName\" className=\"auth-label\">{t('inputLabel2')}</label>\r\n <Input\r\n id=\"lastName\"\r\n placeholder=\"Last Name\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <label htmlFor=\"email\" className=\"auth-label\">{t('inputLabel3')}</label>\r\n <Input\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"Email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n className=\"auth-input\"\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"password\" className=\"auth-label\">{t('passwordLabel1')}</label>\r\n {hasAttemptedSubmit && passwordErrors.length > 0 && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder=\"Password\"\r\n value={password}\r\n onChange={handlePasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && passwordErrors.length > 0 ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && passwordErrors.map((error, index) => (\r\n <PasswordError key={index} message={error} />\r\n ))}\r\n {(!hasAttemptedSubmit || passwordErrors.length === 0) && (\r\n <p className=\"text-xs\" style={{ color: 'var(--hp-on-surface-variant)' }}>{t('lenError')}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center gap-1\">\r\n <label htmlFor=\"confirmPassword\" className=\"auth-label\">{t('passwordLabel2')}</label>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <div className=\"w-1.5 h-1.5 rounded-full\" style={{ background: '#ff6b6b' }} />\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n placeholder=\"Confirm Password\"\r\n value={confirmPassword}\r\n onChange={handleConfirmPasswordChange}\r\n required\r\n className={`auth-input pr-10 ${hasAttemptedSubmit && confirmPasswordError ? 'border-destructive' : ''}`}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showConfirmPassword ? <EyeClosed className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\r\n </Button>\r\n </div>\r\n {hasAttemptedSubmit && confirmPasswordError && (\r\n <PasswordError message={confirmPasswordError} />\r\n )}\r\n </div>\r\n\r\n <Button type=\"submit\" className=\"auth-btn-primary w-full h-10\">{t('submit')}</Button>\r\n </form>\r\n\r\n {/* Divider */}\r\n <div className=\"w-full relative py-2\">\r\n <div\r\n className=\"text-xs px-3 absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\"\r\n style={{ color: 'var(--hp-on-surface-variant)', background: 'var(--hp-mid)' }}\r\n >\r\n {t('or')}\r\n </div>\r\n <div className=\"auth-separator w-full\" />\r\n </div>\r\n\r\n {/* Google auth */}\r\n <Button\r\n onClick={() => signIn('google', { callbackUrl: '/' })}\r\n className=\"auth-btn-outline w-full h-10\"\r\n >\r\n <Image src=\"/images/Google__G__logo.svg\" alt=\"Google logo\" width={16} height={16} />\r\n {t('authProvider1')}\r\n </Button>\r\n\r\n <p className=\"text-sm text-center\" style={{ color: 'var(--hp-on-surface-variant)' }}>\r\n {t('linkLabel')}{' '}\r\n <Link className=\"underline\" href={`/${theme}/auth/signin`} style={{ color: 'var(--hp-primary-container)' }}>\r\n {t('linkSignIn')}\r\n </Link>\r\n </p>\r\n </AuthPage>\r\n )\r\n}\r\n"],"mappings":";AAwEM,SACE,KADF;AAtEN,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,gBAAgB;AAEzB,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,KAAK,iBAAiB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAEzB,SAAS,SAAS;AACvB,QAAM,IAAI,gBAAgB,QAAQ;AAClC,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,MAAM,IAAI;AAElB,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,EAAE;AACnD,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,EAAE;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,EAAE;AAC/D,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,SAAS,KAAK;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAmB,CAAC,CAAC;AACvE,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAS,EAAE;AACzE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AAExE,QAAM,mBAAmB,CAACA,cAA+B;AACvD,UAAM,SAAmB,CAAC;AAC1B,QAAIA,UAAS,SAAS,GAAI,QAAO,KAAK,yCAAyC;AAC/E,QAAIA,UAAS,SAAS,GAAI,QAAO,KAAK,0CAA0C;AAChF,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,MAAM;AAClC,UAAM,cAAc,EAAE,OAAO;AAC7B,gBAAY,WAAW;AACvB,QAAI,YAAa,mBAAkB,iBAAiB,WAAW,CAAC;AAAA,QAC3D,mBAAkB,CAAC,CAAC;AACzB,QAAI,iBAAiB;AACnB,8BAAwB,gBAAgB,kBAAkB,KAAK,wBAAwB;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,8BAA8B,CAAC,MAAM;AACzC,UAAM,qBAAqB,EAAE,OAAO;AACpC,uBAAmB,kBAAkB;AACrC,QAAI,sBAAsB,UAAU;AAClC,8BAAwB,uBAAuB,WAAW,KAAK,wBAAwB;AAAA,IACzF,OAAO;AACL,8BAAwB,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAM;AAChC,MAAE,eAAe;AACjB,0BAAsB,IAAI;AAC1B,UAAM,SAAS,iBAAiB,QAAQ;AACxC,sBAAkB,MAAM;AACxB,QAAI,aAAa,gBAAiB,yBAAwB,EAAE;AAAA,QACvD,yBAAwB,wBAAwB;AACrD,QAAI,OAAO,SAAS,KAAK,aAAa,gBAAiB;AAAA,EAEzD;AAEA,SACE,qBAAC,YAEC;AAAA,yBAAC,SAAI,WAAU,uBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,OAAO;AAAA,YACP,YAAY;AAAA,UACd;AAAA,UAEC,YAAE,IAAI;AAAA;AAAA,MACT;AAAA,MACA,oBAAC,OAAE,OAAO,EAAE,OAAO,gCAAgC,UAAU,SAAS,GACnE,YAAE,WAAW,GAChB;AAAA,OACF;AAAA,IAGA,qBAAC,UAAK,UAAU,cAAc,WAAU,aACtC;AAAA,2BAAC,SAAI,WAAU,gBACb;AAAA,6BAAC,SAAI,WAAU,oBACb;AAAA,8BAAC,WAAM,SAAQ,aAAY,WAAU,cAAc,YAAE,aAAa,GAAE;AAAA,UACpE;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,aAAa,EAAE,cAAc;AAAA,cAC7B,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,cAC5C,UAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,oBACb;AAAA,8BAAC,WAAM,SAAQ,YAAW,WAAU,cAAc,YAAE,aAAa,GAAE;AAAA,UACnE;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,UAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,WAAM,SAAQ,SAAQ,WAAU,cAAc,YAAE,aAAa,GAAE;AAAA,QAChE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,UAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,WAAM,SAAQ,YAAW,WAAU,cAAc,YAAE,gBAAgB,GAAE;AAAA,UACrE,sBAAsB,eAAe,SAAS,KAC7C,oBAAC,SAAI,WAAU,4BAA2B,OAAO,EAAE,YAAY,UAAU,GAAG;AAAA,WAEhF;AAAA,QACA,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAM,eAAe,SAAS;AAAA,cAC9B,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAQ;AAAA,cACR,WAAW,oBAAoB,sBAAsB,eAAe,SAAS,IAAI,uBAAuB,EAAE;AAAA;AAAA,UAC5G;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,cAC5C,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,cAE9C,yBAAe,oBAAC,aAAU,WAAU,WAAU,IAAK,oBAAC,OAAI,WAAU,WAAU;AAAA;AAAA,UAC/E;AAAA,WACF;AAAA,QACC,sBAAsB,eAAe,IAAI,CAAC,OAAO,UAChD,oBAAC,iBAA0B,SAAS,SAAhB,KAAuB,CAC5C;AAAA,SACC,CAAC,sBAAsB,eAAe,WAAW,MACjD,oBAAC,OAAE,WAAU,WAAU,OAAO,EAAE,OAAO,+BAA+B,GAAI,YAAE,UAAU,GAAE;AAAA,SAE5F;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,WAAM,SAAQ,mBAAkB,WAAU,cAAc,YAAE,gBAAgB,GAAE;AAAA,UAC5E,sBAAsB,wBACrB,oBAAC,SAAI,WAAU,4BAA2B,OAAO,EAAE,YAAY,UAAU,GAAG;AAAA,WAEhF;AAAA,QACA,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAM,sBAAsB,SAAS;AAAA,cACrC,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAQ;AAAA,cACR,WAAW,oBAAoB,sBAAsB,uBAAuB,uBAAuB,EAAE;AAAA;AAAA,UACvG;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,uBAAuB,CAAC,mBAAmB;AAAA,cAC1D,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,cAE9C,gCAAsB,oBAAC,aAAU,WAAU,WAAU,IAAK,oBAAC,OAAI,WAAU,WAAU;AAAA;AAAA,UACtF;AAAA,WACF;AAAA,QACC,sBAAsB,wBACrB,oBAAC,iBAAc,SAAS,sBAAsB;AAAA,SAElD;AAAA,MAEA,oBAAC,UAAO,MAAK,UAAS,WAAU,gCAAgC,YAAE,QAAQ,GAAE;AAAA,OAC9E;AAAA,IAGA,qBAAC,SAAI,WAAU,wBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,gCAAgC,YAAY,gBAAgB;AAAA,UAE3E,YAAE,IAAI;AAAA;AAAA,MACT;AAAA,MACA,oBAAC,SAAI,WAAU,yBAAwB;AAAA,OACzC;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,OAAO,UAAU,EAAE,aAAa,IAAI,CAAC;AAAA,QACpD,WAAU;AAAA,QAEV;AAAA,8BAAC,SAAM,KAAI,+BAA8B,KAAI,eAAc,OAAO,IAAI,QAAQ,IAAI;AAAA,UACjF,EAAE,eAAe;AAAA;AAAA;AAAA,IACpB;AAAA,IAEA,qBAAC,OAAE,WAAU,uBAAsB,OAAO,EAAE,OAAO,+BAA+B,GAC/E;AAAA,QAAE,WAAW;AAAA,MAAG;AAAA,MACjB,oBAAC,QAAK,WAAU,aAAY,MAAM,IAAI,KAAK,gBAAgB,OAAO,EAAE,OAAO,8BAA8B,GACtG,YAAE,YAAY,GACjB;AAAA,OACF;AAAA,KACF;AAEJ;","names":["password"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/settings/src/OrganizationSkeleton.tsx"],"sourcesContent":["\r\n// Audit Phase 1.F (F-2c): direct file imports to bypass the ui barrel.\r\nimport { Separator } from '../../ui/Separator';\r\nimport { Skeleton } from '../../ui/Skeleton';\r\n\r\nexport default function OrganizationSkeleton() {\r\n return (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center px-6 py-4 border-b\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-64\" />\r\n </div>\r\n <Skeleton className=\"h-10 w-24\" />\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-6\">\r\n <div className=\"max-w-4xl mx-auto space-y-8\">\r\n {/* Branding Section */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-32\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n {/* Logo */}\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <div className=\"flex items-center gap-4\">\r\n <Skeleton className=\"w-32 h-32 rounded-lg\" />\r\n </div>\r\n </div>\r\n\r\n {/* Favicon */}\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <div className=\"flex items-center gap-4\">\r\n <Skeleton className=\"w-16 h-16 rounded-lg\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Colors */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <div className=\"flex gap-2\">\r\n <Skeleton className=\"w-20 h-10\" />\r\n <Skeleton className=\"flex-1 h-10\" />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-32\" />\r\n <div className=\"flex gap-2\">\r\n <Skeleton className=\"w-20 h-10\" />\r\n <Skeleton className=\"flex-1 h-10\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Basic Information */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-40\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-12\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-24 w-full\" />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Location */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-28\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-28\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Map Configuration */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-44\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/settings/src/OrganizationSkeleton.tsx"],"sourcesContent":["\r\n// Direct file imports to bypass the ui barrel.\r\nimport { Separator } from '../../ui/Separator';\r\nimport { Skeleton } from '../../ui/Skeleton';\r\n\r\nexport default function OrganizationSkeleton() {\r\n return (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center px-6 py-4 border-b\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-64\" />\r\n </div>\r\n <Skeleton className=\"h-10 w-24\" />\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-6\">\r\n <div className=\"max-w-4xl mx-auto space-y-8\">\r\n {/* Branding Section */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-32\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n {/* Logo */}\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <div className=\"flex items-center gap-4\">\r\n <Skeleton className=\"w-32 h-32 rounded-lg\" />\r\n </div>\r\n </div>\r\n\r\n {/* Favicon */}\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <div className=\"flex items-center gap-4\">\r\n <Skeleton className=\"w-16 h-16 rounded-lg\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Colors */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <div className=\"flex gap-2\">\r\n <Skeleton className=\"w-20 h-10\" />\r\n <Skeleton className=\"flex-1 h-10\" />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-32\" />\r\n <div className=\"flex gap-2\">\r\n <Skeleton className=\"w-20 h-10\" />\r\n <Skeleton className=\"flex-1 h-10\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Basic Information */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-40\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-12\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-24 w-full\" />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Location */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-28\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-28\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Map Configuration */}\r\n <div className=\"space-y-4\">\r\n <Skeleton className=\"h-6 w-44\" />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-16\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/settings/src/SettingsSkeleton.tsx"],"sourcesContent":["\r\n// Audit Phase 1.F (F-2c): direct file imports to bypass the ui barrel.\r\nimport { Separator } from '../../ui/Separator';\r\nimport { Skeleton } from '../../ui/Skeleton';\r\n\r\nexport default function SettingsContentSkeleton() {\r\n return (\r\n <div className=\"flex-1 flex flex-col gap-6\">\r\n <div className=\"w-full flex flex-col lg:flex-row lg:gap-6 overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex-shrink-0 pb-2 px-6 lg:w-1/2 flex flex-col gap-2\">\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-full\" />\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n </div>\r\n\r\n {/* User Info Form Fields */}\r\n <div className=\"flex-1 px-6 overflow-auto lg:w-1/2 space-y-6\">\r\n {/* First Name Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-5 w-24\" />\r\n </div>\r\n </div>\r\n\r\n {/* Last Name Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-5 w-48\" />\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-12\" />\r\n <Skeleton className=\"h-5 w-48\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Edit Button */}\r\n <div className=\"flex justify-center mt-6 w-full m-auto\">\r\n <Skeleton className=\"h-10 w-24\" />\r\n </div>\r\n <Separator />\r\n </div>\r\n );\r\n}"],"mappings":"AAUQ,SACE,KADF;AARR,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAEV,SAAR,0BAA2C;AAChD,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,yBAAC,SAAI,WAAU,6DAEb;AAAA,2BAAC,SAAI,WAAU,wDACb;AAAA,4BAAC,YAAS,WAAU,YAAW;AAAA,QAC/B,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC;AAAA,MAGA,qBAAC,SAAI,WAAU,gDAEb;AAAA,4BAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,QAGA,oBAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,QAGA,oBAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEE,oBAAC,SAAI,WAAU,0CACf,8BAAC,YAAS,WAAU,aAAY,GAChC;AAAA,IACF,oBAAC,aAAU;AAAA,KACb;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/settings/src/SettingsSkeleton.tsx"],"sourcesContent":["\r\n// Direct file imports to bypass the ui barrel.\r\nimport { Separator } from '../../ui/Separator';\r\nimport { Skeleton } from '../../ui/Skeleton';\r\n\r\nexport default function SettingsContentSkeleton() {\r\n return (\r\n <div className=\"flex-1 flex flex-col gap-6\">\r\n <div className=\"w-full flex flex-col lg:flex-row lg:gap-6 overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex-shrink-0 pb-2 px-6 lg:w-1/2 flex flex-col gap-2\">\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-full\" />\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n </div>\r\n\r\n {/* User Info Form Fields */}\r\n <div className=\"flex-1 px-6 overflow-auto lg:w-1/2 space-y-6\">\r\n {/* First Name Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-5 w-24\" />\r\n </div>\r\n </div>\r\n\r\n {/* Last Name Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-20\" />\r\n <Skeleton className=\"h-5 w-48\" />\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div className=\"grid grid-cols-1 gap-3 py-3 w-full border-b border-border\">\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-12\" />\r\n <Skeleton className=\"h-5 w-48\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Edit Button */}\r\n <div className=\"flex justify-center mt-6 w-full m-auto\">\r\n <Skeleton className=\"h-10 w-24\" />\r\n </div>\r\n <Separator />\r\n </div>\r\n );\r\n}"],"mappings":"AAUQ,SACE,KADF;AARR,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAEV,SAAR,0BAA2C;AAChD,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,yBAAC,SAAI,WAAU,6DAEb;AAAA,2BAAC,SAAI,WAAU,wDACb;AAAA,4BAAC,YAAS,WAAU,YAAW;AAAA,QAC/B,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC;AAAA,MAGA,qBAAC,SAAI,WAAU,gDAEb;AAAA,4BAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,QAGA,oBAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,QAGA,oBAAC,SAAI,WAAU,6DACb,+BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEE,oBAAC,SAAI,WAAU,0CACf,8BAAC,YAAS,WAAU,aAAY,GAChC;AAAA,IACF,oBAAC,aAAU;AAAA,KACb;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CollapsibleCommentItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/CollapsibleCommentItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAc9B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAIhD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEzD,UAAU,2BAA2B;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;IAC1D,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACpD,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,EACR,OAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAAgB,EAChB,KAAS,EACT,SAAgB,EAChB,YAAY,EACZ,YAAY,EACb,EAAE,2BAA2B,qBA4N7B"}
1
+ {"version":3,"file":"CollapsibleCommentItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/CollapsibleCommentItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAIhD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEzD,UAAU,2BAA2B;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;IAC1D,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACpD,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,EACR,OAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAAgB,EAChB,KAAS,EACT,SAAgB,EAChB,YAAY,EACZ,YAAY,EACb,EAAE,2BAA2B,qBA4N7B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CollapsibleCommentItem.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { usePermissions } from '../../../store'\r\n\r\n// Audit Phase 1.F (F-2c): direct file imports — `from '..'` lands at the\r\n// ui barrel which re-exports heavy modules (InfoSidebar, useFileUploadHandler).\r\nimport { Button } from '../Button'\r\nimport { Badge } from '../Badge'\r\nimport { Input } from '../Input'\r\nimport { Avatar } from '../Avatar'\r\nimport { UserAvatar } from '../UserAvatar'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { format } from 'date-fns'\r\nimport { cn } from '../../../utils/utils'\r\nimport { Comment } from '../../../types/dbTypes'\r\nimport { useUser } from '../../../hooks/users/users'\r\nimport { useSession } from 'next-auth/react'\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\ninterface CollapsibleCommentItemProps {\r\n comment: Comment\r\n onAction?: (action: CommentAction, id: number) => void\r\n replies?: Comment[]\r\n onReply?: (id: number, replyText: string | number) => void\r\n onFileUpload?: (id: number, files: FileList) => void\r\n attachments?: Array<{ name: string; url: string; size: number }>\r\n depth?: number\r\n isVisible?: boolean\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n}\r\n\r\nexport function CollapsibleCommentItem({\r\n comment,\r\n onAction,\r\n replies = [],\r\n onReply,\r\n onFileUpload,\r\n attachments = [],\r\n depth = 0,\r\n isVisible = true,\r\n onMouseEnter,\r\n onMouseLeave\r\n}: CollapsibleCommentItemProps) {\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [isExpanded, setIsExpanded] = React.useState(false)\r\n const [showReplyInput, setShowReplyInput] = React.useState(false)\r\n const [replyText, setReplyText] = React.useState('')\r\n const fileInputRef = React.useRef<HTMLInputElement>(null)\r\n const prevVisibleRef = React.useRef(isVisible)\r\n\r\n const user = useSession().data?.user\r\n\r\n // Auto-collapse when visibility turns off\r\n React.useEffect(() => {\r\n const prevVisible = prevVisibleRef.current\r\n \r\n if (prevVisible && !isVisible) {\r\n // Just turned invisible - collapse\r\n setIsExpanded(false)\r\n }\r\n \r\n prevVisibleRef.current = isVisible\r\n }, [isVisible])\r\n\r\n const handleReplySubmit = () => {\r\n if (replyText.trim() && onReply) {\r\n onReply(comment.id, replyText)\r\n setReplyText('')\r\n setShowReplyInput(false)\r\n }\r\n }\r\n\r\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.files && event.target.files.length > 0 && onFileUpload) {\r\n onFileUpload(comment.id, event.target.files)\r\n event.target.value = ''\r\n }\r\n }\r\n\r\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 12)}` : ''\r\n\r\n const { user: author } = useUser(String(comment.authorId))\r\n let authorName: string | undefined = author?.name ?? 'Unknown User'\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"border rounded-md overflow-hidden transition-opacity\",\r\n indentClass,\r\n // !isVisible && \"opacity-50\"\r\n )}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n {/* Comment Header */}\r\n <div className=\"flex items-start justify-between p-3 hover:bg-accent/50 transition-colors\">\r\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-6 w-6 p-0 mt-1\")}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n >\r\n <LR.ChevronRight\r\n className={cn(\r\n \"h-4 w-4 transition-transform\",\r\n isExpanded && \"rotate-90\"\r\n )}\r\n />\r\n </Button>\r\n\r\n <Avatar className={cn(\"h-8 w-8 mt-1 rounded-full overflow-hidden\")}>\r\n <UserAvatar imageFileId={author?.imageFileId} name={authorName} />\r\n </Avatar>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\"text-sm font-medium text-foreground \")}>\r\n {authorName}\r\n </span>\r\n {comment.updatedAt !== comment.createdAt && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {t('edited')}\r\n </Badge>\r\n )}\r\n </div>\r\n <p className={cn(\"text-sm mt-1 line-clamp-1 text-foreground\")}>\r\n {comment.text}\r\n </p>\r\n {replies.length > 0 && !isExpanded && (\r\n <span className=\"text-xs text-muted-foreground mt-1\">\r\n {replies.length} {replies.length === 1 ? t('reply') : t('replies')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n {onAction && (\r\n <div className={cn(\"flex items-center gap-0 flex-shrink-0\")}>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => setShowReplyInput(!showReplyInput)}\r\n title={t('replyToComment')}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.Reply className=\"h-4 w-4\" />\r\n </Button>\r\n {user?.id === String(comment.authorId) && (\r\n <>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('edit', comment.id)}\r\n title={t('editComment')}\r\n disabled={!ability.can('update', 'Comment')}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n </Button>\r\n {/* TODO: Need 2-step confirmation dialog for DELETE COMMENT */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('delete', comment.id)}\r\n title={t('deleteComment')}\r\n disabled={!ability.can('delete', 'Comment')}\r\n\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Expanded Content */ }\r\n {\r\n isExpanded && (\r\n <div className=\"border-t bg-muted/30\">\r\n <div className=\"p-4 space-y-4\">\r\n {/* Full Comment Text */}\r\n <span className=\"text-xs text-muted-foreground\">\r\n {format(new Date(comment.createdAt), 'PPp')}\r\n </span>\r\n <div>\r\n <p className=\"text-sm text-foreground whitespace-pre-wrap\">\r\n {comment.text}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n {/* Reply Input */ }\r\n {\r\n showReplyInput && onReply && (\r\n <div className=\"border-t p-3 bg-muted/20\">\r\n <div className=\"flex gap-2\">\r\n <Input\r\n value={replyText}\r\n onChange={(e) => setReplyText(e.target.value)}\r\n placeholder={t('writeReply')}\r\n className=\"flex-1\"\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault()\r\n handleReplySubmit()\r\n }\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n />\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReplySubmit}\r\n disabled={!replyText.trim() || !ability.can('create', 'Comment')}\r\n >\r\n <LR.Send className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n onClick={() => {\r\n setShowReplyInput(false)\r\n setReplyText('')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n {/* Nested Replies */ }\r\n {\r\n isExpanded && replies.length > 0 && (\r\n <div className=\"border-t\">\r\n {replies.map((reply) => (\r\n <CollapsibleCommentItem\r\n key={reply.id}\r\n comment={reply}\r\n onAction={onAction}\r\n onReply={onReply}\r\n onFileUpload={onFileUpload}\r\n depth={depth + 1}\r\n />\r\n ))}\r\n </div>\r\n )\r\n }\r\n </div >\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CollapsibleCommentItem.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { usePermissions } from '../../../store'\r\n\r\nimport { Button } from '../Button'\r\nimport { Badge } from '../Badge'\r\nimport { Input } from '../Input'\r\nimport { Avatar } from '../Avatar'\r\nimport { UserAvatar } from '../UserAvatar'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { format } from 'date-fns'\r\nimport { cn } from '../../../utils/utils'\r\nimport { Comment } from '../../../types/dbTypes'\r\nimport { useUser } from '../../../hooks/users/users'\r\nimport { useSession } from 'next-auth/react'\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\ninterface CollapsibleCommentItemProps {\r\n comment: Comment\r\n onAction?: (action: CommentAction, id: number) => void\r\n replies?: Comment[]\r\n onReply?: (id: number, replyText: string | number) => void\r\n onFileUpload?: (id: number, files: FileList) => void\r\n attachments?: Array<{ name: string; url: string; size: number }>\r\n depth?: number\r\n isVisible?: boolean\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n}\r\n\r\nexport function CollapsibleCommentItem({\r\n comment,\r\n onAction,\r\n replies = [],\r\n onReply,\r\n onFileUpload,\r\n attachments = [],\r\n depth = 0,\r\n isVisible = true,\r\n onMouseEnter,\r\n onMouseLeave\r\n}: CollapsibleCommentItemProps) {\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [isExpanded, setIsExpanded] = React.useState(false)\r\n const [showReplyInput, setShowReplyInput] = React.useState(false)\r\n const [replyText, setReplyText] = React.useState('')\r\n const fileInputRef = React.useRef<HTMLInputElement>(null)\r\n const prevVisibleRef = React.useRef(isVisible)\r\n\r\n const user = useSession().data?.user\r\n\r\n // Auto-collapse when visibility turns off\r\n React.useEffect(() => {\r\n const prevVisible = prevVisibleRef.current\r\n \r\n if (prevVisible && !isVisible) {\r\n // Just turned invisible - collapse\r\n setIsExpanded(false)\r\n }\r\n \r\n prevVisibleRef.current = isVisible\r\n }, [isVisible])\r\n\r\n const handleReplySubmit = () => {\r\n if (replyText.trim() && onReply) {\r\n onReply(comment.id, replyText)\r\n setReplyText('')\r\n setShowReplyInput(false)\r\n }\r\n }\r\n\r\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.files && event.target.files.length > 0 && onFileUpload) {\r\n onFileUpload(comment.id, event.target.files)\r\n event.target.value = ''\r\n }\r\n }\r\n\r\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 12)}` : ''\r\n\r\n const { user: author } = useUser(String(comment.authorId))\r\n let authorName: string | undefined = author?.name ?? 'Unknown User'\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"border rounded-md overflow-hidden transition-opacity\",\r\n indentClass,\r\n // !isVisible && \"opacity-50\"\r\n )}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n {/* Comment Header */}\r\n <div className=\"flex items-start justify-between p-3 hover:bg-accent/50 transition-colors\">\r\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-6 w-6 p-0 mt-1\")}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n >\r\n <LR.ChevronRight\r\n className={cn(\r\n \"h-4 w-4 transition-transform\",\r\n isExpanded && \"rotate-90\"\r\n )}\r\n />\r\n </Button>\r\n\r\n <Avatar className={cn(\"h-8 w-8 mt-1 rounded-full overflow-hidden\")}>\r\n <UserAvatar imageFileId={author?.imageFileId} name={authorName} />\r\n </Avatar>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\"text-sm font-medium text-foreground \")}>\r\n {authorName}\r\n </span>\r\n {comment.updatedAt !== comment.createdAt && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {t('edited')}\r\n </Badge>\r\n )}\r\n </div>\r\n <p className={cn(\"text-sm mt-1 line-clamp-1 text-foreground\")}>\r\n {comment.text}\r\n </p>\r\n {replies.length > 0 && !isExpanded && (\r\n <span className=\"text-xs text-muted-foreground mt-1\">\r\n {replies.length} {replies.length === 1 ? t('reply') : t('replies')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n {onAction && (\r\n <div className={cn(\"flex items-center gap-0 flex-shrink-0\")}>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => setShowReplyInput(!showReplyInput)}\r\n title={t('replyToComment')}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.Reply className=\"h-4 w-4\" />\r\n </Button>\r\n {user?.id === String(comment.authorId) && (\r\n <>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('edit', comment.id)}\r\n title={t('editComment')}\r\n disabled={!ability.can('update', 'Comment')}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n </Button>\r\n {/* TODO: Need 2-step confirmation dialog for DELETE COMMENT */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('delete', comment.id)}\r\n title={t('deleteComment')}\r\n disabled={!ability.can('delete', 'Comment')}\r\n\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Expanded Content */ }\r\n {\r\n isExpanded && (\r\n <div className=\"border-t bg-muted/30\">\r\n <div className=\"p-4 space-y-4\">\r\n {/* Full Comment Text */}\r\n <span className=\"text-xs text-muted-foreground\">\r\n {format(new Date(comment.createdAt), 'PPp')}\r\n </span>\r\n <div>\r\n <p className=\"text-sm text-foreground whitespace-pre-wrap\">\r\n {comment.text}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n {/* Reply Input */ }\r\n {\r\n showReplyInput && onReply && (\r\n <div className=\"border-t p-3 bg-muted/20\">\r\n <div className=\"flex gap-2\">\r\n <Input\r\n value={replyText}\r\n onChange={(e) => setReplyText(e.target.value)}\r\n placeholder={t('writeReply')}\r\n className=\"flex-1\"\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault()\r\n handleReplySubmit()\r\n }\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n />\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReplySubmit}\r\n disabled={!replyText.trim() || !ability.can('create', 'Comment')}\r\n >\r\n <LR.Send className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n onClick={() => {\r\n setShowReplyInput(false)\r\n setReplyText('')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n {/* Nested Replies */ }\r\n {\r\n isExpanded && replies.length > 0 && (\r\n <div className=\"border-t\">\r\n {replies.map((reply) => (\r\n <CollapsibleCommentItem\r\n key={reply.id}\r\n comment={reply}\r\n onAction={onAction}\r\n onReply={onReply}\r\n onFileUpload={onFileUpload}\r\n depth={depth + 1}\r\n />\r\n ))}\r\n </div>\r\n )\r\n }\r\n </div >\r\n )\r\n}\r\n"],"mappings":";AA4GY,SAgDA,UAhDA,KAaA,YAbA;AA1GZ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAE/B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB,SAAS,UAAU;AAEnB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAiBpB,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AAAA,EACf,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAgC;AA5ChC;AA6CE,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAS,KAAK;AAChE,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,EAAE;AACnD,QAAM,eAAe,MAAM,OAAyB,IAAI;AACxD,QAAM,iBAAiB,MAAM,OAAO,SAAS;AAE7C,QAAM,QAAO,gBAAW,EAAE,SAAb,mBAAmB;AAGhC,QAAM,UAAU,MAAM;AACpB,UAAM,cAAc,eAAe;AAEnC,QAAI,eAAe,CAAC,WAAW;AAE7B,oBAAc,KAAK;AAAA,IACrB;AAEA,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,oBAAoB,MAAM;AAC9B,QAAI,UAAU,KAAK,KAAK,SAAS;AAC/B,cAAQ,QAAQ,IAAI,SAAS;AAC7B,mBAAa,EAAE;AACf,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,UAA+C;AACvE,QAAI,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM,SAAS,KAAK,cAAc;AACvE,mBAAa,QAAQ,IAAI,MAAM,OAAO,KAAK;AAC3C,YAAM,OAAO,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,IAAI,MAAM,KAAK,IAAI,QAAQ,GAAG,EAAE,CAAC,KAAK;AAElE,QAAM,EAAE,MAAM,OAAO,IAAI,QAAQ,OAAO,QAAQ,QAAQ,CAAC;AACzD,MAAI,cAAiC,sCAAQ,SAAR,YAAgB;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA,MAEF;AAAA,MACA;AAAA,MACA;AAAA,MAGA;AAAA,6BAAC,SAAI,WAAU,6EACb;AAAA,+BAAC,SAAI,WAAU,yCACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAW,GAAG,kBAAkB;AAAA,gBAChC,SAAS,MAAM,cAAc,CAAC,UAAU;AAAA,gBAExC;AAAA,kBAAC,GAAG;AAAA,kBAAH;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,cAAc;AAAA,oBAChB;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAEA,oBAAC,UAAO,WAAW,GAAG,2CAA2C,GAC/D,8BAAC,cAAW,aAAa,iCAAQ,aAAa,MAAM,YAAY,GAClE;AAAA,YAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,mCAAC,SAAI,WAAU,2BACX;AAAA,oCAAC,UAAK,WAAW,GAAG,sCAAsC,GACzD,sBACH;AAAA,gBACC,QAAQ,cAAc,QAAQ,aAC7B,oBAAC,SAAM,SAAQ,WAAU,WAAU,WAChC,YAAE,QAAQ,GACb;AAAA,iBAEJ;AAAA,cACE,oBAAC,OAAE,WAAW,GAAG,2CAA2C,GAC3D,kBAAQ,MACX;AAAA,cACC,QAAQ,SAAS,KAAK,CAAC,cACtB,qBAAC,UAAK,WAAU,sCACb;AAAA,wBAAQ;AAAA,gBAAO;AAAA,gBAAE,QAAQ,WAAW,IAAI,EAAE,OAAO,IAAI,EAAE,SAAS;AAAA,iBACnE;AAAA,eAEJ;AAAA,aACF;AAAA,UAGD,YACC,qBAAC,SAAI,WAAW,GAAG,uCAAuC,GACxD;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM,kBAAkB,CAAC,cAAc;AAAA,gBAChD,OAAO,EAAE,gBAAgB;AAAA,gBACzB,UAAU,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA,gBAE1C,8BAAC,GAAG,OAAH,EAAS,WAAU,WAAU;AAAA;AAAA,YAChC;AAAA,aACC,6BAAM,QAAO,OAAO,QAAQ,QAAQ,KACnC,iCACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,SAAS,QAAQ,QAAQ,EAAE;AAAA,kBAC1C,OAAO,EAAE,aAAa;AAAA,kBACtB,UAAU,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA,kBAE1C,8BAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA;AAAA,cACjC;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,SAAS,UAAU,QAAQ,EAAE;AAAA,kBAC5C,OAAO,EAAE,eAAe;AAAA,kBACxB,UAAU,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA,kBAG1C,8BAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA;AAAA,cACjC;AAAA,eACF;AAAA,aAEJ;AAAA,WAEJ;AAAA,QAIA,cACE,oBAAC,SAAI,WAAU,wBACb,+BAAC,SAAI,WAAU,iBAEb;AAAA,8BAAC,UAAK,WAAU,iCACb,iBAAO,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,GAC5C;AAAA,UACA,oBAAC,SACC,8BAAC,OAAE,WAAU,+CACV,kBAAQ,MACX,GACF;AAAA,WACF,GACF;AAAA,QAMF,kBAAkB,WAChB,oBAAC,SAAI,WAAU,4BACb,+BAAC,SAAI,WAAU,cACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,cAC5C,aAAa,EAAE,YAAY;AAAA,cAC3B,WAAU;AAAA,cACV,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,oBAAE,eAAe;AACjB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,cACA,UAAU,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA;AAAA,UAC5C;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA,cAE/D,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA;AAAA,UAC/B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,SAAS,MAAM;AACb,kCAAkB,KAAK;AACvB,6BAAa,EAAE;AAAA,cACjB;AAAA,cACA,UAAU,CAAC,QAAQ,IAAI,UAAU,SAAS;AAAA,cAE1C,8BAAC,GAAG,GAAH,EAAK,WAAU,WAAU;AAAA;AAAA,UAC5B;AAAA,WACF,GACF;AAAA,QAMF,cAAc,QAAQ,SAAS,KAC7B,oBAAC,SAAI,WAAU,YACZ,kBAAQ,IAAI,CAAC,UACZ;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,QAAQ;AAAA;AAAA,UALV,MAAM;AAAA,QAMb,CACD,GACH;AAAA;AAAA;AAAA,EAGF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsSection.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/CommentsSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,wBAAgB,eAAe,sBAsI9B"}
1
+ {"version":3,"file":"CommentsSection.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/CommentsSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,wBAAgB,eAAe,sBAsI9B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CommentsSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, MenusContext, ToolsContext, usePermissions } from '../../../store'\r\n// Audit Phase 1.F (F-2c): direct file imports — bypass ui barrel.\r\nimport { CollapsibleSection } from '../CollapsibleSection'\r\nimport { SearchInput } from '../SearchInput'\r\nimport { useTranslations } from 'next-intl'\r\nimport { CollapsibleCommentItem } from './CollapsibleCommentItem'\r\nimport { useComment, useComments } from '../../../hooks/comments/comments';\r\nimport { toast } from 'sonner'\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\nexport function CommentsSection() {\r\n // Translation\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { dispatch: toolsDispatch } = React.useContext(ToolsContext)\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { currentViewer, commentsVisibleInViewer } = menusState.menus\r\n\r\n const {comments} = useComments()\r\n const {state: buildingsState} = React.useContext(BuildingsContext)\r\n const buildingId = buildingsState?.buildings?.building?.id || -1\r\n \r\n const [commentToDelete, setCommentToDelete] = React.useState<number | null>(null)\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const { deleteComment } = useComment(commentToDelete)\r\n\r\n const handleAddComment = React.useCallback(() => {\r\n if (!currentViewer) return\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: {\r\n currentToolId:\r\n currentViewer === 'bim'\r\n ? 'bim-add-comment'\r\n : currentViewer === 'map'\r\n ? 'map-add-comment'\r\n : undefined,\r\n },\r\n })\r\n }, [toolsDispatch, currentViewer])\r\n \r\n const handleCommentAction = React.useCallback((action: CommentAction, id: number) => {\r\n switch (action) {\r\n case 'view':\r\n console.log(`View comment ${id}`)\r\n break\r\n case 'edit':\r\n console.log(`Edit comment ${id}`)\r\n break\r\n case 'delete':\r\n toast.success(t('commentDeleted'))\r\n setCommentToDelete(id)\r\n break\r\n case 'reply':\r\n console.log(`Reply to comment ${id}`)\r\n break\r\n default:\r\n break\r\n }\r\n }, [t])\r\n\r\n // Trigger deletion when commentToDelete changes\r\n React.useEffect(() => {\r\n if (commentToDelete !== null) {\r\n deleteComment()\r\n setCommentToDelete(null)\r\n }\r\n }, [commentToDelete, deleteComment])\r\n\r\n const handleReply = React.useCallback((id: number, replyText: string) => {\r\n console.log(`Reply to ${id}: ${replyText}`)\r\n // TODO: Implement reply functionality\r\n }, [])\r\n\r\n const handleFileUpload = React.useCallback((commentId: number, files: FileList) => {\r\n console.log(`Upload files for comment ${commentId}:`, Array.from(files).map(f => f.name))\r\n // TODO: Implement file upload functionality\r\n }, [])\r\n\r\n const currentComments = comments.filter((comment) => currentViewer === comment.viewer && (!comment.buildingId || comment.buildingId === buildingId))\r\n\r\n // Filter comments based on search query\r\n const filteredComments = React.useMemo(() => {\r\n if (!searchQuery.trim()) return currentComments\r\n \r\n const query = searchQuery.toLowerCase()\r\n return currentComments.filter((comment) => \r\n comment.text?.toLowerCase().includes(query)\r\n )\r\n }, [currentComments, searchQuery])\r\n\r\n const commentsVisible = commentsVisibleInViewer.includes(currentViewer) \r\n\r\n const toggleCommentsVisibility = React.useCallback(() => {\r\n menusDispatch({\r\n type: commentsVisible ? 'HIDE_COMMENTS_IN_VIEWER' : 'SHOW_COMMENTS_IN_VIEWER',\r\n payload: {\r\n viewer: currentViewer,\r\n },\r\n })\r\n }, [currentViewer, commentsVisible, menusDispatch])\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder={t('searchComments')}\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <CollapsibleSection\r\n title={t('commentsTitle')}\r\n icon={LR.MessageCircle}\r\n className=\"overflow-y-auto\"\r\n itemCount={filteredComments.length}\r\n onAddItem={handleAddComment}\r\n addItemTitle={t('addCommentTitle')}\r\n switchVariant={{\r\n checked: commentsVisible,\r\n onCheckedChange: toggleCommentsVisibility,\r\n }}\r\n >\r\n <div className=\"space-y-2 mx-2 pr-2\">\r\n {filteredComments.map((comment) => (\r\n <CollapsibleCommentItem\r\n key={comment.id}\r\n comment={comment}\r\n onAction={handleCommentAction}\r\n onReply={handleReply}\r\n onFileUpload={handleFileUpload}\r\n replies={[]}\r\n attachments={[]}\r\n isVisible={commentsVisible}\r\n onMouseEnter={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: comment.id } })}\r\n onMouseLeave={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: null } })}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CommentsSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, MenusContext, ToolsContext, usePermissions } from '../../../store'\r\nimport { CollapsibleSection } from '../CollapsibleSection'\r\nimport { SearchInput } from '../SearchInput'\r\nimport { useTranslations } from 'next-intl'\r\nimport { CollapsibleCommentItem } from './CollapsibleCommentItem'\r\nimport { useComment, useComments } from '../../../hooks/comments/comments';\r\nimport { toast } from 'sonner'\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\nexport function CommentsSection() {\r\n // Translation\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { dispatch: toolsDispatch } = React.useContext(ToolsContext)\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { currentViewer, commentsVisibleInViewer } = menusState.menus\r\n\r\n const {comments} = useComments()\r\n const {state: buildingsState} = React.useContext(BuildingsContext)\r\n const buildingId = buildingsState?.buildings?.building?.id || -1\r\n \r\n const [commentToDelete, setCommentToDelete] = React.useState<number | null>(null)\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const { deleteComment } = useComment(commentToDelete)\r\n\r\n const handleAddComment = React.useCallback(() => {\r\n if (!currentViewer) return\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: {\r\n currentToolId:\r\n currentViewer === 'bim'\r\n ? 'bim-add-comment'\r\n : currentViewer === 'map'\r\n ? 'map-add-comment'\r\n : undefined,\r\n },\r\n })\r\n }, [toolsDispatch, currentViewer])\r\n \r\n const handleCommentAction = React.useCallback((action: CommentAction, id: number) => {\r\n switch (action) {\r\n case 'view':\r\n console.log(`View comment ${id}`)\r\n break\r\n case 'edit':\r\n console.log(`Edit comment ${id}`)\r\n break\r\n case 'delete':\r\n toast.success(t('commentDeleted'))\r\n setCommentToDelete(id)\r\n break\r\n case 'reply':\r\n console.log(`Reply to comment ${id}`)\r\n break\r\n default:\r\n break\r\n }\r\n }, [t])\r\n\r\n // Trigger deletion when commentToDelete changes\r\n React.useEffect(() => {\r\n if (commentToDelete !== null) {\r\n deleteComment()\r\n setCommentToDelete(null)\r\n }\r\n }, [commentToDelete, deleteComment])\r\n\r\n const handleReply = React.useCallback((id: number, replyText: string) => {\r\n console.log(`Reply to ${id}: ${replyText}`)\r\n // TODO: Implement reply functionality\r\n }, [])\r\n\r\n const handleFileUpload = React.useCallback((commentId: number, files: FileList) => {\r\n console.log(`Upload files for comment ${commentId}:`, Array.from(files).map(f => f.name))\r\n // TODO: Implement file upload functionality\r\n }, [])\r\n\r\n const currentComments = comments.filter((comment) => currentViewer === comment.viewer && (!comment.buildingId || comment.buildingId === buildingId))\r\n\r\n // Filter comments based on search query\r\n const filteredComments = React.useMemo(() => {\r\n if (!searchQuery.trim()) return currentComments\r\n \r\n const query = searchQuery.toLowerCase()\r\n return currentComments.filter((comment) => \r\n comment.text?.toLowerCase().includes(query)\r\n )\r\n }, [currentComments, searchQuery])\r\n\r\n const commentsVisible = commentsVisibleInViewer.includes(currentViewer) \r\n\r\n const toggleCommentsVisibility = React.useCallback(() => {\r\n menusDispatch({\r\n type: commentsVisible ? 'HIDE_COMMENTS_IN_VIEWER' : 'SHOW_COMMENTS_IN_VIEWER',\r\n payload: {\r\n viewer: currentViewer,\r\n },\r\n })\r\n }, [currentViewer, commentsVisible, menusDispatch])\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder={t('searchComments')}\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <CollapsibleSection\r\n title={t('commentsTitle')}\r\n icon={LR.MessageCircle}\r\n className=\"overflow-y-auto\"\r\n itemCount={filteredComments.length}\r\n onAddItem={handleAddComment}\r\n addItemTitle={t('addCommentTitle')}\r\n switchVariant={{\r\n checked: commentsVisible,\r\n onCheckedChange: toggleCommentsVisibility,\r\n }}\r\n >\r\n <div className=\"space-y-2 mx-2 pr-2\">\r\n {filteredComments.map((comment) => (\r\n <CollapsibleCommentItem\r\n key={comment.id}\r\n comment={comment}\r\n onAction={handleCommentAction}\r\n onReply={handleReply}\r\n onFileUpload={handleFileUpload}\r\n replies={[]}\r\n attachments={[]}\r\n isVisible={commentsVisible}\r\n onMouseEnter={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: comment.id } })}\r\n onMouseLeave={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: null } })}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA6GI,SAEI,KAFJ;AA3GJ,YAAY,WAAW;AACvB,YAAY,QAAQ;AACpB,SAAS,kBAAkB,cAAc,cAAc,sBAAsB;AAC7E,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,YAAY,mBAAmB;AACxC,SAAS,aAAa;AAIf,SAAS,kBAAkB;AAdlC;AAgBE,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACjE,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,eAAe,wBAAwB,IAAI,WAAW;AAE9D,QAAM,EAAC,SAAQ,IAAI,YAAY;AAC/B,QAAM,EAAC,OAAO,eAAc,IAAI,MAAM,WAAW,gBAAgB;AACjE,QAAM,eAAa,4DAAgB,cAAhB,mBAA2B,aAA3B,mBAAqC,OAAM;AAE9D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAwB,IAAI;AAChF,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,EAAE,cAAc,IAAI,WAAW,eAAe;AAEpD,QAAM,mBAAmB,MAAM,YAAY,MAAM;AAC/C,QAAI,CAAC,cAAe;AAClB,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,QACP,eACE,kBAAkB,QACd,oBACA,kBAAkB,QAChB,oBACA;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,GAAG,CAAC,eAAe,aAAa,CAAC;AAEjC,QAAM,sBAAsB,MAAM,YAAY,CAAC,QAAuB,OAAe;AACnF,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,gBAAQ,IAAI,gBAAgB,EAAE,EAAE;AAChC;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,gBAAgB,EAAE,EAAE;AAChC;AAAA,MACF,KAAK;AACC,cAAM,QAAQ,EAAE,gBAAgB,CAAC;AACjC,2BAAmB,EAAE;AACzB;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,oBAAoB,EAAE,EAAE;AACpC;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,CAAC,CAAC;AAGN,QAAM,UAAU,MAAM;AACpB,QAAI,oBAAoB,MAAM;AAC5B,oBAAc;AACd,yBAAmB,IAAI;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,cAAc,MAAM,YAAY,CAAC,IAAY,cAAsB;AACvE,YAAQ,IAAI,YAAY,EAAE,KAAK,SAAS,EAAE;AAAA,EAE5C,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,MAAM,YAAY,CAAC,WAAmB,UAAoB;AACjF,YAAQ,IAAI,4BAA4B,SAAS,KAAK,MAAM,KAAK,KAAK,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC;AAAA,EAE1F,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,SAAS,OAAO,CAAC,YAAY,kBAAkB,QAAQ,WAAW,CAAC,QAAQ,cAAc,QAAQ,eAAe,WAAW;AAGnJ,QAAM,mBAAmB,MAAM,QAAQ,MAAM;AAC3C,QAAI,CAAC,YAAY,KAAK,EAAG,QAAO;AAEhC,UAAM,QAAQ,YAAY,YAAY;AACtC,WAAO,gBAAgB;AAAA,MAAO,CAAC,YAAS;AA5F5C,YAAAA;AA6FM,gBAAAA,MAAA,QAAQ,SAAR,gBAAAA,IAAc,cAAc,SAAS;AAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,iBAAiB,WAAW,CAAC;AAEjC,QAAM,kBAAkB,wBAAwB,SAAS,aAAa;AAEtE,QAAM,2BAA2B,MAAM,YAAY,MAAM;AACrD,kBAAc;AAAA,MACZ,MAAM,kBAAkB,4BAA4B;AAAA,MACpD,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,GAAG,CAAC,eAAe,iBAAiB,aAAa,CAAC;AAElD,SACE,qBAAC,SAAI,WAAU,kDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,EAAE,gBAAgB;AAAA,QAC/B,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,eAAe;AAAA,QACxB,MAAM,GAAG;AAAA,QACT,WAAU;AAAA,QACV,WAAW,iBAAiB;AAAA,QAC5B,WAAW;AAAA,QACX,cAAc,EAAE,iBAAiB;AAAA,QACjC,eAAe;AAAA,UACb,SAAS;AAAA,UACT,iBAAiB;AAAA,QACnB;AAAA,QAEA,8BAAC,SAAI,WAAU,uBACZ,2BAAiB,IAAI,CAAC,YACrB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,SAAS,CAAC;AAAA,YACV,aAAa,CAAC;AAAA,YACd,WAAW;AAAA,YACX,cAAc,MAAM,cAAc,EAAE,MAAM,0BAA0B,SAAS,EAAE,WAAW,QAAQ,GAAG,EAAE,CAAC;AAAA,YACxG,cAAc,MAAM,cAAc,EAAE,MAAM,0BAA0B,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA;AAAA,UAT7F,QAAQ;AAAA,QAUf,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/DataTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,SAAS,EAOV,MAAM,uBAAuB,CAAA;AAmC9B,UAAU,cAAc,CAAC,KAAK,EAAE,MAAM;IACpC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAA;IACnC,IAAI,EAAE,KAAK,EAAE,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACtC,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACvC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EACvC,OAAO,EACP,IAAI,EACJ,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,cAAqB,EACrB,GAAQ,EACR,SAAiB,GAClB,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,qBAkQ/B"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/DataTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,SAAS,EAOV,MAAM,uBAAuB,CAAA;AAmC9B,UAAU,cAAc,CAAC,KAAK,EAAE,MAAM;IACpC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAA;IACnC,IAAI,EAAE,KAAK,EAAE,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACtC,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACvC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EACvC,OAAO,EACP,IAAI,EACJ,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,cAAqB,EACrB,GAAQ,EACR,SAAiB,GAClB,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,qBAgR/B"}
@@ -71,6 +71,7 @@ function DataTable({
71
71
  const table = useReactTable({
72
72
  data,
73
73
  columns,
74
+ autoResetPageIndex: false,
74
75
  getCoreRowModel: getCoreRowModel(),
75
76
  getPaginationRowModel: getPaginationRowModel(),
76
77
  onSortingChange: setSorting,
@@ -90,6 +91,12 @@ function DataTable({
90
91
  }
91
92
  }
92
93
  });
94
+ React.useEffect(() => {
95
+ const pageCount = Math.max(1, Math.ceil(data.length / rowsPerPage));
96
+ if (pageIndex > pageCount - 1) {
97
+ setPageIndex(pageCount - 1);
98
+ }
99
+ }, [data.length, rowsPerPage, pageIndex]);
93
100
  if (isLoading) {
94
101
  return /* @__PURE__ */ jsx(
95
102
  DataTableSkeleton,