@ifc-lite/viewer 1.17.3 → 1.17.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +132 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-86rgogji.js +1 -0
  7. package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
  8. package/dist/assets/{browser-CKs-FY1P.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-DoxKMqbO.js +257 -0
  12. package/dist/assets/{exporters-C_6J153K.js → exporters-CcPS9MK5.js} +2898 -2380
  13. package/dist/assets/geometry.worker-BFUYA08u.js +1 -0
  14. package/dist/assets/ids-DQ5jY0E8.js +1 -0
  15. package/dist/assets/ifc-lite_bg-BINvzoCP.wasm +0 -0
  16. package/dist/assets/{index-jhBr1wbn.js → index-Bfms9I4A.js} +41036 -34613
  17. package/dist/assets/index-_bfZsDCC.css +1 -0
  18. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  19. package/dist/assets/native-bridge-DUyLCMZS.js +429 -0
  20. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-C8575tul.js} +4342 -4324
  21. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BuZK7OST.js} +4 -4
  22. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  23. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  24. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  25. package/dist/assets/wasm-bridge-JsqEGDV8.js +1 -0
  26. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  55. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  57. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  58. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  59. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  227. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  229. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  230. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  231. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  232. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  233. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  234. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  235. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  236. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  237. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  238. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  239. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  240. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  241. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  242. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  243. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  244. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  245. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  246. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  247. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  248. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  249. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  250. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  285. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  286. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  287. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  288. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  289. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  290. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  291. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  292. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  293. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  294. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  295. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  296. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  297. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  298. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  299. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  300. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  301. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  302. package/dist/cesium/Widgets/lighter.css +237 -0
  303. package/dist/cesium/Widgets/lighterShared.css +46 -0
  304. package/dist/cesium/Widgets/shared.css +103 -0
  305. package/dist/cesium/Widgets/widgets.css +1342 -0
  306. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  307. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  308. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  309. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  310. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  311. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  312. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  313. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  314. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  315. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  316. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  317. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  318. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  319. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  320. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  321. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  322. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  323. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  324. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  325. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  326. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  327. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  328. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  329. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  330. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  331. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  332. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  333. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  334. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  335. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  336. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  337. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  338. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  339. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  340. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  341. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  342. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  343. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  344. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  345. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  346. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  347. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  348. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  349. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  350. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  351. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  352. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  353. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  354. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  355. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  356. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  357. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  358. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  359. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  360. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  361. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  362. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  363. package/dist/cesium/Workers/combineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  365. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  379. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createGeometry.js +26 -0
  381. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  390. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  393. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  395. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  396. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  398. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  399. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  402. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  404. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  405. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  406. package/dist/cesium/Workers/decodeDraco.js +26 -0
  407. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  408. package/dist/cesium/Workers/decodeI3S.js +26 -0
  409. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  410. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  411. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  412. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  413. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  414. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  415. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  416. package/dist/index.html +13 -10
  417. package/index.html +1 -0
  418. package/package.json +18 -15
  419. package/src/App.tsx +7 -9
  420. package/src/components/viewer/BCFPanel.tsx +46 -4
  421. package/src/components/viewer/CesiumOverlay.tsx +715 -0
  422. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  423. package/src/components/viewer/ChatPanel.tsx +232 -90
  424. package/src/components/viewer/CommandPalette.tsx +6 -1
  425. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  426. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  427. package/src/components/viewer/ExportDialog.tsx +22 -6
  428. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  429. package/src/components/viewer/IDSPanel.tsx +52 -3
  430. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  431. package/src/components/viewer/MainToolbar.tsx +355 -28
  432. package/src/components/viewer/PropertiesPanel.tsx +234 -81
  433. package/src/components/viewer/ScriptPanel.tsx +34 -8
  434. package/src/components/viewer/SettingsPage.tsx +581 -0
  435. package/src/components/viewer/StatusBar.tsx +17 -1
  436. package/src/components/viewer/ThemeSwitch.tsx +63 -7
  437. package/src/components/viewer/ViewerLayout.tsx +48 -6
  438. package/src/components/viewer/Viewport.tsx +61 -8
  439. package/src/components/viewer/ViewportContainer.tsx +265 -28
  440. package/src/components/viewer/ViewportOverlays.tsx +132 -27
  441. package/src/components/viewer/bcf/BCFTopicDetail.tsx +4 -4
  442. package/src/components/viewer/chat/ModelSelector.tsx +90 -54
  443. package/src/components/viewer/properties/GeoreferencingPanel.tsx +229 -55
  444. package/src/components/viewer/properties/LocationMap.tsx +462 -19
  445. package/src/components/viewer/properties/ModelMetadataPanel.tsx +1 -1
  446. package/src/components/viewer/selectionHandlers.ts +4 -3
  447. package/src/components/viewer/tools/SectionCapControls.tsx +237 -0
  448. package/src/components/viewer/tools/SectionPanel.tsx +39 -18
  449. package/src/components/viewer/useAnimationLoop.ts +13 -1
  450. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  451. package/src/components/viewer/useMouseControls.ts +4 -1
  452. package/src/components/viewer/useRenderUpdates.ts +1 -1
  453. package/src/hooks/ids/idsDataAccessor.ts +60 -24
  454. package/src/hooks/ingest/viewerModelIngest.ts +280 -0
  455. package/src/hooks/useIDS.ts +1 -1
  456. package/src/hooks/useIfc.ts +7 -1
  457. package/src/hooks/useIfcCache.ts +28 -15
  458. package/src/hooks/useIfcFederation.ts +378 -291
  459. package/src/hooks/useIfcLoader.ts +1657 -130
  460. package/src/hooks/useIfcServer.ts +0 -69
  461. package/src/hooks/useViewControls.ts +13 -5
  462. package/src/index.css +484 -10
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +43 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +318 -0
  467. package/src/lib/geo/effective-georef.test.ts +73 -0
  468. package/src/lib/geo/effective-georef.ts +111 -0
  469. package/src/lib/geo/reproject.ts +249 -37
  470. package/src/lib/llm/byok-guard.test.ts +77 -0
  471. package/src/lib/llm/byok-guard.ts +39 -0
  472. package/src/lib/llm/free-models.test.ts +0 -6
  473. package/src/lib/llm/models.ts +104 -42
  474. package/src/lib/llm/stream-client.ts +74 -110
  475. package/src/lib/llm/stream-direct.test.ts +130 -0
  476. package/src/lib/llm/stream-direct.ts +316 -0
  477. package/src/lib/llm/types.ts +14 -2
  478. package/src/lib/recent-files.ts +2 -1
  479. package/src/main.tsx +1 -10
  480. package/src/services/analysis-extensions.ts +125 -0
  481. package/src/services/api-keys.ts +73 -0
  482. package/src/services/app-navigation.ts +13 -0
  483. package/src/services/bsdd.ts +53 -4
  484. package/src/services/cacheService.ts +1 -1
  485. package/src/services/desktop-cache.ts +43 -0
  486. package/src/services/desktop-export.ts +77 -0
  487. package/src/services/desktop-harness.ts +196 -0
  488. package/src/services/desktop-logger.ts +20 -0
  489. package/src/services/desktop-native-metadata.ts +207 -0
  490. package/src/services/desktop-panel-actions.ts +43 -0
  491. package/src/services/desktop-preferences.ts +44 -0
  492. package/src/services/file-dialog.ts +147 -0
  493. package/src/services/tauri-core-stub.ts +7 -0
  494. package/src/services/tauri-dialog-stub.ts +7 -0
  495. package/src/services/tauri-fs-stub.ts +7 -0
  496. package/src/store/constants.ts +20 -2
  497. package/src/store/index.ts +52 -7
  498. package/src/store/slices/cesiumSlice.ts +127 -0
  499. package/src/store/slices/chatSlice.test.ts +6 -76
  500. package/src/store/slices/chatSlice.ts +21 -58
  501. package/src/store/slices/dataSlice.ts +139 -28
  502. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  503. package/src/store/slices/loadingSlice.ts +14 -2
  504. package/src/store/slices/modelSlice.ts +58 -3
  505. package/src/store/slices/sectionSlice.test.ts +87 -7
  506. package/src/store/slices/sectionSlice.ts +151 -5
  507. package/src/store/slices/uiSlice.ts +28 -5
  508. package/src/store/types.ts +122 -2
  509. package/src/store.ts +1 -1
  510. package/src/utils/desktopModelSnapshot.ts +358 -0
  511. package/src/utils/ifcConfig.ts +6 -1
  512. package/src/utils/nativeSpatialDataStore.ts +253 -0
  513. package/src/utils/serverDataModel.ts +4 -0
  514. package/src/utils/spatialHierarchy.ts +10 -11
  515. package/src/utils/viewportUtils.ts +7 -2
  516. package/src/vite-env.d.ts +0 -4
  517. package/vite.config.ts +24 -0
  518. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  519. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  520. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  521. package/dist/assets/drawing-2d-gWfpdfYe.js +0 -257
  522. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  523. package/dist/assets/ids-B4jTqB1O.js +0 -1
  524. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  525. package/dist/assets/index-pbE7itQS.css +0 -1
  526. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  527. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
  528. package/src/components/viewer/UpgradePage.tsx +0 -69
  529. package/src/lib/llm/ClerkChatSync.tsx +0 -74
  530. package/src/lib/llm/clerk-auth.ts +0 -62
@@ -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
+ }
@@ -30,6 +30,24 @@ export const SECTION_PLANE_DEFAULTS = {
30
30
  ENABLED: true,
31
31
  /** Default flipped state */
32
32
  FLIPPED: false,
33
+ /** Default: render filled/hatched cap surfaces at the cut */
34
+ SHOW_CAP: true,
35
+ /** Default: draw polygon outlines on the cut surfaces */
36
+ SHOW_OUTLINES: true,
37
+ } as const;
38
+
39
+ /**
40
+ * Default cut-surface appearance. RGBA tuples are 0-1 per channel. Screen-space
41
+ * hatch settings are in pixels so the hatch stays readable at any zoom level.
42
+ */
43
+ export const SECTION_CAP_DEFAULTS = {
44
+ FILL_COLOR: [0.92, 0.88, 0.78, 1.0] as [number, number, number, number], // warm paper
45
+ STROKE_COLOR: [0.10, 0.10, 0.10, 1.0] as [number, number, number, number], // ink
46
+ PATTERN: 'diagonal' as const,
47
+ SPACING_PX: 8,
48
+ ANGLE_RAD: Math.PI / 4,
49
+ WIDTH_PX: 1.0,
50
+ SECONDARY_ANGLE_RAD: -Math.PI / 4,
33
51
  } as const;
34
52
 
35
53
  // ============================================================================
@@ -52,10 +70,10 @@ export const EDGE_LOCK_DEFAULTS = {
52
70
  // ============================================================================
53
71
 
54
72
  /** Resolve the initial theme: localStorage override > system preference > dark fallback */
55
- function getInitialTheme(): 'light' | 'dark' {
73
+ function getInitialTheme(): 'light' | 'dark' | 'colorful' {
56
74
  if (typeof window === 'undefined') return 'dark';
57
75
  const saved = localStorage.getItem('ifc-lite-theme');
58
- if (saved === 'light' || saved === 'dark') return saved;
76
+ if (saved === 'light' || saved === 'dark' || saved === 'colorful') return saved;
59
77
  return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
60
78
  }
61
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
@@ -41,7 +43,7 @@ import { CAMERA_DEFAULTS, SECTION_PLANE_DEFAULTS, UI_DEFAULTS, TYPE_VISIBILITY_D
41
43
  export type * from './types.js';
42
44
 
43
45
  // Explicitly re-export multi-model types that need to be imported by name
44
- export type { EntityRef, SchemaVersion, FederatedModel, MeasurementConstraintEdge, OrthogonalAxis } from './types.js';
46
+ export type { EntityRef, SchemaVersion, FederatedModel, MeasurementConstraintEdge, OrthogonalAxis, SectionCapStyle, SectionCapHatchId, SectionPlane, SectionPlaneAxis } from './types.js';
45
47
 
46
48
  // Re-export utility functions for entity references
47
49
  export { entityRefToString, stringToEntityRef, entityRefEquals, isIfcxDataStore } from './types.js';
@@ -76,6 +78,10 @@ export type { ScriptSlice } from './slices/scriptSlice.js';
76
78
 
77
79
  // Re-export Chat types
78
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';
79
85
 
80
86
  // Combined store type
81
87
  export type ViewerState = LoadingSlice &
@@ -97,14 +103,16 @@ export type ViewerState = LoadingSlice &
97
103
  PinboardSlice &
98
104
  LensSlice &
99
105
  ScriptSlice &
100
- ChatSlice & {
106
+ ChatSlice &
107
+ CesiumSlice &
108
+ DesktopEntitlementSlice & {
101
109
  resetViewerState: () => void;
102
110
  };
103
111
 
104
112
  /**
105
113
  * Main viewer store combining all slices
106
114
  */
107
- export const useViewerStore = create<ViewerState>()((...args) => ({
115
+ const createViewerStore = () => create<ViewerState>()((...args) => ({
108
116
  // Spread all slices
109
117
  ...createLoadingSlice(...args),
110
118
  ...createSelectionSlice(...args),
@@ -126,6 +134,8 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
126
134
  ...createLensSlice(...args),
127
135
  ...createScriptSlice(...args),
128
136
  ...createChatSlice(...args),
137
+ ...createCesiumSlice(...args),
138
+ ...createDesktopEntitlementSlice(...args),
129
139
 
130
140
  // Reset all viewer state when loading new file
131
141
  // Note: Does NOT clear models - use clearAllModels() for that
@@ -157,6 +167,13 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
157
167
  isolatedEntitiesByModel: new Map(),
158
168
 
159
169
  // Data
170
+ loading: false,
171
+ geometryStreamingActive: false,
172
+ geometryUpdateTick: 0,
173
+ progress: null,
174
+ geometryProgress: null,
175
+ metadataProgress: null,
176
+ error: null,
160
177
  pendingColorUpdates: null,
161
178
  pendingMeshColorUpdates: null,
162
179
 
@@ -178,12 +195,18 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
178
195
  cornerValence: 0,
179
196
  },
180
197
 
181
- // Section plane
198
+ // Section plane: reset axis/position/enabled/flipped (those are
199
+ // model-relative and meaningless when switching files), but PRESERVE
200
+ // the user's cap appearance preferences (showCap, showOutlines,
201
+ // capStyle). Those round-trip to localStorage via the slice's
202
+ // persistence helpers; clobbering them here was the cause of "my
203
+ // hatch / colour resets to defaults every time I open a file".
182
204
  sectionPlane: {
183
- axis: SECTION_PLANE_DEFAULTS.AXIS,
205
+ ...get().sectionPlane,
206
+ axis: SECTION_PLANE_DEFAULTS.AXIS,
184
207
  position: SECTION_PLANE_DEFAULTS.POSITION,
185
- enabled: SECTION_PLANE_DEFAULTS.ENABLED,
186
- flipped: SECTION_PLANE_DEFAULTS.FLIPPED,
208
+ enabled: SECTION_PLANE_DEFAULTS.ENABLED,
209
+ flipped: SECTION_PLANE_DEFAULTS.FLIPPED,
187
210
  },
188
211
 
189
212
  // Camera
@@ -206,6 +229,15 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
206
229
  separationLinesIntensity: UI_DEFAULTS.SEPARATION_LINES_INTENSITY,
207
230
  separationLinesRadius: UI_DEFAULTS.SEPARATION_LINES_RADIUS,
208
231
 
232
+ // Cesium
233
+ cesiumAvailable: false,
234
+ cesiumEnabled: false,
235
+ cesiumTerrainHeight: null,
236
+ cesiumTerrainClamp: false,
237
+ cesiumSourceModelId: null,
238
+ cesiumTerrainClipY: null,
239
+ cesiumGlbLoaded: false,
240
+
209
241
  // Drawing 2D
210
242
  drawing2D: null,
211
243
  drawing2DStatus: 'idle' as const,
@@ -317,3 +349,16 @@ export const useViewerStore = create<ViewerState>()((...args) => ({
317
349
  });
318
350
  },
319
351
  }));
352
+
353
+ const STORE_SINGLETON_KEY = '__ifc_lite_viewer_store__';
354
+ const globalStoreRegistry = globalThis as typeof globalThis & {
355
+ [STORE_SINGLETON_KEY]?: ReturnType<typeof createViewerStore>;
356
+ };
357
+
358
+ export function getViewerStoreApi() {
359
+ return globalStoreRegistry[STORE_SINGLETON_KEY] ?? (
360
+ globalStoreRegistry[STORE_SINGLETON_KEY] = createViewerStore()
361
+ );
362
+ }
363
+
364
+ export const useViewerStore = getViewerStoreApi();
@@ -0,0 +1,127 @@
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
+ /** Whether a loaded model (or user mutations) provide enough georeferencing to place in Cesium. */
27
+ cesiumAvailable: boolean;
28
+ cesiumEnabled: boolean;
29
+ cesiumDataSource: CesiumDataSource;
30
+ /** Resolved Cesium ion access token (user override or build-time default). */
31
+ cesiumIonToken: string;
32
+ /** Terrain enabled (Cesium World Terrain). */
33
+ cesiumTerrainEnabled: boolean;
34
+ /** Clamp model to terrain height at its geodetic position. */
35
+ cesiumTerrainClamp: boolean;
36
+ /** Terrain height at model position (queried from Cesium, meters). null = not yet queried. */
37
+ cesiumTerrainHeight: number | null;
38
+ /** Model ID that the Cesium overlay is currently displaying. */
39
+ cesiumSourceModelId: string | null;
40
+ /** Terrain clip Y position in viewer space. When set, fragments below this Y are discarded. */
41
+ cesiumTerrainClipY: number | null;
42
+ /** Whether the GLB model has been loaded into Cesium (hides WebGPU overlay). */
43
+ cesiumGlbLoaded: boolean;
44
+
45
+ // Actions
46
+ setCesiumAvailable: (available: boolean) => void;
47
+ setCesiumEnabled: (enabled: boolean) => void;
48
+ toggleCesium: () => void;
49
+ setCesiumDataSource: (source: CesiumDataSource) => void;
50
+ setCesiumIonToken: (token: string) => void;
51
+ setCesiumTerrainEnabled: (enabled: boolean) => void;
52
+ setCesiumTerrainClamp: (clamp: boolean) => void;
53
+ setCesiumTerrainHeight: (height: number | null) => void;
54
+ setCesiumSourceModelId: (modelId: string | null) => void;
55
+ setCesiumTerrainClipY: (y: number | null) => void;
56
+ setCesiumGlbLoaded: (loaded: boolean) => void;
57
+ }
58
+
59
+ const STORAGE_KEY_ION_TOKEN = 'ifc-lite:cesium-ion-token';
60
+ const STORAGE_KEY_DATA_SOURCE = 'ifc-lite:cesium-data-source';
61
+
62
+ /**
63
+ * Default Cesium ion token provided at build time.
64
+ * Set via VITE_CESIUM_ION_TOKEN in .env or CI environment.
65
+ * This means users never need to configure a token manually.
66
+ */
67
+ const DEFAULT_ION_TOKEN: string = (import.meta as any).env?.VITE_CESIUM_ION_TOKEN ?? '';
68
+
69
+ function loadFromStorage(key: string, fallback: string): string {
70
+ try {
71
+ return localStorage.getItem(key) ?? fallback;
72
+ } catch {
73
+ return fallback;
74
+ }
75
+ }
76
+
77
+ function saveToStorage(key: string, value: string): void {
78
+ try {
79
+ localStorage.setItem(key, value);
80
+ } catch { /* storage unavailable */ }
81
+ }
82
+
83
+ const VALID_DATA_SOURCES = new Set<CesiumDataSource>(['osm-buildings', 'bing-aerial', 'google-photorealistic']);
84
+
85
+ function loadDataSource(): CesiumDataSource {
86
+ const stored = loadFromStorage(STORAGE_KEY_DATA_SOURCE, '');
87
+ return VALID_DATA_SOURCES.has(stored as CesiumDataSource)
88
+ ? (stored as CesiumDataSource)
89
+ : 'google-photorealistic';
90
+ }
91
+
92
+ /** Resolve the Cesium ion token: user override > build-time default */
93
+ function resolveIonToken(): string {
94
+ const userToken = loadFromStorage(STORAGE_KEY_ION_TOKEN, '');
95
+ return userToken || DEFAULT_ION_TOKEN;
96
+ }
97
+
98
+ export const createCesiumSlice: StateCreator<CesiumSlice, [], [], CesiumSlice> = (set) => ({
99
+ cesiumAvailable: false,
100
+ cesiumEnabled: false,
101
+ cesiumDataSource: loadDataSource(),
102
+ cesiumIonToken: resolveIonToken(),
103
+ cesiumTerrainEnabled: true,
104
+ cesiumTerrainClamp: false,
105
+ cesiumTerrainHeight: null,
106
+ cesiumSourceModelId: null,
107
+ cesiumTerrainClipY: null,
108
+ cesiumGlbLoaded: false,
109
+
110
+ setCesiumAvailable: (available) => set({ cesiumAvailable: available }),
111
+ setCesiumEnabled: (enabled) => set({ cesiumEnabled: enabled }),
112
+ toggleCesium: () => set((s) => ({ cesiumEnabled: !s.cesiumEnabled })),
113
+ setCesiumDataSource: (source) => {
114
+ saveToStorage(STORAGE_KEY_DATA_SOURCE, source);
115
+ set({ cesiumDataSource: source });
116
+ },
117
+ setCesiumIonToken: (token) => {
118
+ saveToStorage(STORAGE_KEY_ION_TOKEN, token);
119
+ set({ cesiumIonToken: token || DEFAULT_ION_TOKEN });
120
+ },
121
+ setCesiumTerrainEnabled: (enabled) => set({ cesiumTerrainEnabled: enabled }),
122
+ setCesiumTerrainClamp: (clamp) => set({ cesiumTerrainClamp: clamp }),
123
+ setCesiumTerrainHeight: (height) => set({ cesiumTerrainHeight: height }),
124
+ setCesiumSourceModelId: (modelId) => set({ cesiumSourceModelId: modelId }),
125
+ setCesiumTerrainClipY: (y) => set({ cesiumTerrainClipY: y }),
126
+ setCesiumGlbLoaded: (loaded) => set({ cesiumGlbLoaded: loaded }),
127
+ });
@@ -8,7 +8,7 @@ import { buildErrorFeedbackContent } from './chatSlice.js';
8
8
  import { create } from 'zustand';
9
9
  import { createChatSlice, type ChatSlice } from './chatSlice.js';
10
10
  import { createPatchDiagnostic, createPreflightDiagnostic } from '../../lib/llm/script-diagnostics.js';
11
- import { DEFAULT_FREE_MODEL, DEFAULT_PRO_MODEL } from '../../lib/llm/models.js';
11
+ import { DEFAULT_FREE_MODEL, DEFAULT_BYOK_MODEL } from '../../lib/llm/models.js';
12
12
 
13
13
  function withMockLocalStorage(fn: () => void) {
14
14
  const original = globalThis.localStorage;
@@ -217,52 +217,14 @@ test('clearChatMessages resets streaming state as well as persisted messages', (
217
217
  assert.deepEqual(useChatStore.getState().chatAttachments, []);
218
218
  });
219
219
 
220
- test('switchChatUserContext restores per-user history and coerces disallowed models', () => {
221
- withMockLocalStorage(() => {
222
- globalThis.localStorage.setItem('ifc-lite-chat-model:user-a', DEFAULT_PRO_MODEL.id);
223
- globalThis.localStorage.setItem('ifc-lite-chat-messages:user-a', JSON.stringify([
224
- {
225
- id: 'persisted-a',
226
- role: 'user',
227
- content: 'hello from A',
228
- createdAt: 1,
229
- },
230
- ]));
231
- globalThis.localStorage.setItem('ifc-lite-chat-model:user-b', DEFAULT_FREE_MODEL.id);
232
- globalThis.localStorage.setItem('ifc-lite-chat-messages:user-b', JSON.stringify([
233
- {
234
- id: 'persisted-b',
235
- role: 'assistant',
236
- content: 'hello from B',
237
- createdAt: 2,
238
- },
239
- ]));
240
-
241
- const useChatStore = create<ChatSlice>()((...args) => createChatSlice(...args));
242
- useChatStore.getState().switchChatUserContext('user-a', true, { restoreMessages: true });
243
-
244
- assert.equal(useChatStore.getState().chatActiveModel, DEFAULT_PRO_MODEL.id);
245
- assert.equal(useChatStore.getState().chatMessages[0]?.id, 'persisted-a');
246
-
247
- useChatStore.getState().switchChatUserContext('user-b', false, {
248
- clearPersistedCurrent: true,
249
- restoreMessages: true,
250
- });
251
-
252
- assert.equal(useChatStore.getState().chatActiveModel, DEFAULT_FREE_MODEL.id);
253
- assert.equal(useChatStore.getState().chatMessages[0]?.id, 'persisted-b');
254
- assert.equal(globalThis.localStorage.getItem('ifc-lite-chat-messages:user-a'), null);
255
- });
256
- });
257
-
258
- test('setChatHasPro falls back to a free model when entitlement is removed', () => {
220
+ test('setChatHasByokKey falls back to a free model when keys are removed', () => {
259
221
  const useChatStore = create<ChatSlice>()((...args) => createChatSlice(...args));
260
- useChatStore.getState().setChatHasPro(true);
261
- useChatStore.getState().setChatActiveModel(DEFAULT_PRO_MODEL.id);
222
+ useChatStore.getState().setChatHasByokKey(true);
223
+ useChatStore.getState().setChatActiveModel(DEFAULT_BYOK_MODEL.id);
262
224
 
263
- useChatStore.getState().setChatHasPro(false);
225
+ useChatStore.getState().setChatHasByokKey(false);
264
226
 
265
- assert.equal(useChatStore.getState().chatHasPro, false);
227
+ assert.equal(useChatStore.getState().chatHasByokKey, false);
266
228
  assert.equal(useChatStore.getState().chatActiveModel, DEFAULT_FREE_MODEL.id);
267
229
  });
268
230
 
@@ -291,35 +253,3 @@ test('removeChatAttachment only removes the targeted attachment id', () => {
291
253
  );
292
254
  });
293
255
 
294
- test('switchChatUserContext ignores malformed persisted messages', () => {
295
- withMockLocalStorage(() => {
296
- globalThis.localStorage.setItem('ifc-lite-chat-messages:user-a', JSON.stringify([
297
- {
298
- id: 'valid',
299
- role: 'user',
300
- content: 'hello',
301
- createdAt: 1,
302
- attachments: [
303
- { id: 'att-1', name: 'ok.csv', type: 'text/csv', size: 20, textContent: 'a,b\n1,2' },
304
- { name: 'missing-id.csv', type: 'text/csv', size: 20 },
305
- ],
306
- },
307
- {
308
- id: 123,
309
- role: 'assistant',
310
- content: 'bad',
311
- createdAt: 2,
312
- },
313
- ]));
314
-
315
- const useChatStore = create<ChatSlice>()((...args) => createChatSlice(...args));
316
- useChatStore.getState().switchChatUserContext('user-a', false, { restoreMessages: true });
317
-
318
- assert.equal(useChatStore.getState().chatMessages.length, 1);
319
- assert.equal(useChatStore.getState().chatMessages[0]?.id, 'valid');
320
- assert.deepEqual(
321
- useChatStore.getState().chatMessages[0]?.attachments?.map((attachment) => attachment.id),
322
- ['att-1'],
323
- );
324
- });
325
- });