@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
@@ -0,0 +1,100 @@
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
+ /**
6
+ * Settings dialog for configuring Cesium 3D overlay options:
7
+ * - Data source selection (OSM Buildings, Bing Aerial, Google Photorealistic)
8
+ * - Terrain toggle
9
+ * - Advanced: custom Cesium ion token override (optional — default is bundled)
10
+ */
11
+
12
+ import { useState } from 'react';
13
+ import {
14
+ Dialog,
15
+ DialogContent,
16
+ DialogHeader,
17
+ DialogTitle,
18
+ DialogTrigger,
19
+ } from '@/components/ui/dialog';
20
+ import { Button } from '@/components/ui/button';
21
+ import { Label } from '@/components/ui/label';
22
+ import { useViewerStore } from '@/store';
23
+ import type { CesiumDataSource } from '@/store/slices/cesiumSlice';
24
+ import { Settings2 } from 'lucide-react';
25
+
26
+ const DATA_SOURCE_OPTIONS: { value: CesiumDataSource; label: string; description: string }[] = [
27
+ { value: 'osm-buildings', label: 'OSM Buildings', description: 'OpenStreetMap 3D buildings worldwide' },
28
+ { value: 'bing-aerial', label: 'Bing Aerial', description: 'Satellite imagery draped on terrain' },
29
+ { value: 'google-photorealistic', label: 'Google Photorealistic', description: 'High-fidelity 3D photogrammetry (where available)' },
30
+ ];
31
+
32
+ export function CesiumSettingsDialog() {
33
+ const dataSource = useViewerStore((s) => s.cesiumDataSource);
34
+ const setCesiumDataSource = useViewerStore((s) => s.setCesiumDataSource);
35
+ const terrainEnabled = useViewerStore((s) => s.cesiumTerrainEnabled);
36
+ const setCesiumTerrainEnabled = useViewerStore((s) => s.setCesiumTerrainEnabled);
37
+ const [open, setOpen] = useState(false);
38
+
39
+ return (
40
+ <Dialog open={open} onOpenChange={setOpen}>
41
+ <DialogTrigger asChild>
42
+ <Button variant="ghost" size="icon-sm" className="h-6 w-6" aria-label="Cesium settings">
43
+ <Settings2 className="h-3 w-3" />
44
+ </Button>
45
+ </DialogTrigger>
46
+ <DialogContent className="sm:max-w-md">
47
+ <DialogHeader>
48
+ <DialogTitle className="text-sm font-bold">3D World Context</DialogTitle>
49
+ </DialogHeader>
50
+
51
+ <div className="space-y-4 mt-2">
52
+ {/* Data Source */}
53
+ <div className="space-y-1.5">
54
+ <Label className="text-xs font-medium">3D Data Source</Label>
55
+ <div className="space-y-1">
56
+ {DATA_SOURCE_OPTIONS.map((opt) => (
57
+ <label
58
+ key={opt.value}
59
+ className={`flex items-start gap-2 p-2 rounded border cursor-pointer transition-colors ${
60
+ dataSource === opt.value
61
+ ? 'border-teal-500 bg-teal-50 dark:bg-teal-950/30'
62
+ : 'border-zinc-200 dark:border-zinc-700 hover:border-zinc-300 dark:hover:border-zinc-600'
63
+ }`}
64
+ >
65
+ <input
66
+ type="radio"
67
+ name="cesium-data-source"
68
+ checked={dataSource === opt.value}
69
+ onChange={() => setCesiumDataSource(opt.value)}
70
+ className="mt-0.5 accent-teal-500"
71
+ />
72
+ <div>
73
+ <div className="text-xs font-medium">{opt.label}</div>
74
+ <div className="text-[10px] text-zinc-400">{opt.description}</div>
75
+ </div>
76
+ </label>
77
+ ))}
78
+ </div>
79
+ </div>
80
+
81
+ {/* Terrain Toggle */}
82
+ <label className="flex items-center gap-2 cursor-pointer">
83
+ <input
84
+ type="checkbox"
85
+ checked={terrainEnabled}
86
+ onChange={(e) => setCesiumTerrainEnabled(e.target.checked)}
87
+ className="accent-teal-500"
88
+ />
89
+ <span className="text-xs">Enable 3D terrain (Cesium World Terrain)</span>
90
+ </label>
91
+
92
+ <p className="text-[10px] text-zinc-400 border-t border-zinc-100 dark:border-zinc-800 pt-3">
93
+ Powered by Cesium ion. Real-world 3D tiles are overlaid on your georeferenced
94
+ IFC model. Only available when the model contains IfcMapConversion data.
95
+ </p>
96
+ </div>
97
+ </DialogContent>
98
+ </Dialog>
99
+ );
100
+ }
@@ -31,6 +31,7 @@ import {
31
31
  } from 'lucide-react';
32
32
  import { SignInButton, SignedIn, SignedOut, UserButton } from '@clerk/clerk-react';
33
33
  import { Button } from '@/components/ui/button';
34
+ import { toast } from '@/components/ui/toast';
34
35
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
35
36
  import { useViewerStore } from '@/store';
36
37
  import { buildErrorFeedbackContent } from '@/store/slices/chatSlice';
@@ -50,6 +51,8 @@ import type { ChatMessage, ChatRepairRequest, FileAttachment } from '@/lib/llm/t
50
51
  import { canUsePlainCodeBlockFallback, type ScriptMutationIntent } from '@/lib/llm/script-preservation';
51
52
  import { Image as ImageIcon } from 'lucide-react';
52
53
  import { isClerkConfigured } from '@/lib/llm/clerk-auth';
54
+ import { buildDesktopUpgradeUrl, hasDesktopFeatureAccess } from '@/lib/desktop-product';
55
+ import { navigateToPath } from '@/services/app-navigation';
53
56
  import { getModelById } from '@/lib/llm/models';
54
57
  import { useSandbox } from '@/hooks/useSandbox';
55
58
 
@@ -212,7 +215,9 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
212
215
  const hasPro = useViewerStore((s) => s.chatHasPro);
213
216
  const usage = useViewerStore((s) => s.chatUsage);
214
217
  const setChatUsage = useViewerStore((s) => s.setChatUsage);
218
+ const desktopEntitlement = useViewerStore((s) => s.desktopEntitlement);
215
219
  const { execute } = useSandbox();
220
+ const canUseAiAssistant = hasDesktopFeatureAccess(desktopEntitlement, 'ai_assistant');
216
221
  const displayUsage: UsageInfo | null = usage ?? (hasPro
217
222
  ? {
218
223
  type: 'credits',
@@ -233,6 +238,14 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
233
238
  const [showScrollBtn, setShowScrollBtn] = useState(false);
234
239
  const [userScrolledUp, setUserScrolledUp] = useState(false);
235
240
  const [lastFinishReason, setLastFinishReason] = useState<string | null>(null);
241
+ const openUpgradePage = useCallback(() => {
242
+ navigateToPath(buildDesktopUpgradeUrl());
243
+ }, []);
244
+ const promptAiUpgrade = useCallback(() => {
245
+ setChatError('AI assistant is available with Desktop Pro.');
246
+ toast.info('AI assistant is available with Desktop Pro');
247
+ openUpgradePage();
248
+ }, [openUpgradePage, setChatError]);
236
249
 
237
250
  const inputRef = useRef<HTMLTextAreaElement>(null);
238
251
  const scrollRef = useRef<HTMLDivElement>(null);
@@ -385,6 +398,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
385
398
  // ── Core send logic ──
386
399
  const doSend = useCallback(async (text: string, options?: ChatSendOptions) => {
387
400
  if (!text.trim() || status === 'streaming' || status === 'sending') return;
401
+ if (!canUseAiAssistant) {
402
+ setChatError('AI assistant is available with Desktop Pro.');
403
+ return;
404
+ }
388
405
 
389
406
  const continuationBase = options?.continuationBase;
390
407
  const responseIntent = options?.intent ?? 'create';
@@ -780,15 +797,19 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
780
797
  }
781
798
  }
782
799
  }, [
783
- status, activeModel, attachments, authToken,
800
+ canUseAiAssistant, status, activeModel, attachments, authToken,
784
801
  addMessage, setChatStatus, updateStreaming, finalizeAssistant,
785
802
  setChatError, setChatAbortController, clearAttachments, setChatUsage, resizeInput,
786
803
  buildRepairPromptFromLiveState, triggerAutoRepair, execute,
787
804
  ]);
788
805
 
789
806
  const handleSend = useCallback(() => {
807
+ if (!canUseAiAssistant) {
808
+ promptAiUpgrade();
809
+ return;
810
+ }
790
811
  doSend(inputText);
791
- }, [inputText, doSend]);
812
+ }, [canUseAiAssistant, doSend, inputText, promptAiUpgrade]);
792
813
 
793
814
  // Allow other panels (e.g. ScriptPanel errors) to trigger a chat repair turn.
794
815
  useEffect(() => {
@@ -817,6 +838,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
817
838
  }, [pendingRepairRequest, status, consumePendingRepairRequest, buildRepairPromptFromLiveState, doSend]);
818
839
 
819
840
  const handleContinue = useCallback(() => {
841
+ if (!canUseAiAssistant) {
842
+ promptAiUpgrade();
843
+ return;
844
+ }
820
845
  const state = useViewerStore.getState();
821
846
  const partial = state.chatStreamingContent.trim();
822
847
  const lastAssistant = [...state.chatMessages].reverse().find((m) => m.role === 'assistant');
@@ -829,7 +854,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
829
854
  }
830
855
  setChatError(null);
831
856
  doSend(CONTINUE_PROMPT, { continuationBase });
832
- }, [doSend, finalizeAssistant, setChatError]);
857
+ }, [canUseAiAssistant, doSend, finalizeAssistant, promptAiUpgrade, setChatError]);
833
858
 
834
859
  const handleStop = useCallback(() => {
835
860
  const controller = useViewerStore.getState().chatAbortController;
@@ -854,6 +879,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
854
879
 
855
880
  // ── Error feedback (Fix this) ──
856
881
  const handleFixError = useCallback((code: string, errorMsg: string) => {
882
+ if (!canUseAiAssistant) {
883
+ promptAiUpgrade();
884
+ return;
885
+ }
857
886
  const diagnostics = useViewerStore.getState().scriptLastDiagnostics;
858
887
  const liveCode = useViewerStore.getState().scriptEditorContent;
859
888
  const staleCode = code.trim() !== liveCode.trim() ? code : undefined;
@@ -868,7 +897,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
868
897
  requestedRepairScope: getPrimaryRootCause(diagnostics)?.repairScope,
869
898
  rootCauseKey: getPrimaryRootCause(diagnostics)?.rootCauseKey,
870
899
  });
871
- }, [buildRepairPromptFromLiveState, doSend]);
900
+ }, [buildRepairPromptFromLiveState, canUseAiAssistant, doSend, promptAiUpgrade]);
872
901
 
873
902
  // ── Clickable example prompts ──
874
903
  const handleExampleClick = useCallback((prompt: string) => {
@@ -898,6 +927,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
898
927
 
899
928
  // ── File upload (button + drag-drop + paste) ──
900
929
  const processFiles = useCallback(async (files: FileList | File[]) => {
930
+ if (!canUseAiAssistant) {
931
+ promptAiUpgrade();
932
+ return;
933
+ }
901
934
  const model = getModelById(activeModel);
902
935
  const supportsImages = model?.supportsImages ?? false;
903
936
  const supportsFileAttachments = model?.supportsFileAttachments ?? true;
@@ -965,7 +998,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
965
998
  setChatError(`Could not read ${file.name}: ${error instanceof Error ? error.message : String(error)}`);
966
999
  }
967
1000
  }
968
- }, [activeModel, addAttachment, attachments.length, setChatError]);
1001
+ }, [activeModel, addAttachment, attachments.length, canUseAiAssistant, promptAiUpgrade, setChatError]);
969
1002
 
970
1003
  const handleFileUpload = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {
971
1004
  const files = e.target.files;
@@ -1044,13 +1077,6 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
1044
1077
  const canContinue = Boolean(
1045
1078
  !isActive && (streamingContent.trim().length > 0 || lastFinishReason === 'length'),
1046
1079
  );
1047
- const openUpgradePage = useCallback(() => {
1048
- const currentPath = `${window.location.pathname}${window.location.search}`;
1049
- const target = `/upgrade?returnTo=${encodeURIComponent(currentPath)}`;
1050
- window.history.pushState({}, '', target);
1051
- window.dispatchEvent(new PopStateEvent('popstate'));
1052
- }, []);
1053
-
1054
1080
  return (
1055
1081
  <div
1056
1082
  className="h-full flex flex-col bg-background relative"
@@ -1134,6 +1160,15 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
1134
1160
  )}
1135
1161
  </div>
1136
1162
 
1163
+ {!canUseAiAssistant && (
1164
+ <div className="border-b bg-muted/40 px-3 py-2 text-xs text-muted-foreground flex items-center justify-between gap-3">
1165
+ <span>AI assistant is available with Desktop Pro. Core viewing and scripting stay available without it.</span>
1166
+ <Button variant="outline" size="sm" className="h-6 px-2 text-xs" onClick={openUpgradePage}>
1167
+ Upgrade
1168
+ </Button>
1169
+ </div>
1170
+ )}
1171
+
1137
1172
  {/* Clear confirmation */}
1138
1173
  {showClearConfirm && (
1139
1174
  <div className="px-3 py-2 bg-destructive/5 border-b flex items-center gap-2 text-xs">
@@ -1308,14 +1343,16 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
1308
1343
  variant="ghost"
1309
1344
  size="icon-xs"
1310
1345
  onClick={() => fileInputRef.current?.click()}
1311
- disabled={!canAttachInput}
1346
+ disabled={!canAttachInput || !canUseAiAssistant}
1312
1347
  className="shrink-0 mb-0.5"
1313
1348
  >
1314
1349
  <Paperclip className="h-3.5 w-3.5" />
1315
1350
  </Button>
1316
1351
  </TooltipTrigger>
1317
1352
  <TooltipContent>
1318
- {canAttachInput
1353
+ {!canUseAiAssistant
1354
+ ? 'Desktop Pro required for AI assistant'
1355
+ : canAttachInput
1319
1356
  ? 'Attach file or image (paste, drag & drop)'
1320
1357
  : 'Selected model does not support attachments'}
1321
1358
  </TooltipContent>
@@ -1330,10 +1367,11 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
1330
1367
  }}
1331
1368
  onKeyDown={handleKeyDown}
1332
1369
  onPaste={handlePaste}
1333
- placeholder="Ask anything..."
1370
+ placeholder={canUseAiAssistant ? 'Ask anything...' : 'Desktop Pro required for AI assistant'}
1334
1371
  rows={1}
1335
1372
  className="flex-1 resize-none rounded-md border border-input bg-background text-foreground placeholder:text-muted-foreground px-3 py-1.5 text-sm min-h-[32px] max-h-[120px] focus:outline-none focus:ring-1 focus:ring-ring"
1336
1373
  style={{ height: 'auto', overflow: 'hidden' }}
1374
+ disabled={!canUseAiAssistant}
1337
1375
  />
1338
1376
 
1339
1377
  {isActive ? (
@@ -1357,7 +1395,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
1357
1395
  variant="default"
1358
1396
  size="icon-xs"
1359
1397
  onClick={handleSend}
1360
- disabled={!inputText.trim()}
1398
+ disabled={!inputText.trim() || !canUseAiAssistant}
1361
1399
  className="shrink-0 mb-0.5"
1362
1400
  >
1363
1401
  <Send className="h-3.5 w-3.5" />
@@ -70,6 +70,7 @@ import { SCRIPT_TEMPLATES } from '@/lib/scripts/templates';
70
70
  import { GLTFExporter, CSVExporter } from '@ifc-lite/export';
71
71
  import { getRecentFiles, formatFileSize, getCachedFile } from '@/lib/recent-files';
72
72
  import type { RecentFileEntry } from '@/lib/recent-files';
73
+ import { closeActiveAnalysisExtension } from '@/services/analysis-extensions';
73
74
 
74
75
  // ── Types ──────────────────────────────────────────────────────────────
75
76
 
@@ -189,6 +190,8 @@ function activateRightPanel(panel: 'bcf' | 'ids' | 'lens') {
189
190
  panel === 'ids' ? s.idsPanelVisible :
190
191
  s.lensPanelVisible;
191
192
 
193
+ closeActiveAnalysisExtension();
194
+
192
195
  // Close all content panels
193
196
  s.setBcfPanelVisible(false);
194
197
  s.setIdsPanelVisible(false);
@@ -211,6 +214,8 @@ function activateBottomPanel(panel: 'script' | 'list') {
211
214
  const s = useViewerStore.getState();
212
215
  const isActive = panel === 'script' ? s.scriptPanelVisible : s.listPanelVisible;
213
216
 
217
+ closeActiveAnalysisExtension();
218
+
214
219
  // Close all bottom panels
215
220
  s.setScriptPanelVisible(false);
216
221
  s.setListPanelVisible(false);
@@ -270,7 +275,7 @@ export function CommandPalette({ open, onOpenChange }: CommandPaletteProps) {
270
275
  detail: formatFileSize(rf.size),
271
276
  action: () => {
272
277
  // Try loading from IndexedDB blob cache → dispatches to MainToolbar's loadFile
273
- getCachedFile(fileName).then(file => {
278
+ getCachedFile(rf).then(file => {
274
279
  if (file) {
275
280
  window.dispatchEvent(new CustomEvent('ifc-lite:load-file', { detail: file }));
276
281
  } else {
@@ -0,0 +1,74 @@
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 { AlertTriangle, Clock3, WifiOff } from 'lucide-react';
6
+ import { Button } from '@/components/ui/button';
7
+ import { useViewerStore } from '@/store';
8
+ import { buildDesktopUpgradeUrl, hasDesktopPro } from '@/lib/desktop-product';
9
+ import { navigateToPath } from '@/services/app-navigation';
10
+
11
+ function formatDate(timestamp: number | null): string | null {
12
+ if (!timestamp || !Number.isFinite(timestamp)) {
13
+ return null;
14
+ }
15
+ return new Date(timestamp).toLocaleDateString();
16
+ }
17
+
18
+ export function DesktopEntitlementBanner() {
19
+ const entitlement = useViewerStore((s) => s.desktopEntitlement);
20
+
21
+ if (entitlement.status === 'active' || entitlement.status === 'anonymous') {
22
+ return null;
23
+ }
24
+
25
+ if (entitlement.status === 'trial') {
26
+ return (
27
+ <div className="flex items-center justify-between gap-3 border-b bg-amber-50 px-4 py-2 text-sm text-amber-900 dark:bg-amber-950/60 dark:text-amber-200">
28
+ <div className="flex items-center gap-2 min-w-0">
29
+ <Clock3 className="h-4 w-4 shrink-0" />
30
+ <span className="truncate">
31
+ Desktop Pro trial active{formatDate(entitlement.trialEndsAt) ? ` until ${formatDate(entitlement.trialEndsAt)}` : ''}.
32
+ </span>
33
+ </div>
34
+ <Button variant="outline" size="sm" onClick={() => navigateToPath('/settings')}>
35
+ View Plan
36
+ </Button>
37
+ </div>
38
+ );
39
+ }
40
+
41
+ if (entitlement.status === 'grace_offline') {
42
+ return (
43
+ <div className="flex items-center justify-between gap-3 border-b bg-blue-50 px-4 py-2 text-sm text-blue-900 dark:bg-blue-950/60 dark:text-blue-200">
44
+ <div className="flex items-center gap-2 min-w-0">
45
+ <WifiOff className="h-4 w-4 shrink-0" />
46
+ <span className="truncate">
47
+ Offline grace active{formatDate(entitlement.graceUntil) ? ` until ${formatDate(entitlement.graceUntil)}` : ''}. Pro features remain available from the last validated plan.
48
+ </span>
49
+ </div>
50
+ <Button variant="outline" size="sm" onClick={() => navigateToPath('/settings')}>
51
+ View Plan
52
+ </Button>
53
+ </div>
54
+ );
55
+ }
56
+
57
+ if (!hasDesktopPro(entitlement)) {
58
+ return (
59
+ <div className="flex items-center justify-between gap-3 border-b bg-muted/60 px-4 py-2 text-sm text-foreground">
60
+ <div className="flex items-center gap-2 min-w-0">
61
+ <AlertTriangle className="h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400" />
62
+ <span className="truncate">
63
+ Desktop Pro is not active. Core viewing stays available; advanced features are locked.
64
+ </span>
65
+ </div>
66
+ <Button variant="default" size="sm" onClick={() => navigateToPath(buildDesktopUpgradeUrl())}>
67
+ Upgrade
68
+ </Button>
69
+ </div>
70
+ );
71
+ }
72
+
73
+ return null;
74
+ }
@@ -18,6 +18,7 @@ import { StepExporter } from '@ifc-lite/export';
18
18
  import { MutablePropertyView } from '@ifc-lite/mutations';
19
19
  import type { IfcDataStore } from '@ifc-lite/parser';
20
20
  import { toast } from '@/components/ui/toast';
21
+ import { ensureModelExportReady } from '@/services/desktop-export';
21
22
 
22
23
  interface ExportChangesButtonProps {
23
24
  /** Optional custom class name */
@@ -124,6 +125,10 @@ export function ExportChangesButton({ className }: ExportChangesButtonProps) {
124
125
 
125
126
  try {
126
127
  const mutationView = getMutationView(modelInfo.id);
128
+ const exportDataStore = await ensureModelExportReady(modelInfo.id);
129
+ if (!exportDataStore) {
130
+ throw new Error('Model data is unavailable for export');
131
+ }
127
132
 
128
133
  // Determine schema version
129
134
  const schemaVersion = modelInfo.schemaVersion || 'IFC4';
@@ -131,7 +136,7 @@ export function ExportChangesButton({ className }: ExportChangesButtonProps) {
131
136
  : schemaVersion.includes('4X3') ? 'IFC4X3'
132
137
  : 'IFC4';
133
138
 
134
- const exporter = new StepExporter(modelInfo.ifcDataStore, mutationView || undefined);
139
+ const exporter = new StepExporter(exportDataStore, mutationView || undefined);
135
140
  const georefMutations = useViewerStore.getState().georefMutations?.get(modelInfo.id) ?? undefined;
136
141
  const result = exporter.export({
137
142
  schema: schema as 'IFC2X3' | 'IFC4' | 'IFC4X3',
@@ -52,6 +52,7 @@ import { Progress } from '@/components/ui/progress';
52
52
  import { useViewerStore } from '@/store';
53
53
  import { configureMutationView } from '@/utils/configureMutationView';
54
54
  import { toast } from '@/components/ui/toast';
55
+ import { ensureModelExportReady } from '@/services/desktop-export';
55
56
  import { StepExporter, MergedExporter, Ifc5Exporter, IFC5_KNOWN_PROP_NAMES, type MergeModelInput, type ExportProgress, type StepExportProgress } from '@ifc-lite/export';
56
57
  import { MutablePropertyView } from '@ifc-lite/mutations';
57
58
  import type { IfcDataStore } from '@ifc-lite/parser';
@@ -320,11 +321,21 @@ export function ExportDialog({ trigger }: ExportDialogProps) {
320
321
  try {
321
322
  // Handle merged export of all models (STEP only, not IFC5)
322
323
  if (!isIfc5 && exportScope === 'merged' && !changesOnly) {
323
- const mergeInputs: MergeModelInput[] = Array.from(models.values()).map((m) => ({
324
- id: m.id,
325
- name: m.name,
326
- dataStore: m.ifcDataStore,
327
- }));
324
+ const hydratedModels = await Promise.all(Array.from(models.values()).map(async (model) => ({
325
+ model,
326
+ dataStore: await ensureModelExportReady(model.id),
327
+ })));
328
+ const mergeInputs: MergeModelInput[] = [];
329
+ for (const entry of hydratedModels) {
330
+ if (!entry.dataStore) {
331
+ continue;
332
+ }
333
+ mergeInputs.push({
334
+ id: entry.model.id,
335
+ name: entry.model.name,
336
+ dataStore: entry.dataStore,
337
+ });
338
+ }
328
339
 
329
340
  const mergedExporter = new MergedExporter(mergeInputs);
330
341
 
@@ -467,7 +478,12 @@ export function ExportDialog({ trigger }: ExportDialogProps) {
467
478
 
468
479
  // ── Pre-IFC5 full export → STEP ──────────────────────────────────
469
480
  } else {
470
- const exporter = new StepExporter(selectedModel.ifcDataStore, mutationView || undefined);
481
+ const exportDataStore = await ensureModelExportReady(selectedModelId);
482
+ if (!exportDataStore) {
483
+ throw new Error('Model data is unavailable for export');
484
+ }
485
+
486
+ const exporter = new StepExporter(exportDataStore, mutationView || undefined);
471
487
 
472
488
  const localHidden = visibleOnly ? getLocalHiddenIds(selectedModelId) : undefined;
473
489
  const localIsolated = visibleOnly ? getLocalIsolatedIds(selectedModelId) : undefined;