@ifc-lite/viewer 1.17.2 → 1.17.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/.turbo/turbo-build.log +34 -24
  2. package/.turbo/turbo-typecheck.log +1 -42
  3. package/CHANGELOG.md +24 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
  7. package/dist/assets/bcf-DOG9_WPX.js +281 -0
  8. package/dist/assets/{browser-BDShTXzi.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-gWfpdfYe.js +257 -0
  12. package/dist/assets/epsg-index.generated-BjJrt_0S.js +1 -0
  13. package/dist/assets/exporters-ChAtBmlj.js +80367 -0
  14. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  15. package/dist/assets/ids-B4jTqB1O.js +1 -0
  16. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  17. package/dist/assets/index-Co8E2-FE.js +106013 -0
  18. package/dist/assets/index-DckuDqlv.css +1 -0
  19. package/dist/assets/lens-CSASnhAL.js +1 -0
  20. package/dist/assets/maplibre-gl-CGLcoNXc.js +811 -0
  21. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  22. package/dist/assets/{arrow2-bb-jcVEo.js → parquet-CEXmQNRO.js} +2 -2
  23. package/dist/assets/sandbox-DZiNLNMk.js +5933 -0
  24. package/dist/assets/server-client-BV8zHZ7Y.js +626 -0
  25. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  26. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  27. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  28. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  29. package/dist/assets/zip-DBEtpeu6.js +12 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  55. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  56. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  57. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  58. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  59. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  60. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  61. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  62. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  111. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  112. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  113. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  227. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  228. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  229. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  230. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  231. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  232. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  233. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  234. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  235. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  236. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  237. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  238. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  239. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  240. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  241. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  242. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  243. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  244. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  245. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  246. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  247. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  248. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  249. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  250. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  251. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  252. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  253. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  276. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  277. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  278. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  285. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  286. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  287. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  288. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  289. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  290. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  291. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  292. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  293. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  294. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  295. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  296. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  297. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  298. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  299. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  300. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  301. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  302. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  303. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  304. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  305. package/dist/cesium/Widgets/lighter.css +237 -0
  306. package/dist/cesium/Widgets/lighterShared.css +46 -0
  307. package/dist/cesium/Widgets/shared.css +103 -0
  308. package/dist/cesium/Widgets/widgets.css +1342 -0
  309. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  310. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  311. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  312. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  313. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  314. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  315. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  316. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  317. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  318. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  319. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  320. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  321. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  322. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  323. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  324. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  325. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  326. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  327. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  328. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  329. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  330. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  331. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  332. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  333. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  334. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  335. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  336. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  337. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  338. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  339. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  340. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  341. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  342. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  343. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  344. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  345. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  346. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  348. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  349. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  350. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  351. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  352. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  353. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  354. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  355. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  356. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  357. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  358. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  359. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  360. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  361. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  362. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  363. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  364. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  365. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  366. package/dist/cesium/Workers/combineGeometry.js +26 -0
  367. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  368. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  374. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  375. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  376. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  378. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  379. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  380. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  381. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  382. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  383. package/dist/cesium/Workers/createGeometry.js +26 -0
  384. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  391. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  393. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  395. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  396. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  397. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  398. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  399. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  400. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  401. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  402. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  404. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  405. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  406. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  407. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  408. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  409. package/dist/cesium/Workers/decodeDraco.js +26 -0
  410. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  411. package/dist/cesium/Workers/decodeI3S.js +26 -0
  412. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  413. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  414. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  415. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  416. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  417. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  418. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  419. package/dist/index.html +13 -2
  420. package/package.json +27 -19
  421. package/src/App.tsx +1 -17
  422. package/src/components/viewer/BCFPanel.tsx +46 -4
  423. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  424. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  425. package/src/components/viewer/ChatPanel.tsx +54 -16
  426. package/src/components/viewer/CommandPalette.tsx +6 -1
  427. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  428. package/src/components/viewer/ExportChangesButton.tsx +24 -4
  429. package/src/components/viewer/ExportDialog.tsx +38 -9
  430. package/src/components/viewer/HierarchyPanel.tsx +202 -6
  431. package/src/components/viewer/IDSPanel.tsx +52 -3
  432. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  433. package/src/components/viewer/MainToolbar.tsx +353 -27
  434. package/src/components/viewer/PropertiesPanel.tsx +306 -131
  435. package/src/components/viewer/ScriptPanel.tsx +34 -8
  436. package/src/components/viewer/Section2DPanel.tsx +3 -2
  437. package/src/components/viewer/SettingsPage.tsx +430 -0
  438. package/src/components/viewer/StatusBar.tsx +17 -1
  439. package/src/components/viewer/UpgradePage.tsx +6 -4
  440. package/src/components/viewer/ViewerLayout.tsx +47 -6
  441. package/src/components/viewer/Viewport.tsx +49 -8
  442. package/src/components/viewer/ViewportContainer.tsx +285 -32
  443. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  444. package/src/components/viewer/hierarchy/treeDataBuilder.ts +2 -1
  445. package/src/components/viewer/properties/EpsgLookupDialog.tsx +418 -0
  446. package/src/components/viewer/properties/GeoreferencingPanel.tsx +703 -0
  447. package/src/components/viewer/properties/LocationMap.tsx +730 -0
  448. package/src/components/viewer/properties/ModelMetadataPanel.tsx +3 -70
  449. package/src/components/viewer/selectionHandlers.ts +4 -3
  450. package/src/components/viewer/useAnimationLoop.ts +4 -0
  451. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  452. package/src/components/viewer/useMouseControls.ts +4 -1
  453. package/src/hooks/bcfIdLookup.ts +13 -11
  454. package/src/hooks/ids/idsColorSystem.ts +3 -8
  455. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  456. package/src/hooks/useIDS.ts +32 -17
  457. package/src/hooks/useIfc.ts +7 -1
  458. package/src/hooks/useIfcCache.ts +28 -15
  459. package/src/hooks/useIfcFederation.ts +59 -227
  460. package/src/hooks/useIfcLoader.ts +1656 -130
  461. package/src/hooks/useIfcServer.ts +0 -69
  462. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +45 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +310 -0
  467. package/src/lib/geo/kmz-exporter.ts +112 -0
  468. package/src/lib/geo/reproject.ts +370 -0
  469. package/src/lib/lens/adapter.ts +3 -1
  470. package/src/lib/recent-files.ts +2 -1
  471. package/src/main.tsx +1 -0
  472. package/src/sdk/adapters/export-adapter.ts +14 -1
  473. package/src/sdk/adapters/viewer-adapter.ts +5 -9
  474. package/src/sdk/adapters/visibility-adapter.ts +6 -9
  475. package/src/services/analysis-extensions.ts +125 -0
  476. package/src/services/app-navigation.ts +13 -0
  477. package/src/services/bsdd.ts +53 -4
  478. package/src/services/cacheService.ts +1 -1
  479. package/src/services/desktop-cache.ts +43 -0
  480. package/src/services/desktop-export.ts +77 -0
  481. package/src/services/desktop-harness.ts +196 -0
  482. package/src/services/desktop-logger.ts +20 -0
  483. package/src/services/desktop-native-metadata.ts +207 -0
  484. package/src/services/desktop-panel-actions.ts +43 -0
  485. package/src/services/desktop-preferences.ts +44 -0
  486. package/src/services/file-dialog.ts +147 -0
  487. package/src/services/tauri-core-stub.ts +7 -0
  488. package/src/services/tauri-dialog-stub.ts +7 -0
  489. package/src/services/tauri-fs-stub.ts +7 -0
  490. package/src/store/basketVisibleSet.ts +3 -4
  491. package/src/store/globalId.ts +79 -0
  492. package/src/store/index.ts +41 -2
  493. package/src/store/slices/cesiumSlice.ts +122 -0
  494. package/src/store/slices/chatSlice.ts +5 -1
  495. package/src/store/slices/dataSlice.ts +139 -28
  496. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  497. package/src/store/slices/loadingSlice.ts +14 -2
  498. package/src/store/slices/modelSlice.ts +58 -3
  499. package/src/store/slices/mutationSlice.ts +178 -0
  500. package/src/store/slices/pinboardSlice.ts +4 -8
  501. package/src/store/types.ts +96 -2
  502. package/src/store.ts +1 -1
  503. package/src/utils/desktopModelSnapshot.ts +358 -0
  504. package/src/utils/ifcConfig.ts +6 -1
  505. package/src/utils/nativeSpatialDataStore.ts +250 -0
  506. package/src/utils/serverDataModel.ts +4 -0
  507. package/src/utils/spatialHierarchy.ts +10 -11
  508. package/vite.config.ts +41 -0
  509. package/dist/assets/Arrow.dom-BhOg9lpn.js +0 -20
  510. package/dist/assets/arrow2_bg-BlXl-cSQ.js +0 -1
  511. package/dist/assets/basketViewActivator-BRG5DBmM.js +0 -1
  512. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  513. package/dist/assets/geometry.worker-kgiT_Qhh.js +0 -1
  514. package/dist/assets/ifc-lite_bg-FNRmpSvM.wasm +0 -0
  515. package/dist/assets/index-B1Ecw4AU.js +0 -189756
  516. package/dist/assets/index-Ba4eoTe7.css +0 -1
  517. package/dist/assets/index-CrgYBjTn.js +0 -229
  518. package/dist/assets/module-6F3E5H7Y-tx0BadV3.js +0 -6
  519. package/dist/assets/native-bridge-Crsb7TKz.js +0 -111
  520. package/dist/assets/wasm-bridge-mJUhb7uk.js +0 -1
@@ -0,0 +1,44 @@
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 interface DesktopPreferences {
6
+ reopenLastModelOnLaunch: boolean;
7
+ restoreWorkspaceLayoutOnLaunch: boolean;
8
+ }
9
+
10
+ const STORAGE_KEY = 'ifc-lite:desktop-preferences:v1';
11
+ const CHANGED_EVENT = 'ifc-lite:desktop-preferences-changed';
12
+
13
+ const DEFAULT_PREFERENCES: DesktopPreferences = {
14
+ reopenLastModelOnLaunch: true,
15
+ restoreWorkspaceLayoutOnLaunch: true,
16
+ };
17
+
18
+ function sanitizePreferences(value: unknown): DesktopPreferences {
19
+ const parsed = (value && typeof value === 'object') ? value as Partial<DesktopPreferences> : {};
20
+ return {
21
+ reopenLastModelOnLaunch: parsed.reopenLastModelOnLaunch ?? DEFAULT_PREFERENCES.reopenLastModelOnLaunch,
22
+ restoreWorkspaceLayoutOnLaunch: parsed.restoreWorkspaceLayoutOnLaunch ?? DEFAULT_PREFERENCES.restoreWorkspaceLayoutOnLaunch,
23
+ };
24
+ }
25
+
26
+ export function getDesktopPreferences(): DesktopPreferences {
27
+ try {
28
+ return sanitizePreferences(JSON.parse(localStorage.getItem(STORAGE_KEY) ?? '{}'));
29
+ } catch {
30
+ return { ...DEFAULT_PREFERENCES };
31
+ }
32
+ }
33
+
34
+ export function updateDesktopPreferences(updates: Partial<DesktopPreferences>): DesktopPreferences {
35
+ const next = { ...getDesktopPreferences(), ...updates };
36
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
37
+ window.dispatchEvent(new Event(CHANGED_EVENT));
38
+ return next;
39
+ }
40
+
41
+ export function subscribeDesktopPreferences(listener: () => void): () => void {
42
+ window.addEventListener(CHANGED_EVENT, listener);
43
+ return () => window.removeEventListener(CHANGED_EVENT, listener);
44
+ }
@@ -0,0 +1,147 @@
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
+ type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
6
+
7
+ export interface NativeFileHandle {
8
+ path: string;
9
+ name: string;
10
+ size: number;
11
+ modifiedMs?: number | null;
12
+ }
13
+
14
+ export interface GenericFileDialogOptions {
15
+ title?: string;
16
+ filters?: Array<{ name: string; extensions: string[] }>;
17
+ }
18
+
19
+ async function loadInvokeFromTauriModule(): Promise<InvokeFn | null> {
20
+ try {
21
+ const core = await import('@tauri-apps/api/core');
22
+ return typeof core.invoke === 'function' ? core.invoke as InvokeFn : null;
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+
28
+ async function loadDialogModule(): Promise<{
29
+ open: (options?: {
30
+ multiple?: boolean;
31
+ directory?: boolean;
32
+ filters?: Array<{ name: string; extensions: string[] }>;
33
+ title?: string;
34
+ }) => Promise<string | string[] | null>;
35
+ } | null> {
36
+ try {
37
+ return await import('@tauri-apps/plugin-dialog');
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+
43
+ async function loadFsModule(): Promise<{
44
+ stat: (path: string) => Promise<{ size: number }>;
45
+ } | null> {
46
+ try {
47
+ return await import('@tauri-apps/plugin-fs');
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+
53
+ async function getInvoke(): Promise<InvokeFn> {
54
+ const win = globalThis as unknown as { __TAURI_INTERNALS__?: { invoke: InvokeFn } };
55
+ if (win.__TAURI_INTERNALS__?.invoke) {
56
+ return win.__TAURI_INTERNALS__.invoke;
57
+ }
58
+ const moduleInvoke = await loadInvokeFromTauriModule();
59
+ if (moduleInvoke) {
60
+ return moduleInvoke;
61
+ }
62
+ throw new Error('Tauri API not available');
63
+ }
64
+
65
+ export async function openIfcFileDialog(): Promise<NativeFileHandle | null> {
66
+ try {
67
+ const invoke = await getInvoke();
68
+ return await invoke<NativeFileHandle | null>('open_ifc_file');
69
+ } catch {
70
+ // Expected in browser builds — fall through to plugin fallback, then browser file input.
71
+ }
72
+
73
+ try {
74
+ const dialog = await loadDialogModule();
75
+ const fs = await loadFsModule();
76
+ if (!dialog || !fs) {
77
+ return null;
78
+ }
79
+
80
+ const selected = await dialog.open({
81
+ multiple: false,
82
+ directory: false,
83
+ title: 'Open IFC File',
84
+ filters: [
85
+ { name: 'IFC Files', extensions: ['ifc', 'ifczip', 'ifcxml'] },
86
+ { name: 'All Files', extensions: ['*'] },
87
+ ],
88
+ });
89
+ if (!selected || Array.isArray(selected)) {
90
+ return null;
91
+ }
92
+
93
+ const metadata = await fs.stat(selected);
94
+ const normalizedPath = selected.toString();
95
+ const pathSegments = normalizedPath.split(/[\\/]/);
96
+ const name = pathSegments[pathSegments.length - 1] || 'unknown.ifc';
97
+
98
+ return {
99
+ path: normalizedPath,
100
+ name,
101
+ size: metadata.size,
102
+ };
103
+ } catch {
104
+ // No Tauri plugin available — caller falls back to browser <input type="file">.
105
+ return null;
106
+ }
107
+ }
108
+
109
+ export async function readNativeFile(path: string): Promise<Uint8Array> {
110
+ try {
111
+ const invoke = await getInvoke();
112
+ const bytes = await invoke<number[]>('read_native_file', { path });
113
+ return Uint8Array.from(bytes);
114
+ } catch (error) {
115
+ console.warn('[FileDialog] Falling back to plugin-fs read for native file:', error);
116
+ const fs = await import('@tauri-apps/plugin-fs');
117
+ return fs.readFile(path);
118
+ }
119
+ }
120
+
121
+ export async function openGenericFileDialog(options: GenericFileDialogOptions = {}): Promise<File | null> {
122
+ try {
123
+ const dialog = await loadDialogModule();
124
+ if (!dialog) {
125
+ return null;
126
+ }
127
+
128
+ const selected = await dialog.open({
129
+ multiple: false,
130
+ directory: false,
131
+ title: options.title,
132
+ filters: options.filters,
133
+ });
134
+ if (!selected || Array.isArray(selected)) {
135
+ return null;
136
+ }
137
+
138
+ const normalizedPath = selected.toString();
139
+ const bytes = await readNativeFile(normalizedPath);
140
+ const pathSegments = normalizedPath.split(/[\\/]/);
141
+ const name = pathSegments[pathSegments.length - 1] || 'document';
142
+ return new File([bytes], name, { type: 'application/octet-stream' });
143
+ } catch (error) {
144
+ console.warn('[FileDialog] Failed to open generic native file dialog:', error);
145
+ return null;
146
+ }
147
+ }
@@ -0,0 +1,7 @@
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 async function invoke(): Promise<never> {
6
+ throw new Error('Tauri core API is unavailable in the browser build');
7
+ }
@@ -0,0 +1,7 @@
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 async function open(): Promise<null> {
6
+ return null;
7
+ }
@@ -0,0 +1,7 @@
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 async function readFile(_path: string): Promise<Uint8Array> {
6
+ throw new Error('Tauri file system API is unavailable in the browser benchmark build');
7
+ }
@@ -14,6 +14,7 @@ import type { IfcDataStore } from '@ifc-lite/parser';
14
14
  import type { EntityRef } from './types.js';
15
15
  import { entityRefToString, stringToEntityRef } from './types.js';
16
16
  import { useViewerStore } from './index.js';
17
+ import { toGlobalIdFromModels } from './globalId.js';
17
18
 
18
19
  type ViewerStateSnapshot = ReturnType<typeof useViewerStore.getState>;
19
20
 
@@ -159,9 +160,7 @@ function expandRefToElements(state: ViewerStateSnapshot, ref: EntityRef): Entity
159
160
  }
160
161
 
161
162
  function toGlobalId(modelId: string, expressId: number, state: ViewerStateSnapshot): number {
162
- if (modelId === 'legacy') return expressId;
163
- const model = state.models.get(modelId);
164
- return expressId + (model?.idOffset ?? 0);
163
+ return toGlobalIdFromModels(state.models, modelId, expressId);
165
164
  }
166
165
 
167
166
  function globalIdToRef(state: ViewerStateSnapshot, globalId: number): EntityRef | null {
@@ -318,7 +317,7 @@ function computeStoreyIsolation(state: ViewerStateSnapshot): Set<number> | null
318
317
  const storeyElementIds = collectIfcBuildingStoreyElementsWithIfcSpace(hierarchy, localStoreyId);
319
318
  if (!storeyElementIds) continue;
320
319
  for (const localId of storeyElementIds) {
321
- ids.add(localId + offset);
320
+ ids.add(toGlobalIdFromModels(state.models, model.id, localId));
322
321
  }
323
322
  }
324
323
  }
@@ -0,0 +1,79 @@
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 type { EntityRef, FederatedModel } from './types.js';
6
+
7
+ type ForwardModelMapLike = ReadonlyMap<string, { idOffset?: number }>;
8
+ type ReverseModelMapLike = ReadonlyMap<string, Pick<FederatedModel, 'idOffset' | 'maxExpressId'>>;
9
+
10
+ /**
11
+ * Convert a local expressId to the renderer/global ID space.
12
+ *
13
+ * This is the viewer-level single source of truth for modelId + expressId →
14
+ * globalId conversion outside Zustand hooks. It preserves single-model legacy
15
+ * behavior by falling back to the original expressId when no federated model
16
+ * entry exists.
17
+ */
18
+ export function toGlobalIdFromModels(
19
+ models: ForwardModelMapLike,
20
+ modelId: string,
21
+ expressId: number,
22
+ ): number {
23
+ if (modelId === 'legacy' || modelId === 'default' || modelId === '__legacy__') {
24
+ return expressId;
25
+ }
26
+
27
+ const model = models.get(modelId);
28
+ if (!model) {
29
+ return expressId;
30
+ }
31
+
32
+ return expressId + (model.idOffset ?? 0);
33
+ }
34
+
35
+ /**
36
+ * Resolve a renderer/global ID back to the source model and local expressId.
37
+ *
38
+ * This mirrors toGlobalIdFromModels and preserves legacy single-model behavior.
39
+ */
40
+ export function fromGlobalIdFromModels(
41
+ models: ReverseModelMapLike,
42
+ globalId: number,
43
+ ): EntityRef | undefined {
44
+ if (models.size <= 1) {
45
+ const firstModelId = models.keys().next().value;
46
+ if (firstModelId) {
47
+ return {
48
+ modelId: firstModelId,
49
+ expressId: globalId,
50
+ };
51
+ }
52
+ return {
53
+ modelId: 'legacy',
54
+ expressId: globalId,
55
+ };
56
+ }
57
+
58
+ for (const [modelId, model] of models.entries()) {
59
+ const localExpressId = globalId - model.idOffset;
60
+ if (localExpressId > 0 && localExpressId <= model.maxExpressId) {
61
+ return {
62
+ modelId,
63
+ expressId: localExpressId,
64
+ };
65
+ }
66
+ }
67
+
68
+ return undefined;
69
+ }
70
+
71
+ /**
72
+ * Convert an EntityRef to the renderer/global ID space.
73
+ */
74
+ export function toGlobalIdForRef(
75
+ models: ForwardModelMapLike,
76
+ ref: EntityRef,
77
+ ): number {
78
+ return toGlobalIdFromModels(models, ref.modelId, ref.expressId);
79
+ }
@@ -32,6 +32,8 @@ import { createPinboardSlice, type PinboardSlice } from './slices/pinboardSlice.
32
32
  import { createLensSlice, type LensSlice } from './slices/lensSlice.js';
33
33
  import { createScriptSlice, type ScriptSlice } from './slices/scriptSlice.js';
34
34
  import { createChatSlice, type ChatSlice } from './slices/chatSlice.js';
35
+ import { createCesiumSlice, type CesiumSlice } from './slices/cesiumSlice.js';
36
+ import { createDesktopEntitlementSlice, type DesktopEntitlementSlice } from './slices/desktopEntitlementSlice.js';
35
37
  import { invalidateVisibleBasketCache } from './basketVisibleSet.js';
36
38
 
37
39
  // Import constants for reset function
@@ -48,6 +50,7 @@ export { entityRefToString, stringToEntityRef, entityRefEquals, isIfcxDataStore
48
50
 
49
51
  // Re-export single source of truth for globalId → EntityRef resolution
50
52
  export { resolveEntityRef } from './resolveEntityRef.js';
53
+ export { fromGlobalIdFromModels, toGlobalIdFromModels, toGlobalIdForRef } from './globalId.js';
51
54
 
52
55
  // Re-export Drawing2D types
53
56
  export type { Drawing2DState, Drawing2DStatus, Annotation2DTool, PolygonArea2DResult, TextAnnotation2D, CloudAnnotation2D, SelectedAnnotation2D } from './slices/drawing2DSlice.js';
@@ -75,6 +78,10 @@ export type { ScriptSlice } from './slices/scriptSlice.js';
75
78
 
76
79
  // Re-export Chat types
77
80
  export type { ChatSlice } from './slices/chatSlice.js';
81
+ export type { DesktopEntitlementSlice } from './slices/desktopEntitlementSlice.js';
82
+
83
+ // Re-export Cesium types
84
+ export type { CesiumSlice, CesiumDataSource } from './slices/cesiumSlice.js';
78
85
 
79
86
  // Combined store type
80
87
  export type ViewerState = LoadingSlice &
@@ -96,14 +103,16 @@ export type ViewerState = LoadingSlice &
96
103
  PinboardSlice &
97
104
  LensSlice &
98
105
  ScriptSlice &
99
- ChatSlice & {
106
+ ChatSlice &
107
+ CesiumSlice &
108
+ DesktopEntitlementSlice & {
100
109
  resetViewerState: () => void;
101
110
  };
102
111
 
103
112
  /**
104
113
  * Main viewer store combining all slices
105
114
  */
106
- export const useViewerStore = create<ViewerState>()((...args) => ({
115
+ const createViewerStore = () => create<ViewerState>()((...args) => ({
107
116
  // Spread all slices
108
117
  ...createLoadingSlice(...args),
109
118
  ...createSelectionSlice(...args),
@@ -125,6 +134,8 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
125
134
  ...createLensSlice(...args),
126
135
  ...createScriptSlice(...args),
127
136
  ...createChatSlice(...args),
137
+ ...createCesiumSlice(...args),
138
+ ...createDesktopEntitlementSlice(...args),
128
139
 
129
140
  // Reset all viewer state when loading new file
130
141
  // Note: Does NOT clear models - use clearAllModels() for that
@@ -156,6 +167,13 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
156
167
  isolatedEntitiesByModel: new Map(),
157
168
 
158
169
  // Data
170
+ loading: false,
171
+ geometryStreamingActive: false,
172
+ geometryUpdateTick: 0,
173
+ progress: null,
174
+ geometryProgress: null,
175
+ metadataProgress: null,
176
+ error: null,
159
177
  pendingColorUpdates: null,
160
178
  pendingMeshColorUpdates: null,
161
179
 
@@ -205,6 +223,14 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
205
223
  separationLinesIntensity: UI_DEFAULTS.SEPARATION_LINES_INTENSITY,
206
224
  separationLinesRadius: UI_DEFAULTS.SEPARATION_LINES_RADIUS,
207
225
 
226
+ // Cesium
227
+ cesiumEnabled: false,
228
+ cesiumTerrainHeight: null,
229
+ cesiumTerrainClamp: false,
230
+ cesiumSourceModelId: null,
231
+ cesiumTerrainClipY: null,
232
+ cesiumGlbLoaded: false,
233
+
208
234
  // Drawing 2D
209
235
  drawing2D: null,
210
236
  drawing2DStatus: 'idle' as const,
@@ -316,3 +342,16 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
316
342
  });
317
343
  },
318
344
  }));
345
+
346
+ const STORE_SINGLETON_KEY = '__ifc_lite_viewer_store__';
347
+ const globalStoreRegistry = globalThis as typeof globalThis & {
348
+ [STORE_SINGLETON_KEY]?: ReturnType<typeof createViewerStore>;
349
+ };
350
+
351
+ export function getViewerStoreApi() {
352
+ return globalStoreRegistry[STORE_SINGLETON_KEY] ?? (
353
+ globalStoreRegistry[STORE_SINGLETON_KEY] = createViewerStore()
354
+ );
355
+ }
356
+
357
+ export const useViewerStore = getViewerStoreApi();
@@ -0,0 +1,122 @@
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
+ * Cesium 3D Tiles overlay state slice.
7
+ *
8
+ * Manages the enabled/disabled state, selected data source, and Cesium ion
9
+ * access token for the optional real-world 3D context overlay.
10
+ *
11
+ * Token resolution:
12
+ * 1. User-provided override in localStorage
13
+ * 2. Build-time default token via VITE_CESIUM_ION_TOKEN env var
14
+ * → Users never need to configure anything; the app ships with a working token.
15
+ */
16
+
17
+ import type { StateCreator } from 'zustand';
18
+
19
+ export type CesiumDataSource =
20
+ | 'osm-buildings' // Cesium OSM Buildings (free via Cesium ion)
21
+ | 'bing-aerial' // Bing Maps aerial imagery draped on terrain
22
+ | 'google-photorealistic'; // Google Photorealistic 3D Tiles (requires API key)
23
+
24
+ export interface CesiumSlice {
25
+ // State
26
+ cesiumEnabled: boolean;
27
+ cesiumDataSource: CesiumDataSource;
28
+ /** Resolved Cesium ion access token (user override or build-time default). */
29
+ cesiumIonToken: string;
30
+ /** Terrain enabled (Cesium World Terrain). */
31
+ cesiumTerrainEnabled: boolean;
32
+ /** Clamp model to terrain height at its geodetic position. */
33
+ cesiumTerrainClamp: boolean;
34
+ /** Terrain height at model position (queried from Cesium, meters). null = not yet queried. */
35
+ cesiumTerrainHeight: number | null;
36
+ /** Model ID that the Cesium overlay is currently displaying. */
37
+ cesiumSourceModelId: string | null;
38
+ /** Terrain clip Y position in viewer space. When set, fragments below this Y are discarded. */
39
+ cesiumTerrainClipY: number | null;
40
+ /** Whether the GLB model has been loaded into Cesium (hides WebGPU overlay). */
41
+ cesiumGlbLoaded: boolean;
42
+
43
+ // Actions
44
+ setCesiumEnabled: (enabled: boolean) => void;
45
+ toggleCesium: () => void;
46
+ setCesiumDataSource: (source: CesiumDataSource) => void;
47
+ setCesiumIonToken: (token: string) => void;
48
+ setCesiumTerrainEnabled: (enabled: boolean) => void;
49
+ setCesiumTerrainClamp: (clamp: boolean) => void;
50
+ setCesiumTerrainHeight: (height: number | null) => void;
51
+ setCesiumSourceModelId: (modelId: string | null) => void;
52
+ setCesiumTerrainClipY: (y: number | null) => void;
53
+ setCesiumGlbLoaded: (loaded: boolean) => void;
54
+ }
55
+
56
+ const STORAGE_KEY_ION_TOKEN = 'ifc-lite:cesium-ion-token';
57
+ const STORAGE_KEY_DATA_SOURCE = 'ifc-lite:cesium-data-source';
58
+
59
+ /**
60
+ * Default Cesium ion token provided at build time.
61
+ * Set via VITE_CESIUM_ION_TOKEN in .env or CI environment.
62
+ * This means users never need to configure a token manually.
63
+ */
64
+ const DEFAULT_ION_TOKEN: string = (import.meta as any).env?.VITE_CESIUM_ION_TOKEN ?? '';
65
+
66
+ function loadFromStorage(key: string, fallback: string): string {
67
+ try {
68
+ return localStorage.getItem(key) ?? fallback;
69
+ } catch {
70
+ return fallback;
71
+ }
72
+ }
73
+
74
+ function saveToStorage(key: string, value: string): void {
75
+ try {
76
+ localStorage.setItem(key, value);
77
+ } catch { /* storage unavailable */ }
78
+ }
79
+
80
+ const VALID_DATA_SOURCES = new Set<CesiumDataSource>(['osm-buildings', 'bing-aerial', 'google-photorealistic']);
81
+
82
+ function loadDataSource(): CesiumDataSource {
83
+ const stored = loadFromStorage(STORAGE_KEY_DATA_SOURCE, '');
84
+ return VALID_DATA_SOURCES.has(stored as CesiumDataSource)
85
+ ? (stored as CesiumDataSource)
86
+ : 'google-photorealistic';
87
+ }
88
+
89
+ /** Resolve the Cesium ion token: user override > build-time default */
90
+ function resolveIonToken(): string {
91
+ const userToken = loadFromStorage(STORAGE_KEY_ION_TOKEN, '');
92
+ return userToken || DEFAULT_ION_TOKEN;
93
+ }
94
+
95
+ export const createCesiumSlice: StateCreator<CesiumSlice, [], [], CesiumSlice> = (set) => ({
96
+ cesiumEnabled: false,
97
+ cesiumDataSource: loadDataSource(),
98
+ cesiumIonToken: resolveIonToken(),
99
+ cesiumTerrainEnabled: true,
100
+ cesiumTerrainClamp: false,
101
+ cesiumTerrainHeight: null,
102
+ cesiumSourceModelId: null,
103
+ cesiumTerrainClipY: null,
104
+ cesiumGlbLoaded: false,
105
+
106
+ setCesiumEnabled: (enabled) => set({ cesiumEnabled: enabled }),
107
+ toggleCesium: () => set((s) => ({ cesiumEnabled: !s.cesiumEnabled })),
108
+ setCesiumDataSource: (source) => {
109
+ saveToStorage(STORAGE_KEY_DATA_SOURCE, source);
110
+ set({ cesiumDataSource: source });
111
+ },
112
+ setCesiumIonToken: (token) => {
113
+ saveToStorage(STORAGE_KEY_ION_TOKEN, token);
114
+ set({ cesiumIonToken: token || DEFAULT_ION_TOKEN });
115
+ },
116
+ setCesiumTerrainEnabled: (enabled) => set({ cesiumTerrainEnabled: enabled }),
117
+ setCesiumTerrainClamp: (clamp) => set({ cesiumTerrainClamp: clamp }),
118
+ setCesiumTerrainHeight: (height) => set({ cesiumTerrainHeight: height }),
119
+ setCesiumSourceModelId: (modelId) => set({ cesiumSourceModelId: modelId }),
120
+ setCesiumTerrainClipY: (y) => set({ cesiumTerrainClipY: y }),
121
+ setCesiumGlbLoaded: (loaded) => set({ cesiumGlbLoaded: loaded }),
122
+ });
@@ -177,6 +177,10 @@ function loadStoredModel(userId: string | null, fallback?: string): string {
177
177
  }
178
178
  }
179
179
 
180
+ function loadValidStoredModel(userId: string | null, hasPro: boolean, fallback?: string): string {
181
+ return coerceModelForEntitlement(loadStoredModel(userId, fallback), hasPro);
182
+ }
183
+
180
184
  function loadStoredAutoExecute(): boolean {
181
185
  try {
182
186
  const val = localStorage.getItem(AUTO_EXEC_STORAGE_KEY);
@@ -275,7 +279,7 @@ export const createChatSlice: StateCreator<ChatSlice, [], [], ChatSlice> = (set,
275
279
  chatMessages: loadStoredMessages(null),
276
280
  chatStatus: 'idle',
277
281
  chatStreamingContent: '',
278
- chatActiveModel: loadStoredModel(null),
282
+ chatActiveModel: loadValidStoredModel(null, false),
279
283
  chatAutoExecute: loadStoredAutoExecute(),
280
284
  chatError: null,
281
285
  chatAbortController: null,