@ifc-lite/viewer 1.17.2 → 1.17.4

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 (520) hide show
  1. package/.turbo/turbo-build.log +34 -24
  2. package/.turbo/turbo-typecheck.log +1 -42
  3. package/CHANGELOG.md +24 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
  7. package/dist/assets/bcf-DOG9_WPX.js +281 -0
  8. package/dist/assets/{browser-BDShTXzi.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-gWfpdfYe.js +257 -0
  12. package/dist/assets/epsg-index.generated-BjJrt_0S.js +1 -0
  13. package/dist/assets/exporters-ChAtBmlj.js +80367 -0
  14. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  15. package/dist/assets/ids-B4jTqB1O.js +1 -0
  16. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  17. package/dist/assets/index-Co8E2-FE.js +106013 -0
  18. package/dist/assets/index-DckuDqlv.css +1 -0
  19. package/dist/assets/lens-CSASnhAL.js +1 -0
  20. package/dist/assets/maplibre-gl-CGLcoNXc.js +811 -0
  21. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  22. package/dist/assets/{arrow2-bb-jcVEo.js → parquet-CEXmQNRO.js} +2 -2
  23. package/dist/assets/sandbox-DZiNLNMk.js +5933 -0
  24. package/dist/assets/server-client-BV8zHZ7Y.js +626 -0
  25. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  26. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  27. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  28. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  29. package/dist/assets/zip-DBEtpeu6.js +12 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  55. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  56. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  57. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  58. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  59. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  60. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  61. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  62. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  111. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  112. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  113. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  227. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  228. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  229. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  230. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  231. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  232. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  233. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  234. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  235. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  236. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  237. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  238. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  239. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  240. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  241. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  242. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  243. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  244. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  245. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  246. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  247. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  248. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  249. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  250. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  251. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  252. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  253. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  276. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  277. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  278. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  285. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  286. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  287. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  288. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  289. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  290. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  291. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  292. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  293. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  294. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  295. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  296. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  297. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  298. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  299. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  300. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  301. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  302. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  303. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  304. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  305. package/dist/cesium/Widgets/lighter.css +237 -0
  306. package/dist/cesium/Widgets/lighterShared.css +46 -0
  307. package/dist/cesium/Widgets/shared.css +103 -0
  308. package/dist/cesium/Widgets/widgets.css +1342 -0
  309. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  310. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  311. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  312. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  313. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  314. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  315. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  316. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  317. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  318. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  319. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  320. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  321. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  322. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  323. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  324. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  325. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  326. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  327. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  328. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  329. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  330. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  331. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  332. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  333. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  334. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  335. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  336. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  337. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  338. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  339. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  340. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  341. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  342. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  343. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  344. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  345. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  346. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  348. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  349. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  350. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  351. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  352. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  353. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  354. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  355. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  356. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  357. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  358. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  359. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  360. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  361. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  362. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  363. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  364. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  365. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  366. package/dist/cesium/Workers/combineGeometry.js +26 -0
  367. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  368. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  374. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  375. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  376. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  378. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  379. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  380. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  381. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  382. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  383. package/dist/cesium/Workers/createGeometry.js +26 -0
  384. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  391. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  393. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  395. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  396. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  397. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  398. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  399. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  400. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  401. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  402. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  404. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  405. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  406. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  407. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  408. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  409. package/dist/cesium/Workers/decodeDraco.js +26 -0
  410. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  411. package/dist/cesium/Workers/decodeI3S.js +26 -0
  412. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  413. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  414. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  415. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  416. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  417. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  418. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  419. package/dist/index.html +13 -2
  420. package/package.json +27 -19
  421. package/src/App.tsx +1 -17
  422. package/src/components/viewer/BCFPanel.tsx +46 -4
  423. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  424. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  425. package/src/components/viewer/ChatPanel.tsx +54 -16
  426. package/src/components/viewer/CommandPalette.tsx +6 -1
  427. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  428. package/src/components/viewer/ExportChangesButton.tsx +24 -4
  429. package/src/components/viewer/ExportDialog.tsx +38 -9
  430. package/src/components/viewer/HierarchyPanel.tsx +202 -6
  431. package/src/components/viewer/IDSPanel.tsx +52 -3
  432. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  433. package/src/components/viewer/MainToolbar.tsx +353 -27
  434. package/src/components/viewer/PropertiesPanel.tsx +306 -131
  435. package/src/components/viewer/ScriptPanel.tsx +34 -8
  436. package/src/components/viewer/Section2DPanel.tsx +3 -2
  437. package/src/components/viewer/SettingsPage.tsx +430 -0
  438. package/src/components/viewer/StatusBar.tsx +17 -1
  439. package/src/components/viewer/UpgradePage.tsx +6 -4
  440. package/src/components/viewer/ViewerLayout.tsx +47 -6
  441. package/src/components/viewer/Viewport.tsx +49 -8
  442. package/src/components/viewer/ViewportContainer.tsx +285 -32
  443. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  444. package/src/components/viewer/hierarchy/treeDataBuilder.ts +2 -1
  445. package/src/components/viewer/properties/EpsgLookupDialog.tsx +418 -0
  446. package/src/components/viewer/properties/GeoreferencingPanel.tsx +703 -0
  447. package/src/components/viewer/properties/LocationMap.tsx +730 -0
  448. package/src/components/viewer/properties/ModelMetadataPanel.tsx +3 -70
  449. package/src/components/viewer/selectionHandlers.ts +4 -3
  450. package/src/components/viewer/useAnimationLoop.ts +4 -0
  451. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  452. package/src/components/viewer/useMouseControls.ts +4 -1
  453. package/src/hooks/bcfIdLookup.ts +13 -11
  454. package/src/hooks/ids/idsColorSystem.ts +3 -8
  455. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  456. package/src/hooks/useIDS.ts +32 -17
  457. package/src/hooks/useIfc.ts +7 -1
  458. package/src/hooks/useIfcCache.ts +28 -15
  459. package/src/hooks/useIfcFederation.ts +59 -227
  460. package/src/hooks/useIfcLoader.ts +1656 -130
  461. package/src/hooks/useIfcServer.ts +0 -69
  462. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +45 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +310 -0
  467. package/src/lib/geo/kmz-exporter.ts +112 -0
  468. package/src/lib/geo/reproject.ts +370 -0
  469. package/src/lib/lens/adapter.ts +3 -1
  470. package/src/lib/recent-files.ts +2 -1
  471. package/src/main.tsx +1 -0
  472. package/src/sdk/adapters/export-adapter.ts +14 -1
  473. package/src/sdk/adapters/viewer-adapter.ts +5 -9
  474. package/src/sdk/adapters/visibility-adapter.ts +6 -9
  475. package/src/services/analysis-extensions.ts +125 -0
  476. package/src/services/app-navigation.ts +13 -0
  477. package/src/services/bsdd.ts +53 -4
  478. package/src/services/cacheService.ts +1 -1
  479. package/src/services/desktop-cache.ts +43 -0
  480. package/src/services/desktop-export.ts +77 -0
  481. package/src/services/desktop-harness.ts +196 -0
  482. package/src/services/desktop-logger.ts +20 -0
  483. package/src/services/desktop-native-metadata.ts +207 -0
  484. package/src/services/desktop-panel-actions.ts +43 -0
  485. package/src/services/desktop-preferences.ts +44 -0
  486. package/src/services/file-dialog.ts +147 -0
  487. package/src/services/tauri-core-stub.ts +7 -0
  488. package/src/services/tauri-dialog-stub.ts +7 -0
  489. package/src/services/tauri-fs-stub.ts +7 -0
  490. package/src/store/basketVisibleSet.ts +3 -4
  491. package/src/store/globalId.ts +79 -0
  492. package/src/store/index.ts +41 -2
  493. package/src/store/slices/cesiumSlice.ts +122 -0
  494. package/src/store/slices/chatSlice.ts +5 -1
  495. package/src/store/slices/dataSlice.ts +139 -28
  496. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  497. package/src/store/slices/loadingSlice.ts +14 -2
  498. package/src/store/slices/modelSlice.ts +58 -3
  499. package/src/store/slices/mutationSlice.ts +178 -0
  500. package/src/store/slices/pinboardSlice.ts +4 -8
  501. package/src/store/types.ts +96 -2
  502. package/src/store.ts +1 -1
  503. package/src/utils/desktopModelSnapshot.ts +358 -0
  504. package/src/utils/ifcConfig.ts +6 -1
  505. package/src/utils/nativeSpatialDataStore.ts +250 -0
  506. package/src/utils/serverDataModel.ts +4 -0
  507. package/src/utils/spatialHierarchy.ts +10 -11
  508. package/vite.config.ts +41 -0
  509. package/dist/assets/Arrow.dom-BhOg9lpn.js +0 -20
  510. package/dist/assets/arrow2_bg-BlXl-cSQ.js +0 -1
  511. package/dist/assets/basketViewActivator-BRG5DBmM.js +0 -1
  512. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  513. package/dist/assets/geometry.worker-kgiT_Qhh.js +0 -1
  514. package/dist/assets/ifc-lite_bg-FNRmpSvM.wasm +0 -0
  515. package/dist/assets/index-B1Ecw4AU.js +0 -189756
  516. package/dist/assets/index-Ba4eoTe7.css +0 -1
  517. package/dist/assets/index-CrgYBjTn.js +0 -229
  518. package/dist/assets/module-6F3E5H7Y-tx0BadV3.js +0 -6
  519. package/dist/assets/native-bridge-Crsb7TKz.js +0 -111
  520. package/dist/assets/wasm-bridge-mJUhb7uk.js +0 -1
@@ -27,11 +27,13 @@ import { ScrollArea } from '@/components/ui/scroll-area';
27
27
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';
28
28
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
29
29
  import { useViewerStore } from '@/store';
30
+ import { toGlobalIdFromModels } from '@/store/globalId';
30
31
  import { useIfc } from '@/hooks/useIfc';
32
+ import { getNativeEntityDetails } from '@/services/desktop-native-metadata';
31
33
  import { configureMutationView } from '@/utils/configureMutationView';
32
34
  import { IfcQuery } from '@ifc-lite/query';
33
35
  import { MutablePropertyView } from '@ifc-lite/mutations';
34
- import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, type IfcDataStore } from '@ifc-lite/parser';
36
+ import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGeoreferencingOnDemand, type IfcDataStore } from '@ifc-lite/parser';
35
37
  import { EntityFlags, RelationshipType, isSpatialStructureTypeName, isStoreyLikeSpatialTypeName } from '@ifc-lite/data';
36
38
  import type { EntityRef, FederatedModel } from '@/store/types';
37
39
 
@@ -45,6 +47,7 @@ import { DocumentCard } from './properties/DocumentCard';
45
47
  import { RelationshipsCard } from './properties/RelationshipsCard';
46
48
  import type { PropertySet, QuantitySet } from './properties/encodingUtils';
47
49
  import { BsddCard } from './properties/BsddCard';
50
+ import { GeoreferencingPanel } from './properties/GeoreferencingPanel';
48
51
 
49
52
  type DisplayProperty = { name: string; value: unknown; isMutated: boolean };
50
53
  type DisplayPropertySet = {
@@ -101,7 +104,7 @@ export function PropertiesPanel() {
101
104
  const m = models.get(selectedEntity.modelId);
102
105
  if (m) {
103
106
  return {
104
- modelQuery: new IfcQuery(m.ifcDataStore),
107
+ modelQuery: m.nativeMetadata ? null : (m.ifcDataStore ? new IfcQuery(m.ifcDataStore) : null),
105
108
  model: m,
106
109
  };
107
110
  }
@@ -121,7 +124,7 @@ export function PropertiesPanel() {
121
124
 
122
125
  // Ensure mutation view exists for editing - creates it on-demand if needed
123
126
  useEffect(() => {
124
- if (!model || !selectedEntity || selectedEntity.modelId === 'legacy') return;
127
+ if (!model || !model.ifcDataStore || !selectedEntity || selectedEntity.modelId === 'legacy') return;
125
128
 
126
129
  const modelId = selectedEntity.modelId;
127
130
  let mutationView = getMutationView(modelId);
@@ -140,10 +143,38 @@ export function PropertiesPanel() {
140
143
  const [copied, setCopied] = useState(false);
141
144
  const [coordCopied, setCoordCopied] = useState<string | null>(null);
142
145
  const [coordOpen, setCoordOpen] = useState(false);
146
+ const [nativeDetails, setNativeDetails] = useState<import('@/store/types').NativeMetadataEntityDetails | null>(null);
147
+ const [nativeDetailsState, setNativeDetailsState] = useState<'idle' | 'loading' | 'error'>('idle');
143
148
 
144
149
  // Edit mode toggle - allows inline property editing
145
150
  const [editMode, setEditMode] = useState(false);
146
151
 
152
+ useEffect(() => {
153
+ if (!selectedEntity || !model?.nativeMetadata) {
154
+ setNativeDetails(null);
155
+ setNativeDetailsState('idle');
156
+ return;
157
+ }
158
+ let cancelled = false;
159
+ setNativeDetailsState('loading');
160
+ void getNativeEntityDetails(model.nativeMetadata.cacheKey, selectedEntity.expressId)
161
+ .then((details) => {
162
+ if (!cancelled) {
163
+ setNativeDetails(details);
164
+ setNativeDetailsState('idle');
165
+ }
166
+ })
167
+ .catch(() => {
168
+ if (!cancelled) {
169
+ setNativeDetails(null);
170
+ setNativeDetailsState('error');
171
+ }
172
+ });
173
+ return () => {
174
+ cancelled = true;
175
+ };
176
+ }, [selectedEntity, model?.nativeMetadata]);
177
+
147
178
  const copyToClipboard = useCallback((text: string) => {
148
179
  navigator.clipboard.writeText(text);
149
180
  setCopied(true);
@@ -247,7 +278,7 @@ export function PropertiesPanel() {
247
278
  if (!geoResult?.meshes?.length) return null;
248
279
 
249
280
  // In multi-model mode, meshes use globalIds (originalExpressId + idOffset)
250
- const targetExpressId = selectedEntity.expressId + (model?.idOffset ?? 0);
281
+ const targetExpressId = toGlobalIdFromModels(models, selectedEntity.modelId, selectedEntity.expressId);
251
282
 
252
283
  // Compute bounding box from matching mesh positions
253
284
  let minX = Infinity, minY = Infinity, minZ = Infinity;
@@ -515,6 +546,14 @@ export function PropertiesPanel() {
515
546
  return totalCount > 0 ? rels : null;
516
547
  }, [selectedEntity, model, ifcDataStore]);
517
548
 
549
+ // Extract georeferencing info for the model (used in coordinates section)
550
+ const georef = useMemo(() => {
551
+ const dataStore = model?.ifcDataStore ?? ifcDataStore;
552
+ if (!dataStore) return null;
553
+ const info = extractGeoreferencingOnDemand(dataStore as IfcDataStore);
554
+ return info?.hasGeoreference ? info : null;
555
+ }, [model, ifcDataStore]);
556
+
518
557
  // Extract type-level properties (e.g., from IfcWallType's HasPropertySets)
519
558
  const typeProperties = useMemo(() => {
520
559
  if (!selectedEntity) return null;
@@ -644,8 +683,8 @@ export function PropertiesPanel() {
644
683
 
645
684
  // Separate occurrence (instance) and inherited type properties.
646
685
  // Occurrence properties are displayed first, type properties in a separate section.
647
- // When a pset exists at both levels, occurrence takes precedence; the type-only
648
- // properties (not overridden at instance level) are shown in the inherited section.
686
+ // All type property sets are always shown in the inherited section so users can see
687
+ // what the type defines, even when the same pset exists at occurrence level.
649
688
  const { occurrenceProperties, inheritedTypeProperties } = useMemo(() => {
650
689
  const occ: PropertySet[] = properties.map(p => ({ ...p, source: 'instance' as const }));
651
690
 
@@ -653,23 +692,10 @@ export function PropertiesPanel() {
653
692
  return { occurrenceProperties: occ, inheritedTypeProperties: [] as PropertySet[] };
654
693
  }
655
694
 
656
- const instanceByName = new Set(properties.map(p => p.name));
657
- const inherited: PropertySet[] = [];
658
-
659
- for (const typePset of typeProperties.psets) {
660
- if (instanceByName.has(typePset.name)) {
661
- // Pset exists at instance level - add type-only props that aren't overridden
662
- const instancePset = properties.find(p => p.name === typePset.name)!;
663
- const instancePropNames = new Set(instancePset.properties.map(p => p.name));
664
- const extraProps = typePset.properties.filter(p => !instancePropNames.has(p.name));
665
- if (extraProps.length > 0) {
666
- inherited.push({ ...typePset, properties: extraProps, source: 'type' });
667
- }
668
- } else {
669
- // Type-only pset - show fully in inherited section
670
- inherited.push({ ...typePset, source: 'type' });
671
- }
672
- }
695
+ const inherited: PropertySet[] = typeProperties.psets.map(typePset => ({
696
+ ...typePset,
697
+ source: 'type' as const,
698
+ }));
673
699
 
674
700
  return { occurrenceProperties: occ, inheritedTypeProperties: inherited };
675
701
  }, [properties, typeProperties]);
@@ -750,6 +776,114 @@ export function PropertiesPanel() {
750
776
  return names;
751
777
  }, [attributes]);
752
778
 
779
+ const isNativeLazySelection = Boolean(selectedEntity && model?.nativeMetadata);
780
+
781
+ useEffect(() => {
782
+ if (isNativeLazySelection && editMode) {
783
+ setEditMode(false);
784
+ }
785
+ }, [isNativeLazySelection, editMode]);
786
+
787
+ const nativeSpatialInfo = useMemo(() => {
788
+ if (!nativeDetails?.spatial?.storeyName) return null;
789
+ return {
790
+ storeyId: nativeDetails.spatial.storeyId ?? undefined,
791
+ storeyName: nativeDetails.spatial.storeyName,
792
+ elevation: nativeDetails.spatial.elevation ?? undefined,
793
+ height: nativeDetails.spatial.height ?? undefined,
794
+ };
795
+ }, [nativeDetails]);
796
+
797
+ const nativeOccurrenceProperties = useMemo<PropertySet[]>(() => {
798
+ if (!nativeDetails) return [];
799
+ return nativeDetails.properties.map((pset) => ({
800
+ name: pset.name,
801
+ properties: pset.properties.map((property) => ({
802
+ name: property.name,
803
+ value: property.value,
804
+ isMutated: false,
805
+ })),
806
+ isNewPset: false,
807
+ source: 'instance' as const,
808
+ }));
809
+ }, [nativeDetails]);
810
+
811
+ const nativeQuantities = useMemo<QuantitySet[]>(() => {
812
+ if (!nativeDetails) return [];
813
+ return nativeDetails.quantities.map((qset) => ({
814
+ name: qset.name,
815
+ quantities: qset.quantities.map((quantity) => ({
816
+ name: quantity.name,
817
+ value: quantity.value,
818
+ type: quantity.type ?? 0,
819
+ })),
820
+ }));
821
+ }, [nativeDetails]);
822
+
823
+ const renderedEntityType = isNativeLazySelection
824
+ ? (nativeDetails?.summary.type ?? 'Loading...')
825
+ : (entityNode?.type ?? 'Unknown');
826
+ const renderedEntityName = isNativeLazySelection
827
+ ? (nativeDetails?.summary.name ?? `#${selectedEntity?.expressId ?? ''}`)
828
+ : entityNode?.name;
829
+ const renderedEntityGlobalId = isNativeLazySelection
830
+ ? (nativeDetails?.summary.globalId ?? null)
831
+ : entityNode?.globalId;
832
+ const renderedEntityDescription = isNativeLazySelection ? undefined : entityNode?.description;
833
+ const renderedEntityObjectType = isNativeLazySelection ? undefined : entityNode?.objectType;
834
+ const renderedSpatialInfo = isNativeLazySelection ? nativeSpatialInfo : spatialInfo;
835
+ const renderedOccurrenceProperties = isNativeLazySelection ? nativeOccurrenceProperties : occurrenceProperties;
836
+ const renderedInheritedTypeProperties = isNativeLazySelection ? [] : inheritedTypeProperties;
837
+ const renderedMergedProperties = isNativeLazySelection
838
+ ? nativeOccurrenceProperties
839
+ : mergedProperties;
840
+ const renderedQuantities = isNativeLazySelection ? nativeQuantities : quantities;
841
+ const renderedAttributes = isNativeLazySelection ? [] : attributes;
842
+ const renderedClassifications = isNativeLazySelection ? [] : classifications;
843
+ const renderedMaterialInfo = isNativeLazySelection ? null : materialInfo;
844
+ const renderedDocuments = isNativeLazySelection ? [] : documents;
845
+ const renderedEntityRelationships = isNativeLazySelection ? null : entityRelationships;
846
+ const renderedGeoref = isNativeLazySelection ? null : georef;
847
+ const renderedSpatialContainment = isNativeLazySelection ? null : spatialContainment;
848
+ const renderedTypeProperties = isNativeLazySelection
849
+ ? (nativeDetails?.typeSummary
850
+ ? {
851
+ typeName: nativeDetails.typeSummary.name,
852
+ typeId: nativeDetails.typeSummary.expressId,
853
+ psets: [] as PropertySet[],
854
+ }
855
+ : null)
856
+ : typeProperties;
857
+ const renderedTypeEditImpact = isNativeLazySelection ? null : typeEditImpact;
858
+ const renderedIsTypeEntity = isNativeLazySelection
859
+ ? ((nativeDetails?.summary.type ?? '').endsWith('Type'))
860
+ : isTypeEntity;
861
+ const renderedExistingProps = useMemo(() => {
862
+ const keys = new Set<string>();
863
+ for (const pset of renderedMergedProperties) {
864
+ for (const prop of pset.properties) {
865
+ keys.add(`${pset.name}:${prop.name}`);
866
+ }
867
+ }
868
+ return keys;
869
+ }, [renderedMergedProperties]);
870
+ const renderedExistingQuants = useMemo(() => {
871
+ const keys = new Set<string>();
872
+ for (const qset of renderedQuantities) {
873
+ for (const q of qset.quantities) {
874
+ keys.add(`${qset.name}:${q.name}`);
875
+ }
876
+ }
877
+ return keys;
878
+ }, [renderedQuantities]);
879
+ const renderedExistingAttributeNames = useMemo(() => {
880
+ const names = new Set<string>();
881
+ for (const attr of renderedAttributes) {
882
+ if (attr.value) names.add(attr.name);
883
+ }
884
+ return names;
885
+ }, [renderedAttributes]);
886
+
753
887
  // Model metadata display (when clicking top-level model in hierarchy)
754
888
  if (selectedModelId) {
755
889
  const selectedModel = models.get(selectedModelId);
@@ -769,7 +903,24 @@ export function PropertiesPanel() {
769
903
  );
770
904
  }
771
905
 
772
- if (!selectedEntityId || !modelQuery || !entityNode) {
906
+ if (!selectedEntityId || (!isNativeLazySelection && (!modelQuery || !entityNode))) {
907
+ // Show model metadata when a single legacy model is loaded and nothing selected
908
+ if (ifcDataStore && models.size === 0 && geometryResult) {
909
+ const legacyModel: FederatedModel = {
910
+ id: '__legacy__',
911
+ name: 'Model',
912
+ ifcDataStore: ifcDataStore as IfcDataStore,
913
+ geometryResult,
914
+ visible: true,
915
+ collapsed: false,
916
+ schemaVersion: ((ifcDataStore as IfcDataStore).schemaVersion ?? 'IFC4') as FederatedModel['schemaVersion'],
917
+ loadedAt: Date.now(),
918
+ fileSize: (ifcDataStore as IfcDataStore).fileSize ?? 0,
919
+ idOffset: 0,
920
+ maxExpressId: (ifcDataStore as IfcDataStore).entityCount ?? 0,
921
+ };
922
+ return <ModelMetadataPanel model={legacyModel} />;
923
+ }
773
924
  return (
774
925
  <div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-black">
775
926
  <div className="p-3 border-b-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
@@ -781,7 +932,7 @@ export function PropertiesPanel() {
781
932
  </div>
782
933
  <p className="font-bold uppercase text-zinc-900 dark:text-zinc-100 mb-2">No Selection</p>
783
934
  <p className="text-xs font-mono text-zinc-500 dark:text-zinc-400 max-w-[150px]">
784
- Select an element to view details
935
+ {models.size > 1 ? 'Select a model or element to view details' : 'Select an element to view details'}
785
936
  </p>
786
937
  </div>
787
938
  </div>
@@ -789,11 +940,11 @@ export function PropertiesPanel() {
789
940
  }
790
941
 
791
942
  // These are safe to access after the early return check (entityNode is confirmed non-null above)
792
- const entityType = entityNode.type;
793
- const entityName = entityNode.name;
794
- const entityGlobalId = entityNode.globalId;
795
- const entityDescription = entityNode.description;
796
- const entityObjectType = entityNode.objectType;
943
+ const entityType = renderedEntityType;
944
+ const entityName = renderedEntityName;
945
+ const entityGlobalId = renderedEntityGlobalId;
946
+ const entityDescription = renderedEntityDescription;
947
+ const entityObjectType = renderedEntityObjectType;
797
948
 
798
949
  return (
799
950
  <div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
@@ -808,6 +959,13 @@ export function PropertiesPanel() {
808
959
  {entityName || `${entityType}`}
809
960
  </h3>
810
961
  <p className="text-xs font-mono text-zinc-500 dark:text-zinc-400">{entityType}</p>
962
+ {/* Show associated type entity for occurrences */}
963
+ {!renderedIsTypeEntity && renderedTypeProperties && (
964
+ <p className="text-[11px] font-mono text-indigo-500 dark:text-indigo-400 truncate" title={`${activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: ${renderedTypeProperties.typeName}`}>
965
+ <Building2 className="inline h-3 w-3 mr-1 -mt-0.5" />
966
+ {activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: {renderedTypeProperties.typeName}
967
+ </p>
968
+ )}
811
969
  </div>
812
970
  <div className="flex gap-1 shrink-0">
813
971
  <Tooltip>
@@ -851,19 +1009,21 @@ export function PropertiesPanel() {
851
1009
  </TooltipContent>
852
1010
  </Tooltip>
853
1011
  {/* Edit mode toggle */}
854
- <Tooltip>
855
- <TooltipTrigger asChild>
856
- <Button
857
- variant={editMode ? 'default' : 'ghost'}
858
- size="icon-xs"
859
- className={`rounded-none ${editMode ? 'bg-purple-600 hover:bg-purple-700 text-white' : 'hover:bg-zinc-200 dark:hover:bg-zinc-700'}`}
860
- onClick={() => setEditMode(!editMode)}
861
- >
862
- <PenLine className="h-3.5 w-3.5" />
863
- </Button>
864
- </TooltipTrigger>
865
- <TooltipContent>{editMode ? 'Exit Edit Mode' : 'Edit Properties'}</TooltipContent>
866
- </Tooltip>
1012
+ {!isNativeLazySelection && (
1013
+ <Tooltip>
1014
+ <TooltipTrigger asChild>
1015
+ <Button
1016
+ variant={editMode ? 'default' : 'ghost'}
1017
+ size="icon-xs"
1018
+ className={`rounded-none ${editMode ? 'bg-purple-600 hover:bg-purple-700 text-white' : 'hover:bg-zinc-200 dark:hover:bg-zinc-700'}`}
1019
+ onClick={() => setEditMode(!editMode)}
1020
+ >
1021
+ <PenLine className="h-3.5 w-3.5" />
1022
+ </Button>
1023
+ </TooltipTrigger>
1024
+ <TooltipContent>{editMode ? 'Exit Edit Mode' : 'Edit Properties'}</TooltipContent>
1025
+ </Tooltip>
1026
+ )}
867
1027
  </div>
868
1028
  </div>
869
1029
 
@@ -897,34 +1057,34 @@ export function PropertiesPanel() {
897
1057
  )}
898
1058
 
899
1059
  {/* Spatial Location */}
900
- {spatialInfo && (
1060
+ {renderedSpatialInfo && (
901
1061
  <div className="flex items-center gap-2 text-xs border border-emerald-500/30 bg-emerald-50/50 dark:bg-emerald-900/10 px-2 py-1.5 text-emerald-800 dark:text-emerald-400 min-w-0">
902
1062
  <Layers className="h-3.5 w-3.5 shrink-0" />
903
- <span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{spatialInfo.storeyName}</span>
1063
+ <span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{renderedSpatialInfo.storeyName}</span>
904
1064
  <div className="flex items-center gap-1.5 shrink-0">
905
- {spatialInfo.elevation !== undefined && (
1065
+ {renderedSpatialInfo.elevation !== undefined && (
906
1066
  <Tooltip>
907
1067
  <TooltipTrigger asChild>
908
1068
  <span className="text-emerald-600/70 dark:text-emerald-500/70 font-mono whitespace-nowrap">
909
- {spatialInfo.elevation >= 0 ? '+' : ''}{spatialInfo.elevation.toFixed(2)}m
1069
+ {renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m
910
1070
  </span>
911
1071
  </TooltipTrigger>
912
1072
  <TooltipContent>
913
- <p className="text-xs">Elevation: {spatialInfo.elevation >= 0 ? '+' : ''}{spatialInfo.elevation.toFixed(2)}m from ground</p>
1073
+ <p className="text-xs">Elevation: {renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m from ground</p>
914
1074
  </TooltipContent>
915
1075
  </Tooltip>
916
1076
  )}
917
- {spatialInfo.height !== undefined && (
1077
+ {renderedSpatialInfo.height !== undefined && (
918
1078
  <Tooltip>
919
1079
  <TooltipTrigger asChild>
920
1080
  <span className="flex items-center gap-1 text-emerald-500/60 dark:text-emerald-400/60 font-mono text-[10px] whitespace-nowrap">
921
1081
  <ArrowUpDown className="h-2.5 w-2.5 shrink-0" />
922
- <span className="hidden sm:inline">{spatialInfo.height.toFixed(2)}m</span>
923
- <span className="sm:hidden">{spatialInfo.height.toFixed(1)}m</span>
1082
+ <span className="hidden sm:inline">{renderedSpatialInfo.height.toFixed(2)}m</span>
1083
+ <span className="sm:hidden">{renderedSpatialInfo.height.toFixed(1)}m</span>
924
1084
  </span>
925
1085
  </TooltipTrigger>
926
1086
  <TooltipContent>
927
- <p className="text-xs">Height: {spatialInfo.height.toFixed(2)}m to next storey</p>
1087
+ <p className="text-xs">Height: {renderedSpatialInfo.height.toFixed(2)}m to next storey</p>
928
1088
  </TooltipContent>
929
1089
  </Tooltip>
930
1090
  )}
@@ -932,55 +1092,70 @@ export function PropertiesPanel() {
932
1092
  </div>
933
1093
  )}
934
1094
 
935
- {/* Entity Position - teal tint to distinguish from emerald storey bar */}
936
- {entityCoordinates && (
1095
+ {/* World coordinates + Georeferencing single consolidated section */}
1096
+ {(entityCoordinates || renderedGeoref || editMode) && (
937
1097
  <Collapsible open={coordOpen} onOpenChange={setCoordOpen}>
938
1098
  <CollapsibleTrigger className="flex items-center gap-2 w-full text-xs border border-teal-500/30 px-2 py-1.5 text-teal-800 dark:text-teal-400 min-w-0 text-left group/coord">
939
1099
  <Crosshair className="h-3.5 w-3.5 shrink-0" />
940
1100
  <span className="font-bold uppercase tracking-wide shrink-0">World</span>
941
1101
  {!coordOpen && (
942
1102
  <>
943
- <span className="font-mono text-[10px] text-teal-600/70 dark:text-teal-500/70 truncate min-w-0 flex-1 tabular-nums">
944
- <CoordVal axis="E" value={entityCoordinates.worldZup.center.x} />{' '}
945
- <CoordVal axis="N" value={entityCoordinates.worldZup.center.y} />{' '}
946
- <CoordVal axis="Z" value={entityCoordinates.worldZup.center.z} />
947
- </span>
1103
+ {entityCoordinates && (
1104
+ <span className="font-mono text-[10px] text-teal-600/70 dark:text-teal-500/70 truncate min-w-0 flex-1 tabular-nums">
1105
+ <CoordVal axis="E" value={entityCoordinates.worldZup.center.x} />{' '}
1106
+ <CoordVal axis="N" value={entityCoordinates.worldZup.center.y} />{' '}
1107
+ <CoordVal axis="Z" value={entityCoordinates.worldZup.center.z} />
1108
+ </span>
1109
+ )}
1110
+ {renderedGeoref?.projectedCRS?.name && (
1111
+ <span className="font-mono text-[9px] text-teal-500/60 shrink-0">{renderedGeoref.projectedCRS.name}</span>
1112
+ )}
948
1113
  <span className="text-[9px] text-teal-500/0 group-hover/coord:text-teal-500/40 transition-colors shrink-0">details</span>
949
1114
  </>
950
1115
  )}
951
1116
  </CollapsibleTrigger>
952
1117
  <CollapsibleContent>
953
- <div className="px-2 py-1.5 space-y-0.5">
954
- <CoordRow
955
- label=""
956
- values={[
957
- { axis: 'E', value: entityCoordinates.worldZup.center.x },
958
- { axis: 'N', value: entityCoordinates.worldZup.center.y },
959
- { axis: 'Z', value: entityCoordinates.worldZup.center.z },
960
- ]}
961
- primary
962
- copyLabel="world"
963
- coordCopied={coordCopied}
964
- onCopy={copyCoords}
965
- />
966
- <CoordRow
967
- label="Local"
968
- values={[
969
- { axis: 'X', value: entityCoordinates.local.center.x },
970
- { axis: 'Y', value: entityCoordinates.local.center.y },
971
- { axis: 'Z', value: entityCoordinates.local.center.z },
972
- ]}
973
- copyLabel="local"
974
- coordCopied={coordCopied}
975
- onCopy={copyCoords}
976
- />
977
- <div className="flex items-start gap-1.5">
978
- <span className="text-[9px] font-medium text-muted-foreground/50 uppercase tracking-wider w-[34px] shrink-0 pt-px">Size</span>
979
- <span className="font-mono text-[10px] text-muted-foreground/50 tabular-nums">
980
- {(entityCoordinates.local.max.x - entityCoordinates.local.min.x).toFixed(2)} x {(entityCoordinates.local.max.y - entityCoordinates.local.min.y).toFixed(2)} x {(entityCoordinates.local.max.z - entityCoordinates.local.min.z).toFixed(2)}
981
- </span>
1118
+ {entityCoordinates && (
1119
+ <div className="px-2 py-1.5 space-y-0.5">
1120
+ <CoordRow
1121
+ label=""
1122
+ values={[
1123
+ { axis: 'E', value: entityCoordinates.worldZup.center.x },
1124
+ { axis: 'N', value: entityCoordinates.worldZup.center.y },
1125
+ { axis: 'Z', value: entityCoordinates.worldZup.center.z },
1126
+ ]}
1127
+ primary
1128
+ copyLabel="world"
1129
+ coordCopied={coordCopied}
1130
+ onCopy={copyCoords}
1131
+ />
1132
+ <CoordRow
1133
+ label="Local"
1134
+ values={[
1135
+ { axis: 'X', value: entityCoordinates.local.center.x },
1136
+ { axis: 'Y', value: entityCoordinates.local.center.y },
1137
+ { axis: 'Z', value: entityCoordinates.local.center.z },
1138
+ ]}
1139
+ copyLabel="local"
1140
+ coordCopied={coordCopied}
1141
+ onCopy={copyCoords}
1142
+ />
1143
+ <div className="flex items-start gap-1.5">
1144
+ <span className="text-[9px] font-medium text-muted-foreground/50 uppercase tracking-wider w-[34px] shrink-0 pt-px">Size</span>
1145
+ <span className="font-mono text-[10px] text-muted-foreground/50 tabular-nums">
1146
+ {(entityCoordinates.local.max.x - entityCoordinates.local.min.x).toFixed(2)} x {(entityCoordinates.local.max.y - entityCoordinates.local.min.y).toFixed(2)} x {(entityCoordinates.local.max.z - entityCoordinates.local.min.z).toFixed(2)}
1147
+ </span>
1148
+ </div>
982
1149
  </div>
983
- </div>
1150
+ )}
1151
+ <GeoreferencingPanel
1152
+ georef={renderedGeoref}
1153
+ modelId={selectedEntity?.modelId === 'legacy' ? '__legacy__' : (model?.id ?? selectedEntity?.modelId)}
1154
+ enableEditing
1155
+ schemaVersion={activeDataStore?.schemaVersion}
1156
+ coordinateInfo={(model?.geometryResult ?? geometryResult)?.coordinateInfo}
1157
+ geometryResult={model?.geometryResult ?? geometryResult}
1158
+ />
984
1159
  </CollapsibleContent>
985
1160
  </Collapsible>
986
1161
  )}
@@ -995,17 +1170,17 @@ export function PropertiesPanel() {
995
1170
  </div>
996
1171
 
997
1172
  {/* IFC Attributes */}
998
- {attributes.length > 0 && (
1173
+ {renderedAttributes.length > 0 && (
999
1174
  <Collapsible defaultOpen className="border-b">
1000
1175
  <CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
1001
1176
  <Tag className="h-4 w-4 text-muted-foreground" />
1002
1177
  <span className="font-medium text-sm">Attributes</span>
1003
1178
  {editMode && <PenLine className="h-3 w-3 text-purple-500 ml-1" />}
1004
- <span className="text-xs text-muted-foreground ml-auto">{attributes.length}</span>
1179
+ <span className="text-xs text-muted-foreground ml-auto">{renderedAttributes.length}</span>
1005
1180
  </CollapsibleTrigger>
1006
1181
  <CollapsibleContent>
1007
1182
  <div className="divide-y border-t">
1008
- {attributes.map((attr) => (
1183
+ {renderedAttributes.map((attr) => (
1009
1184
  <div key={attr.name} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
1010
1185
  <span className="text-muted-foreground truncate" title={attr.name}>{attr.name}</span>
1011
1186
  {editMode && selectedEntity ? (
@@ -1030,16 +1205,16 @@ export function PropertiesPanel() {
1030
1205
  )}
1031
1206
 
1032
1207
  {/* Spatial Containment - for spatial containers (Project, Site, Building, Storey) */}
1033
- {spatialContainment && (
1208
+ {renderedSpatialContainment && (
1034
1209
  <Collapsible defaultOpen className="border-b">
1035
1210
  <CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
1036
1211
  <Layers className="h-4 w-4 text-emerald-600" />
1037
1212
  <span className="font-medium text-sm">Structure</span>
1038
- <span className="text-xs text-muted-foreground ml-auto">{spatialContainment.length}</span>
1213
+ <span className="text-xs text-muted-foreground ml-auto">{renderedSpatialContainment.length}</span>
1039
1214
  </CollapsibleTrigger>
1040
1215
  <CollapsibleContent>
1041
1216
  <div className="divide-y border-t">
1042
- {spatialContainment.map((item) => (
1217
+ {renderedSpatialContainment.map((item) => (
1043
1218
  <div key={item.label} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
1044
1219
  <span className="text-muted-foreground truncate" title={item.label}>{item.label}</span>
1045
1220
  <span className="font-medium font-mono">{item.value}</span>
@@ -1082,26 +1257,26 @@ export function PropertiesPanel() {
1082
1257
  <ScrollArea className="flex-1 bg-white dark:bg-black">
1083
1258
  <TabsContent value="properties" className="m-0 p-3 overflow-hidden">
1084
1259
  {/* Edit toolbar - only shown when edit mode is active */}
1085
- {editMode && selectedEntity && (
1260
+ {editMode && selectedEntity && !isNativeLazySelection && (
1086
1261
  <EditToolbar
1087
1262
  modelId={selectedEntity.modelId}
1088
1263
  entityId={selectedEntity.expressId}
1089
1264
  entityType={entityType}
1090
- existingPsets={mergedProperties.map(p => p.name)}
1091
- existingQtos={quantities.map(q => q.name)}
1265
+ existingPsets={renderedMergedProperties.map(p => p.name)}
1266
+ existingQtos={renderedQuantities.map(q => q.name)}
1092
1267
  schemaVersion={activeDataStore?.schemaVersion}
1093
1268
  />
1094
1269
  )}
1095
- {mergedProperties.length === 0 && classifications.length === 0 && !materialInfo && documents.length === 0 ? (
1270
+ {renderedMergedProperties.length === 0 && renderedClassifications.length === 0 && !renderedMaterialInfo && renderedDocuments.length === 0 ? (
1096
1271
  <p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No property sets</p>
1097
1272
  ) : (
1098
1273
  <div className="space-y-3 w-full overflow-hidden">
1099
1274
  {/* Occurrence/Type Properties (based on whether entity itself is a type) */}
1100
- {occurrenceProperties.length > 0 && (
1275
+ {renderedOccurrenceProperties.length > 0 && (
1101
1276
  <>
1102
- {(isTypeEntity || (typeProperties && typeProperties.psets.length > 0)) && (
1277
+ {(renderedIsTypeEntity || (renderedTypeProperties && renderedTypeProperties.psets.length > 0)) && (
1103
1278
  <div className="flex items-center gap-2 px-1 pb-0.5 text-[11px] text-zinc-500 dark:text-zinc-400 uppercase tracking-wider font-semibold">
1104
- {isTypeEntity ? (
1279
+ {renderedIsTypeEntity ? (
1105
1280
  <>
1106
1281
  <Building2 className="h-3 w-3 shrink-0 text-indigo-500" />
1107
1282
  Type Properties:
@@ -1109,83 +1284,83 @@ export function PropertiesPanel() {
1109
1284
  ) : 'Occurrence Properties:'}
1110
1285
  </div>
1111
1286
  )}
1112
- {occurrenceProperties.map((pset: PropertySet) => (
1287
+ {renderedOccurrenceProperties.map((pset: PropertySet) => (
1113
1288
  <PropertySetCard
1114
1289
  key={`occ-${pset.name}`}
1115
1290
  pset={pset}
1116
1291
  modelId={selectedEntity?.modelId}
1117
1292
  entityId={selectedEntity?.expressId}
1118
- enableEditing={editMode}
1119
- isTypeProperty={isTypeEntity}
1120
- typeEditScope={isTypeEntity ? typeEditImpact ?? undefined : undefined}
1293
+ enableEditing={editMode && !isNativeLazySelection}
1294
+ isTypeProperty={renderedIsTypeEntity}
1295
+ typeEditScope={renderedIsTypeEntity ? renderedTypeEditImpact ?? undefined : undefined}
1121
1296
  />
1122
1297
  ))}
1123
1298
  </>
1124
1299
  )}
1125
1300
 
1126
1301
  {/* Inherited Type Properties */}
1127
- {inheritedTypeProperties.length > 0 && typeProperties && (
1302
+ {renderedInheritedTypeProperties.length > 0 && renderedTypeProperties && (
1128
1303
  <>
1129
- {occurrenceProperties.length > 0 && (
1304
+ {renderedOccurrenceProperties.length > 0 && (
1130
1305
  <div className="border-t border-indigo-200 dark:border-indigo-800/50 pt-2 mt-2" />
1131
1306
  )}
1132
1307
  <div className="flex items-center gap-2 px-1 pb-0.5 text-[11px] text-indigo-600/70 dark:text-indigo-400/60 uppercase tracking-wider font-semibold">
1133
1308
  <Building2 className="h-3 w-3 shrink-0" />
1134
- <span className="truncate">Inherited Type Properties</span>
1309
+ <span className="truncate">Type Properties ({renderedTypeProperties.typeName})</span>
1135
1310
  </div>
1136
- {inheritedTypeProperties.map((pset: PropertySet) => (
1311
+ {renderedInheritedTypeProperties.map((pset: PropertySet) => (
1137
1312
  <PropertySetCard
1138
1313
  key={`type-${pset.name}`}
1139
1314
  pset={pset}
1140
1315
  modelId={selectedEntity?.modelId}
1141
- entityId={typeProperties.typeId}
1142
- enableEditing={editMode}
1316
+ entityId={renderedTypeProperties.typeId}
1317
+ enableEditing={editMode && !isNativeLazySelection}
1143
1318
  isTypeProperty
1144
- typeEditScope={typeEditImpact?.mode === 'inherited' ? typeEditImpact : undefined}
1319
+ typeEditScope={renderedTypeEditImpact?.mode === 'inherited' ? renderedTypeEditImpact : undefined}
1145
1320
  />
1146
1321
  ))}
1147
1322
  </>
1148
1323
  )}
1149
1324
 
1150
1325
  {/* Classifications */}
1151
- {classifications.length > 0 && (
1326
+ {renderedClassifications.length > 0 && (
1152
1327
  <>
1153
- {mergedProperties.length > 0 && (
1328
+ {renderedMergedProperties.length > 0 && (
1154
1329
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1155
1330
  )}
1156
- {classifications.map((classification, i) => (
1331
+ {renderedClassifications.map((classification, i) => (
1157
1332
  <ClassificationCard key={`class-${i}`} classification={classification} />
1158
1333
  ))}
1159
1334
  </>
1160
1335
  )}
1161
1336
 
1162
1337
  {/* Materials */}
1163
- {materialInfo && (
1338
+ {renderedMaterialInfo && (
1164
1339
  <>
1165
- {(mergedProperties.length > 0 || classifications.length > 0) && (
1340
+ {(renderedMergedProperties.length > 0 || renderedClassifications.length > 0) && (
1166
1341
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1167
1342
  )}
1168
- <MaterialCard material={materialInfo} />
1343
+ <MaterialCard material={renderedMaterialInfo} />
1169
1344
  </>
1170
1345
  )}
1171
1346
 
1172
1347
  {/* Documents */}
1173
- {documents.length > 0 && (
1348
+ {renderedDocuments.length > 0 && (
1174
1349
  <>
1175
- {(mergedProperties.length > 0 || classifications.length > 0 || materialInfo) && (
1350
+ {(renderedMergedProperties.length > 0 || renderedClassifications.length > 0 || renderedMaterialInfo) && (
1176
1351
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1177
1352
  )}
1178
- {documents.map((doc, i) => (
1353
+ {renderedDocuments.map((doc, i) => (
1179
1354
  <DocumentCard key={`doc-${i}`} document={doc} />
1180
1355
  ))}
1181
1356
  </>
1182
1357
  )}
1183
1358
 
1184
1359
  {/* Relationships */}
1185
- {entityRelationships && (
1360
+ {renderedEntityRelationships && (
1186
1361
  <>
1187
1362
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1188
- <RelationshipsCard relationships={entityRelationships} />
1363
+ <RelationshipsCard relationships={renderedEntityRelationships} />
1189
1364
  </>
1190
1365
  )}
1191
1366
  </div>
@@ -1193,11 +1368,11 @@ export function PropertiesPanel() {
1193
1368
  </TabsContent>
1194
1369
 
1195
1370
  <TabsContent value="quantities" className="m-0 p-3 overflow-hidden">
1196
- {quantities.length === 0 ? (
1371
+ {renderedQuantities.length === 0 ? (
1197
1372
  <p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No quantities</p>
1198
1373
  ) : (
1199
1374
  <div className="space-y-3 w-full overflow-hidden">
1200
- {quantities.map((qset: QuantitySet) => (
1375
+ {renderedQuantities.map((qset: QuantitySet) => (
1201
1376
  <QuantitySetCard key={qset.name} qset={qset} />
1202
1377
  ))}
1203
1378
  </div>
@@ -1210,11 +1385,11 @@ export function PropertiesPanel() {
1210
1385
  entityType={entityType}
1211
1386
  modelId={selectedEntity.modelId}
1212
1387
  entityId={selectedEntity.expressId}
1213
- existingPsets={mergedProperties.map(p => p.name)}
1214
- existingProps={existingProps}
1215
- existingQsets={quantities.map(q => q.name)}
1216
- existingQuants={existingQuants}
1217
- existingAttributes={existingAttributeNames}
1388
+ existingPsets={renderedMergedProperties.map(p => p.name)}
1389
+ existingProps={renderedExistingProps}
1390
+ existingQsets={renderedQuantities.map(q => q.name)}
1391
+ existingQuants={renderedExistingQuants}
1392
+ existingAttributes={renderedExistingAttributeNames}
1218
1393
  />
1219
1394
  )}
1220
1395
  </TabsContent>