@ifc-lite/viewer 1.21.0 → 1.22.1

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 (598) hide show
  1. package/.turbo/turbo-build.log +91 -57
  2. package/CHANGELOG.md +33 -0
  3. package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
  4. package/dist/assets/arrow-CXWhTnNT.js +20 -0
  5. package/dist/assets/ascii-points-source-bTjLVmUX.js +1 -0
  6. package/dist/assets/{basketViewActivator-Bzw51jhm.js → basketViewActivator--cFpU2Q9.js} +14 -15
  7. package/dist/assets/bcf-Ba2CjHib.js +281 -0
  8. package/dist/assets/browser-DXS29_v9.js +695 -0
  9. package/dist/assets/cesium-BoVuJvTC.js +17850 -0
  10. package/dist/assets/decode-worker-CgM1iNSK.js +172 -0
  11. package/dist/assets/deflate-DCLbV4UE.js +1 -0
  12. package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
  13. package/dist/assets/e57-source-CQHxE8n3.js +1 -0
  14. package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
  15. package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
  16. package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
  17. package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
  18. package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
  19. package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
  20. package/dist/assets/esbuild-FgU11_Eg.js +1 -0
  21. package/dist/assets/event-B0kAzHa-.js +1 -0
  22. package/dist/assets/exporters-Bf6PTtdW.js +5723 -0
  23. package/dist/assets/ffi-Boa1QuFa.js +1 -0
  24. package/dist/assets/geometry-controller.worker-CEr00X3X.js +7 -0
  25. package/dist/assets/geometry.worker-B4VPDkmL.js +1 -0
  26. package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
  27. package/dist/assets/{ids-B7AXEv7h.js → ids-XwxE1tK3.js} +7 -7
  28. package/dist/assets/ifc-lite-DNzkEkIb.js +7 -0
  29. package/dist/assets/ifc-lite_bg-1IiJN0Zg.wasm +0 -0
  30. package/dist/assets/ifc-lite_bg-B_eUD1Wy.wasm +0 -0
  31. package/dist/assets/index-DMho-JA0.js +6 -0
  32. package/dist/assets/index-DS_xJQfP.css +1 -0
  33. package/dist/assets/{index-DVNSvEMh.js → index-j2x5R7fb.js} +86695 -74779
  34. package/dist/assets/inline-worker-BpBzlmd6.js +1 -0
  35. package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
  36. package/dist/assets/las-BW6LIc_j.js +1 -0
  37. package/dist/assets/las-source-C_IGrgRq.js +1 -0
  38. package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
  39. package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
  40. package/dist/assets/laz-source-BWjza0Iw.js +125 -0
  41. package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
  42. package/dist/assets/lerc-DmzRHXn3.js +1 -0
  43. package/dist/assets/lzw-CgyIIzii.js +1 -0
  44. package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
  45. package/dist/assets/{native-bridge-BiD01jI9.js → native-bridge-Q5ACp4QY.js} +6 -9
  46. package/dist/assets/packbits-C1r4AzHj.js +1 -0
  47. package/dist/assets/pako.esm-Cram60i4.js +1 -0
  48. package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
  49. package/dist/assets/{parser.worker-Bnbrl6gy.js → parser.worker-Cl6XQcXA.js} +2 -2
  50. package/dist/assets/pcd-source-Ck0UnVDn.js +3 -0
  51. package/dist/assets/ply-source-C8jjyzxE.js +4 -0
  52. package/dist/assets/raw-ZqLh7kVQ.js +1 -0
  53. package/dist/assets/{exporters-u0sz2Upj.js → sandbox-Bju6ZKJK.js} +11869 -7414
  54. package/dist/assets/{server-client-DP8fMPY9.js → server-client-B8wi3CGx.js} +4 -4
  55. package/dist/assets/three-CQBzFWY2.js +4104 -0
  56. package/dist/assets/wasm-bridge-X-mWRA9Z.js +1 -0
  57. package/dist/assets/webimage-D0MbRMkU.js +1 -0
  58. package/dist/assets/{workerHelpers-CBbWSJmd.js → workerHelpers-DnNedVRr.js} +1 -1
  59. package/dist/assets/zip-BJqVbRkU.js +2 -0
  60. package/dist/assets/zstd-DA4VQ-ji.js +1 -0
  61. package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
  62. package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
  63. package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
  64. package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
  65. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
  66. package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
  67. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
  68. package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
  69. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
  70. package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
  71. package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
  72. package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
  73. package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
  74. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
  75. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
  76. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
  77. package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
  78. package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
  79. package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
  80. package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
  81. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
  82. package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
  83. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
  84. package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
  85. package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
  86. package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
  87. package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
  88. package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
  89. package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
  90. package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
  91. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
  92. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
  93. package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
  94. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
  95. package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
  96. package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
  97. package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
  98. package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
  99. package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
  100. package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
  101. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
  102. package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
  103. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
  104. package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
  105. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
  106. package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
  107. package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
  108. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
  109. package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
  110. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
  111. package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
  112. package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
  113. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
  114. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
  115. package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
  116. package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
  117. package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
  118. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
  119. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
  120. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
  121. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
  122. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
  123. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
  124. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  125. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
  126. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
  127. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
  128. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
  129. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
  130. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
  131. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
  132. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
  133. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
  134. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
  135. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
  136. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
  137. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
  138. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
  139. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
  140. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
  141. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
  142. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
  143. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
  144. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
  145. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
  146. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
  147. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
  148. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
  149. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
  150. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
  151. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
  152. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
  153. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
  154. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
  155. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
  156. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
  157. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
  158. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
  159. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
  160. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
  161. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
  162. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
  163. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
  164. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
  165. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
  166. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
  167. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
  168. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
  169. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  170. package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
  171. package/dist/index.html +12 -14
  172. package/package.json +52 -45
  173. package/src/components/mcp/McpLanding.tsx +1 -1
  174. package/src/components/mcp/McpPlayground.tsx +1 -1
  175. package/src/components/mcp/PlaygroundChat.tsx +90 -52
  176. package/src/components/viewer/AddElementPanel.tsx +2 -2
  177. package/src/components/viewer/BasepointOverlay.tsx +239 -0
  178. package/src/components/viewer/CesiumOverlay.tsx +130 -115
  179. package/src/components/viewer/CesiumPlacementEditor.tsx +1024 -0
  180. package/src/components/viewer/ChatPanel.tsx +76 -93
  181. package/src/components/viewer/CommandPalette.tsx +25 -0
  182. package/src/components/viewer/EntityContextMenu.tsx +68 -10
  183. package/src/components/viewer/GeometryAxisRow.tsx +54 -0
  184. package/src/components/viewer/GeometryEditCard.tsx +392 -0
  185. package/src/components/viewer/HierarchyPanel.tsx +2 -2
  186. package/src/components/viewer/IDSAuditSummary.tsx +2 -2
  187. package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
  188. package/src/components/viewer/MainToolbar.tsx +308 -7
  189. package/src/components/viewer/PropertiesPanel.tsx +28 -31
  190. package/src/components/viewer/StatusBar.tsx +12 -0
  191. package/src/components/viewer/ToolOverlays.tsx +36 -0
  192. package/src/components/viewer/ViewerLayout.tsx +27 -0
  193. package/src/components/viewer/Viewport.tsx +49 -4
  194. package/src/components/viewer/ViewportContainer.tsx +158 -33
  195. package/src/components/viewer/ViewportOverlays.tsx +49 -106
  196. package/src/components/viewer/chat/ByokKeyModal.tsx +338 -0
  197. package/src/components/viewer/chat/ByokStreamingPill.tsx +62 -0
  198. package/src/components/viewer/chat/ByokTrustDiagram.tsx +192 -0
  199. package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
  200. package/src/components/viewer/properties/GeoreferencingPanel.tsx +55 -52
  201. package/src/components/viewer/properties/ModelMetadataPanel.tsx +55 -44
  202. package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
  203. package/src/components/viewer/properties/raw-step-format.ts +5 -3
  204. package/src/components/viewer/selectionHandlers.ts +308 -11
  205. package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
  206. package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
  207. package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
  208. package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
  209. package/src/components/viewer/useGeometryStreaming.ts +100 -1
  210. package/src/components/viewer/useMouseControls.ts +8 -1
  211. package/src/hooks/useBCF.ts +6 -6
  212. package/src/hooks/useCameraTickSubscription.ts +62 -0
  213. package/src/hooks/useIfc.ts +4 -0
  214. package/src/hooks/useIfcFederation.ts +368 -20
  215. package/src/hooks/useKeyboardShortcuts.ts +86 -0
  216. package/src/hooks/useLevelDisplayEffect.ts +160 -0
  217. package/src/hooks/useViewerSelectors.ts +8 -0
  218. package/src/lib/__test__/stubs.ts +110 -0
  219. package/src/lib/geo/cesium-bridge.ts +86 -50
  220. package/src/lib/geo/cesium-placement.test.ts +260 -0
  221. package/src/lib/geo/cesium-placement.ts +237 -0
  222. package/src/lib/geo/effective-georef.test.ts +97 -8
  223. package/src/lib/geo/effective-georef.ts +40 -93
  224. package/src/lib/geo/geo-scale.ts +160 -0
  225. package/src/lib/geo/ifc-origin.test.ts +176 -0
  226. package/src/lib/geo/ifc-origin.ts +144 -0
  227. package/src/lib/geo/precision-grids.ts +444 -0
  228. package/src/lib/geo/reproject.test.ts +218 -0
  229. package/src/lib/geo/reproject.ts +199 -42
  230. package/src/lib/geo/terrain-elevation.ts +198 -89
  231. package/src/lib/lens/adapter.ts +52 -6
  232. package/src/lib/level-offsets.test.ts +153 -0
  233. package/src/lib/level-offsets.ts +140 -0
  234. package/src/lib/linear-element-edit.test.ts +220 -0
  235. package/src/lib/linear-element-edit.ts +327 -0
  236. package/src/lib/llm/clipboard-detect.test.ts +150 -0
  237. package/src/lib/llm/clipboard-detect.ts +90 -0
  238. package/src/lib/llm/models.ts +28 -0
  239. package/src/lib/llm/stream-direct.ts +16 -4
  240. package/src/lib/llm/types.ts +8 -0
  241. package/src/lib/metadata-clone.test.ts +173 -0
  242. package/src/lib/metadata-clone.ts +124 -0
  243. package/src/lib/placement-core.ts +340 -0
  244. package/src/lib/placement-edit.boot.ts +21 -0
  245. package/src/lib/placement-edit.test.ts +464 -0
  246. package/src/lib/placement-edit.ts +47 -0
  247. package/src/lib/polygon-clip.test.ts +193 -0
  248. package/src/lib/polygon-clip.ts +199 -0
  249. package/src/lib/slab-edit.test.ts +169 -0
  250. package/src/lib/slab-edit.ts +312 -0
  251. package/src/lib/wall-edit.ts +342 -0
  252. package/src/lib/wall-opening-reassign.test.ts +291 -0
  253. package/src/lib/wall-opening-reassign.ts +241 -0
  254. package/src/main.tsx +4 -0
  255. package/src/services/playground-model.ts +55 -0
  256. package/src/store/index.ts +11 -5
  257. package/src/store/slices/cesiumSlice.ts +154 -20
  258. package/src/store/slices/dataSlice.ts +80 -0
  259. package/src/store/slices/levelDisplaySlice.ts +105 -0
  260. package/src/store/slices/modelSlice.test.ts +19 -0
  261. package/src/store/slices/mutationSlice.ts +1138 -1
  262. package/src/store/slices/splitToolSlice.ts +165 -0
  263. package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
  264. package/src/store/slices/uiSlice.ts +78 -1
  265. package/src/store/types.ts +57 -2
  266. package/src/store.ts +3 -0
  267. package/src/utils/createBlankIfc.ts +37 -0
  268. package/tsconfig.json +1 -0
  269. package/.turbo/turbo-typecheck.log +0 -4
  270. package/dist/assets/arrow-CZ5kQ26f.js +0 -20
  271. package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
  272. package/dist/assets/bcf-4K724hw0.js +0 -281
  273. package/dist/assets/browser-C5TFR7sH.js +0 -694
  274. package/dist/assets/cesium-DUOzBlqv.js +0 -17817
  275. package/dist/assets/decode-worker-t2EGKAxO.js +0 -1708
  276. package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
  277. package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
  278. package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
  279. package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
  280. package/dist/assets/emscripten-module.browser-CY5t0Vfq.js +0 -1
  281. package/dist/assets/esbuild-COv63sf-.js +0 -1
  282. package/dist/assets/event-DIOks52T.js +0 -1
  283. package/dist/assets/ffi-DlhRHxHv.js +0 -1
  284. package/dist/assets/geometry-controller.worker-NH8pZmrU.js +0 -7
  285. package/dist/assets/geometry.worker-Bp4rW_R1.js +0 -1
  286. package/dist/assets/ifc-lite-DfZHk36-.js +0 -7
  287. package/dist/assets/ifc-lite_bg-DlKs5-yM.wasm +0 -0
  288. package/dist/assets/ifc-lite_bg-PqmRe3Ph.wasm +0 -0
  289. package/dist/assets/index-CSWgTe1s.css +0 -1
  290. package/dist/assets/index-XwKzDuw6.js +0 -22
  291. package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
  292. package/dist/assets/maplibre-gl-CGLcoNXc.js +0 -811
  293. package/dist/assets/sandbox-DPD1ROr0.js +0 -9700
  294. package/dist/assets/three-CDRZThFA.js +0 -4057
  295. package/dist/assets/wasm-bridge-CErti6zX.js +0 -1
  296. package/dist/assets/zip-DBEtpeu6.js +0 -12
  297. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
  298. package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
  299. package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
  300. package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
  301. package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
  302. package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
  303. package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
  304. package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
  305. package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
  306. package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
  307. package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
  308. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
  309. package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
  310. package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
  311. package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
  312. package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
  313. package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
  314. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
  315. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
  316. package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
  317. package/dist/cesium/Workers/transcodeKTX2.js +0 -56
  318. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
  319. package/src/components/viewer/CesiumSettingsDialog.tsx +0 -100
  320. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
  321. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
  322. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
  323. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
  324. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
  325. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
  326. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
  327. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
  328. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
  329. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
  330. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
  331. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
  332. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
  333. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
  334. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
  335. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
  336. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
  337. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
  338. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
  339. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
  340. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
  341. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
  342. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
  343. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
  344. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
  345. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
  346. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
  347. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
  348. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
  349. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
  350. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
  351. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
  352. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
  353. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
  354. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  355. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  356. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  357. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  358. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  359. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  360. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  361. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  362. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  363. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  364. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  365. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  366. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  367. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  368. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  369. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  370. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  371. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  372. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  373. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  374. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  375. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  376. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  377. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  378. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  379. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  380. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  381. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  382. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  383. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  384. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  385. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  386. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  387. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  388. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  389. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  390. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  391. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  392. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  393. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  394. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  395. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  396. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
  397. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  398. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  399. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  400. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  401. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  402. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  403. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
  404. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
  405. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
  406. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
  407. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
  408. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
  409. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
  410. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
  411. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
  412. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
  413. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
  414. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
  415. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
  416. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
  417. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
  418. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
  419. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
  420. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
  421. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
  422. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
  423. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
  424. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
  425. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
  426. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
  427. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
  428. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
  429. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
  430. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
  431. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
  432. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
  433. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
  434. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
  435. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
  436. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
  437. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
  438. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
  439. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
  440. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
  441. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
  442. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
  443. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
  444. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
  445. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
  446. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
  447. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
  448. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
  449. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
  450. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
  451. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
  452. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
  453. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
  454. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
  455. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
  456. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
  457. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
  458. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
  459. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
  460. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
  461. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
  462. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
  463. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
  464. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
  465. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
  466. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
  467. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
  468. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
  469. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
  470. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
  471. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
  472. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
  473. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
  474. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
  475. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
  476. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
  477. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
  478. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
  479. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
  480. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
  481. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
  482. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
  483. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
  484. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
  485. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
  486. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
  487. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
  488. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
  489. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
  490. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
  491. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
  492. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
  493. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
  494. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
  495. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
  496. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
  497. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
  498. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
  499. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
  500. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
  501. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
  502. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
  503. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
  504. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
  505. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
  506. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
  507. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
  508. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
  509. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
  510. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
  511. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
  512. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
  513. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
  514. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
  515. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
  516. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
  517. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
  518. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
  519. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
  520. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
  521. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
  522. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
  523. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
  524. /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
  525. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
  526. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
  527. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
  528. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
  529. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
  530. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
  531. /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
  532. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
  533. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
  534. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
  535. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
  536. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
  537. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
  538. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
  539. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
  540. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
  541. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
  542. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
  543. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
  544. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  545. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  546. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  547. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
  548. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
  549. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
  550. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
  551. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
  552. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
  553. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
  554. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
  555. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
  556. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
  557. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  558. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  559. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
  560. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
  561. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
  562. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
  563. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
  564. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
  565. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  566. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  567. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
  568. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
  569. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
  570. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
  571. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
  572. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
  573. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
  574. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
  575. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
  576. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
  577. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
  578. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  579. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
  580. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
  581. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
  582. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
  583. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
  584. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
  585. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
  586. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
  587. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
  588. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
  589. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
  590. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
  591. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
  592. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
  593. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
  594. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
  595. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
  596. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
  597. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
  598. /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
@@ -0,0 +1,180 @@
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
+ * Federation alignment controls — surfaces per-model alignment status, anchor
7
+ * selection, and an explicit "Re-align federation" action.
8
+ *
9
+ * Lives inside GeoreferencingPanel (one instance per model). When only one
10
+ * model is loaded the controls are hidden — alignment is a federation concept.
11
+ */
12
+
13
+ import { useCallback, useMemo, useState } from 'react';
14
+ import { Anchor, RefreshCw, AlertTriangle, Check } from 'lucide-react';
15
+ import { useViewerStore } from '@/store';
16
+ import { useIfc } from '@/hooks/useIfc';
17
+ import { toast } from '@/components/ui/toast';
18
+ import { getEffectiveGeoreference } from '@/lib/geo/effective-georef';
19
+ import type { IfcDataStore } from '@ifc-lite/parser';
20
+ import type { FederatedModel } from '@/store/types';
21
+
22
+ export interface FederationAlignmentControlsProps {
23
+ modelId: string;
24
+ }
25
+
26
+ function statusLabel(status: FederatedModel['federationAlignmentStatus']): {
27
+ text: string;
28
+ tone: 'anchor' | 'ok' | 'warn' | 'neutral';
29
+ icon: typeof Check;
30
+ } {
31
+ switch (status) {
32
+ case 'anchor':
33
+ return { text: 'Federation anchor', tone: 'anchor', icon: Anchor };
34
+ case 'same-crs':
35
+ return { text: 'Aligned (same CRS)', tone: 'ok', icon: Check };
36
+ case 'reprojected':
37
+ return { text: 'Reprojected to anchor CRS', tone: 'ok', icon: Check };
38
+ case 'identity':
39
+ return { text: 'Aligned (identity)', tone: 'ok', icon: Check };
40
+ case 'failed':
41
+ return { text: 'Alignment failed', tone: 'warn', icon: AlertTriangle };
42
+ case 'none':
43
+ case undefined:
44
+ return { text: 'Not aligned', tone: 'neutral', icon: Anchor };
45
+ }
46
+ }
47
+
48
+ const toneClasses = {
49
+ anchor: 'border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-950/40 text-amber-800 dark:text-amber-200',
50
+ ok: 'border-emerald-300 dark:border-emerald-700 bg-emerald-50 dark:bg-emerald-950/40 text-emerald-800 dark:text-emerald-200',
51
+ warn: 'border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-950/40 text-red-800 dark:text-red-200',
52
+ neutral: 'border-zinc-300 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900 text-zinc-600 dark:text-zinc-400',
53
+ } as const;
54
+
55
+ export function FederationAlignmentControls({ modelId }: FederationAlignmentControlsProps) {
56
+ const models = useViewerStore((s) => s.models);
57
+ const anchorModelIdOverride = useViewerStore((s) => s.anchorModelIdOverride);
58
+ const setAnchorModelIdOverride = useViewerStore((s) => s.setAnchorModelIdOverride);
59
+ const georefMutations = useViewerStore((s) => s.georefMutations);
60
+ useViewerStore((s) => s.mutationVersion);
61
+ const { realignFederation } = useIfc();
62
+ const [busy, setBusy] = useState(false);
63
+
64
+ // The "effective anchor" matches findReferenceGeorefModel in useIfcFederation:
65
+ // honour the override if it points to a model with a valid (non-site) georef,
66
+ // otherwise pick the earliest-loaded model with one. Federation status alone
67
+ // is not enough — a model can be loaded standalone with status='none' and
68
+ // would otherwise show up as a fake anchor in the badge.
69
+ const hasValidGeoref = useCallback(
70
+ (model: FederatedModel | undefined): boolean => {
71
+ if (!model?.ifcDataStore) return false;
72
+ const eff = getEffectiveGeoreference(
73
+ model.ifcDataStore as IfcDataStore,
74
+ model.geometryResult?.coordinateInfo,
75
+ georefMutations.get(model.id),
76
+ );
77
+ return Boolean(
78
+ eff?.projectedCRS?.name && eff.mapConversion && eff.source !== 'siteLocation',
79
+ );
80
+ },
81
+ [georefMutations],
82
+ );
83
+
84
+ const effectiveAnchorId = useMemo<string | null>(() => {
85
+ if (anchorModelIdOverride && hasValidGeoref(models.get(anchorModelIdOverride))) {
86
+ return anchorModelIdOverride;
87
+ }
88
+ const sorted = Array.from(models.entries()).sort(
89
+ ([, a], [, b]) => (a.loadedAt ?? 0) - (b.loadedAt ?? 0),
90
+ );
91
+ for (const [id, model] of sorted) {
92
+ if (hasValidGeoref(model)) return id;
93
+ }
94
+ return null;
95
+ }, [models, anchorModelIdOverride, hasValidGeoref]);
96
+
97
+ const thisModel = models.get(modelId);
98
+ if (!thisModel) return null;
99
+ if (models.size < 2) return null;
100
+
101
+ const isAnchor = effectiveAnchorId === modelId;
102
+ const status: FederatedModel['federationAlignmentStatus'] = isAnchor
103
+ ? 'anchor'
104
+ : thisModel.federationAlignmentStatus ?? 'none';
105
+ const badge = statusLabel(status);
106
+ const Icon = badge.icon;
107
+
108
+ const handleSetAnchor = useCallback(() => {
109
+ setAnchorModelIdOverride(modelId);
110
+ }, [modelId, setAnchorModelIdOverride]);
111
+
112
+ const handleClearAnchor = useCallback(() => {
113
+ setAnchorModelIdOverride(null);
114
+ }, [setAnchorModelIdOverride]);
115
+
116
+ const handleRealign = useCallback(async () => {
117
+ setBusy(true);
118
+ try {
119
+ await realignFederation();
120
+ } catch (error) {
121
+ // realignFederation's happy path uses toast for per-model status; if
122
+ // the orchestrator itself throws (e.g. proj4 grid loader rejects), the
123
+ // async click handler would otherwise surface an unhandled rejection
124
+ // with no user feedback. Catch + log + toast so the failure mode is
125
+ // visible and the spinner clears.
126
+ console.error('[FederationAlignmentControls] re-align failed:', error);
127
+ toast.error(
128
+ error instanceof Error
129
+ ? `Re-align failed: ${error.message}`
130
+ : 'Re-align failed.',
131
+ );
132
+ } finally {
133
+ setBusy(false);
134
+ }
135
+ }, [realignFederation]);
136
+
137
+ return (
138
+ <div className="px-2 py-1.5 border-b border-zinc-100 dark:border-zinc-900">
139
+ <div className="flex items-center gap-2 flex-wrap">
140
+ <div
141
+ className={`inline-flex items-center gap-1 px-1.5 py-0.5 border text-[10px] font-medium ${toneClasses[badge.tone]}`}
142
+ >
143
+ <Icon className="h-2.5 w-2.5" />
144
+ <span>{badge.text}</span>
145
+ </div>
146
+ {!isAnchor && (
147
+ <button
148
+ type="button"
149
+ onClick={handleSetAnchor}
150
+ className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300 border border-teal-300/50 dark:border-teal-700/50 hover:bg-teal-50 dark:hover:bg-teal-950/50 transition-colors"
151
+ title="Use this model as the federation anchor. Click 'Re-align' afterwards to apply."
152
+ >
153
+ <Anchor className="h-2.5 w-2.5" />
154
+ Make anchor
155
+ </button>
156
+ )}
157
+ {isAnchor && anchorModelIdOverride === modelId && (
158
+ <button
159
+ type="button"
160
+ onClick={handleClearAnchor}
161
+ className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-zinc-600 dark:text-zinc-400 hover:text-zinc-800 dark:hover:text-zinc-200 border border-zinc-300/50 dark:border-zinc-700/50 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors"
162
+ title="Stop pinning this model as the anchor; revert to the default (earliest-loaded with georef)."
163
+ >
164
+ Unpin
165
+ </button>
166
+ )}
167
+ <button
168
+ type="button"
169
+ onClick={handleRealign}
170
+ disabled={busy}
171
+ className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-zinc-700 dark:text-zinc-300 hover:text-zinc-900 dark:hover:text-zinc-100 border border-zinc-300/50 dark:border-zinc-700/50 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors disabled:opacity-50 disabled:cursor-not-allowed ml-auto"
172
+ title="Re-bake every model's geometry against the current anchor."
173
+ >
174
+ <RefreshCw className={`h-2.5 w-2.5 ${busy ? 'animate-spin' : ''}`} />
175
+ Re-align
176
+ </button>
177
+ </div>
178
+ </div>
179
+ );
180
+ }
@@ -15,9 +15,16 @@ import { computeAngleToGridNorth, type GeoreferenceInfo, type MapConversion, typ
15
15
  import { useViewerStore } from '@/store';
16
16
  import type { CoordinateInfo, GeometryResult } from '@ifc-lite/geometry';
17
17
  import { EpsgLookupDialog, type EpsgResult } from './EpsgLookupDialog';
18
+ import { FederationAlignmentControls } from './FederationAlignmentControls';
19
+ import { PrecisionGridBadge } from './PrecisionGridBadge';
18
20
  import { LocationMap, type PickedPosition } from './LocationMap';
19
- import { findClampAnchorY } from '@/lib/geo/clamp-anchor';
20
- import { detectScaleUnitMismatch, mergeMapConversion, mergeProjectedCRS } from '@/lib/geo/effective-georef';
21
+ import { computeOrthogonalHeightForBaseAltitude } from '@/lib/geo/cesium-placement';
22
+ import {
23
+ detectScaleUnitMismatch,
24
+ mergeMapConversion,
25
+ mergeProjectedCRS,
26
+ supportsStandardGeoreferencing,
27
+ } from '@/lib/geo/effective-georef';
21
28
  import { useIfc } from '@/hooks/useIfc';
22
29
  import { toast } from '@/components/ui/toast';
23
30
 
@@ -335,9 +342,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
335
342
  const setGeorefField = useViewerStore(s => s.setGeorefField);
336
343
  const setGeorefFields = useViewerStore(s => s.setGeorefFields);
337
344
  const cesiumEnabled = useViewerStore(s => s.cesiumEnabled);
338
- const terrainClamp = useViewerStore(s => s.cesiumTerrainClamp);
339
- const setCesiumTerrainClamp = useViewerStore(s => s.setCesiumTerrainClamp);
340
345
  const cesiumTerrainHeight = useViewerStore(s => s.cesiumTerrainHeight);
346
+ const cesiumTerrainSource = useViewerStore(s => s.cesiumTerrainSource);
341
347
  const cesiumSourceModelId = useViewerStore(s => s.cesiumSourceModelId);
342
348
  const models = useViewerStore(s => s.models);
343
349
  const loading = useViewerStore(s => s.loading);
@@ -351,7 +357,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
351
357
  useViewerStore(s => s.mutationVersion);
352
358
 
353
359
  const mutations = modelId ? georefMutations?.get(modelId) : undefined;
354
- const supportsStandardGeoreferencing = !schemaVersion?.toUpperCase().includes('2X3');
360
+ const isLegacySiteGeoreference = georef?.source === 'siteLocation';
361
+ const canUseStandardGeoreferencing = supportsStandardGeoreferencing(schemaVersion, georef);
355
362
 
356
363
  const mergedCRS = useMemo((): ProjectedCRS | undefined => {
357
364
  return mergeProjectedCRS(georef?.projectedCRS, mutations?.projectedCRS, lengthUnitScale ?? 1);
@@ -382,13 +389,6 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
382
389
  return 'm';
383
390
  }, [mergedCRS?.mapUnit]);
384
391
 
385
- // Convert meters to map units (Cesium always returns meters)
386
- const metersToMapUnit = useCallback((meters: number): number => {
387
- if (mapUnitSuffix === 'ftUS') return meters / 0.3048006096;
388
- if (mapUnitSuffix === 'ft') return meters / 0.3048;
389
- return meters; // already meters
390
- }, [mapUnitSuffix]);
391
-
392
392
  /**
393
393
  * Given a target world altitude (metres) for the model's ground floor
394
394
  * (the storey nearest elevation 0, falling back to bounds.min.y when
@@ -400,14 +400,14 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
400
400
  * world position as toggling the clamp.
401
401
  */
402
402
  const oHeightForBaseAltitude = useCallback((targetBaseAltitude: number): number => {
403
- const bounds = coordinateInfo?.originalBounds;
404
- const anchorY = findClampAnchorY(bounds, storeyElevations);
405
- const shiftY = coordinateInfo?.originShift?.y ?? 0;
406
- // RTC offset is in IFC Z-up; viewer Y-up takes its Z component.
407
- const rtcYupY = coordinateInfo?.wasmRtcOffset?.z ?? 0;
408
- const targetOHeightMeters = targetBaseAltitude - shiftY - rtcYupY - anchorY;
409
- return Math.round(metersToMapUnit(targetOHeightMeters) * 100) / 100;
410
- }, [coordinateInfo, storeyElevations, metersToMapUnit]);
403
+ return computeOrthogonalHeightForBaseAltitude({
404
+ coordinateInfo,
405
+ projectedCRS: mergedCRS,
406
+ lengthUnitScale: lengthUnitScale ?? 1,
407
+ storeyElevations,
408
+ targetBaseAltitude,
409
+ });
410
+ }, [coordinateInfo, mergedCRS, lengthUnitScale, storeyElevations]);
411
411
 
412
412
  const isMutated = useCallback((entity: 'projectedCRS' | 'mapConversion', field: string): boolean => {
413
413
  if (!mutations) return false;
@@ -467,14 +467,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
467
467
  ? mergedCRS?.[field as keyof ProjectedCRS]
468
468
  : mergedConversion?.[field as keyof MapConversion];
469
469
  setGeorefField(modelId, entity, field, value, oldValue as string | number | undefined);
470
- // Editing OrthogonalHeight implies "I want this exact altitude" — auto
471
- // -release the terrain clamp so the new value actually takes effect
472
- // (with clamp on, placement is locked to terrain regardless of oHeight).
473
- if (entity === 'mapConversion' && field === 'orthogonalHeight' && terrainClamp) {
474
- setCesiumTerrainClamp(false);
475
- }
476
470
  requestAlignmentReload();
477
- }, [modelId, setGeorefField, mergedCRS, mergedConversion, requestAlignmentReload, terrainClamp, setCesiumTerrainClamp]);
471
+ }, [modelId, setGeorefField, mergedCRS, mergedConversion, requestAlignmentReload]);
478
472
 
479
473
  // Handle angle edit: compute and set both XAxisAbscissa and XAxisOrdinate
480
474
  const handleAngleChange = useCallback((abscissa: number, ordinate: number) => {
@@ -557,18 +551,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
557
551
  }, [modelId, setGeorefFields, mergedCRS, mergedConversion, mutations, initializeMapConversionDefaults, requestAlignmentReload]);
558
552
 
559
553
  const hasData = mergedCRS || mergedConversion;
560
- const editable = enableEditing && !!modelId && supportsStandardGeoreferencing;
561
-
562
- if (enableEditing && !supportsStandardGeoreferencing) {
563
- return (
564
- <div className="px-2 py-1.5 flex items-center gap-2">
565
- <Globe className="h-3 w-3 text-zinc-400" />
566
- <span className="text-[10px] text-zinc-500 dark:text-zinc-400">
567
- Georeferencing editing requires IFC4 or newer. IFC2X3 does not support IfcProjectedCRS or IfcMapConversion.
568
- </span>
569
- </div>
570
- );
571
- }
554
+ const editable = enableEditing && !!modelId && canUseStandardGeoreferencing;
572
555
 
573
556
  // When no georef data exists, show "Add Georeferencing" in edit mode
574
557
  if (!hasData && !georef?.hasGeoreference) {
@@ -616,6 +599,24 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
616
599
  </div>
617
600
  </div>
618
601
  )}
602
+ {/* Only flag the legacy-site / unsupported-schema state when there is
603
+ actually nothing extractable to show. If we have a projectedCRS or
604
+ mapConversion (even partially), the data sections below speak for
605
+ themselves — the schema notice is just noise that contradicts the
606
+ live data the properties panel already renders. */}
607
+ {!canUseStandardGeoreferencing && !mergedCRS && !mergedConversion && (
608
+ <div className="px-3 py-1.5 flex items-center gap-2 border-b border-zinc-100 dark:border-zinc-900">
609
+ <Globe className="h-3 w-3 text-zinc-400 shrink-0" />
610
+ <span className="text-[10px] text-zinc-500 dark:text-zinc-400">
611
+ {isLegacySiteGeoreference
612
+ ? 'Showing legacy IfcSite geolocation from IFC2X3. This view is read-only.'
613
+ : 'Georeferencing editing requires IFC4 or newer. IFC2X3 does not support IfcProjectedCRS or IfcMapConversion.'}
614
+ </span>
615
+ </div>
616
+ )}
617
+ {/* Federation alignment badge + anchor / re-align controls.
618
+ Hidden when only one model is loaded — alignment is a federation concept. */}
619
+ {modelId && models.size > 1 && <FederationAlignmentControls modelId={modelId} />}
619
620
  {/* CRS summary — always visible */}
620
621
  <div className="px-2 py-1.5 flex items-center gap-2">
621
622
  <Globe className="h-3 w-3 text-teal-500 shrink-0" />
@@ -628,6 +629,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
628
629
  {mergedCRS?.description && (
629
630
  <span className="text-[10px] font-mono text-teal-500/60 truncate">{mergedCRS.description}</span>
630
631
  )}
632
+ {mergedCRS?.name && <PrecisionGridBadge crsName={mergedCRS.name} />}
631
633
  {editable && (
632
634
  <EpsgLookupDialog onSelect={handleEpsgSelect}>
633
635
  <button className="flex items-center gap-1 text-[9px] text-teal-500 hover:text-teal-700 dark:hover:text-teal-300 transition-colors ml-auto shrink-0">
@@ -751,28 +753,25 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
751
753
  </div>
752
754
  )}
753
755
 
754
- {/* Terrain clamp toggle — only when Cesium overlay is active */}
756
+ {/* Sampled surface height — only when Cesium overlay is active */}
755
757
  {cesiumEnabled && isActiveCesiumModel && mergedConversion && (
756
758
  <div className="px-3 py-1.5 border-t border-zinc-100 dark:border-zinc-900 space-y-1">
757
759
  <div className="flex items-center gap-2">
758
760
  <Mountain className="h-3 w-3 text-teal-500 shrink-0" />
759
- <label className="flex items-center gap-1.5 cursor-pointer flex-1">
760
- <input
761
- type="checkbox"
762
- checked={terrainClamp}
763
- onChange={(e) => setCesiumTerrainClamp(e.target.checked)}
764
- className="accent-teal-500 h-3 w-3"
765
- />
766
- <span className="text-[10px] text-zinc-600 dark:text-zinc-400">Clamp to terrain</span>
767
- </label>
761
+ <span className="text-[10px] text-zinc-600 dark:text-zinc-400 flex-1">Visible surface height</span>
768
762
  {cesiumTerrainHeight !== null ? (
769
- <span className="text-[9px] font-mono text-teal-500">
763
+ <span className="text-[9px] font-mono text-teal-500" title={cesiumTerrainSource ?? undefined}>
770
764
  {cesiumTerrainHeight.toFixed(1)} m
771
765
  </span>
772
766
  ) : (
773
767
  <span className="text-[9px] font-mono text-zinc-400">querying...</span>
774
768
  )}
775
769
  </div>
770
+ {cesiumTerrainSource && (
771
+ <div className="ml-5 text-[9px] text-zinc-500 dark:text-zinc-400">
772
+ sampled via {cesiumTerrainSource}
773
+ </div>
774
+ )}
776
775
  {cesiumTerrainHeight !== null && editable && modelId && (
777
776
  <div className="flex items-center gap-1 ml-5">
778
777
  <button
@@ -780,7 +779,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
780
779
  className="text-[9px] text-teal-500 hover:text-teal-700 dark:hover:text-teal-300 transition-colors flex items-center gap-0.5"
781
780
  >
782
781
  <Mountain className="h-2.5 w-2.5" />
783
- Set OrthogonalHeight to {cesiumTerrainHeight.toFixed(1)} m
782
+ Set OrthogonalHeight to sampled terrain height ({cesiumTerrainHeight.toFixed(1)} m)
784
783
  </button>
785
784
  </div>
786
785
  )}
@@ -809,6 +808,7 @@ function TerrainHeightButton({ modelId, editable, onApply }: {
809
808
  }) {
810
809
  const cesiumEnabled = useViewerStore(s => s.cesiumEnabled);
811
810
  const terrainHeight = useViewerStore(s => s.cesiumTerrainHeight);
811
+ const terrainSource = useViewerStore(s => s.cesiumTerrainSource);
812
812
  const sourceModelId = useViewerStore(s => s.cesiumSourceModelId);
813
813
 
814
814
  // Only show when this panel's model is the active Cesium model
@@ -828,7 +828,10 @@ function TerrainHeightButton({ modelId, editable, onApply }: {
828
828
  <span>{terrainHeight.toFixed(1)} m</span>
829
829
  </button>
830
830
  </TooltipTrigger>
831
- <TooltipContent>Set OrthogonalHeight to Cesium terrain elevation ({terrainHeight.toFixed(1)} m)</TooltipContent>
831
+ <TooltipContent>
832
+ Set OrthogonalHeight to sampled terrain height ({terrainHeight.toFixed(1)} m
833
+ {terrainSource ? ` via ${terrainSource}` : ''})
834
+ </TooltipContent>
832
835
  </Tooltip>
833
836
  );
834
837
  }
@@ -124,7 +124,12 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
124
124
  </div>
125
125
  </div>
126
126
 
127
- <ScrollArea className="flex-1">
127
+ {/* `min-h-0` is required: without it `flex-1` falls back to
128
+ min-height:auto and the ScrollArea grows past the panel's
129
+ height instead of constraining the inner viewport, so the map
130
+ (and any tall content underneath) overflowed past the right
131
+ panel's clip box. */}
132
+ <ScrollArea className="flex-1 min-h-0">
128
133
  {/* File Information */}
129
134
  <div className="border-b border-zinc-200 dark:border-zinc-800">
130
135
  <div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
@@ -172,49 +177,11 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
172
177
  </div>
173
178
  )}
174
179
 
175
- {/* Entity Statistics */}
176
- <div className="border-b border-zinc-200 dark:border-zinc-800">
177
- <div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
178
- <h4 className="font-bold text-xs uppercase tracking-wide text-zinc-700 dark:text-zinc-300">
179
- Statistics
180
- </h4>
181
- </div>
182
- <div className="divide-y divide-zinc-100 dark:divide-zinc-900">
183
- <div className="flex items-center gap-3 px-3 py-2">
184
- <Database className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
185
- <span className="text-xs text-zinc-500">Total Entities</span>
186
- <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
187
- {dataStore?.entityCount?.toLocaleString() ?? 'N/A'}
188
- </span>
189
- </div>
190
- <div className="flex items-center gap-3 px-3 py-2">
191
- <Layers className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
192
- <span className="text-xs text-zinc-500">Building Storeys</span>
193
- <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
194
- {stats.storeys}
195
- </span>
196
- </div>
197
- <div className="flex items-center gap-3 px-3 py-2">
198
- <Building2 className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
199
- <span className="text-xs text-zinc-500">Elements with Geometry</span>
200
- <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
201
- {stats.elementsWithGeometry.toLocaleString()}
202
- </span>
203
- </div>
204
- <div className="flex items-center gap-3 px-3 py-2">
205
- <Hash className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
206
- <span className="text-xs text-zinc-500">Max Express ID</span>
207
- <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
208
- {model.maxExpressId.toLocaleString()}
209
- </span>
210
- </div>
211
- </div>
212
- </div>
213
-
214
- {/* Georeferencing */}
215
- <GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} lengthUnitScale={unitInfo?.scale} />
216
-
217
- {/* IfcProject Data */}
180
+ {/* IfcProject Data — placed near the top so the model's name,
181
+ description, and project-level psets are the first thing users
182
+ see after file info. Previously the section was at the bottom
183
+ of the panel (below the map), which buried critical project
184
+ identity below scrollable georeferencing content. */}
218
185
  {projectData && (
219
186
  <div className="border-b border-zinc-200 dark:border-zinc-800">
220
187
  <div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
@@ -262,6 +229,50 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
262
229
  )}
263
230
  </div>
264
231
  )}
232
+
233
+ {/* Entity Statistics */}
234
+ <div className="border-b border-zinc-200 dark:border-zinc-800">
235
+ <div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
236
+ <h4 className="font-bold text-xs uppercase tracking-wide text-zinc-700 dark:text-zinc-300">
237
+ Statistics
238
+ </h4>
239
+ </div>
240
+ <div className="divide-y divide-zinc-100 dark:divide-zinc-900">
241
+ <div className="flex items-center gap-3 px-3 py-2">
242
+ <Database className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
243
+ <span className="text-xs text-zinc-500">Total Entities</span>
244
+ <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
245
+ {dataStore?.entityCount?.toLocaleString() ?? 'N/A'}
246
+ </span>
247
+ </div>
248
+ <div className="flex items-center gap-3 px-3 py-2">
249
+ <Layers className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
250
+ <span className="text-xs text-zinc-500">Building Storeys</span>
251
+ <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
252
+ {stats.storeys}
253
+ </span>
254
+ </div>
255
+ <div className="flex items-center gap-3 px-3 py-2">
256
+ <Building2 className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
257
+ <span className="text-xs text-zinc-500">Elements with Geometry</span>
258
+ <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
259
+ {stats.elementsWithGeometry.toLocaleString()}
260
+ </span>
261
+ </div>
262
+ <div className="flex items-center gap-3 px-3 py-2">
263
+ <Hash className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
264
+ <span className="text-xs text-zinc-500">Max Express ID</span>
265
+ <span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
266
+ {model.maxExpressId.toLocaleString()}
267
+ </span>
268
+ </div>
269
+ </div>
270
+ </div>
271
+
272
+ {/* Georeferencing — kept at the bottom because it embeds a
273
+ tall location map; placing it earlier would push the
274
+ statistics + project metadata below the fold. */}
275
+ <GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} lengthUnitScale={unitInfo?.scale} />
265
276
  </ScrollArea>
266
277
  </div>
267
278
  );
@@ -0,0 +1,125 @@
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
+ * Small badge in the GeoreferencingPanel header that tells the user
7
+ * whether their CRS is using a precision NTv2/GeoTIFF datum-shift grid
8
+ * (sub-decimeter accuracy) or the +towgs84 fallback (up to ~120 m error
9
+ * for Bessel-based national grids like RD/NL, OSGB/UK, MGI/AT).
10
+ *
11
+ * Re-checks on a short interval so it flips from "loading" → "loaded"
12
+ * after the grid finishes downloading without forcing the parent to
13
+ * re-render.
14
+ */
15
+
16
+ import { useEffect, useState } from 'react';
17
+ import { CheckCircle2, AlertTriangle, Loader2 } from 'lucide-react';
18
+ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
19
+ import {
20
+ PRECISION_GRIDS,
21
+ hasFailedPrecisionGrid,
22
+ hasLoadedPrecisionGrid,
23
+ } from '@/lib/geo/precision-grids';
24
+
25
+ interface PrecisionGridBadgeProps {
26
+ crsName: string | undefined;
27
+ }
28
+
29
+ function extractEpsgCode(crsName: string | undefined): string | null {
30
+ if (!crsName) return null;
31
+ const match = crsName.match(/EPSG[:\s]*(\d+)/i);
32
+ return match ? match[1] : null;
33
+ }
34
+
35
+ type BadgeState = 'loading' | 'loaded' | 'failed';
36
+
37
+ export function PrecisionGridBadge({ crsName }: PrecisionGridBadgeProps) {
38
+ const code = extractEpsgCode(crsName);
39
+ const spec = code ? PRECISION_GRIDS[code] : undefined;
40
+ const [state, setState] = useState<BadgeState>(() => {
41
+ if (!spec) return 'loading';
42
+ if (hasLoadedPrecisionGrid(code!)) return 'loaded';
43
+ if (hasFailedPrecisionGrid(code!)) return 'failed';
44
+ return 'loading';
45
+ });
46
+
47
+ useEffect(() => {
48
+ if (!spec || state !== 'loading') return;
49
+ // Poll every 250ms until the grid loader settles (success or failure).
50
+ // Cheap — PRECISION_GRIDS lookup is O(1) and most CRSs never trigger
51
+ // this path. Stops as soon as the grid resolves or the component
52
+ // unmounts.
53
+ const id = setInterval(() => {
54
+ if (hasLoadedPrecisionGrid(code!)) {
55
+ setState('loaded');
56
+ } else if (hasFailedPrecisionGrid(code!)) {
57
+ setState('failed');
58
+ }
59
+ }, 250);
60
+ return () => clearInterval(id);
61
+ }, [spec, state, code]);
62
+
63
+ // CRS without a registered precision grid — accuracy depends entirely on
64
+ // whether its +towgs84 is good (ETRS89/WGS84-aligned CRSs: yes; old
65
+ // Bessel/Airy national grids: no). Don't show a badge for these.
66
+ if (!spec) return null;
67
+
68
+ if (state === 'loaded') {
69
+ return (
70
+ <Tooltip>
71
+ <TooltipTrigger asChild>
72
+ <span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-emerald-300/60 dark:border-emerald-700/60 bg-emerald-50 dark:bg-emerald-950/40 text-emerald-700 dark:text-emerald-300 shrink-0">
73
+ <CheckCircle2 className="h-2.5 w-2.5" />
74
+ grid
75
+ </span>
76
+ </TooltipTrigger>
77
+ <TooltipContent side="bottom" className="text-xs max-w-xs">
78
+ <div>Precision NTv2/GeoTIFF grid loaded for {spec.region}.</div>
79
+ <div className="mt-1 text-[10px] opacity-80">
80
+ Sub-decimeter datum-shift accuracy via{' '}
81
+ <code className="font-mono">{spec.filename}</code>.
82
+ </div>
83
+ </TooltipContent>
84
+ </Tooltip>
85
+ );
86
+ }
87
+
88
+ if (state === 'failed') {
89
+ return (
90
+ <Tooltip>
91
+ <TooltipTrigger asChild>
92
+ <span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-red-300/60 dark:border-red-700/60 bg-red-50 dark:bg-red-950/40 text-red-700 dark:text-red-300 shrink-0">
93
+ <AlertTriangle className="h-2.5 w-2.5" />
94
+ grid failed
95
+ </span>
96
+ </TooltipTrigger>
97
+ <TooltipContent side="bottom" className="text-xs max-w-xs">
98
+ <div>Precision grid fetch failed for {spec.region}.</div>
99
+ <div className="mt-1 text-[10px] opacity-80">
100
+ Falling back to +towgs84 approximation. Check network access to{' '}
101
+ <code className="font-mono">cdn.proj.org</code>.
102
+ </div>
103
+ </TooltipContent>
104
+ </Tooltip>
105
+ );
106
+ }
107
+
108
+ return (
109
+ <Tooltip>
110
+ <TooltipTrigger asChild>
111
+ <span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-amber-300/60 dark:border-amber-700/60 bg-amber-50 dark:bg-amber-950/40 text-amber-700 dark:text-amber-300 shrink-0">
112
+ <Loader2 className="h-2.5 w-2.5 animate-spin" />
113
+ loading grid
114
+ </span>
115
+ </TooltipTrigger>
116
+ <TooltipContent side="bottom" className="text-xs max-w-xs">
117
+ <div>Fetching precision grid for {spec.region}…</div>
118
+ <div className="mt-1 text-[10px] opacity-80">
119
+ Until it arrives, placement uses the +towgs84 approximation (off by
120
+ up to ~120 m for this CRS).
121
+ </div>
122
+ </TooltipContent>
123
+ </Tooltip>
124
+ );
125
+ }
@@ -22,6 +22,7 @@
22
22
  */
23
23
 
24
24
  import type { IfcAttributeValue } from '@ifc-lite/mutations';
25
+ import { safeUtf8Decode } from '@ifc-lite/data';
25
26
 
26
27
  /**
27
28
  * Tokenize the inside of a STEP entity body (`,`-separated arguments)
@@ -86,9 +87,10 @@ export function extractRawStepTokens(
86
87
  byteLength: number,
87
88
  ): string[] | null {
88
89
  if (byteLength <= 0) return null;
89
- const text = new TextDecoder().decode(
90
- buffer.subarray(byteOffset, byteOffset + byteLength),
91
- );
90
+ // safeUtf8Decode handles SAB-backed source buffers (the parser
91
+ // keeps `dataStore.source` SAB-backed for zero-copy worker sharing,
92
+ // and Firefox/Chrome reject `TextDecoder.decode()` on SAB views).
93
+ const text = safeUtf8Decode(buffer, byteOffset, byteOffset + byteLength);
92
94
  // Match #N=TYPE( ... ) — the trailing `;` is optional in case the
93
95
  // ref slice doesn't include it.
94
96
  const match = text.match(/^#\d+\s*=\s*[A-Z0-9_]+\(([\s\S]*)\)\s*;?\s*$/i);