@ifc-lite/viewer 1.17.3 → 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 (495) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +15 -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-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/{exporters-C_6J153K.js → exporters-ChAtBmlj.js} +2225 -1754
  12. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  13. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  14. package/dist/assets/{index-jhBr1wbn.js → index-Co8E2-FE.js} +28959 -24612
  15. package/dist/assets/index-DckuDqlv.css +1 -0
  16. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  17. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  18. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-DZiNLNMk.js} +5 -5
  19. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BV8zHZ7Y.js} +4 -4
  20. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  21. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  22. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  23. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  24. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  25. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  26. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  53. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  54. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  55. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  57. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  58. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  59. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  102. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  109. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  110. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  225. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  226. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  227. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  229. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  230. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  231. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  232. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  233. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  234. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  235. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  236. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  237. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  238. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  239. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  240. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  241. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  242. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  243. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  244. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  245. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  246. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  247. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  248. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  249. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  250. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  274. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  275. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  283. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  284. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  285. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  286. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  287. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  288. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  289. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  290. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  291. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  292. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  293. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  294. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  295. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  296. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  297. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  298. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  299. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  300. package/dist/cesium/Widgets/lighter.css +237 -0
  301. package/dist/cesium/Widgets/lighterShared.css +46 -0
  302. package/dist/cesium/Widgets/shared.css +103 -0
  303. package/dist/cesium/Widgets/widgets.css +1342 -0
  304. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  305. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  306. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  307. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  308. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  309. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  310. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  311. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  312. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  313. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  314. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  315. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  316. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  317. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  318. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  319. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  320. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  321. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  322. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  323. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  324. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  325. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  326. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  327. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  328. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  329. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  330. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  331. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  332. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  333. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  334. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  335. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  336. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  337. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  338. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  339. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  340. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  341. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  342. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  343. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  344. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  345. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  346. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  348. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  349. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  350. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  351. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  352. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  353. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  354. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  355. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  356. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  357. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  358. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  359. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  360. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  361. package/dist/cesium/Workers/combineGeometry.js +26 -0
  362. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  363. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  365. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  373. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  377. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createGeometry.js +26 -0
  379. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  381. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  388. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  393. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  394. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  395. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  396. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  398. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  399. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  402. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  403. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  404. package/dist/cesium/Workers/decodeDraco.js +26 -0
  405. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  406. package/dist/cesium/Workers/decodeI3S.js +26 -0
  407. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  408. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  409. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  410. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  411. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  412. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  413. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  414. package/dist/index.html +10 -8
  415. package/package.json +15 -12
  416. package/src/App.tsx +1 -17
  417. package/src/components/viewer/BCFPanel.tsx +46 -4
  418. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  419. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  420. package/src/components/viewer/ChatPanel.tsx +54 -16
  421. package/src/components/viewer/CommandPalette.tsx +6 -1
  422. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  423. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  424. package/src/components/viewer/ExportDialog.tsx +22 -6
  425. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  426. package/src/components/viewer/IDSPanel.tsx +52 -3
  427. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  428. package/src/components/viewer/MainToolbar.tsx +353 -27
  429. package/src/components/viewer/PropertiesPanel.tsx +218 -79
  430. package/src/components/viewer/ScriptPanel.tsx +34 -8
  431. package/src/components/viewer/SettingsPage.tsx +430 -0
  432. package/src/components/viewer/StatusBar.tsx +17 -1
  433. package/src/components/viewer/UpgradePage.tsx +6 -4
  434. package/src/components/viewer/ViewerLayout.tsx +47 -6
  435. package/src/components/viewer/Viewport.tsx +49 -8
  436. package/src/components/viewer/ViewportContainer.tsx +280 -28
  437. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  438. package/src/components/viewer/properties/GeoreferencingPanel.tsx +117 -5
  439. package/src/components/viewer/properties/LocationMap.tsx +458 -17
  440. package/src/components/viewer/selectionHandlers.ts +4 -3
  441. package/src/components/viewer/useAnimationLoop.ts +4 -0
  442. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  443. package/src/components/viewer/useMouseControls.ts +4 -1
  444. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  445. package/src/hooks/useIDS.ts +1 -1
  446. package/src/hooks/useIfc.ts +7 -1
  447. package/src/hooks/useIfcCache.ts +28 -15
  448. package/src/hooks/useIfcFederation.ts +57 -225
  449. package/src/hooks/useIfcLoader.ts +1656 -130
  450. package/src/hooks/useIfcServer.ts +0 -69
  451. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  452. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  453. package/src/lib/desktop-entitlement.ts +45 -0
  454. package/src/lib/desktop-product.ts +124 -0
  455. package/src/lib/geo/cesium-bridge.ts +310 -0
  456. package/src/lib/geo/reproject.ts +151 -25
  457. package/src/lib/recent-files.ts +2 -1
  458. package/src/services/analysis-extensions.ts +125 -0
  459. package/src/services/app-navigation.ts +13 -0
  460. package/src/services/bsdd.ts +53 -4
  461. package/src/services/cacheService.ts +1 -1
  462. package/src/services/desktop-cache.ts +43 -0
  463. package/src/services/desktop-export.ts +77 -0
  464. package/src/services/desktop-harness.ts +196 -0
  465. package/src/services/desktop-logger.ts +20 -0
  466. package/src/services/desktop-native-metadata.ts +207 -0
  467. package/src/services/desktop-panel-actions.ts +43 -0
  468. package/src/services/desktop-preferences.ts +44 -0
  469. package/src/services/file-dialog.ts +147 -0
  470. package/src/services/tauri-core-stub.ts +7 -0
  471. package/src/services/tauri-dialog-stub.ts +7 -0
  472. package/src/services/tauri-fs-stub.ts +7 -0
  473. package/src/store/index.ts +40 -2
  474. package/src/store/slices/cesiumSlice.ts +122 -0
  475. package/src/store/slices/chatSlice.ts +5 -1
  476. package/src/store/slices/dataSlice.ts +139 -28
  477. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  478. package/src/store/slices/loadingSlice.ts +14 -2
  479. package/src/store/slices/modelSlice.ts +58 -3
  480. package/src/store/types.ts +96 -2
  481. package/src/store.ts +1 -1
  482. package/src/utils/desktopModelSnapshot.ts +358 -0
  483. package/src/utils/ifcConfig.ts +6 -1
  484. package/src/utils/nativeSpatialDataStore.ts +250 -0
  485. package/src/utils/serverDataModel.ts +4 -0
  486. package/src/utils/spatialHierarchy.ts +10 -11
  487. package/vite.config.ts +24 -0
  488. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  489. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  490. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  491. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  492. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  493. package/dist/assets/index-pbE7itQS.css +0 -1
  494. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  495. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
@@ -132,7 +132,6 @@ export function useIfcServer() {
132
132
  ): Promise<boolean> => {
133
133
  const { setProgress, setIfcDataStore, setGeometryResult } = useViewerStore.getState();
134
134
  try {
135
- const serverStart = performance.now();
136
135
  setProgress({ phase: 'Connecting to server', percent: 5 });
137
136
 
138
137
  const client = new IfcServerClient({ baseUrl: SERVER_URL });
@@ -151,8 +150,6 @@ export function useIfcServer() {
151
150
 
152
151
  let allMeshes: MeshData[];
153
152
  let result: ServerParseResultType;
154
- let parseTime: number;
155
- let convertTime: number;
156
153
 
157
154
  // Use streaming for large files (>150MB) for progressive rendering
158
155
  // Smaller files use non-streaming path (faster - avoids ~1.1s background re-processing overhead)
@@ -164,8 +161,6 @@ export function useIfcServer() {
164
161
 
165
162
  if (parquetSupported && fileSizeMB > USE_STREAMING_THRESHOLD_MB) {
166
163
  // STREAMING PATH - for large files, render progressively
167
- console.log(`[useIfc] Using STREAMING endpoint for large file (${fileSizeMB.toFixed(1)}MB)`);
168
-
169
164
  allMeshes = [];
170
165
  let totalVertices = 0;
171
166
  let totalTriangles = 0;
@@ -177,8 +172,6 @@ export function useIfcServer() {
177
172
  // Progressive bounds calculation
178
173
  const bounds = createEmptyBounds();
179
174
 
180
- const parseStart = performance.now();
181
-
182
175
  // Throttle server streaming updates - large files get less frequent UI updates
183
176
  let lastServerStreamRenderTime = 0;
184
177
  const SERVER_STREAM_INTERVAL_MS = getServerStreamIntervalMs(fileSizeMB);
@@ -232,15 +225,10 @@ export function useIfcServer() {
232
225
  }
233
226
  });
234
227
 
235
- parseTime = performance.now() - parseStart;
236
228
  cacheKey = streamResult.cache_key;
237
229
  streamMetadata = streamResult.metadata;
238
230
  streamStats = streamResult.stats;
239
231
 
240
- console.log(`[useIfc] Streaming complete in ${parseTime.toFixed(0)}ms`);
241
- console.log(` ${batchCount} batches, ${allMeshes.length} meshes`);
242
- console.log(` Cache key: ${cacheKey}`);
243
-
244
232
  // Build final result object for data model fetching
245
233
  // Note: meshes field is omitted - allMeshes is passed separately to convertServerDataModel
246
234
  result = {
@@ -248,7 +236,6 @@ export function useIfcServer() {
248
236
  metadata: streamMetadata,
249
237
  stats: streamStats,
250
238
  } as ParquetStreamResult;
251
- convertTime = 0; // Already converted inline
252
239
 
253
240
  // Final geometry set with complete bounds
254
241
  // Server already applies RTC shift to mesh positions, so bounds are shifted
@@ -286,49 +273,23 @@ export function useIfcServer() {
286
273
 
287
274
  } else if (parquetSupported) {
288
275
  // NON-STREAMING PATH - for smaller files, use batch request (with cache check)
289
- console.log(`[useIfc] Using PARQUET endpoint - 15x smaller payload, faster transfer`);
290
-
291
276
  // Use Parquet endpoint - much smaller payload (~15x compression)
292
- const parseStart = performance.now();
293
277
  const parquetResult = await client.parseParquet(file);
294
278
  result = parquetResult;
295
- parseTime = performance.now() - parseStart;
296
-
297
- console.log(`[useIfc] Server parse response received in ${parseTime.toFixed(0)}ms`);
298
- console.log(` Server stats: ${parquetResult.stats.total_time_ms}ms total (parse: ${parquetResult.stats.parse_time_ms}ms, geometry: ${parquetResult.stats.geometry_time_ms}ms)`);
299
- console.log(` Parquet payload: ${(parquetResult.parquet_stats.payload_size / 1024 / 1024).toFixed(2)}MB, decode: ${parquetResult.parquet_stats.decode_time_ms}ms`);
300
- console.log(` Meshes: ${parquetResult.meshes.length}, Vertices: ${parquetResult.stats.total_vertices}, Triangles: ${parquetResult.stats.total_triangles}`);
301
- console.log(` Cache key: ${parquetResult.cache_key}`);
302
279
 
303
280
  setProgress({ phase: 'Converting meshes', percent: 70 });
304
281
 
305
282
  // Convert server mesh format to viewer format (TypedArrays)
306
- const convertStart = performance.now();
307
283
  allMeshes = parquetResult.meshes.map(convertServerMesh);
308
- convertTime = performance.now() - convertStart;
309
- console.log(`[useIfc] Mesh conversion: ${convertTime.toFixed(0)}ms for ${allMeshes.length} meshes`);
310
284
  } else {
311
- console.log(`[useIfc] Parquet not available, using JSON endpoint (install parquet-wasm for 15x faster transfer)`);
312
- console.log(`[useIfc] Using FULL PARSE (parallel) - all geometry processed at once`);
313
-
314
285
  // Fallback to JSON endpoint
315
- const parseStart = performance.now();
316
286
  result = await client.parse(file);
317
- parseTime = performance.now() - parseStart;
318
-
319
- console.log(`[useIfc] Server parse response received in ${parseTime.toFixed(0)}ms`);
320
- console.log(` Server stats: ${result.stats.total_time_ms}ms total (parse: ${result.stats.parse_time_ms}ms, geometry: ${result.stats.geometry_time_ms}ms)`);
321
- console.log(` Meshes: ${result.meshes.length}, Vertices: ${result.stats.total_vertices}, Triangles: ${result.stats.total_triangles}`);
322
- console.log(` Cache key: ${result.cache_key}`);
323
287
 
324
288
  setProgress({ phase: 'Converting meshes', percent: 70 });
325
289
 
326
290
  // Convert server mesh format to viewer format
327
- const convertStart = performance.now();
328
291
  const jsonResult = result as ParseResponse;
329
292
  allMeshes = jsonResult.meshes.map(convertServerMesh);
330
- convertTime = performance.now() - convertStart;
331
- console.log(`[useIfc] Mesh conversion: ${convertTime.toFixed(0)}ms for ${allMeshes.length} meshes`);
332
293
  }
333
294
 
334
295
  // For non-streaming paths, calculate bounds and set geometry
@@ -376,23 +337,14 @@ export function useIfcServer() {
376
337
  hasLargeCoordinates: serverCoordInfo?.is_geo_referenced ?? false,
377
338
  };
378
339
 
379
- console.log(`[useIfc] Calculated bounds:`, {
380
- min: `(${bounds.min.x.toFixed(1)}, ${bounds.min.y.toFixed(1)}, ${bounds.min.z.toFixed(1)})`,
381
- max: `(${bounds.max.x.toFixed(1)}, ${bounds.max.y.toFixed(1)}, ${bounds.max.z.toFixed(1)})`,
382
- size: `${(bounds.max.x - bounds.min.x).toFixed(1)} x ${(bounds.max.y - bounds.min.y).toFixed(1)} x ${(bounds.max.z - bounds.min.z).toFixed(1)}`,
383
- });
384
-
385
340
  // Set all geometry at once
386
341
  setProgress({ phase: 'Rendering geometry', percent: 80 });
387
- const renderStart = performance.now();
388
342
  setGeometryResult({
389
343
  meshes: allMeshes,
390
344
  totalVertices: result.stats.total_vertices,
391
345
  totalTriangles: result.stats.total_triangles,
392
346
  coordinateInfo,
393
347
  });
394
- const renderTime = performance.now() - renderStart;
395
- console.log(`[useIfc] Geometry set: ${renderTime.toFixed(0)}ms`);
396
348
  }
397
349
 
398
350
  // Fetch and decode data model asynchronously (geometry already displayed)
@@ -403,8 +355,6 @@ export function useIfcServer() {
403
355
  (async () => {
404
356
  if (isStale?.()) return;
405
357
  setProgress({ phase: 'Fetching data model', percent: 85 });
406
- const dataModelStart = performance.now();
407
-
408
358
  try {
409
359
  // If data model was included in response (ParquetParseResponse), use it directly
410
360
  // Otherwise, fetch from the data model endpoint
@@ -414,25 +364,15 @@ export function useIfcServer() {
414
364
  }
415
365
 
416
366
  if (!dataModelBuffer || dataModelBuffer.byteLength === 0) {
417
- console.log('[useIfc] Fetching data model from server (background processing)...');
418
367
  dataModelBuffer = await client.fetchDataModel(cacheKey);
419
368
  }
420
369
 
421
370
  if (!dataModelBuffer) {
422
- console.log('[useIfc] ⚡ Data model not available - property panel disabled');
423
371
  return;
424
372
  }
425
373
 
426
374
  const dataModel: DataModel = await decodeDataModel(dataModelBuffer);
427
375
 
428
- console.log(`[useIfc] Data model decoded in ${(performance.now() - dataModelStart).toFixed(0)}ms`);
429
- console.log(` Entities: ${dataModel.entities.size}`);
430
- console.log(` PropertySets: ${dataModel.propertySets.size}`);
431
- const quantitySetsSize = (dataModel as { quantitySets?: Map<number, unknown> }).quantitySets?.size ?? 0;
432
- console.log(` QuantitySets: ${quantitySetsSize}`);
433
- console.log(` Relationships: ${dataModel.relationships.length}`);
434
- console.log(` Spatial nodes: ${dataModel.spatialHierarchy.nodes.length}`);
435
-
436
376
  // Convert server data model directly to IfcDataStore format
437
377
  const dataStore = convertServerDataModel(
438
378
  dataModel,
@@ -443,23 +383,14 @@ export function useIfcServer() {
443
383
 
444
384
  if (isStale?.()) return;
445
385
  setIfcDataStore(dataStore);
446
- console.log('[useIfc] ✅ Property panel ready with server data model');
447
- console.log(`[useIfc] Data model loaded in ${(performance.now() - dataModelStart).toFixed(0)}ms (background)`);
448
386
 
449
387
  buildSpatialIndexGuarded(allMeshes, dataStore, setIfcDataStore);
450
388
  } catch (err) {
451
- console.warn('[useIfc] Failed to decode data model:', err);
452
- console.log('[useIfc] ⚡ Skipping data model (decoding failed)');
453
389
  }
454
390
  })(); // End of async data model fetch block - runs in background, doesn't block
455
391
 
456
392
  // Geometry is ready - mark complete immediately (data model loads in background)
457
393
  setProgress({ phase: 'Complete', percent: 100 });
458
- const totalServerTime = performance.now() - serverStart;
459
- console.log(`[useIfc] SERVER PARALLEL complete: ${file.name}`);
460
- console.log(` Total time: ${totalServerTime.toFixed(0)}ms`);
461
- console.log(` Breakdown: parse=${parseTime.toFixed(0)}ms, convert=${convertTime.toFixed(0)}ms`);
462
-
463
394
  return true;
464
395
  } catch (err) {
465
396
  console.error('[useIfc] Server parse failed:', err);
@@ -0,0 +1,175 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import { useEffect } from 'react';
6
+ import { useAuth, useUser } from '@clerk/clerk-react';
7
+ import { getDefaultDesktopEntitlement, type DesktopEntitlement } from '@/lib/desktop-product';
8
+ import { resolveDesktopEntitlement } from '@/lib/desktop-entitlement';
9
+ import { useViewerStore } from '@/store';
10
+ import { DESKTOP_ENTITLEMENT_REFRESH_EVENT } from './desktopEntitlementEvents';
11
+
12
+ /**
13
+ * Sync Clerk auth + entitlement state into the viewer store.
14
+ * Desktop plan state is authoritative here; chat inherits only the AI-specific permission.
15
+ */
16
+ const ENTITLEMENT_REFRESH_INTERVAL_MS = 24 * 60 * 60 * 1000;
17
+
18
+ function entitlementsEqual(left: DesktopEntitlement, right: DesktopEntitlement): boolean {
19
+ return left.tier === right.tier
20
+ && left.status === right.status
21
+ && left.source === right.source
22
+ && left.userId === right.userId
23
+ && left.validatedAt === right.validatedAt
24
+ && left.graceUntil === right.graceUntil
25
+ && left.trialEndsAt === right.trialEndsAt;
26
+ }
27
+
28
+ export function ClerkDesktopEntitlementSync() {
29
+ const { isLoaded, isSignedIn, userId, getToken, has } = useAuth();
30
+ const { user } = useUser();
31
+ const setChatAuthToken = useViewerStore((s) => s.setChatAuthToken);
32
+ const switchChatUserContext = useViewerStore((s) => s.switchChatUserContext);
33
+ const setDesktopEntitlement = useViewerStore((s) => s.setDesktopEntitlement);
34
+
35
+ useEffect(() => {
36
+ if (!isLoaded) return;
37
+
38
+ if (!isSignedIn) {
39
+ const state = useViewerStore.getState();
40
+ const next = (
41
+ state.desktopEntitlement.tier === 'pro'
42
+ && state.desktopEntitlement.graceUntil
43
+ && state.desktopEntitlement.graceUntil > Date.now()
44
+ )
45
+ ? {
46
+ ...state.desktopEntitlement,
47
+ status: 'grace_offline' as const,
48
+ source: 'cached' as const,
49
+ }
50
+ : {
51
+ ...getDefaultDesktopEntitlement(),
52
+ status: 'signed_out' as const,
53
+ source: 'cached' as const,
54
+ };
55
+ if (!entitlementsEqual(state.desktopEntitlement, next)) {
56
+ setDesktopEntitlement(next);
57
+ }
58
+ if (next.status === 'grace_offline') {
59
+ switchChatUserContext(next.userId, false, {
60
+ clearPersistedCurrent: false,
61
+ restoreMessages: true,
62
+ });
63
+ } else {
64
+ switchChatUserContext(null, false, {
65
+ clearPersistedCurrent: state.chatStorageUserId !== null,
66
+ restoreMessages: false,
67
+ });
68
+ }
69
+ setChatAuthToken(null);
70
+ return;
71
+ }
72
+
73
+ let cancelled = false;
74
+
75
+ const syncAuth = async () => {
76
+ try {
77
+ const token = await getToken({ skipCache: true });
78
+ const { entitlement, aiAssistantEnabled } = resolveDesktopEntitlement({
79
+ userId: userId ?? null,
80
+ token,
81
+ has,
82
+ publicMetadata: (user?.publicMetadata ?? null) as Record<string, unknown> | null,
83
+ });
84
+
85
+ if (cancelled) {
86
+ return;
87
+ }
88
+
89
+ const state = useViewerStore.getState();
90
+ if (!entitlementsEqual(state.desktopEntitlement, entitlement)) {
91
+ setDesktopEntitlement(entitlement);
92
+ }
93
+ if (state.chatStorageUserId !== (userId ?? null) || state.chatHasPro !== aiAssistantEnabled) {
94
+ switchChatUserContext(userId ?? null, aiAssistantEnabled, {
95
+ clearPersistedCurrent: state.chatStorageUserId !== null && state.chatStorageUserId !== userId,
96
+ restoreMessages: true,
97
+ });
98
+ }
99
+ setChatAuthToken(token ?? null);
100
+ } catch {
101
+ if (cancelled) {
102
+ return;
103
+ }
104
+
105
+ const state = useViewerStore.getState();
106
+ if (
107
+ state.desktopEntitlement.tier === 'pro'
108
+ && state.desktopEntitlement.graceUntil
109
+ && state.desktopEntitlement.graceUntil > Date.now()
110
+ ) {
111
+ const next = {
112
+ ...state.desktopEntitlement,
113
+ status: 'grace_offline',
114
+ source: 'cached',
115
+ } satisfies DesktopEntitlement;
116
+ if (!entitlementsEqual(state.desktopEntitlement, next)) {
117
+ setDesktopEntitlement(next);
118
+ }
119
+ if (state.chatStorageUserId !== (userId ?? null) || state.chatHasPro !== true) {
120
+ switchChatUserContext(userId ?? null, true, {
121
+ clearPersistedCurrent: false,
122
+ restoreMessages: true,
123
+ });
124
+ }
125
+ return;
126
+ }
127
+
128
+ const next = {
129
+ ...getDefaultDesktopEntitlement(),
130
+ userId: userId ?? null,
131
+ status: 'signed_out' as const,
132
+ source: 'cached' as const,
133
+ };
134
+ if (!entitlementsEqual(state.desktopEntitlement, next)) {
135
+ setDesktopEntitlement(next);
136
+ }
137
+ }
138
+ };
139
+
140
+ void syncAuth();
141
+ const timer = window.setInterval(() => {
142
+ void syncAuth();
143
+ }, ENTITLEMENT_REFRESH_INTERVAL_MS);
144
+ const onWindowFocus = () => {
145
+ void syncAuth();
146
+ };
147
+ const onManualRefresh = (event: Event) => {
148
+ const detail = (event as CustomEvent<{ resolve: () => void; reject: (error?: unknown) => void }>).detail;
149
+ void syncAuth()
150
+ .then(() => detail?.resolve())
151
+ .catch((error) => detail?.reject(error));
152
+ };
153
+ window.addEventListener('focus', onWindowFocus);
154
+ window.addEventListener(DESKTOP_ENTITLEMENT_REFRESH_EVENT, onManualRefresh);
155
+
156
+ return () => {
157
+ cancelled = true;
158
+ window.clearInterval(timer);
159
+ window.removeEventListener('focus', onWindowFocus);
160
+ window.removeEventListener(DESKTOP_ENTITLEMENT_REFRESH_EVENT, onManualRefresh);
161
+ };
162
+ }, [
163
+ getToken,
164
+ has,
165
+ isLoaded,
166
+ isSignedIn,
167
+ setChatAuthToken,
168
+ setDesktopEntitlement,
169
+ switchChatUserContext,
170
+ user?.publicMetadata,
171
+ userId,
172
+ ]);
173
+
174
+ return null;
175
+ }
@@ -0,0 +1,39 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ export const DESKTOP_ENTITLEMENT_REFRESH_EVENT = 'ifc-lite:desktop-entitlement-refresh';
6
+
7
+ interface DesktopEntitlementRefreshDetail {
8
+ resolve: () => void;
9
+ reject: (error?: unknown) => void;
10
+ }
11
+
12
+ const ENTITLEMENT_REFRESH_TIMEOUT_MS = 10_000;
13
+
14
+ export function requestDesktopEntitlementRefresh(): Promise<void> {
15
+ return new Promise((resolve, reject) => {
16
+ const timeoutId = globalThis.setTimeout(() => {
17
+ reject(new Error(
18
+ `Desktop entitlement refresh timed out after ${ENTITLEMENT_REFRESH_TIMEOUT_MS}ms — ` +
19
+ 'no listener responded to the refresh event.',
20
+ ));
21
+ }, ENTITLEMENT_REFRESH_TIMEOUT_MS);
22
+
23
+ window.dispatchEvent(new CustomEvent<DesktopEntitlementRefreshDetail>(
24
+ DESKTOP_ENTITLEMENT_REFRESH_EVENT,
25
+ {
26
+ detail: {
27
+ resolve: () => {
28
+ globalThis.clearTimeout(timeoutId);
29
+ resolve();
30
+ },
31
+ reject: (error?: unknown) => {
32
+ globalThis.clearTimeout(timeoutId);
33
+ reject(error);
34
+ },
35
+ },
36
+ },
37
+ ));
38
+ });
39
+ }
@@ -0,0 +1,45 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import {
6
+ getDefaultDesktopEntitlement,
7
+ hasDesktopFeatureAccess,
8
+ type DesktopEntitlement,
9
+ type DesktopFeature,
10
+ } from './desktop-product';
11
+
12
+ type HasFn = ((params: { plan?: string; feature?: string }) => boolean) | undefined;
13
+
14
+ interface ResolveDesktopEntitlementOptions {
15
+ userId: string | null;
16
+ token: string | null;
17
+ has: HasFn;
18
+ publicMetadata: Record<string, unknown> | null | undefined;
19
+ now?: number;
20
+ }
21
+
22
+ interface ResolvedDesktopEntitlement {
23
+ entitlement: DesktopEntitlement;
24
+ aiAssistantEnabled: boolean;
25
+ }
26
+
27
+ export function resolveDesktopEntitlement(options: ResolveDesktopEntitlementOptions): ResolvedDesktopEntitlement {
28
+ // NOTE: `token`, `has`, `publicMetadata`, and `now` are accepted but
29
+ // intentionally unused in this initial implementation. Full Clerk-based
30
+ // entitlement resolution (plan checks via `has`, metadata-driven overrides,
31
+ // token validation, and time-based expiry via `now`) will be wired up once
32
+ // the Clerk integration is available in the desktop shell.
33
+ const { userId } = options;
34
+ const entitlement: DesktopEntitlement = {
35
+ ...getDefaultDesktopEntitlement(),
36
+ userId,
37
+ };
38
+ const aiAssistantEnabled = hasDesktopFeatureAccess(entitlement, 'ai_assistant');
39
+ return { entitlement, aiAssistantEnabled };
40
+ }
41
+
42
+ export function canUseDesktopFeatureOffline(entitlement: DesktopEntitlement, feature: DesktopFeature, now = Date.now()): boolean {
43
+ void now;
44
+ return hasDesktopFeatureAccess(entitlement, feature);
45
+ }
@@ -0,0 +1,124 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ export type DesktopPlanTier = 'free' | 'pro';
6
+ export type DesktopEntitlementStatus = 'anonymous' | 'signed_out' | 'active' | 'trial' | 'expired' | 'grace_offline';
7
+ export type DesktopEntitlementSource = 'anonymous' | 'clerk_claims' | 'cached';
8
+
9
+ export type DesktopFeature =
10
+ | 'viewer_basic'
11
+ | 'workspace_restore'
12
+ | 'exports'
13
+ | 'ids_validation'
14
+ | 'bcf_issue_management'
15
+ | 'ai_assistant';
16
+
17
+ export interface DesktopEntitlement {
18
+ tier: DesktopPlanTier;
19
+ status: DesktopEntitlementStatus;
20
+ source: DesktopEntitlementSource;
21
+ userId: string | null;
22
+ validatedAt: number | null;
23
+ graceUntil: number | null;
24
+ trialEndsAt: number | null;
25
+ }
26
+
27
+ export interface DesktopUsageSummary {
28
+ type: 'credits' | 'requests';
29
+ used: number;
30
+ limit: number;
31
+ pct?: number;
32
+ resetAt?: number;
33
+ }
34
+
35
+ interface DesktopFeatureDefinition {
36
+ label: string;
37
+ description: string;
38
+ free: boolean;
39
+ }
40
+
41
+ const DESKTOP_FEATURES: Record<DesktopFeature, DesktopFeatureDefinition> = {
42
+ viewer_basic: {
43
+ label: 'Viewer features',
44
+ description: 'Core model viewing and inspection capabilities.',
45
+ free: true,
46
+ },
47
+ workspace_restore: {
48
+ label: 'Workspace restore',
49
+ description: 'Host-provided workspace persistence features.',
50
+ free: true,
51
+ },
52
+ exports: {
53
+ label: 'Exports',
54
+ description: 'Host-provided export integrations.',
55
+ free: true,
56
+ },
57
+ ids_validation: {
58
+ label: 'IDS validation',
59
+ description: 'Host-provided IDS workflows.',
60
+ free: true,
61
+ },
62
+ bcf_issue_management: {
63
+ label: 'BCF issue management',
64
+ description: 'Host-provided BCF workflows.',
65
+ free: true,
66
+ },
67
+ ai_assistant: {
68
+ label: 'Host AI assistant',
69
+ description: 'Optional host-provided AI integrations.',
70
+ free: true,
71
+ },
72
+ };
73
+
74
+ export function isDesktopBillingEnforced(): boolean {
75
+ return false;
76
+ }
77
+
78
+ export function getDesktopPlanTier(entitlementOrHasPro: DesktopEntitlement | boolean): DesktopPlanTier {
79
+ return typeof entitlementOrHasPro === 'boolean'
80
+ ? (entitlementOrHasPro ? 'pro' : 'free')
81
+ : entitlementOrHasPro.tier;
82
+ }
83
+
84
+ export function hasDesktopPro(entitlementOrHasPro: DesktopEntitlement | boolean): boolean {
85
+ return getDesktopPlanTier(entitlementOrHasPro) === 'pro';
86
+ }
87
+
88
+ export function hasDesktopFeatureAccess(entitlementOrHasPro: DesktopEntitlement | boolean, feature: DesktopFeature): boolean {
89
+ return hasDesktopPro(entitlementOrHasPro) || DESKTOP_FEATURES[feature].free;
90
+ }
91
+
92
+ export function getDesktopFeatureCatalog(entitlementOrHasPro: DesktopEntitlement | boolean) {
93
+ return (Object.entries(DESKTOP_FEATURES) as Array<[DesktopFeature, DesktopFeatureDefinition]>).map(([key, value]) => ({
94
+ key,
95
+ ...value,
96
+ enabled: hasDesktopFeatureAccess(entitlementOrHasPro, key),
97
+ }));
98
+ }
99
+
100
+ export function buildDesktopUpgradeUrl(returnTo?: string): string {
101
+ const fallbackReturnTo = typeof window !== 'undefined'
102
+ ? `${window.location.pathname}${window.location.search}`
103
+ : '/';
104
+ const nextReturnTo = returnTo ?? fallbackReturnTo;
105
+ return `/upgrade?returnTo=${encodeURIComponent(nextReturnTo)}`;
106
+ }
107
+
108
+ export function getDefaultDesktopEntitlement(): DesktopEntitlement {
109
+ return {
110
+ tier: 'free',
111
+ status: 'anonymous',
112
+ source: 'anonymous',
113
+ userId: null,
114
+ validatedAt: null,
115
+ graceUntil: null,
116
+ trialEndsAt: null,
117
+ };
118
+ }
119
+
120
+ export function getDesktopPlanSummary(entitlementOrHasPro: DesktopEntitlement | boolean, usage: DesktopUsageSummary | null): string {
121
+ void entitlementOrHasPro;
122
+ void usage;
123
+ return 'Desktop entitlements are host-defined and disabled in the open-source web viewer build.';
124
+ }