@ifc-lite/viewer 1.17.3 → 1.17.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +39 -30
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +15 -0
- package/DESKTOP_CONTRACT_VERSION +1 -0
- package/dist/assets/arrow-CZ5kQ26f.js +20 -0
- package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
- package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
- package/dist/assets/{browser-CKs-FY1P.js → browser-C5TFR7sH.js} +1 -1
- package/dist/assets/cesium-ADbP7waU.css +1 -0
- package/dist/assets/cesium-DUOzBlqv.js +17817 -0
- package/dist/assets/{exporters-C_6J153K.js → exporters-ChAtBmlj.js} +2225 -1754
- package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
- package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
- package/dist/assets/{index-jhBr1wbn.js → index-Co8E2-FE.js} +28959 -24612
- package/dist/assets/index-DckuDqlv.css +1 -0
- package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
- package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
- package/dist/assets/{sandbox-B79eavQ3.js → sandbox-DZiNLNMk.js} +5 -5
- package/dist/assets/{server-client-D3bUPJJc.js → server-client-BV8zHZ7Y.js} +4 -4
- package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
- package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
- package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
- package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
- package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
- package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
- package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
- package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
- package/dist/cesium/Assets/Images/ion-credit.png +0 -0
- package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
- package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
- package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
- package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
- package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
- package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
- package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
- package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
- package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/building.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
- package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
- package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
- package/dist/cesium/Assets/Textures/maki/car.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
- package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
- package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/city.png +0 -0
- package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
- package/dist/cesium/Assets/Textures/maki/college.png +0 -0
- package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
- package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
- package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
- package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
- package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
- package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
- package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
- package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
- package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
- package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
- package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
- package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
- package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
- package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
- package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
- package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
- package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
- package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
- package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
- package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
- package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
- package/dist/cesium/Assets/Textures/maki/library.png +0 -0
- package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
- package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
- package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
- package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
- package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
- package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
- package/dist/cesium/Assets/Textures/maki/music.png +0 -0
- package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
- package/dist/cesium/Assets/Textures/maki/park.png +0 -0
- package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
- package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
- package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
- package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
- package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
- package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
- package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/police.png +0 -0
- package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
- package/dist/cesium/Assets/Textures/maki/post.png +0 -0
- package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
- package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
- package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/school.png +0 -0
- package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
- package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
- package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
- package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
- package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/square.png +0 -0
- package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/star.png +0 -0
- package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
- package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
- package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
- package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
- package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
- package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
- package/dist/cesium/Assets/Textures/maki/town.png +0 -0
- package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/village.png +0 -0
- package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/water.png +0 -0
- package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
- package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
- package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
- package/dist/cesium/Assets/Textures/pin.svg +1 -0
- package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
- package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
- package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
- package/dist/cesium/ThirdParty/Workers/package.json +1 -0
- package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
- package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
- package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
- package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
- package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
- package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
- package/dist/cesium/Widgets/Animation/Animation.css +127 -0
- package/dist/cesium/Widgets/Animation/lighter.css +70 -0
- package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
- package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
- package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
- package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
- package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
- package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
- package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
- package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
- package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
- package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
- package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
- package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
- package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
- package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
- package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
- package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
- package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
- package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
- package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
- package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
- package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
- package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
- package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
- package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
- package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
- package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
- package/dist/cesium/Widgets/lighter.css +237 -0
- package/dist/cesium/Widgets/lighterShared.css +46 -0
- package/dist/cesium/Widgets/shared.css +103 -0
- package/dist/cesium/Widgets/widgets.css +1342 -0
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
- package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
- package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
- package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
- package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
- package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
- package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
- package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
- package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
- package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
- package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
- package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
- package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
- package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
- package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
- package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
- package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
- package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
- package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
- package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
- package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
- package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
- package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
- package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
- package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
- package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
- package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
- package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
- package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
- package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
- package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
- package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
- package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
- package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
- package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
- package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
- package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
- package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
- package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
- package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
- package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
- package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
- package/dist/cesium/Workers/combineGeometry.js +26 -0
- package/dist/cesium/Workers/createBoxGeometry.js +26 -0
- package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCircleGeometry.js +26 -0
- package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
- package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
- package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
- package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createGeometry.js +26 -0
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
- package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
- package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
- package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createSphereGeometry.js +26 -0
- package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
- package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
- package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
- package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
- package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
- package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
- package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
- package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
- package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
- package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/Workers/createWallGeometry.js +26 -0
- package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/decodeDraco.js +26 -0
- package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
- package/dist/cesium/Workers/decodeI3S.js +26 -0
- package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
- package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
- package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
- package/dist/cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
- package/dist/index.html +10 -8
- package/package.json +15 -12
- package/src/App.tsx +1 -17
- package/src/components/viewer/BCFPanel.tsx +46 -4
- package/src/components/viewer/CesiumOverlay.tsx +672 -0
- package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
- package/src/components/viewer/ChatPanel.tsx +54 -16
- package/src/components/viewer/CommandPalette.tsx +6 -1
- package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
- package/src/components/viewer/ExportChangesButton.tsx +6 -1
- package/src/components/viewer/ExportDialog.tsx +22 -6
- package/src/components/viewer/HierarchyPanel.tsx +196 -0
- package/src/components/viewer/IDSPanel.tsx +52 -3
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
- package/src/components/viewer/MainToolbar.tsx +353 -27
- package/src/components/viewer/PropertiesPanel.tsx +218 -79
- package/src/components/viewer/ScriptPanel.tsx +34 -8
- package/src/components/viewer/SettingsPage.tsx +430 -0
- package/src/components/viewer/StatusBar.tsx +17 -1
- package/src/components/viewer/UpgradePage.tsx +6 -4
- package/src/components/viewer/ViewerLayout.tsx +47 -6
- package/src/components/viewer/Viewport.tsx +49 -8
- package/src/components/viewer/ViewportContainer.tsx +280 -28
- package/src/components/viewer/ViewportOverlays.tsx +129 -27
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +117 -5
- package/src/components/viewer/properties/LocationMap.tsx +458 -17
- package/src/components/viewer/selectionHandlers.ts +4 -3
- package/src/components/viewer/useAnimationLoop.ts +4 -0
- package/src/components/viewer/useGeometryStreaming.ts +127 -40
- package/src/components/viewer/useMouseControls.ts +4 -1
- package/src/hooks/ingest/viewerModelIngest.ts +275 -0
- package/src/hooks/useIDS.ts +1 -1
- package/src/hooks/useIfc.ts +7 -1
- package/src/hooks/useIfcCache.ts +28 -15
- package/src/hooks/useIfcFederation.ts +57 -225
- package/src/hooks/useIfcLoader.ts +1656 -130
- package/src/hooks/useIfcServer.ts +0 -69
- package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
- package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
- package/src/lib/desktop-entitlement.ts +45 -0
- package/src/lib/desktop-product.ts +124 -0
- package/src/lib/geo/cesium-bridge.ts +310 -0
- package/src/lib/geo/reproject.ts +151 -25
- package/src/lib/recent-files.ts +2 -1
- package/src/services/analysis-extensions.ts +125 -0
- package/src/services/app-navigation.ts +13 -0
- package/src/services/bsdd.ts +53 -4
- package/src/services/cacheService.ts +1 -1
- package/src/services/desktop-cache.ts +43 -0
- package/src/services/desktop-export.ts +77 -0
- package/src/services/desktop-harness.ts +196 -0
- package/src/services/desktop-logger.ts +20 -0
- package/src/services/desktop-native-metadata.ts +207 -0
- package/src/services/desktop-panel-actions.ts +43 -0
- package/src/services/desktop-preferences.ts +44 -0
- package/src/services/file-dialog.ts +147 -0
- package/src/services/tauri-core-stub.ts +7 -0
- package/src/services/tauri-dialog-stub.ts +7 -0
- package/src/services/tauri-fs-stub.ts +7 -0
- package/src/store/index.ts +40 -2
- package/src/store/slices/cesiumSlice.ts +122 -0
- package/src/store/slices/chatSlice.ts +5 -1
- package/src/store/slices/dataSlice.ts +139 -28
- package/src/store/slices/desktopEntitlementSlice.ts +86 -0
- package/src/store/slices/loadingSlice.ts +14 -2
- package/src/store/slices/modelSlice.ts +58 -3
- package/src/store/types.ts +96 -2
- package/src/store.ts +1 -1
- package/src/utils/desktopModelSnapshot.ts +358 -0
- package/src/utils/ifcConfig.ts +6 -1
- package/src/utils/nativeSpatialDataStore.ts +250 -0
- package/src/utils/serverDataModel.ts +4 -0
- package/src/utils/spatialHierarchy.ts +10 -11
- package/vite.config.ts +24 -0
- package/dist/assets/arrow-DJf2ErbF.js +0 -20
- package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
- package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
- package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
- package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
- package/dist/assets/index-pbE7itQS.css +0 -1
- package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
- package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Settings dialog for configuring Cesium 3D overlay options:
|
|
7
|
+
* - Data source selection (OSM Buildings, Bing Aerial, Google Photorealistic)
|
|
8
|
+
* - Terrain toggle
|
|
9
|
+
* - Advanced: custom Cesium ion token override (optional — default is bundled)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { useState } from 'react';
|
|
13
|
+
import {
|
|
14
|
+
Dialog,
|
|
15
|
+
DialogContent,
|
|
16
|
+
DialogHeader,
|
|
17
|
+
DialogTitle,
|
|
18
|
+
DialogTrigger,
|
|
19
|
+
} from '@/components/ui/dialog';
|
|
20
|
+
import { Button } from '@/components/ui/button';
|
|
21
|
+
import { Label } from '@/components/ui/label';
|
|
22
|
+
import { useViewerStore } from '@/store';
|
|
23
|
+
import type { CesiumDataSource } from '@/store/slices/cesiumSlice';
|
|
24
|
+
import { Settings2 } from 'lucide-react';
|
|
25
|
+
|
|
26
|
+
const DATA_SOURCE_OPTIONS: { value: CesiumDataSource; label: string; description: string }[] = [
|
|
27
|
+
{ value: 'osm-buildings', label: 'OSM Buildings', description: 'OpenStreetMap 3D buildings worldwide' },
|
|
28
|
+
{ value: 'bing-aerial', label: 'Bing Aerial', description: 'Satellite imagery draped on terrain' },
|
|
29
|
+
{ value: 'google-photorealistic', label: 'Google Photorealistic', description: 'High-fidelity 3D photogrammetry (where available)' },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
export function CesiumSettingsDialog() {
|
|
33
|
+
const dataSource = useViewerStore((s) => s.cesiumDataSource);
|
|
34
|
+
const setCesiumDataSource = useViewerStore((s) => s.setCesiumDataSource);
|
|
35
|
+
const terrainEnabled = useViewerStore((s) => s.cesiumTerrainEnabled);
|
|
36
|
+
const setCesiumTerrainEnabled = useViewerStore((s) => s.setCesiumTerrainEnabled);
|
|
37
|
+
const [open, setOpen] = useState(false);
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Dialog open={open} onOpenChange={setOpen}>
|
|
41
|
+
<DialogTrigger asChild>
|
|
42
|
+
<Button variant="ghost" size="icon-sm" className="h-6 w-6" aria-label="Cesium settings">
|
|
43
|
+
<Settings2 className="h-3 w-3" />
|
|
44
|
+
</Button>
|
|
45
|
+
</DialogTrigger>
|
|
46
|
+
<DialogContent className="sm:max-w-md">
|
|
47
|
+
<DialogHeader>
|
|
48
|
+
<DialogTitle className="text-sm font-bold">3D World Context</DialogTitle>
|
|
49
|
+
</DialogHeader>
|
|
50
|
+
|
|
51
|
+
<div className="space-y-4 mt-2">
|
|
52
|
+
{/* Data Source */}
|
|
53
|
+
<div className="space-y-1.5">
|
|
54
|
+
<Label className="text-xs font-medium">3D Data Source</Label>
|
|
55
|
+
<div className="space-y-1">
|
|
56
|
+
{DATA_SOURCE_OPTIONS.map((opt) => (
|
|
57
|
+
<label
|
|
58
|
+
key={opt.value}
|
|
59
|
+
className={`flex items-start gap-2 p-2 rounded border cursor-pointer transition-colors ${
|
|
60
|
+
dataSource === opt.value
|
|
61
|
+
? 'border-teal-500 bg-teal-50 dark:bg-teal-950/30'
|
|
62
|
+
: 'border-zinc-200 dark:border-zinc-700 hover:border-zinc-300 dark:hover:border-zinc-600'
|
|
63
|
+
}`}
|
|
64
|
+
>
|
|
65
|
+
<input
|
|
66
|
+
type="radio"
|
|
67
|
+
name="cesium-data-source"
|
|
68
|
+
checked={dataSource === opt.value}
|
|
69
|
+
onChange={() => setCesiumDataSource(opt.value)}
|
|
70
|
+
className="mt-0.5 accent-teal-500"
|
|
71
|
+
/>
|
|
72
|
+
<div>
|
|
73
|
+
<div className="text-xs font-medium">{opt.label}</div>
|
|
74
|
+
<div className="text-[10px] text-zinc-400">{opt.description}</div>
|
|
75
|
+
</div>
|
|
76
|
+
</label>
|
|
77
|
+
))}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
{/* Terrain Toggle */}
|
|
82
|
+
<label className="flex items-center gap-2 cursor-pointer">
|
|
83
|
+
<input
|
|
84
|
+
type="checkbox"
|
|
85
|
+
checked={terrainEnabled}
|
|
86
|
+
onChange={(e) => setCesiumTerrainEnabled(e.target.checked)}
|
|
87
|
+
className="accent-teal-500"
|
|
88
|
+
/>
|
|
89
|
+
<span className="text-xs">Enable 3D terrain (Cesium World Terrain)</span>
|
|
90
|
+
</label>
|
|
91
|
+
|
|
92
|
+
<p className="text-[10px] text-zinc-400 border-t border-zinc-100 dark:border-zinc-800 pt-3">
|
|
93
|
+
Powered by Cesium ion. Real-world 3D tiles are overlaid on your georeferenced
|
|
94
|
+
IFC model. Only available when the model contains IfcMapConversion data.
|
|
95
|
+
</p>
|
|
96
|
+
</div>
|
|
97
|
+
</DialogContent>
|
|
98
|
+
</Dialog>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
} from 'lucide-react';
|
|
32
32
|
import { SignInButton, SignedIn, SignedOut, UserButton } from '@clerk/clerk-react';
|
|
33
33
|
import { Button } from '@/components/ui/button';
|
|
34
|
+
import { toast } from '@/components/ui/toast';
|
|
34
35
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
35
36
|
import { useViewerStore } from '@/store';
|
|
36
37
|
import { buildErrorFeedbackContent } from '@/store/slices/chatSlice';
|
|
@@ -50,6 +51,8 @@ import type { ChatMessage, ChatRepairRequest, FileAttachment } from '@/lib/llm/t
|
|
|
50
51
|
import { canUsePlainCodeBlockFallback, type ScriptMutationIntent } from '@/lib/llm/script-preservation';
|
|
51
52
|
import { Image as ImageIcon } from 'lucide-react';
|
|
52
53
|
import { isClerkConfigured } from '@/lib/llm/clerk-auth';
|
|
54
|
+
import { buildDesktopUpgradeUrl, hasDesktopFeatureAccess } from '@/lib/desktop-product';
|
|
55
|
+
import { navigateToPath } from '@/services/app-navigation';
|
|
53
56
|
import { getModelById } from '@/lib/llm/models';
|
|
54
57
|
import { useSandbox } from '@/hooks/useSandbox';
|
|
55
58
|
|
|
@@ -212,7 +215,9 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
212
215
|
const hasPro = useViewerStore((s) => s.chatHasPro);
|
|
213
216
|
const usage = useViewerStore((s) => s.chatUsage);
|
|
214
217
|
const setChatUsage = useViewerStore((s) => s.setChatUsage);
|
|
218
|
+
const desktopEntitlement = useViewerStore((s) => s.desktopEntitlement);
|
|
215
219
|
const { execute } = useSandbox();
|
|
220
|
+
const canUseAiAssistant = hasDesktopFeatureAccess(desktopEntitlement, 'ai_assistant');
|
|
216
221
|
const displayUsage: UsageInfo | null = usage ?? (hasPro
|
|
217
222
|
? {
|
|
218
223
|
type: 'credits',
|
|
@@ -233,6 +238,14 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
233
238
|
const [showScrollBtn, setShowScrollBtn] = useState(false);
|
|
234
239
|
const [userScrolledUp, setUserScrolledUp] = useState(false);
|
|
235
240
|
const [lastFinishReason, setLastFinishReason] = useState<string | null>(null);
|
|
241
|
+
const openUpgradePage = useCallback(() => {
|
|
242
|
+
navigateToPath(buildDesktopUpgradeUrl());
|
|
243
|
+
}, []);
|
|
244
|
+
const promptAiUpgrade = useCallback(() => {
|
|
245
|
+
setChatError('AI assistant is available with Desktop Pro.');
|
|
246
|
+
toast.info('AI assistant is available with Desktop Pro');
|
|
247
|
+
openUpgradePage();
|
|
248
|
+
}, [openUpgradePage, setChatError]);
|
|
236
249
|
|
|
237
250
|
const inputRef = useRef<HTMLTextAreaElement>(null);
|
|
238
251
|
const scrollRef = useRef<HTMLDivElement>(null);
|
|
@@ -385,6 +398,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
385
398
|
// ── Core send logic ──
|
|
386
399
|
const doSend = useCallback(async (text: string, options?: ChatSendOptions) => {
|
|
387
400
|
if (!text.trim() || status === 'streaming' || status === 'sending') return;
|
|
401
|
+
if (!canUseAiAssistant) {
|
|
402
|
+
setChatError('AI assistant is available with Desktop Pro.');
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
388
405
|
|
|
389
406
|
const continuationBase = options?.continuationBase;
|
|
390
407
|
const responseIntent = options?.intent ?? 'create';
|
|
@@ -780,15 +797,19 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
780
797
|
}
|
|
781
798
|
}
|
|
782
799
|
}, [
|
|
783
|
-
status, activeModel, attachments, authToken,
|
|
800
|
+
canUseAiAssistant, status, activeModel, attachments, authToken,
|
|
784
801
|
addMessage, setChatStatus, updateStreaming, finalizeAssistant,
|
|
785
802
|
setChatError, setChatAbortController, clearAttachments, setChatUsage, resizeInput,
|
|
786
803
|
buildRepairPromptFromLiveState, triggerAutoRepair, execute,
|
|
787
804
|
]);
|
|
788
805
|
|
|
789
806
|
const handleSend = useCallback(() => {
|
|
807
|
+
if (!canUseAiAssistant) {
|
|
808
|
+
promptAiUpgrade();
|
|
809
|
+
return;
|
|
810
|
+
}
|
|
790
811
|
doSend(inputText);
|
|
791
|
-
}, [inputText,
|
|
812
|
+
}, [canUseAiAssistant, doSend, inputText, promptAiUpgrade]);
|
|
792
813
|
|
|
793
814
|
// Allow other panels (e.g. ScriptPanel errors) to trigger a chat repair turn.
|
|
794
815
|
useEffect(() => {
|
|
@@ -817,6 +838,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
817
838
|
}, [pendingRepairRequest, status, consumePendingRepairRequest, buildRepairPromptFromLiveState, doSend]);
|
|
818
839
|
|
|
819
840
|
const handleContinue = useCallback(() => {
|
|
841
|
+
if (!canUseAiAssistant) {
|
|
842
|
+
promptAiUpgrade();
|
|
843
|
+
return;
|
|
844
|
+
}
|
|
820
845
|
const state = useViewerStore.getState();
|
|
821
846
|
const partial = state.chatStreamingContent.trim();
|
|
822
847
|
const lastAssistant = [...state.chatMessages].reverse().find((m) => m.role === 'assistant');
|
|
@@ -829,7 +854,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
829
854
|
}
|
|
830
855
|
setChatError(null);
|
|
831
856
|
doSend(CONTINUE_PROMPT, { continuationBase });
|
|
832
|
-
}, [doSend, finalizeAssistant, setChatError]);
|
|
857
|
+
}, [canUseAiAssistant, doSend, finalizeAssistant, promptAiUpgrade, setChatError]);
|
|
833
858
|
|
|
834
859
|
const handleStop = useCallback(() => {
|
|
835
860
|
const controller = useViewerStore.getState().chatAbortController;
|
|
@@ -854,6 +879,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
854
879
|
|
|
855
880
|
// ── Error feedback (Fix this) ──
|
|
856
881
|
const handleFixError = useCallback((code: string, errorMsg: string) => {
|
|
882
|
+
if (!canUseAiAssistant) {
|
|
883
|
+
promptAiUpgrade();
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
857
886
|
const diagnostics = useViewerStore.getState().scriptLastDiagnostics;
|
|
858
887
|
const liveCode = useViewerStore.getState().scriptEditorContent;
|
|
859
888
|
const staleCode = code.trim() !== liveCode.trim() ? code : undefined;
|
|
@@ -868,7 +897,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
868
897
|
requestedRepairScope: getPrimaryRootCause(diagnostics)?.repairScope,
|
|
869
898
|
rootCauseKey: getPrimaryRootCause(diagnostics)?.rootCauseKey,
|
|
870
899
|
});
|
|
871
|
-
}, [buildRepairPromptFromLiveState, doSend]);
|
|
900
|
+
}, [buildRepairPromptFromLiveState, canUseAiAssistant, doSend, promptAiUpgrade]);
|
|
872
901
|
|
|
873
902
|
// ── Clickable example prompts ──
|
|
874
903
|
const handleExampleClick = useCallback((prompt: string) => {
|
|
@@ -898,6 +927,10 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
898
927
|
|
|
899
928
|
// ── File upload (button + drag-drop + paste) ──
|
|
900
929
|
const processFiles = useCallback(async (files: FileList | File[]) => {
|
|
930
|
+
if (!canUseAiAssistant) {
|
|
931
|
+
promptAiUpgrade();
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
901
934
|
const model = getModelById(activeModel);
|
|
902
935
|
const supportsImages = model?.supportsImages ?? false;
|
|
903
936
|
const supportsFileAttachments = model?.supportsFileAttachments ?? true;
|
|
@@ -965,7 +998,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
965
998
|
setChatError(`Could not read ${file.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
966
999
|
}
|
|
967
1000
|
}
|
|
968
|
-
}, [activeModel, addAttachment, attachments.length, setChatError]);
|
|
1001
|
+
}, [activeModel, addAttachment, attachments.length, canUseAiAssistant, promptAiUpgrade, setChatError]);
|
|
969
1002
|
|
|
970
1003
|
const handleFileUpload = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
971
1004
|
const files = e.target.files;
|
|
@@ -1044,13 +1077,6 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
1044
1077
|
const canContinue = Boolean(
|
|
1045
1078
|
!isActive && (streamingContent.trim().length > 0 || lastFinishReason === 'length'),
|
|
1046
1079
|
);
|
|
1047
|
-
const openUpgradePage = useCallback(() => {
|
|
1048
|
-
const currentPath = `${window.location.pathname}${window.location.search}`;
|
|
1049
|
-
const target = `/upgrade?returnTo=${encodeURIComponent(currentPath)}`;
|
|
1050
|
-
window.history.pushState({}, '', target);
|
|
1051
|
-
window.dispatchEvent(new PopStateEvent('popstate'));
|
|
1052
|
-
}, []);
|
|
1053
|
-
|
|
1054
1080
|
return (
|
|
1055
1081
|
<div
|
|
1056
1082
|
className="h-full flex flex-col bg-background relative"
|
|
@@ -1134,6 +1160,15 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
1134
1160
|
)}
|
|
1135
1161
|
</div>
|
|
1136
1162
|
|
|
1163
|
+
{!canUseAiAssistant && (
|
|
1164
|
+
<div className="border-b bg-muted/40 px-3 py-2 text-xs text-muted-foreground flex items-center justify-between gap-3">
|
|
1165
|
+
<span>AI assistant is available with Desktop Pro. Core viewing and scripting stay available without it.</span>
|
|
1166
|
+
<Button variant="outline" size="sm" className="h-6 px-2 text-xs" onClick={openUpgradePage}>
|
|
1167
|
+
Upgrade
|
|
1168
|
+
</Button>
|
|
1169
|
+
</div>
|
|
1170
|
+
)}
|
|
1171
|
+
|
|
1137
1172
|
{/* Clear confirmation */}
|
|
1138
1173
|
{showClearConfirm && (
|
|
1139
1174
|
<div className="px-3 py-2 bg-destructive/5 border-b flex items-center gap-2 text-xs">
|
|
@@ -1308,14 +1343,16 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
1308
1343
|
variant="ghost"
|
|
1309
1344
|
size="icon-xs"
|
|
1310
1345
|
onClick={() => fileInputRef.current?.click()}
|
|
1311
|
-
disabled={!canAttachInput}
|
|
1346
|
+
disabled={!canAttachInput || !canUseAiAssistant}
|
|
1312
1347
|
className="shrink-0 mb-0.5"
|
|
1313
1348
|
>
|
|
1314
1349
|
<Paperclip className="h-3.5 w-3.5" />
|
|
1315
1350
|
</Button>
|
|
1316
1351
|
</TooltipTrigger>
|
|
1317
1352
|
<TooltipContent>
|
|
1318
|
-
{
|
|
1353
|
+
{!canUseAiAssistant
|
|
1354
|
+
? 'Desktop Pro required for AI assistant'
|
|
1355
|
+
: canAttachInput
|
|
1319
1356
|
? 'Attach file or image (paste, drag & drop)'
|
|
1320
1357
|
: 'Selected model does not support attachments'}
|
|
1321
1358
|
</TooltipContent>
|
|
@@ -1330,10 +1367,11 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
1330
1367
|
}}
|
|
1331
1368
|
onKeyDown={handleKeyDown}
|
|
1332
1369
|
onPaste={handlePaste}
|
|
1333
|
-
placeholder=
|
|
1370
|
+
placeholder={canUseAiAssistant ? 'Ask anything...' : 'Desktop Pro required for AI assistant'}
|
|
1334
1371
|
rows={1}
|
|
1335
1372
|
className="flex-1 resize-none rounded-md border border-input bg-background text-foreground placeholder:text-muted-foreground px-3 py-1.5 text-sm min-h-[32px] max-h-[120px] focus:outline-none focus:ring-1 focus:ring-ring"
|
|
1336
1373
|
style={{ height: 'auto', overflow: 'hidden' }}
|
|
1374
|
+
disabled={!canUseAiAssistant}
|
|
1337
1375
|
/>
|
|
1338
1376
|
|
|
1339
1377
|
{isActive ? (
|
|
@@ -1357,7 +1395,7 @@ export function ChatPanel({ onClose }: ChatPanelProps) {
|
|
|
1357
1395
|
variant="default"
|
|
1358
1396
|
size="icon-xs"
|
|
1359
1397
|
onClick={handleSend}
|
|
1360
|
-
disabled={!inputText.trim()}
|
|
1398
|
+
disabled={!inputText.trim() || !canUseAiAssistant}
|
|
1361
1399
|
className="shrink-0 mb-0.5"
|
|
1362
1400
|
>
|
|
1363
1401
|
<Send className="h-3.5 w-3.5" />
|
|
@@ -70,6 +70,7 @@ import { SCRIPT_TEMPLATES } from '@/lib/scripts/templates';
|
|
|
70
70
|
import { GLTFExporter, CSVExporter } from '@ifc-lite/export';
|
|
71
71
|
import { getRecentFiles, formatFileSize, getCachedFile } from '@/lib/recent-files';
|
|
72
72
|
import type { RecentFileEntry } from '@/lib/recent-files';
|
|
73
|
+
import { closeActiveAnalysisExtension } from '@/services/analysis-extensions';
|
|
73
74
|
|
|
74
75
|
// ── Types ──────────────────────────────────────────────────────────────
|
|
75
76
|
|
|
@@ -189,6 +190,8 @@ function activateRightPanel(panel: 'bcf' | 'ids' | 'lens') {
|
|
|
189
190
|
panel === 'ids' ? s.idsPanelVisible :
|
|
190
191
|
s.lensPanelVisible;
|
|
191
192
|
|
|
193
|
+
closeActiveAnalysisExtension();
|
|
194
|
+
|
|
192
195
|
// Close all content panels
|
|
193
196
|
s.setBcfPanelVisible(false);
|
|
194
197
|
s.setIdsPanelVisible(false);
|
|
@@ -211,6 +214,8 @@ function activateBottomPanel(panel: 'script' | 'list') {
|
|
|
211
214
|
const s = useViewerStore.getState();
|
|
212
215
|
const isActive = panel === 'script' ? s.scriptPanelVisible : s.listPanelVisible;
|
|
213
216
|
|
|
217
|
+
closeActiveAnalysisExtension();
|
|
218
|
+
|
|
214
219
|
// Close all bottom panels
|
|
215
220
|
s.setScriptPanelVisible(false);
|
|
216
221
|
s.setListPanelVisible(false);
|
|
@@ -270,7 +275,7 @@ export function CommandPalette({ open, onOpenChange }: CommandPaletteProps) {
|
|
|
270
275
|
detail: formatFileSize(rf.size),
|
|
271
276
|
action: () => {
|
|
272
277
|
// Try loading from IndexedDB blob cache → dispatches to MainToolbar's loadFile
|
|
273
|
-
getCachedFile(
|
|
278
|
+
getCachedFile(rf).then(file => {
|
|
274
279
|
if (file) {
|
|
275
280
|
window.dispatchEvent(new CustomEvent('ifc-lite:load-file', { detail: file }));
|
|
276
281
|
} else {
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { AlertTriangle, Clock3, WifiOff } from 'lucide-react';
|
|
6
|
+
import { Button } from '@/components/ui/button';
|
|
7
|
+
import { useViewerStore } from '@/store';
|
|
8
|
+
import { buildDesktopUpgradeUrl, hasDesktopPro } from '@/lib/desktop-product';
|
|
9
|
+
import { navigateToPath } from '@/services/app-navigation';
|
|
10
|
+
|
|
11
|
+
function formatDate(timestamp: number | null): string | null {
|
|
12
|
+
if (!timestamp || !Number.isFinite(timestamp)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return new Date(timestamp).toLocaleDateString();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function DesktopEntitlementBanner() {
|
|
19
|
+
const entitlement = useViewerStore((s) => s.desktopEntitlement);
|
|
20
|
+
|
|
21
|
+
if (entitlement.status === 'active' || entitlement.status === 'anonymous') {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (entitlement.status === 'trial') {
|
|
26
|
+
return (
|
|
27
|
+
<div className="flex items-center justify-between gap-3 border-b bg-amber-50 px-4 py-2 text-sm text-amber-900 dark:bg-amber-950/60 dark:text-amber-200">
|
|
28
|
+
<div className="flex items-center gap-2 min-w-0">
|
|
29
|
+
<Clock3 className="h-4 w-4 shrink-0" />
|
|
30
|
+
<span className="truncate">
|
|
31
|
+
Desktop Pro trial active{formatDate(entitlement.trialEndsAt) ? ` until ${formatDate(entitlement.trialEndsAt)}` : ''}.
|
|
32
|
+
</span>
|
|
33
|
+
</div>
|
|
34
|
+
<Button variant="outline" size="sm" onClick={() => navigateToPath('/settings')}>
|
|
35
|
+
View Plan
|
|
36
|
+
</Button>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (entitlement.status === 'grace_offline') {
|
|
42
|
+
return (
|
|
43
|
+
<div className="flex items-center justify-between gap-3 border-b bg-blue-50 px-4 py-2 text-sm text-blue-900 dark:bg-blue-950/60 dark:text-blue-200">
|
|
44
|
+
<div className="flex items-center gap-2 min-w-0">
|
|
45
|
+
<WifiOff className="h-4 w-4 shrink-0" />
|
|
46
|
+
<span className="truncate">
|
|
47
|
+
Offline grace active{formatDate(entitlement.graceUntil) ? ` until ${formatDate(entitlement.graceUntil)}` : ''}. Pro features remain available from the last validated plan.
|
|
48
|
+
</span>
|
|
49
|
+
</div>
|
|
50
|
+
<Button variant="outline" size="sm" onClick={() => navigateToPath('/settings')}>
|
|
51
|
+
View Plan
|
|
52
|
+
</Button>
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!hasDesktopPro(entitlement)) {
|
|
58
|
+
return (
|
|
59
|
+
<div className="flex items-center justify-between gap-3 border-b bg-muted/60 px-4 py-2 text-sm text-foreground">
|
|
60
|
+
<div className="flex items-center gap-2 min-w-0">
|
|
61
|
+
<AlertTriangle className="h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400" />
|
|
62
|
+
<span className="truncate">
|
|
63
|
+
Desktop Pro is not active. Core viewing stays available; advanced features are locked.
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
66
|
+
<Button variant="default" size="sm" onClick={() => navigateToPath(buildDesktopUpgradeUrl())}>
|
|
67
|
+
Upgrade
|
|
68
|
+
</Button>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
@@ -18,6 +18,7 @@ import { StepExporter } from '@ifc-lite/export';
|
|
|
18
18
|
import { MutablePropertyView } from '@ifc-lite/mutations';
|
|
19
19
|
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
20
20
|
import { toast } from '@/components/ui/toast';
|
|
21
|
+
import { ensureModelExportReady } from '@/services/desktop-export';
|
|
21
22
|
|
|
22
23
|
interface ExportChangesButtonProps {
|
|
23
24
|
/** Optional custom class name */
|
|
@@ -124,6 +125,10 @@ export function ExportChangesButton({ className }: ExportChangesButtonProps) {
|
|
|
124
125
|
|
|
125
126
|
try {
|
|
126
127
|
const mutationView = getMutationView(modelInfo.id);
|
|
128
|
+
const exportDataStore = await ensureModelExportReady(modelInfo.id);
|
|
129
|
+
if (!exportDataStore) {
|
|
130
|
+
throw new Error('Model data is unavailable for export');
|
|
131
|
+
}
|
|
127
132
|
|
|
128
133
|
// Determine schema version
|
|
129
134
|
const schemaVersion = modelInfo.schemaVersion || 'IFC4';
|
|
@@ -131,7 +136,7 @@ export function ExportChangesButton({ className }: ExportChangesButtonProps) {
|
|
|
131
136
|
: schemaVersion.includes('4X3') ? 'IFC4X3'
|
|
132
137
|
: 'IFC4';
|
|
133
138
|
|
|
134
|
-
const exporter = new StepExporter(
|
|
139
|
+
const exporter = new StepExporter(exportDataStore, mutationView || undefined);
|
|
135
140
|
const georefMutations = useViewerStore.getState().georefMutations?.get(modelInfo.id) ?? undefined;
|
|
136
141
|
const result = exporter.export({
|
|
137
142
|
schema: schema as 'IFC2X3' | 'IFC4' | 'IFC4X3',
|
|
@@ -52,6 +52,7 @@ import { Progress } from '@/components/ui/progress';
|
|
|
52
52
|
import { useViewerStore } from '@/store';
|
|
53
53
|
import { configureMutationView } from '@/utils/configureMutationView';
|
|
54
54
|
import { toast } from '@/components/ui/toast';
|
|
55
|
+
import { ensureModelExportReady } from '@/services/desktop-export';
|
|
55
56
|
import { StepExporter, MergedExporter, Ifc5Exporter, IFC5_KNOWN_PROP_NAMES, type MergeModelInput, type ExportProgress, type StepExportProgress } from '@ifc-lite/export';
|
|
56
57
|
import { MutablePropertyView } from '@ifc-lite/mutations';
|
|
57
58
|
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
@@ -320,11 +321,21 @@ export function ExportDialog({ trigger }: ExportDialogProps) {
|
|
|
320
321
|
try {
|
|
321
322
|
// Handle merged export of all models (STEP only, not IFC5)
|
|
322
323
|
if (!isIfc5 && exportScope === 'merged' && !changesOnly) {
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
324
|
+
const hydratedModels = await Promise.all(Array.from(models.values()).map(async (model) => ({
|
|
325
|
+
model,
|
|
326
|
+
dataStore: await ensureModelExportReady(model.id),
|
|
327
|
+
})));
|
|
328
|
+
const mergeInputs: MergeModelInput[] = [];
|
|
329
|
+
for (const entry of hydratedModels) {
|
|
330
|
+
if (!entry.dataStore) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
mergeInputs.push({
|
|
334
|
+
id: entry.model.id,
|
|
335
|
+
name: entry.model.name,
|
|
336
|
+
dataStore: entry.dataStore,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
328
339
|
|
|
329
340
|
const mergedExporter = new MergedExporter(mergeInputs);
|
|
330
341
|
|
|
@@ -467,7 +478,12 @@ export function ExportDialog({ trigger }: ExportDialogProps) {
|
|
|
467
478
|
|
|
468
479
|
// ── Pre-IFC5 full export → STEP ──────────────────────────────────
|
|
469
480
|
} else {
|
|
470
|
-
const
|
|
481
|
+
const exportDataStore = await ensureModelExportReady(selectedModelId);
|
|
482
|
+
if (!exportDataStore) {
|
|
483
|
+
throw new Error('Model data is unavailable for export');
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const exporter = new StepExporter(exportDataStore, mutationView || undefined);
|
|
471
487
|
|
|
472
488
|
const localHidden = visibleOnly ? getLocalHiddenIds(selectedModelId) : undefined;
|
|
473
489
|
const localIsolated = visibleOnly ? getLocalIsolatedIds(selectedModelId) : undefined;
|