@ifc-lite/viewer 1.17.3 → 1.17.6

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 (530) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +132 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-86rgogji.js +1 -0
  7. package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
  8. package/dist/assets/{browser-CKs-FY1P.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-DoxKMqbO.js +257 -0
  12. package/dist/assets/{exporters-C_6J153K.js → exporters-CcPS9MK5.js} +2898 -2380
  13. package/dist/assets/geometry.worker-BFUYA08u.js +1 -0
  14. package/dist/assets/ids-DQ5jY0E8.js +1 -0
  15. package/dist/assets/ifc-lite_bg-BINvzoCP.wasm +0 -0
  16. package/dist/assets/{index-jhBr1wbn.js → index-Bfms9I4A.js} +41036 -34613
  17. package/dist/assets/index-_bfZsDCC.css +1 -0
  18. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  19. package/dist/assets/native-bridge-DUyLCMZS.js +429 -0
  20. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-C8575tul.js} +4342 -4324
  21. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BuZK7OST.js} +4 -4
  22. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  23. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  24. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  25. package/dist/assets/wasm-bridge-JsqEGDV8.js +1 -0
  26. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  55. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  57. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  58. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  59. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  227. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  229. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  230. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  231. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  232. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  233. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  234. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  235. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  236. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  237. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  238. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  239. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  240. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  241. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  242. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  243. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  244. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  245. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  246. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  247. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  248. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  249. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  250. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  285. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  286. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  287. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  288. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  289. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  290. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  291. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  292. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  293. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  294. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  295. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  296. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  297. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  298. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  299. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  300. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  301. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  302. package/dist/cesium/Widgets/lighter.css +237 -0
  303. package/dist/cesium/Widgets/lighterShared.css +46 -0
  304. package/dist/cesium/Widgets/shared.css +103 -0
  305. package/dist/cesium/Widgets/widgets.css +1342 -0
  306. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  307. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  308. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  309. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  310. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  311. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  312. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  313. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  314. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  315. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  316. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  317. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  318. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  319. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  320. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  321. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  322. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  323. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  324. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  325. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  326. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  327. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  328. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  329. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  330. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  331. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  332. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  333. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  334. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  335. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  336. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  337. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  338. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  339. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  340. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  341. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  342. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  343. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  344. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  345. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  346. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  347. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  348. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  349. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  350. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  351. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  352. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  353. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  354. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  355. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  356. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  357. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  358. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  359. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  360. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  361. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  362. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  363. package/dist/cesium/Workers/combineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  365. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  379. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createGeometry.js +26 -0
  381. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  390. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  393. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  395. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  396. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  398. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  399. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  402. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  404. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  405. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  406. package/dist/cesium/Workers/decodeDraco.js +26 -0
  407. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  408. package/dist/cesium/Workers/decodeI3S.js +26 -0
  409. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  410. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  411. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  412. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  413. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  414. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  415. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  416. package/dist/index.html +13 -10
  417. package/index.html +1 -0
  418. package/package.json +18 -15
  419. package/src/App.tsx +7 -9
  420. package/src/components/viewer/BCFPanel.tsx +46 -4
  421. package/src/components/viewer/CesiumOverlay.tsx +715 -0
  422. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  423. package/src/components/viewer/ChatPanel.tsx +232 -90
  424. package/src/components/viewer/CommandPalette.tsx +6 -1
  425. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  426. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  427. package/src/components/viewer/ExportDialog.tsx +22 -6
  428. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  429. package/src/components/viewer/IDSPanel.tsx +52 -3
  430. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  431. package/src/components/viewer/MainToolbar.tsx +355 -28
  432. package/src/components/viewer/PropertiesPanel.tsx +234 -81
  433. package/src/components/viewer/ScriptPanel.tsx +34 -8
  434. package/src/components/viewer/SettingsPage.tsx +581 -0
  435. package/src/components/viewer/StatusBar.tsx +17 -1
  436. package/src/components/viewer/ThemeSwitch.tsx +63 -7
  437. package/src/components/viewer/ViewerLayout.tsx +48 -6
  438. package/src/components/viewer/Viewport.tsx +61 -8
  439. package/src/components/viewer/ViewportContainer.tsx +265 -28
  440. package/src/components/viewer/ViewportOverlays.tsx +132 -27
  441. package/src/components/viewer/bcf/BCFTopicDetail.tsx +4 -4
  442. package/src/components/viewer/chat/ModelSelector.tsx +90 -54
  443. package/src/components/viewer/properties/GeoreferencingPanel.tsx +229 -55
  444. package/src/components/viewer/properties/LocationMap.tsx +462 -19
  445. package/src/components/viewer/properties/ModelMetadataPanel.tsx +1 -1
  446. package/src/components/viewer/selectionHandlers.ts +4 -3
  447. package/src/components/viewer/tools/SectionCapControls.tsx +237 -0
  448. package/src/components/viewer/tools/SectionPanel.tsx +39 -18
  449. package/src/components/viewer/useAnimationLoop.ts +13 -1
  450. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  451. package/src/components/viewer/useMouseControls.ts +4 -1
  452. package/src/components/viewer/useRenderUpdates.ts +1 -1
  453. package/src/hooks/ids/idsDataAccessor.ts +60 -24
  454. package/src/hooks/ingest/viewerModelIngest.ts +280 -0
  455. package/src/hooks/useIDS.ts +1 -1
  456. package/src/hooks/useIfc.ts +7 -1
  457. package/src/hooks/useIfcCache.ts +28 -15
  458. package/src/hooks/useIfcFederation.ts +378 -291
  459. package/src/hooks/useIfcLoader.ts +1657 -130
  460. package/src/hooks/useIfcServer.ts +0 -69
  461. package/src/hooks/useViewControls.ts +13 -5
  462. package/src/index.css +484 -10
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +43 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +318 -0
  467. package/src/lib/geo/effective-georef.test.ts +73 -0
  468. package/src/lib/geo/effective-georef.ts +111 -0
  469. package/src/lib/geo/reproject.ts +249 -37
  470. package/src/lib/llm/byok-guard.test.ts +77 -0
  471. package/src/lib/llm/byok-guard.ts +39 -0
  472. package/src/lib/llm/free-models.test.ts +0 -6
  473. package/src/lib/llm/models.ts +104 -42
  474. package/src/lib/llm/stream-client.ts +74 -110
  475. package/src/lib/llm/stream-direct.test.ts +130 -0
  476. package/src/lib/llm/stream-direct.ts +316 -0
  477. package/src/lib/llm/types.ts +14 -2
  478. package/src/lib/recent-files.ts +2 -1
  479. package/src/main.tsx +1 -10
  480. package/src/services/analysis-extensions.ts +125 -0
  481. package/src/services/api-keys.ts +73 -0
  482. package/src/services/app-navigation.ts +13 -0
  483. package/src/services/bsdd.ts +53 -4
  484. package/src/services/cacheService.ts +1 -1
  485. package/src/services/desktop-cache.ts +43 -0
  486. package/src/services/desktop-export.ts +77 -0
  487. package/src/services/desktop-harness.ts +196 -0
  488. package/src/services/desktop-logger.ts +20 -0
  489. package/src/services/desktop-native-metadata.ts +207 -0
  490. package/src/services/desktop-panel-actions.ts +43 -0
  491. package/src/services/desktop-preferences.ts +44 -0
  492. package/src/services/file-dialog.ts +147 -0
  493. package/src/services/tauri-core-stub.ts +7 -0
  494. package/src/services/tauri-dialog-stub.ts +7 -0
  495. package/src/services/tauri-fs-stub.ts +7 -0
  496. package/src/store/constants.ts +20 -2
  497. package/src/store/index.ts +52 -7
  498. package/src/store/slices/cesiumSlice.ts +127 -0
  499. package/src/store/slices/chatSlice.test.ts +6 -76
  500. package/src/store/slices/chatSlice.ts +21 -58
  501. package/src/store/slices/dataSlice.ts +139 -28
  502. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  503. package/src/store/slices/loadingSlice.ts +14 -2
  504. package/src/store/slices/modelSlice.ts +58 -3
  505. package/src/store/slices/sectionSlice.test.ts +87 -7
  506. package/src/store/slices/sectionSlice.ts +151 -5
  507. package/src/store/slices/uiSlice.ts +28 -5
  508. package/src/store/types.ts +122 -2
  509. package/src/store.ts +1 -1
  510. package/src/utils/desktopModelSnapshot.ts +358 -0
  511. package/src/utils/ifcConfig.ts +6 -1
  512. package/src/utils/nativeSpatialDataStore.ts +253 -0
  513. package/src/utils/serverDataModel.ts +4 -0
  514. package/src/utils/spatialHierarchy.ts +10 -11
  515. package/src/utils/viewportUtils.ts +7 -2
  516. package/src/vite-env.d.ts +0 -4
  517. package/vite.config.ts +24 -0
  518. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  519. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  520. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  521. package/dist/assets/drawing-2d-gWfpdfYe.js +0 -257
  522. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  523. package/dist/assets/ids-B4jTqB1O.js +0 -1
  524. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  525. package/dist/assets/index-pbE7itQS.css +0 -1
  526. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  527. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
  528. package/src/components/viewer/UpgradePage.tsx +0 -69
  529. package/src/lib/llm/ClerkChatSync.tsx +0 -74
  530. package/src/lib/llm/clerk-auth.ts +0 -62
@@ -29,10 +29,11 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip
29
29
  import { useViewerStore } from '@/store';
30
30
  import { toGlobalIdFromModels } from '@/store/globalId';
31
31
  import { useIfc } from '@/hooks/useIfc';
32
+ import { getNativeEntityDetails } from '@/services/desktop-native-metadata';
32
33
  import { configureMutationView } from '@/utils/configureMutationView';
33
34
  import { IfcQuery } from '@ifc-lite/query';
34
35
  import { MutablePropertyView } from '@ifc-lite/mutations';
35
- import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGeoreferencingOnDemand, type IfcDataStore } from '@ifc-lite/parser';
36
+ import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGeoreferencingOnDemand, extractLengthUnitScale, type IfcDataStore } from '@ifc-lite/parser';
36
37
  import { EntityFlags, RelationshipType, isSpatialStructureTypeName, isStoreyLikeSpatialTypeName } from '@ifc-lite/data';
37
38
  import type { EntityRef, FederatedModel } from '@/store/types';
38
39
 
@@ -103,7 +104,7 @@ export function PropertiesPanel() {
103
104
  const m = models.get(selectedEntity.modelId);
104
105
  if (m) {
105
106
  return {
106
- modelQuery: new IfcQuery(m.ifcDataStore),
107
+ modelQuery: m.nativeMetadata ? null : (m.ifcDataStore ? new IfcQuery(m.ifcDataStore) : null),
107
108
  model: m,
108
109
  };
109
110
  }
@@ -123,7 +124,7 @@ export function PropertiesPanel() {
123
124
 
124
125
  // Ensure mutation view exists for editing - creates it on-demand if needed
125
126
  useEffect(() => {
126
- if (!model || !selectedEntity || selectedEntity.modelId === 'legacy') return;
127
+ if (!model || !model.ifcDataStore || !selectedEntity || selectedEntity.modelId === 'legacy') return;
127
128
 
128
129
  const modelId = selectedEntity.modelId;
129
130
  let mutationView = getMutationView(modelId);
@@ -142,10 +143,38 @@ export function PropertiesPanel() {
142
143
  const [copied, setCopied] = useState(false);
143
144
  const [coordCopied, setCoordCopied] = useState<string | null>(null);
144
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');
145
148
 
146
149
  // Edit mode toggle - allows inline property editing
147
150
  const [editMode, setEditMode] = useState(false);
148
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
+
149
178
  const copyToClipboard = useCallback((text: string) => {
150
179
  navigator.clipboard.writeText(text);
151
180
  setCopied(true);
@@ -525,6 +554,13 @@ export function PropertiesPanel() {
525
554
  return info?.hasGeoreference ? info : null;
526
555
  }, [model, ifcDataStore]);
527
556
 
557
+ // Extract IFC length unit scale (e.g. 0.001 for mm, 0.3048 for ft)
558
+ const lengthUnitScale = useMemo(() => {
559
+ const dataStore = model?.ifcDataStore ?? ifcDataStore;
560
+ if (!dataStore?.source?.length || !dataStore?.entityIndex) return 1;
561
+ return extractLengthUnitScale(dataStore.source, dataStore.entityIndex);
562
+ }, [model, ifcDataStore]);
563
+
528
564
  // Extract type-level properties (e.g., from IfcWallType's HasPropertySets)
529
565
  const typeProperties = useMemo(() => {
530
566
  if (!selectedEntity) return null;
@@ -747,6 +783,114 @@ export function PropertiesPanel() {
747
783
  return names;
748
784
  }, [attributes]);
749
785
 
786
+ const isNativeLazySelection = Boolean(selectedEntity && model?.nativeMetadata);
787
+
788
+ useEffect(() => {
789
+ if (isNativeLazySelection && editMode) {
790
+ setEditMode(false);
791
+ }
792
+ }, [isNativeLazySelection, editMode]);
793
+
794
+ const nativeSpatialInfo = useMemo(() => {
795
+ if (!nativeDetails?.spatial?.storeyName) return null;
796
+ return {
797
+ storeyId: nativeDetails.spatial.storeyId ?? undefined,
798
+ storeyName: nativeDetails.spatial.storeyName,
799
+ elevation: nativeDetails.spatial.elevation ?? undefined,
800
+ height: nativeDetails.spatial.height ?? undefined,
801
+ };
802
+ }, [nativeDetails]);
803
+
804
+ const nativeOccurrenceProperties = useMemo<PropertySet[]>(() => {
805
+ if (!nativeDetails) return [];
806
+ return nativeDetails.properties.map((pset) => ({
807
+ name: pset.name,
808
+ properties: pset.properties.map((property) => ({
809
+ name: property.name,
810
+ value: property.value,
811
+ isMutated: false,
812
+ })),
813
+ isNewPset: false,
814
+ source: 'instance' as const,
815
+ }));
816
+ }, [nativeDetails]);
817
+
818
+ const nativeQuantities = useMemo<QuantitySet[]>(() => {
819
+ if (!nativeDetails) return [];
820
+ return nativeDetails.quantities.map((qset) => ({
821
+ name: qset.name,
822
+ quantities: qset.quantities.map((quantity) => ({
823
+ name: quantity.name,
824
+ value: quantity.value,
825
+ type: quantity.type ?? 0,
826
+ })),
827
+ }));
828
+ }, [nativeDetails]);
829
+
830
+ const renderedEntityType = isNativeLazySelection
831
+ ? (nativeDetails?.summary.type ?? 'Loading...')
832
+ : (entityNode?.type ?? 'Unknown');
833
+ const renderedEntityName = isNativeLazySelection
834
+ ? (nativeDetails?.summary.name ?? `#${selectedEntity?.expressId ?? ''}`)
835
+ : entityNode?.name;
836
+ const renderedEntityGlobalId = isNativeLazySelection
837
+ ? (nativeDetails?.summary.globalId ?? null)
838
+ : entityNode?.globalId;
839
+ const renderedEntityDescription = isNativeLazySelection ? undefined : entityNode?.description;
840
+ const renderedEntityObjectType = isNativeLazySelection ? undefined : entityNode?.objectType;
841
+ const renderedSpatialInfo = isNativeLazySelection ? nativeSpatialInfo : spatialInfo;
842
+ const renderedOccurrenceProperties = isNativeLazySelection ? nativeOccurrenceProperties : occurrenceProperties;
843
+ const renderedInheritedTypeProperties = isNativeLazySelection ? [] : inheritedTypeProperties;
844
+ const renderedMergedProperties = isNativeLazySelection
845
+ ? nativeOccurrenceProperties
846
+ : mergedProperties;
847
+ const renderedQuantities = isNativeLazySelection ? nativeQuantities : quantities;
848
+ const renderedAttributes = isNativeLazySelection ? [] : attributes;
849
+ const renderedClassifications = isNativeLazySelection ? [] : classifications;
850
+ const renderedMaterialInfo = isNativeLazySelection ? null : materialInfo;
851
+ const renderedDocuments = isNativeLazySelection ? [] : documents;
852
+ const renderedEntityRelationships = isNativeLazySelection ? null : entityRelationships;
853
+ const renderedGeoref = isNativeLazySelection ? null : georef;
854
+ const renderedSpatialContainment = isNativeLazySelection ? null : spatialContainment;
855
+ const renderedTypeProperties = isNativeLazySelection
856
+ ? (nativeDetails?.typeSummary
857
+ ? {
858
+ typeName: nativeDetails.typeSummary.name,
859
+ typeId: nativeDetails.typeSummary.expressId,
860
+ psets: [] as PropertySet[],
861
+ }
862
+ : null)
863
+ : typeProperties;
864
+ const renderedTypeEditImpact = isNativeLazySelection ? null : typeEditImpact;
865
+ const renderedIsTypeEntity = isNativeLazySelection
866
+ ? ((nativeDetails?.summary.type ?? '').endsWith('Type'))
867
+ : isTypeEntity;
868
+ const renderedExistingProps = useMemo(() => {
869
+ const keys = new Set<string>();
870
+ for (const pset of renderedMergedProperties) {
871
+ for (const prop of pset.properties) {
872
+ keys.add(`${pset.name}:${prop.name}`);
873
+ }
874
+ }
875
+ return keys;
876
+ }, [renderedMergedProperties]);
877
+ const renderedExistingQuants = useMemo(() => {
878
+ const keys = new Set<string>();
879
+ for (const qset of renderedQuantities) {
880
+ for (const q of qset.quantities) {
881
+ keys.add(`${qset.name}:${q.name}`);
882
+ }
883
+ }
884
+ return keys;
885
+ }, [renderedQuantities]);
886
+ const renderedExistingAttributeNames = useMemo(() => {
887
+ const names = new Set<string>();
888
+ for (const attr of renderedAttributes) {
889
+ if (attr.value) names.add(attr.name);
890
+ }
891
+ return names;
892
+ }, [renderedAttributes]);
893
+
750
894
  // Model metadata display (when clicking top-level model in hierarchy)
751
895
  if (selectedModelId) {
752
896
  const selectedModel = models.get(selectedModelId);
@@ -766,8 +910,13 @@ export function PropertiesPanel() {
766
910
  );
767
911
  }
768
912
 
769
- if (!selectedEntityId || !modelQuery || !entityNode) {
770
- // Show model metadata when a single legacy model is loaded and nothing selected
913
+ if (!selectedEntityId || (!isNativeLazySelection && (!modelQuery || !entityNode))) {
914
+ // Show model metadata when a single model is loaded and nothing selected.
915
+ // Handles both federated models (models.size >= 1) and legacy single-model path (models.size === 0).
916
+ if (models.size === 1) {
917
+ const singleModel = models.values().next().value as FederatedModel;
918
+ return <ModelMetadataPanel model={singleModel} />;
919
+ }
771
920
  if (ifcDataStore && models.size === 0 && geometryResult) {
772
921
  const legacyModel: FederatedModel = {
773
922
  id: '__legacy__',
@@ -784,6 +933,7 @@ export function PropertiesPanel() {
784
933
  };
785
934
  return <ModelMetadataPanel model={legacyModel} />;
786
935
  }
936
+ // Multi-model or no model loaded: show empty state
787
937
  return (
788
938
  <div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-black">
789
939
  <div className="p-3 border-b-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
@@ -803,11 +953,11 @@ export function PropertiesPanel() {
803
953
  }
804
954
 
805
955
  // These are safe to access after the early return check (entityNode is confirmed non-null above)
806
- const entityType = entityNode.type;
807
- const entityName = entityNode.name;
808
- const entityGlobalId = entityNode.globalId;
809
- const entityDescription = entityNode.description;
810
- const entityObjectType = entityNode.objectType;
956
+ const entityType = renderedEntityType;
957
+ const entityName = renderedEntityName;
958
+ const entityGlobalId = renderedEntityGlobalId;
959
+ const entityDescription = renderedEntityDescription;
960
+ const entityObjectType = renderedEntityObjectType;
811
961
 
812
962
  return (
813
963
  <div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
@@ -823,10 +973,10 @@ export function PropertiesPanel() {
823
973
  </h3>
824
974
  <p className="text-xs font-mono text-zinc-500 dark:text-zinc-400">{entityType}</p>
825
975
  {/* Show associated type entity for occurrences */}
826
- {!isTypeEntity && typeProperties && (
827
- <p className="text-[11px] font-mono text-indigo-500 dark:text-indigo-400 truncate" title={`${activeDataStore?.entities.getTypeName(typeProperties.typeId) || 'Type'}: ${typeProperties.typeName}`}>
976
+ {!renderedIsTypeEntity && renderedTypeProperties && (
977
+ <p className="text-[11px] font-mono text-indigo-500 dark:text-indigo-400 truncate" title={`${activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: ${renderedTypeProperties.typeName}`}>
828
978
  <Building2 className="inline h-3 w-3 mr-1 -mt-0.5" />
829
- {activeDataStore?.entities.getTypeName(typeProperties.typeId) || 'Type'}: {typeProperties.typeName}
979
+ {activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: {renderedTypeProperties.typeName}
830
980
  </p>
831
981
  )}
832
982
  </div>
@@ -872,19 +1022,21 @@ export function PropertiesPanel() {
872
1022
  </TooltipContent>
873
1023
  </Tooltip>
874
1024
  {/* Edit mode toggle */}
875
- <Tooltip>
876
- <TooltipTrigger asChild>
877
- <Button
878
- variant={editMode ? 'default' : 'ghost'}
879
- size="icon-xs"
880
- className={`rounded-none ${editMode ? 'bg-purple-600 hover:bg-purple-700 text-white' : 'hover:bg-zinc-200 dark:hover:bg-zinc-700'}`}
881
- onClick={() => setEditMode(!editMode)}
882
- >
883
- <PenLine className="h-3.5 w-3.5" />
884
- </Button>
885
- </TooltipTrigger>
886
- <TooltipContent>{editMode ? 'Exit Edit Mode' : 'Edit Properties'}</TooltipContent>
887
- </Tooltip>
1025
+ {!isNativeLazySelection && (
1026
+ <Tooltip>
1027
+ <TooltipTrigger asChild>
1028
+ <Button
1029
+ variant={editMode ? 'default' : 'ghost'}
1030
+ size="icon-xs"
1031
+ className={`rounded-none ${editMode ? 'bg-purple-600 hover:bg-purple-700 text-white' : 'hover:bg-zinc-200 dark:hover:bg-zinc-700'}`}
1032
+ onClick={() => setEditMode(!editMode)}
1033
+ >
1034
+ <PenLine className="h-3.5 w-3.5" />
1035
+ </Button>
1036
+ </TooltipTrigger>
1037
+ <TooltipContent>{editMode ? 'Exit Edit Mode' : 'Edit Properties'}</TooltipContent>
1038
+ </Tooltip>
1039
+ )}
888
1040
  </div>
889
1041
  </div>
890
1042
 
@@ -918,34 +1070,34 @@ export function PropertiesPanel() {
918
1070
  )}
919
1071
 
920
1072
  {/* Spatial Location */}
921
- {spatialInfo && (
1073
+ {renderedSpatialInfo && (
922
1074
  <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">
923
1075
  <Layers className="h-3.5 w-3.5 shrink-0" />
924
- <span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{spatialInfo.storeyName}</span>
1076
+ <span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{renderedSpatialInfo.storeyName}</span>
925
1077
  <div className="flex items-center gap-1.5 shrink-0">
926
- {spatialInfo.elevation !== undefined && (
1078
+ {renderedSpatialInfo.elevation !== undefined && (
927
1079
  <Tooltip>
928
1080
  <TooltipTrigger asChild>
929
1081
  <span className="text-emerald-600/70 dark:text-emerald-500/70 font-mono whitespace-nowrap">
930
- {spatialInfo.elevation >= 0 ? '+' : ''}{spatialInfo.elevation.toFixed(2)}m
1082
+ {renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m
931
1083
  </span>
932
1084
  </TooltipTrigger>
933
1085
  <TooltipContent>
934
- <p className="text-xs">Elevation: {spatialInfo.elevation >= 0 ? '+' : ''}{spatialInfo.elevation.toFixed(2)}m from ground</p>
1086
+ <p className="text-xs">Elevation: {renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m from ground</p>
935
1087
  </TooltipContent>
936
1088
  </Tooltip>
937
1089
  )}
938
- {spatialInfo.height !== undefined && (
1090
+ {renderedSpatialInfo.height !== undefined && (
939
1091
  <Tooltip>
940
1092
  <TooltipTrigger asChild>
941
1093
  <span className="flex items-center gap-1 text-emerald-500/60 dark:text-emerald-400/60 font-mono text-[10px] whitespace-nowrap">
942
1094
  <ArrowUpDown className="h-2.5 w-2.5 shrink-0" />
943
- <span className="hidden sm:inline">{spatialInfo.height.toFixed(2)}m</span>
944
- <span className="sm:hidden">{spatialInfo.height.toFixed(1)}m</span>
1095
+ <span className="hidden sm:inline">{renderedSpatialInfo.height.toFixed(2)}m</span>
1096
+ <span className="sm:hidden">{renderedSpatialInfo.height.toFixed(1)}m</span>
945
1097
  </span>
946
1098
  </TooltipTrigger>
947
1099
  <TooltipContent>
948
- <p className="text-xs">Height: {spatialInfo.height.toFixed(2)}m to next storey</p>
1100
+ <p className="text-xs">Height: {renderedSpatialInfo.height.toFixed(2)}m to next storey</p>
949
1101
  </TooltipContent>
950
1102
  </Tooltip>
951
1103
  )}
@@ -954,7 +1106,7 @@ export function PropertiesPanel() {
954
1106
  )}
955
1107
 
956
1108
  {/* World coordinates + Georeferencing — single consolidated section */}
957
- {(entityCoordinates || georef || editMode) && (
1109
+ {(entityCoordinates || renderedGeoref || editMode) && (
958
1110
  <Collapsible open={coordOpen} onOpenChange={setCoordOpen}>
959
1111
  <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">
960
1112
  <Crosshair className="h-3.5 w-3.5 shrink-0" />
@@ -968,8 +1120,8 @@ export function PropertiesPanel() {
968
1120
  <CoordVal axis="Z" value={entityCoordinates.worldZup.center.z} />
969
1121
  </span>
970
1122
  )}
971
- {georef?.projectedCRS?.name && (
972
- <span className="font-mono text-[9px] text-teal-500/60 shrink-0">{georef.projectedCRS.name}</span>
1123
+ {renderedGeoref?.projectedCRS?.name && (
1124
+ <span className="font-mono text-[9px] text-teal-500/60 shrink-0">{renderedGeoref.projectedCRS.name}</span>
973
1125
  )}
974
1126
  <span className="text-[9px] text-teal-500/0 group-hover/coord:text-teal-500/40 transition-colors shrink-0">details</span>
975
1127
  </>
@@ -1010,12 +1162,13 @@ export function PropertiesPanel() {
1010
1162
  </div>
1011
1163
  )}
1012
1164
  <GeoreferencingPanel
1013
- georef={georef}
1165
+ georef={renderedGeoref}
1014
1166
  modelId={selectedEntity?.modelId === 'legacy' ? '__legacy__' : (model?.id ?? selectedEntity?.modelId)}
1015
1167
  enableEditing
1016
1168
  schemaVersion={activeDataStore?.schemaVersion}
1017
1169
  coordinateInfo={(model?.geometryResult ?? geometryResult)?.coordinateInfo}
1018
1170
  geometryResult={model?.geometryResult ?? geometryResult}
1171
+ lengthUnitScale={lengthUnitScale}
1019
1172
  />
1020
1173
  </CollapsibleContent>
1021
1174
  </Collapsible>
@@ -1031,17 +1184,17 @@ export function PropertiesPanel() {
1031
1184
  </div>
1032
1185
 
1033
1186
  {/* IFC Attributes */}
1034
- {attributes.length > 0 && (
1187
+ {renderedAttributes.length > 0 && (
1035
1188
  <Collapsible defaultOpen className="border-b">
1036
1189
  <CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
1037
1190
  <Tag className="h-4 w-4 text-muted-foreground" />
1038
1191
  <span className="font-medium text-sm">Attributes</span>
1039
1192
  {editMode && <PenLine className="h-3 w-3 text-purple-500 ml-1" />}
1040
- <span className="text-xs text-muted-foreground ml-auto">{attributes.length}</span>
1193
+ <span className="text-xs text-muted-foreground ml-auto">{renderedAttributes.length}</span>
1041
1194
  </CollapsibleTrigger>
1042
1195
  <CollapsibleContent>
1043
1196
  <div className="divide-y border-t">
1044
- {attributes.map((attr) => (
1197
+ {renderedAttributes.map((attr) => (
1045
1198
  <div key={attr.name} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
1046
1199
  <span className="text-muted-foreground truncate" title={attr.name}>{attr.name}</span>
1047
1200
  {editMode && selectedEntity ? (
@@ -1066,16 +1219,16 @@ export function PropertiesPanel() {
1066
1219
  )}
1067
1220
 
1068
1221
  {/* Spatial Containment - for spatial containers (Project, Site, Building, Storey) */}
1069
- {spatialContainment && (
1222
+ {renderedSpatialContainment && (
1070
1223
  <Collapsible defaultOpen className="border-b">
1071
1224
  <CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
1072
1225
  <Layers className="h-4 w-4 text-emerald-600" />
1073
1226
  <span className="font-medium text-sm">Structure</span>
1074
- <span className="text-xs text-muted-foreground ml-auto">{spatialContainment.length}</span>
1227
+ <span className="text-xs text-muted-foreground ml-auto">{renderedSpatialContainment.length}</span>
1075
1228
  </CollapsibleTrigger>
1076
1229
  <CollapsibleContent>
1077
1230
  <div className="divide-y border-t">
1078
- {spatialContainment.map((item) => (
1231
+ {renderedSpatialContainment.map((item) => (
1079
1232
  <div key={item.label} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
1080
1233
  <span className="text-muted-foreground truncate" title={item.label}>{item.label}</span>
1081
1234
  <span className="font-medium font-mono">{item.value}</span>
@@ -1118,26 +1271,26 @@ export function PropertiesPanel() {
1118
1271
  <ScrollArea className="flex-1 bg-white dark:bg-black">
1119
1272
  <TabsContent value="properties" className="m-0 p-3 overflow-hidden">
1120
1273
  {/* Edit toolbar - only shown when edit mode is active */}
1121
- {editMode && selectedEntity && (
1274
+ {editMode && selectedEntity && !isNativeLazySelection && (
1122
1275
  <EditToolbar
1123
1276
  modelId={selectedEntity.modelId}
1124
1277
  entityId={selectedEntity.expressId}
1125
1278
  entityType={entityType}
1126
- existingPsets={mergedProperties.map(p => p.name)}
1127
- existingQtos={quantities.map(q => q.name)}
1279
+ existingPsets={renderedMergedProperties.map(p => p.name)}
1280
+ existingQtos={renderedQuantities.map(q => q.name)}
1128
1281
  schemaVersion={activeDataStore?.schemaVersion}
1129
1282
  />
1130
1283
  )}
1131
- {mergedProperties.length === 0 && classifications.length === 0 && !materialInfo && documents.length === 0 ? (
1284
+ {renderedMergedProperties.length === 0 && renderedClassifications.length === 0 && !renderedMaterialInfo && renderedDocuments.length === 0 ? (
1132
1285
  <p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No property sets</p>
1133
1286
  ) : (
1134
1287
  <div className="space-y-3 w-full overflow-hidden">
1135
1288
  {/* Occurrence/Type Properties (based on whether entity itself is a type) */}
1136
- {occurrenceProperties.length > 0 && (
1289
+ {renderedOccurrenceProperties.length > 0 && (
1137
1290
  <>
1138
- {(isTypeEntity || (typeProperties && typeProperties.psets.length > 0)) && (
1291
+ {(renderedIsTypeEntity || (renderedTypeProperties && renderedTypeProperties.psets.length > 0)) && (
1139
1292
  <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">
1140
- {isTypeEntity ? (
1293
+ {renderedIsTypeEntity ? (
1141
1294
  <>
1142
1295
  <Building2 className="h-3 w-3 shrink-0 text-indigo-500" />
1143
1296
  Type Properties:
@@ -1145,83 +1298,83 @@ export function PropertiesPanel() {
1145
1298
  ) : 'Occurrence Properties:'}
1146
1299
  </div>
1147
1300
  )}
1148
- {occurrenceProperties.map((pset: PropertySet) => (
1301
+ {renderedOccurrenceProperties.map((pset: PropertySet) => (
1149
1302
  <PropertySetCard
1150
1303
  key={`occ-${pset.name}`}
1151
1304
  pset={pset}
1152
1305
  modelId={selectedEntity?.modelId}
1153
1306
  entityId={selectedEntity?.expressId}
1154
- enableEditing={editMode}
1155
- isTypeProperty={isTypeEntity}
1156
- typeEditScope={isTypeEntity ? typeEditImpact ?? undefined : undefined}
1307
+ enableEditing={editMode && !isNativeLazySelection}
1308
+ isTypeProperty={renderedIsTypeEntity}
1309
+ typeEditScope={renderedIsTypeEntity ? renderedTypeEditImpact ?? undefined : undefined}
1157
1310
  />
1158
1311
  ))}
1159
1312
  </>
1160
1313
  )}
1161
1314
 
1162
1315
  {/* Inherited Type Properties */}
1163
- {inheritedTypeProperties.length > 0 && typeProperties && (
1316
+ {renderedInheritedTypeProperties.length > 0 && renderedTypeProperties && (
1164
1317
  <>
1165
- {occurrenceProperties.length > 0 && (
1318
+ {renderedOccurrenceProperties.length > 0 && (
1166
1319
  <div className="border-t border-indigo-200 dark:border-indigo-800/50 pt-2 mt-2" />
1167
1320
  )}
1168
1321
  <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">
1169
1322
  <Building2 className="h-3 w-3 shrink-0" />
1170
- <span className="truncate">Type Properties ({typeProperties.typeName})</span>
1323
+ <span className="truncate">Type Properties ({renderedTypeProperties.typeName})</span>
1171
1324
  </div>
1172
- {inheritedTypeProperties.map((pset: PropertySet) => (
1325
+ {renderedInheritedTypeProperties.map((pset: PropertySet) => (
1173
1326
  <PropertySetCard
1174
1327
  key={`type-${pset.name}`}
1175
1328
  pset={pset}
1176
1329
  modelId={selectedEntity?.modelId}
1177
- entityId={typeProperties.typeId}
1178
- enableEditing={editMode}
1330
+ entityId={renderedTypeProperties.typeId}
1331
+ enableEditing={editMode && !isNativeLazySelection}
1179
1332
  isTypeProperty
1180
- typeEditScope={typeEditImpact?.mode === 'inherited' ? typeEditImpact : undefined}
1333
+ typeEditScope={renderedTypeEditImpact?.mode === 'inherited' ? renderedTypeEditImpact : undefined}
1181
1334
  />
1182
1335
  ))}
1183
1336
  </>
1184
1337
  )}
1185
1338
 
1186
1339
  {/* Classifications */}
1187
- {classifications.length > 0 && (
1340
+ {renderedClassifications.length > 0 && (
1188
1341
  <>
1189
- {mergedProperties.length > 0 && (
1342
+ {renderedMergedProperties.length > 0 && (
1190
1343
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1191
1344
  )}
1192
- {classifications.map((classification, i) => (
1345
+ {renderedClassifications.map((classification, i) => (
1193
1346
  <ClassificationCard key={`class-${i}`} classification={classification} />
1194
1347
  ))}
1195
1348
  </>
1196
1349
  )}
1197
1350
 
1198
1351
  {/* Materials */}
1199
- {materialInfo && (
1352
+ {renderedMaterialInfo && (
1200
1353
  <>
1201
- {(mergedProperties.length > 0 || classifications.length > 0) && (
1354
+ {(renderedMergedProperties.length > 0 || renderedClassifications.length > 0) && (
1202
1355
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1203
1356
  )}
1204
- <MaterialCard material={materialInfo} />
1357
+ <MaterialCard material={renderedMaterialInfo} />
1205
1358
  </>
1206
1359
  )}
1207
1360
 
1208
1361
  {/* Documents */}
1209
- {documents.length > 0 && (
1362
+ {renderedDocuments.length > 0 && (
1210
1363
  <>
1211
- {(mergedProperties.length > 0 || classifications.length > 0 || materialInfo) && (
1364
+ {(renderedMergedProperties.length > 0 || renderedClassifications.length > 0 || renderedMaterialInfo) && (
1212
1365
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1213
1366
  )}
1214
- {documents.map((doc, i) => (
1367
+ {renderedDocuments.map((doc, i) => (
1215
1368
  <DocumentCard key={`doc-${i}`} document={doc} />
1216
1369
  ))}
1217
1370
  </>
1218
1371
  )}
1219
1372
 
1220
1373
  {/* Relationships */}
1221
- {entityRelationships && (
1374
+ {renderedEntityRelationships && (
1222
1375
  <>
1223
1376
  <div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
1224
- <RelationshipsCard relationships={entityRelationships} />
1377
+ <RelationshipsCard relationships={renderedEntityRelationships} />
1225
1378
  </>
1226
1379
  )}
1227
1380
  </div>
@@ -1229,11 +1382,11 @@ export function PropertiesPanel() {
1229
1382
  </TabsContent>
1230
1383
 
1231
1384
  <TabsContent value="quantities" className="m-0 p-3 overflow-hidden">
1232
- {quantities.length === 0 ? (
1385
+ {renderedQuantities.length === 0 ? (
1233
1386
  <p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No quantities</p>
1234
1387
  ) : (
1235
1388
  <div className="space-y-3 w-full overflow-hidden">
1236
- {quantities.map((qset: QuantitySet) => (
1389
+ {renderedQuantities.map((qset: QuantitySet) => (
1237
1390
  <QuantitySetCard key={qset.name} qset={qset} />
1238
1391
  ))}
1239
1392
  </div>
@@ -1246,11 +1399,11 @@ export function PropertiesPanel() {
1246
1399
  entityType={entityType}
1247
1400
  modelId={selectedEntity.modelId}
1248
1401
  entityId={selectedEntity.expressId}
1249
- existingPsets={mergedProperties.map(p => p.name)}
1250
- existingProps={existingProps}
1251
- existingQsets={quantities.map(q => q.name)}
1252
- existingQuants={existingQuants}
1253
- existingAttributes={existingAttributeNames}
1402
+ existingPsets={renderedMergedProperties.map(p => p.name)}
1403
+ existingProps={renderedExistingProps}
1404
+ existingQsets={renderedQuantities.map(q => q.name)}
1405
+ existingQuants={renderedExistingQuants}
1406
+ existingAttributes={renderedExistingAttributeNames}
1254
1407
  />
1255
1408
  )}
1256
1409
  </TabsContent>