@ifc-lite/viewer 1.28.1 → 1.29.0

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 (438) hide show
  1. package/.turbo/turbo-build.log +37 -37
  2. package/CHANGELOG.md +56 -0
  3. package/dist/assets/{arrow-CXWhTnNT.js → arrow-fie-E7fe.js} +1 -1
  4. package/dist/assets/{basketViewActivator-Ce38DhXd.js → basketViewActivator-BSRgF1Hw.js} +10 -10
  5. package/dist/assets/{bcf-Cv_O3JfD.js → bcf-3uE1MvcT.js} +2 -2
  6. package/dist/assets/{cesium-CzZn5yVA.js → cesium-DezSO2mp.js} +658 -597
  7. package/dist/assets/{deflate-HbyMq59o.js → deflate-BLlUfw9-.js} +1 -1
  8. package/dist/assets/drawing-2d-CLn7Mtj8.js +257 -0
  9. package/dist/assets/{exporters-BuD3XRzB.js → exporters-BL6UmxRa.js} +1659 -1515
  10. package/dist/assets/geometry.worker-DVwFYHTq.js +1 -0
  11. package/dist/assets/{geotiff-B2HA8Bwm.js → geotiff-BydcIud8.js} +12 -12
  12. package/dist/assets/{ids-DYUFMd5f.js → ids-DFl74rTt.js} +6 -6
  13. package/dist/assets/{ifc-lite_bg-BEA5DLmg.wasm → ifc-lite_bg-FPffpFK_.wasm} +0 -0
  14. package/dist/assets/{index-n5O1QJMM.js → index-BNTlm2lP.js} +37197 -35918
  15. package/dist/assets/index-DpoJvkdg.css +1 -0
  16. package/dist/assets/{index.es-BKVIpZgL.js → index.es-Bk4nLsyS.js} +11 -11
  17. package/dist/assets/{jpeg-C7hjKjPX.js → jpeg-BvMO8-Tc.js} +1 -1
  18. package/dist/assets/{jspdf.es.min-oWlFc42Y.js → jspdf.es.min-BZ_ed66E.js} +5 -5
  19. package/dist/assets/{lens-C4p1kQ0p.js → lens-DMnqMXpz.js} +1 -1
  20. package/dist/assets/{lerc-BfIOGhQz.js → lerc-CNnDpLpV.js} +1 -1
  21. package/dist/assets/{lzw-B0jRuuW5.js → lzw-DBaPrGGZ.js} +1 -1
  22. package/dist/assets/{native-bridge-DpB-dtEn.js → native-bridge-DFOoBvTg.js} +2 -2
  23. package/dist/assets/{packbits-DVvBTC39.js → packbits-C7uyD2Bi.js} +1 -1
  24. package/dist/assets/{parser.worker-BDsWQ6rc.js → parser.worker-U_PVhLNi.js} +3 -3
  25. package/dist/assets/{pdf-dVIqI5ac.js → pdf-DlqdjX9e.js} +12 -12
  26. package/dist/assets/raw-p_2cfl6T.js +1 -0
  27. package/dist/assets/{sandbox-qpJlrNN0.js → sandbox-0Z2NzeOJ.js} +3444 -2879
  28. package/dist/assets/{server-client-DVZ2huNS.js → server-client-DUMy2mXg.js} +4 -4
  29. package/dist/assets/{three-CQBzFWY2.js → three-SQm7uqwa.js} +1 -1
  30. package/dist/assets/{webimage-B394g0Tw.js → webimage-zN-oCabb.js} +1 -1
  31. package/dist/assets/{xlsx-D-oHO76J.js → xlsx-N2LbIR1G.js} +10 -10
  32. package/dist/assets/{zstd-Bf38MwV2.js → zstd-Jk3QKIeb.js} +1 -1
  33. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-35LM35A5.js} +2 -2
  34. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-3R3BCVRR.js} +2 -2
  35. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-44VKZ44M.js} +2 -2
  36. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-4LOVZYQ2.js} +2 -2
  37. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-55KTRCCC.js} +2 -2
  38. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-5AJUPXGZ.js} +2 -2
  39. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-5EEMCPIO.js} +2 -2
  40. package/dist/cesium/node_modules/.pnpm/cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-5HZ2G332.js +26 -0
  41. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-6K4BWAPV.js} +1 -1
  42. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-6LZUEMFX.js} +1 -1
  43. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-6NPJZ3PS.js} +2 -2
  44. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-A3K5FM7E.js} +2 -2
  45. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-AP7AMWJA.js} +2 -2
  46. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-AZCCS55A.js} +2 -2
  47. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-BXPFAIYZ.js} +2 -2
  48. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-C4NHPSO2.js} +2 -2
  49. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-CJGWLCOV.js} +2 -2
  50. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-E4MSZ45D.js} +2 -2
  51. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-FCRW2AGG.js} +2 -2
  52. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-FMWRN5G2.js} +2 -2
  53. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-FXWI4VL7.js} +2 -2
  54. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-FYQCPFNB.js} +2 -2
  55. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-G46AR6KP.js} +2 -2
  56. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-GS4ZGDWD.js} +2 -2
  57. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-GZABERXA.js} +2 -2
  58. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-H6AHPUMX.js} +2 -2
  59. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPQQ2USK.js} +2 -2
  60. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-ITSDUOWL.js} +1 -1
  61. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6WO2HA5.js} +1 -1
  62. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-K3YIAZU7.js} +2 -2
  63. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-K72DPWBT.js} +2 -2
  64. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-LKQXJXNV.js} +1 -1
  65. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-LTHJTGXC.js} +2 -2
  66. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-LUECBOIT.js} +2 -2
  67. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-MUI5QV7K.js} +2 -2
  68. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-OS2CBN2U.js} +2 -2
  69. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-R5DFAOJG.js} +2 -2
  70. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-R7QNYLFY.js} +2 -2
  71. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-RH3WVPDR.js} +2 -2
  72. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-RI3TXBVT.js} +2 -2
  73. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-RU2T2U4O.js} +2 -2
  74. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-SSYRCXAV.js} +2 -2
  75. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-U4VWQPTS.js} +2 -2
  76. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-UHTXIDKA.js} +2 -2
  77. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-V74K6IQF.js} +2 -2
  78. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-VELRZYUL.js} +2 -2
  79. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXS2FTO4.js} +2 -2
  80. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-VZ4ER5HI.js} +2 -2
  81. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-WC7WZIXH.js} +2 -2
  82. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-WM6AKY6B.js} +2 -2
  83. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-WTIPXHS3.js} +2 -2
  84. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-WZYIA4NB.js} +2 -2
  85. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEBZTQHW.js} +2 -2
  86. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-XFWEZBPW.js} +2 -2
  87. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-YLWWFMFQ.js} +2 -2
  88. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-YNBY2HFD.js} +1 -1
  89. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js → cesium@1.142.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZQTDDQLY.js} +2 -2
  90. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/combineGeometry.js +2 -2
  91. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createBoxGeometry.js +2 -2
  92. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createBoxOutlineGeometry.js +2 -2
  93. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCircleGeometry.js +2 -2
  94. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCircleOutlineGeometry.js +2 -2
  95. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonGeometry.js +2 -2
  96. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +2 -2
  97. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCorridorGeometry.js +2 -2
  98. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCorridorOutlineGeometry.js +2 -2
  99. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCylinderGeometry.js +2 -2
  100. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createCylinderOutlineGeometry.js +2 -2
  101. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createEllipseGeometry.js +2 -2
  102. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createEllipseOutlineGeometry.js +2 -2
  103. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createEllipsoidGeometry.js +2 -2
  104. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createEllipsoidOutlineGeometry.js +2 -2
  105. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createFrustumGeometry.js +2 -2
  106. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createFrustumOutlineGeometry.js +2 -2
  107. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createGeometry.js +2 -2
  108. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +2 -2
  109. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPlaneGeometry.js +2 -2
  110. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPlaneOutlineGeometry.js +2 -2
  111. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPolygonGeometry.js +2 -2
  112. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPolygonOutlineGeometry.js +2 -2
  113. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPolylineGeometry.js +2 -2
  114. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPolylineVolumeGeometry.js +2 -2
  115. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createPolylineVolumeOutlineGeometry.js +2 -2
  116. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createRectangleGeometry.js +2 -2
  117. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createRectangleOutlineGeometry.js +2 -2
  118. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createSimplePolylineGeometry.js +2 -2
  119. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createSphereGeometry.js +2 -2
  120. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createSphereOutlineGeometry.js +2 -2
  121. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createTaskProcessorWorker.js +2 -2
  122. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVectorTileClampedPolylines.js +2 -2
  123. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVectorTileGeometries.js +2 -2
  124. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVectorTilePoints.js +2 -2
  125. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVectorTilePolygons.js +2 -2
  126. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVectorTilePolylines.js +2 -2
  127. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +2 -2
  128. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
  129. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVerticesFromHeightmap.js +2 -2
  130. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +2 -2
  131. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createWallGeometry.js +2 -2
  132. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/createWallOutlineGeometry.js +2 -2
  133. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/decodeDraco.js +2 -2
  134. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2
  135. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/decodeI3S.js +2 -2
  136. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/gaussianSplatSorter.js +2 -2
  137. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/gaussianSplatTextureGenerator.js +2 -2
  138. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/incrementallyBuildTerrainPicker.js +2 -2
  139. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +2 -2
  140. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/transferTypedArrayTest.js +1 -1
  141. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +2 -2
  142. package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
  143. package/dist/index.html +11 -11
  144. package/package.json +34 -34
  145. package/src/components/viewer/MainToolbar.tsx +68 -41
  146. package/src/components/viewer/Section2DPanel.tsx +3 -3
  147. package/src/components/viewer/ToolOverlays.tsx +5 -0
  148. package/src/components/viewer/ViewportContainer.tsx +52 -5
  149. package/src/components/viewer/tools/SpaceSketchOverlay.tsx +872 -0
  150. package/src/hooks/useConstructionUnderlay.ts +94 -0
  151. package/src/hooks/useDrawingGeneration.ts +119 -24
  152. package/src/store/slices/mutationSlice.ts +21 -0
  153. package/src/store/slices/uiSlice.ts +1 -0
  154. package/src/store/slices/visibilitySlice.ts +20 -0
  155. package/dist/assets/drawing-2d-DW98umlt.js +0 -257
  156. package/dist/assets/geometry.worker-TH3fCCoY.js +0 -1
  157. package/dist/assets/index-E9wB0zWt.css +0 -1
  158. package/dist/assets/raw-C0ZJYGmN.js +0 -1
  159. package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js +0 -26
  160. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
  161. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
  162. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
  163. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
  164. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
  165. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
  166. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
  167. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
  168. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
  169. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
  170. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
  171. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
  172. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
  173. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
  174. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
  175. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
  176. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
  177. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
  178. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
  179. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
  180. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
  181. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
  182. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
  183. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
  184. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
  185. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
  186. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
  187. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
  188. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Images/bing_maps_credit.png +0 -0
  189. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Images/cesium_credit.png +0 -0
  190. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Images/google_earth_credit.png +0 -0
  191. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Images/ion-credit.png +0 -0
  192. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  193. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  194. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  195. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  196. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  197. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  198. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  199. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  200. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  201. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  202. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  203. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  204. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  205. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  206. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  207. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  208. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  209. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  210. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  211. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  212. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  213. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  214. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  215. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  216. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  217. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  218. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  219. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  220. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  221. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  222. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  223. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  224. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  225. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  226. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  227. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  228. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  229. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  230. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  231. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  232. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  233. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  234. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  235. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  236. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +0 -0
  237. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  238. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  239. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  240. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  241. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  242. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  243. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/airfield.png +0 -0
  244. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/airport.png +0 -0
  245. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  246. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/america-football.png +0 -0
  247. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/art-gallery.png +0 -0
  248. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/bakery.png +0 -0
  249. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/bank.png +0 -0
  250. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/bar.png +0 -0
  251. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/baseball.png +0 -0
  252. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/basketball.png +0 -0
  253. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/beer.png +0 -0
  254. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/bicycle.png +0 -0
  255. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/building.png +0 -0
  256. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/bus.png +0 -0
  257. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cafe.png +0 -0
  258. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/camera.png +0 -0
  259. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/campsite.png +0 -0
  260. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/car.png +0 -0
  261. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cemetery.png +0 -0
  262. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cesium.png +0 -0
  263. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/chemist.png +0 -0
  264. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cinema.png +0 -0
  265. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  266. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/circle.png +0 -0
  267. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/city.png +0 -0
  268. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/clothing-store.png +0 -0
  269. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/college.png +0 -0
  270. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/commercial.png +0 -0
  271. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cricket.png +0 -0
  272. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/cross.png +0 -0
  273. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/dam.png +0 -0
  274. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/danger.png +0 -0
  275. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/disability.png +0 -0
  276. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/dog-park.png +0 -0
  277. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/embassy.png +0 -0
  278. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  279. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/entrance.png +0 -0
  280. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/farm.png +0 -0
  281. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/fast-food.png +0 -0
  282. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/ferry.png +0 -0
  283. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/fire-station.png +0 -0
  284. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/fuel.png +0 -0
  285. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/garden.png +0 -0
  286. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/gift.png +0 -0
  287. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/golf.png +0 -0
  288. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/grocery.png +0 -0
  289. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/hairdresser.png +0 -0
  290. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/harbor.png +0 -0
  291. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/heart.png +0 -0
  292. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/heliport.png +0 -0
  293. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/hospital.png +0 -0
  294. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/ice-cream.png +0 -0
  295. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/industrial.png +0 -0
  296. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/land-use.png +0 -0
  297. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/laundry.png +0 -0
  298. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/library.png +0 -0
  299. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/lighthouse.png +0 -0
  300. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/lodging.png +0 -0
  301. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/logging.png +0 -0
  302. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/london-underground.png +0 -0
  303. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  304. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/marker.png +0 -0
  305. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/minefield.png +0 -0
  306. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/mobilephone.png +0 -0
  307. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/monument.png +0 -0
  308. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/museum.png +0 -0
  309. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/music.png +0 -0
  310. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/oil-well.png +0 -0
  311. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/park.png +0 -0
  312. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/park2.png +0 -0
  313. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/parking-garage.png +0 -0
  314. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/parking.png +0 -0
  315. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/pharmacy.png +0 -0
  316. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/pitch.png +0 -0
  317. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  318. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/playground.png +0 -0
  319. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/police.png +0 -0
  320. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/polling-place.png +0 -0
  321. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/post.png +0 -0
  322. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/prison.png +0 -0
  323. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rail-above.png +0 -0
  324. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rail-light.png +0 -0
  325. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rail-metro.png +0 -0
  326. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rail-underground.png +0 -0
  327. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rail.png +0 -0
  328. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/religious-christian.png +0 -0
  329. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  330. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  331. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/restaurant.png +0 -0
  332. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/roadblock.png +0 -0
  333. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/rocket.png +0 -0
  334. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/school.png +0 -0
  335. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/scooter.png +0 -0
  336. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/shop.png +0 -0
  337. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/skiing.png +0 -0
  338. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  339. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/soccer.png +0 -0
  340. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/square-stroked.png +0 -0
  341. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/square.png +0 -0
  342. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/star-stroked.png +0 -0
  343. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/star.png +0 -0
  344. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/suitcase.png +0 -0
  345. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/swimming.png +0 -0
  346. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/telephone.png +0 -0
  347. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/tennis.png +0 -0
  348. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/theatre.png +0 -0
  349. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/toilets.png +0 -0
  350. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/town-hall.png +0 -0
  351. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/town.png +0 -0
  352. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  353. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/triangle.png +0 -0
  354. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/village.png +0 -0
  355. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/warehouse.png +0 -0
  356. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/waste-basket.png +0 -0
  357. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/water.png +0 -0
  358. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/wetland.png +0 -0
  359. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/maki/zoo.png +0 -0
  360. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/moonSmall.jpg +0 -0
  361. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/pin.svg +0 -0
  362. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/waterNormals.jpg +0 -0
  363. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  364. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Assets/approximateTerrainHeights.json +0 -0
  365. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/Workers/package.json +0 -0
  366. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/Workers/zip-web-worker.js +0 -0
  367. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/basis_transcoder.wasm +0 -0
  368. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/draco_decoder.wasm +0 -0
  369. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/google-earth-dbroot-parser.js +0 -0
  370. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  371. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/ThirdParty/zip-module.wasm +0 -0
  372. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Animation/Animation.css +0 -0
  373. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Animation/lighter.css +0 -0
  374. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +0 -0
  375. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/BaseLayerPicker/lighter.css +0 -0
  376. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
  377. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/CesiumInspector/CesiumInspector.css +0 -0
  378. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/CesiumWidget/CesiumWidget.css +0 -0
  379. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/CesiumWidget/lighter.css +0 -0
  380. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/FullscreenButton/FullscreenButton.css +0 -0
  381. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Geocoder/Geocoder.css +0 -0
  382. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Geocoder/lighter.css +0 -0
  383. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
  384. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  385. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  386. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  387. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  388. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  389. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  390. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  391. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  392. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  393. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  394. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  395. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  396. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  397. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  398. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  399. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  400. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  401. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  402. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  403. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  404. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  405. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  406. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  407. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  408. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  409. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/Mouse.svg +0 -0
  410. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +0 -0
  411. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +0 -0
  412. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg +0 -0
  413. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/Touch.svg +0 -0
  414. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +0 -0
  415. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +0 -0
  416. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +0 -0
  417. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +0 -0
  418. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  419. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  420. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/TimelineIcons.png +0 -0
  421. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Images/info-loading.gif +0 -0
  422. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/InfoBox/InfoBox.css +0 -0
  423. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/InfoBox/InfoBoxDescription.css +0 -0
  424. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +0 -0
  425. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/NavigationHelpButton/lighter.css +0 -0
  426. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
  427. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css +0 -0
  428. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/SceneModePicker/SceneModePicker.css +0 -0
  429. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css +0 -0
  430. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Timeline/Timeline.css +0 -0
  431. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Timeline/lighter.css +0 -0
  432. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/VRButton/VRButton.css +0 -0
  433. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/Viewer/Viewer.css +0 -0
  434. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/VoxelInspector/VoxelInspector.css +0 -0
  435. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/lighter.css +0 -0
  436. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/lighterShared.css +0 -0
  437. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/shared.css +0 -0
  438. /package/dist/cesium/node_modules/.pnpm/{cesium@1.141.0 → cesium@1.142.0}/node_modules/cesium/Build/Cesium/Widgets/widgets.css +0 -0
@@ -0,0 +1,872 @@
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
+ * Space Sketch (DCEL) — interactive test surface for the persistent
7
+ * `SpacePlateHandle` topology editor (rust/geometry `space_dcel`).
8
+ *
9
+ * Self-contained: owns its own wasm handle + local state (no shared slice).
10
+ * Seed from the active storey's walls (or a demo plate), drag a shared vertex
11
+ * (both rooms follow), split a room — between corners OR new nodes added
12
+ * anywhere on a wall — merge two rooms, then Bake to real `IfcSpace` through
13
+ * the viewer's existing `addSpace`.
14
+ *
15
+ * Fluency (RFC §4.2): hover telegraphs the op; dragging snaps to other
16
+ * vertices (Shift = ortho). Undo/redo snapshots the plate via `duplicate()`
17
+ * (each clone owns its heap, freed deterministically — never JS GC). 2D plan
18
+ * sketch; 3D-on-model registration is the next step.
19
+ */
20
+
21
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
22
+ import { useViewerStore } from '@/store';
23
+ import { useConstructionUnderlay } from '@/hooks/useConstructionUnderlay';
24
+ import { useIfc } from '@/hooks/useIfc';
25
+ import init, { SpacePlateHandle } from '@ifc-lite/wasm';
26
+ import {
27
+ extractWallSegmentsForStorey,
28
+ offsetRoomFootprint,
29
+ existingSpaceFootprintsByStorey,
30
+ GENERATED_SPACE_OBJECTTYPE,
31
+ type BoundaryMode,
32
+ } from '@ifc-lite/create';
33
+ import { X, Undo2, Redo2, Building2, Layers } from 'lucide-react';
34
+
35
+ let wasmReady: Promise<void> | null = null;
36
+ function ensureWasm(): Promise<void> {
37
+ if (!wasmReady) wasmReady = init().then(() => undefined);
38
+ return wasmReady;
39
+ }
40
+
41
+ interface Room {
42
+ face: number;
43
+ area: number;
44
+ simple: boolean;
45
+ outline: [number, number][];
46
+ }
47
+ interface Boundary {
48
+ edge: number;
49
+ source: number | null;
50
+ }
51
+ type Mode = 'drag' | 'split' | 'merge';
52
+ type Pt = [number, number];
53
+ type Hover =
54
+ | { kind: 'vertex'; pos: Pt }
55
+ | { kind: 'edge'; edge: number; rooms: number[]; a: Pt; b: Pt }
56
+ | null;
57
+ /** A split endpoint the user picked — an existing corner, or a point on a wall
58
+ * edge (which becomes a new node when the cut is committed). */
59
+ type SplitTarget = { kind: 'vertex'; vid: number; pos: Pt } | { kind: 'edge'; edge: number; pos: Pt };
60
+
61
+ const SVG_W = 580;
62
+ const SVG_H = 460;
63
+ const PAD = 36;
64
+ const PICK_PX = 12;
65
+ const SNAP_PX = 10;
66
+ const MAX_UNDO = 40;
67
+ const BAKE_HEIGHT = 3;
68
+ const EPS = 1e-6;
69
+
70
+ /** Absolute polygon area (shoelace), m². */
71
+ function polyArea(pts: Pt[]): number {
72
+ let a = 0;
73
+ for (let k = 0; k < pts.length; k++) { const p = pts[k], q = pts[(k + 1) % pts.length]; a += p[0] * q[1] - q[0] * p[1]; }
74
+ return Math.abs(a) / 2;
75
+ }
76
+ /** Ray-cast point-in-polygon. */
77
+ function pointInPoly(x: number, y: number, poly: Pt[]): boolean {
78
+ let inside = false;
79
+ for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {
80
+ const xi = poly[i][0], yi = poly[i][1], xj = poly[j][0], yj = poly[j][1];
81
+ if ((yi > y) !== (yj > y) && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;
82
+ }
83
+ return inside;
84
+ }
85
+ const centroid = (pts: Pt[]): Pt => {
86
+ let cx = 0, cy = 0;
87
+ for (const p of pts) { cx += p[0]; cy += p[1]; }
88
+ return [cx / pts.length, cy / pts.length];
89
+ };
90
+
91
+ interface Fit { scale: number; minX: number; minY: number }
92
+
93
+ function computeFit(rooms: Room[]): Fit {
94
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
95
+ for (const r of rooms) for (const [x, y] of r.outline) {
96
+ minX = Math.min(minX, x); minY = Math.min(minY, y);
97
+ maxX = Math.max(maxX, x); maxY = Math.max(maxY, y);
98
+ }
99
+ if (!isFinite(minX)) return { scale: 1, minX: 0, minY: 0 };
100
+ const scale = Math.min((SVG_W - 2 * PAD) / Math.max(maxX - minX, 1e-6), (SVG_H - 2 * PAD) / Math.max(maxY - minY, 1e-6));
101
+ return { scale, minX, minY };
102
+ }
103
+
104
+ const sX = (f: Fit, x: number) => PAD + (x - f.minX) * f.scale;
105
+ const sY = (f: Fit, y: number) => SVG_H - PAD - (y - f.minY) * f.scale;
106
+ const wX = (f: Fit, sx: number) => f.minX + (sx - PAD) / f.scale;
107
+ const wY = (f: Fit, sy: number) => f.minY + (SVG_H - PAD - sy) / f.scale;
108
+
109
+ function distToSeg(px: number, py: number, ax: number, ay: number, bx: number, by: number): number {
110
+ const dx = bx - ax, dy = by - ay;
111
+ const len2 = dx * dx + dy * dy || 1e-9;
112
+ let t = ((px - ax) * dx + (py - ay) * dy) / len2;
113
+ t = Math.max(0, Math.min(1, t));
114
+ return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
115
+ }
116
+
117
+ function projectOnSeg(p: Pt, a: Pt, b: Pt): Pt {
118
+ const dx = b[0] - a[0], dy = b[1] - a[1];
119
+ const len2 = dx * dx + dy * dy || 1e-9;
120
+ let t = ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / len2;
121
+ t = Math.max(0, Math.min(1, t));
122
+ return [a[0] + t * dx, a[1] + t * dy];
123
+ }
124
+
125
+ function uniqueVerts(rooms: Room[]): Pt[] {
126
+ const seen = new Set<string>();
127
+ const out: Pt[] = [];
128
+ for (const r of rooms) for (const p of r.outline) {
129
+ const k = `${p[0].toFixed(4)},${p[1].toFixed(4)}`;
130
+ if (!seen.has(k)) { seen.add(k); out.push(p); }
131
+ }
132
+ return out;
133
+ }
134
+
135
+ const ROOM_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ec4899', '#06b6d4', '#84cc16', '#a855f7', '#ef4444'];
136
+
137
+ export function SpaceSketchOverlay() {
138
+ const setActiveTool = useViewerStore((s) => s.setActiveTool);
139
+ const addSpace = useViewerStore((s) => s.addSpace);
140
+ const removeEntity = useViewerStore((s) => s.removeEntity);
141
+ const activeModelId = useViewerStore((s) => s.activeModelId);
142
+ const { ifcDataStore } = useIfc();
143
+
144
+ const plateRef = useRef<SpacePlateHandle | null>(null);
145
+ const svgRef = useRef<SVGSVGElement | null>(null);
146
+ const panelRef = useRef<HTMLDivElement | null>(null);
147
+ const fitRef = useRef<Fit>({ scale: 1, minX: 0, minY: 0 });
148
+ const rafRef = useRef<number | null>(null);
149
+ const rebuildTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
150
+ const buildSeqRef = useRef(0);
151
+ // IfcSpace expressIds this session created per storey — so a re-bake (or
152
+ // "Generate all") replaces the spaces it dropped instead of duplicating.
153
+ const generatedRef = useRef<Map<number, number[]>>(new Map());
154
+ const moveRef = useRef<{ x: number; y: number; shift: boolean } | null>(null);
155
+
156
+ const dragRef = useRef<number | null>(null);
157
+ const dragStartRef = useRef<Pt | null>(null);
158
+ const otherVertsRef = useRef<Pt[]>([]);
159
+ const pendingUndoRef = useRef<SpacePlateHandle | null>(null);
160
+ const draggedRef = useRef(false);
161
+
162
+ const undoRef = useRef<SpacePlateHandle[]>([]);
163
+ const redoRef = useRef<SpacePlateHandle[]>([]);
164
+
165
+ const [rooms, setRooms] = useState<Room[]>([]);
166
+ const [mode, setMode] = useState<Mode>('drag');
167
+ const [hover, setHover] = useState<Hover>(null);
168
+ const [splitPick, setSplitPick] = useState<SplitTarget | null>(null);
169
+ const [splitHover, setSplitHover] = useState<Pt | null>(null);
170
+ const [snapPos, setSnapPos] = useState<Pt | null>(null);
171
+ const [derivedStorey, setDerivedStorey] = useState<number | null>(null);
172
+ const [snapTol, setSnapTol] = useState<number | null>(null); // null = auto-escalate
173
+ const [usedTol, setUsedTol] = useState(0.1);
174
+ const snapTolRef = useRef<number | null>(null);
175
+ const lastBuildRef = useRef<{ coords: Float64Array; sources: Int32Array; label: string; storey: number | null } | null>(null);
176
+ // Wall segments + thicknesses from the last derive, kept for net-footprint
177
+ // inset at bake (so the IfcSpace solid stops at the inner wall face).
178
+ const extractionRef = useRef<{
179
+ segments: Parameters<typeof offsetRoomFootprint>[1];
180
+ thicknesses: Parameters<typeof offsetRoomFootprint>[2];
181
+ } | null>(null);
182
+ const [hist, setHist] = useState(0);
183
+ const [status, setStatus] = useState('Load the demo plate or derive from a storey.');
184
+ const [showBuilding, setShowBuilding] = useState(true);
185
+ const [boundaryMode, setBoundaryMode] = useState<BoundaryMode>('inner');
186
+
187
+ // Every IfcBuildingStorey with its resolved name + elevation, low → high.
188
+ const storeys = useMemo(() => {
189
+ if (!ifcDataStore) return [] as { id: number; name: string; elev: number }[];
190
+ const elevs = ifcDataStore.spatialHierarchy?.storeyElevations;
191
+ const list = ifcDataStore.getEntitiesByType('IfcBuildingStorey').map((s) => ({
192
+ id: s.expressId,
193
+ name: ifcDataStore.entities.getName(s.expressId) || `Storey #${s.expressId}`,
194
+ elev: elevs?.get(s.expressId) ?? 0,
195
+ }));
196
+ list.sort((a, b) => a.elev - b.elev);
197
+ return list;
198
+ }, [ifcDataStore]);
199
+
200
+ const derivedFloorElev = useMemo(
201
+ () => (derivedStorey == null ? null : storeys.find((s) => s.id === derivedStorey)?.elev ?? null),
202
+ [derivedStorey, storeys],
203
+ );
204
+ const { lines: underlay } = useConstructionUnderlay(showBuilding && rooms.length > 0, derivedFloorElev);
205
+
206
+ // Pre-render the (potentially large) building underlay once per (re)derive,
207
+ // NOT on every drag frame — re-creating hundreds of SVG lines each frame
208
+ // froze the editor (and the runaway drag dragged the room off-canvas). It
209
+ // only changes when the plate is rebuilt, tracked by `hist`.
210
+ const underlayEls = useMemo(() => {
211
+ if (!showBuilding || underlay.length === 0) return null;
212
+ const f = fitRef.current;
213
+ return underlay.map((l, i) => (
214
+ <line key={`b${i}`}
215
+ x1={sX(f, l.a[0])} y1={sY(f, l.a[1])} x2={sX(f, l.b[0])} y2={sY(f, l.b[1])}
216
+ stroke="currentColor"
217
+ strokeOpacity={l.hidden ? 0.16 : 0.34}
218
+ strokeWidth={l.hidden ? 0.8 : 1.1}
219
+ strokeDasharray={l.hidden ? '3 3' : undefined}
220
+ pointerEvents="none" />
221
+ ));
222
+ }, [underlay, showBuilding, hist]);
223
+ const [storeyId, setStoreyId] = useState<number | null>(null);
224
+ const lastDerivedRef = useRef<number | null>(null);
225
+ useEffect(() => {
226
+ if (storeyId == null && storeys.length) setStoreyId(storeys[0].id);
227
+ }, [storeys, storeyId]);
228
+
229
+ // Click anywhere outside the panel closes the tool. Esc closes too.
230
+ useEffect(() => {
231
+ const onDown = (e: PointerEvent) => {
232
+ if (panelRef.current && !panelRef.current.contains(e.target as Node)) setActiveTool('select');
233
+ };
234
+ const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setActiveTool('select'); };
235
+ document.addEventListener('pointerdown', onDown, true);
236
+ document.addEventListener('keydown', onKey);
237
+ return () => {
238
+ document.removeEventListener('pointerdown', onDown, true);
239
+ document.removeEventListener('keydown', onKey);
240
+ };
241
+ }, [setActiveTool]);
242
+
243
+ const refreshRooms = useCallback(() => {
244
+ const plate = plateRef.current;
245
+ if (plate) setRooms(plate.snapshot() as Room[]);
246
+ }, []);
247
+
248
+ const freeHistory = useCallback(() => {
249
+ undoRef.current.forEach((h) => h.free());
250
+ redoRef.current.forEach((h) => h.free());
251
+ undoRef.current = [];
252
+ redoRef.current = [];
253
+ pendingUndoRef.current?.free();
254
+ pendingUndoRef.current = null;
255
+ }, []);
256
+
257
+ const commitUndo = useCallback((snap: SpacePlateHandle) => {
258
+ undoRef.current.push(snap);
259
+ if (undoRef.current.length > MAX_UNDO) undoRef.current.shift()!.free();
260
+ redoRef.current.forEach((h) => h.free());
261
+ redoRef.current = [];
262
+ setHist((v) => v + 1);
263
+ }, []);
264
+
265
+ const resetInteraction = useCallback(() => {
266
+ setHover(null); setSplitPick(null); setSplitHover(null); setSnapPos(null);
267
+ dragRef.current = null; dragStartRef.current = null;
268
+ pendingUndoRef.current?.free(); pendingUndoRef.current = null;
269
+ }, []);
270
+
271
+ const undo = useCallback(() => {
272
+ const plate = plateRef.current;
273
+ if (!plate || !undoRef.current.length) return;
274
+ redoRef.current.push(plate);
275
+ plateRef.current = undoRef.current.pop()!;
276
+ resetInteraction(); refreshRooms(); setHist((v) => v + 1);
277
+ setStatus('Undo.');
278
+ }, [resetInteraction, refreshRooms]);
279
+
280
+ const redo = useCallback(() => {
281
+ const plate = plateRef.current;
282
+ if (!plate || !redoRef.current.length) return;
283
+ undoRef.current.push(plate);
284
+ plateRef.current = redoRef.current.pop()!;
285
+ resetInteraction(); refreshRooms(); setHist((v) => v + 1);
286
+ setStatus('Redo.');
287
+ }, [resetInteraction, refreshRooms]);
288
+
289
+ const buildFrom = useCallback(async (coords: Float64Array, sources: Int32Array, label: string, storey: number | null) => {
290
+ // Re-entrancy guard: a rapid rebuild (snap slider) must not let an older
291
+ // async build free/replace the plate a newer one is using — that races the
292
+ // shared wasm heap. Only the latest build applies; superseded ones bail.
293
+ const seq = ++buildSeqRef.current;
294
+ try {
295
+ await ensureWasm();
296
+ if (seq !== buildSeqRef.current) return;
297
+ plateRef.current?.free();
298
+ freeHistory();
299
+ // Real wall centrelines don't meet exactly at corners — they're offset
300
+ // by ~half the wall thickness. A tight snap leaves the loop open (0
301
+ // rooms). Auto-escalate: take the first tolerance that encloses rooms,
302
+ // else the largest tried (least surprising than silently finding none).
303
+ lastBuildRef.current = { coords, sources, label, storey };
304
+ const manual = snapTolRef.current;
305
+ let plate: SpacePlateHandle | null = null;
306
+ let used = 0.1;
307
+ if (manual != null) {
308
+ plate = new SpacePlateHandle(coords, sources, manual, 0.5);
309
+ used = manual;
310
+ } else {
311
+ for (const tol of [0.1, 0.25, 0.5]) {
312
+ const p = new SpacePlateHandle(coords, sources, tol, 0.5);
313
+ plate?.free();
314
+ plate = p;
315
+ used = tol;
316
+ if (p.roomCount > 0) break;
317
+ }
318
+ }
319
+ if (seq !== buildSeqRef.current) { plate?.free(); return; }
320
+ plateRef.current = plate!;
321
+ setUsedTol(used);
322
+ const snap = plate!.snapshot() as Room[];
323
+ fitRef.current = computeFit(snap);
324
+ resetInteraction();
325
+ setDerivedStorey(storey);
326
+ setRooms(snap); setHist((v) => v + 1);
327
+ const total = snap.reduce((s, r) => s + r.area, 0);
328
+ setStatus(`${label}: ${snap.length} room(s), ${total.toFixed(1)} m² · snap ${used}m${manual == null ? ' (auto)' : ''}.`);
329
+ } catch (e) {
330
+ setStatus(`Build failed: ${String(e)}`);
331
+ }
332
+ }, [freeHistory, resetInteraction]);
333
+
334
+ // Manual snap override (null → back to auto-escalate). Rebuilds the current
335
+ // plate from its source segments at the chosen tolerance.
336
+ const rebuildWithSnap = useCallback((tol: number | null) => {
337
+ snapTolRef.current = tol;
338
+ setSnapTol(tol);
339
+ if (tol != null) setUsedTol(tol); // move the slider thumb/label immediately
340
+ // Debounce the actual rebuild: the range input fires onChange on every
341
+ // tick, and buildFrom is async + frees/creates wasm handles — rebuilding
342
+ // per tick raced the shared heap and froze the editor. Rebuild once the
343
+ // slider settles.
344
+ if (rebuildTimerRef.current) clearTimeout(rebuildTimerRef.current);
345
+ rebuildTimerRef.current = setTimeout(() => {
346
+ rebuildTimerRef.current = null;
347
+ const lb = lastBuildRef.current;
348
+ if (lb) void buildFrom(lb.coords, lb.sources, lb.label, lb.storey);
349
+ }, 180);
350
+ }, [buildFrom]);
351
+
352
+ const deriveFromStorey = useCallback(async () => {
353
+ if (!ifcDataStore || storeyId == null) { setStatus('No model / storey to derive from.'); return; }
354
+ try {
355
+ const { segments, considered, skipped, wallThicknesses } = extractWallSegmentsForStorey(ifcDataStore, storeyId);
356
+ if (!segments.length) {
357
+ setStatus(`No wall axes on storey ${storeyId} (${considered} walls, ${skipped.length} skipped).`);
358
+ return;
359
+ }
360
+ extractionRef.current = { segments, thicknesses: wallThicknesses };
361
+ const coords = new Float64Array(segments.length * 4);
362
+ const sources = new Int32Array(segments.length).fill(-1);
363
+ segments.forEach((s, i) => {
364
+ coords[i * 4] = s.a[0]; coords[i * 4 + 1] = s.a[1];
365
+ coords[i * 4 + 2] = s.b[0]; coords[i * 4 + 3] = s.b[1];
366
+ });
367
+ const name = ifcDataStore.entities.getName(storeyId) || `Storey #${storeyId}`;
368
+ await buildFrom(coords, sources, name, storeyId);
369
+ } catch (e) {
370
+ setStatus(`Derive failed: ${String(e)}`);
371
+ }
372
+ }, [ifcDataStore, storeyId, buildFrom]);
373
+
374
+ // Auto-detect: derive rooms the moment a storey is chosen (and on open, when
375
+ // the first storey auto-selects) so the user doesn't have to click Derive.
376
+ // Guarded so it fires once per storey, and never clobbers a loaded demo.
377
+ useEffect(() => {
378
+ if (storeyId != null && ifcDataStore && lastDerivedRef.current !== storeyId) {
379
+ lastDerivedRef.current = storeyId;
380
+ void deriveFromStorey();
381
+ }
382
+ }, [storeyId, ifcDataStore, deriveFromStorey]);
383
+
384
+ const floorToFloor = useCallback((sid: number): number => {
385
+ const idx = storeys.findIndex((s) => s.id === sid);
386
+ const next = idx >= 0 ? storeys[idx + 1] : undefined;
387
+ const ff = next ? next.elev - storeys[idx].elev : BAKE_HEIGHT;
388
+ return ff > 0.1 && ff < 50 ? ff : BAKE_HEIGHT;
389
+ }, [storeys]);
390
+
391
+ /**
392
+ * IfcSpace is class-hidden by default (TYPE_VISIBILITY_SEMANTIC_DEFAULTS).
393
+ * Flip the toggle on after a successful bake so the user sees what they
394
+ * just created — and, since the toggle persists, so the spaces are still
395
+ * visible when the exported file is reopened.
396
+ */
397
+ const revealSpaces = useCallback(() => {
398
+ const s = useViewerStore.getState();
399
+ if (!s.typeVisibility.spaces) s.toggleTypeVisibility('spaces');
400
+ }, []);
401
+
402
+ /**
403
+ * Bake one storey's rooms to IfcSpace — the single path both "Bake" and
404
+ * "Generate all" use, so they're consistent. (1) Replace: remove the spaces
405
+ * this session previously dropped on the storey. (2) Skip rooms that overlap
406
+ * an existing authored space (dedup). (3) Emit each via `addSpace`, which
407
+ * mirrors a mesh into the 3D scene immediately. Net (inner-face) outline,
408
+ * floor-to-floor height. Returns counts.
409
+ */
410
+ const bakeStorey = useCallback((
411
+ sid: number,
412
+ outlines: Pt[][],
413
+ segments: Parameters<typeof offsetRoomFootprint>[1] | undefined,
414
+ thicknesses: Parameters<typeof offsetRoomFootprint>[2] | undefined,
415
+ authored: Pt[][],
416
+ ): { emitted: number; skipped: number; error: string | null } => {
417
+ if (!activeModelId) return { emitted: 0, skipped: 0, error: null };
418
+ for (const id of generatedRef.current.get(sid) ?? []) removeEntity(activeModelId, id);
419
+ generatedRef.current.delete(sid);
420
+ const height = floorToFloor(sid);
421
+ const newIds: number[] = [];
422
+ let skipped = 0;
423
+ // An addSpace failure (anchor resolution, missing mutation view, …) is
424
+ // NOT an "already a space" skip — keep the first error so the status
425
+ // line tells the user the truth instead of silently dropping spaces
426
+ // that would then be missing from the export.
427
+ let error: string | null = null;
428
+ for (let oi = 0; oi < outlines.length; oi++) {
429
+ const outline = outlines[oi];
430
+ const [cx, cy] = centroid(outline);
431
+ if (authored.some((fp) => pointInPoly(cx, cy, fp))) { skipped++; continue; }
432
+ const others = outlines.filter((_, j) => j !== oi);
433
+ const inset = segments && thicknesses ? offsetRoomFootprint(outline, segments, thicknesses, boundaryMode, others) : outline;
434
+ const res = addSpace(activeModelId, sid, {
435
+ Profile: 'polygon', OuterCurve: inset, Height: height,
436
+ Name: `Space ${newIds.length + 1}`, ObjectType: GENERATED_SPACE_OBJECTTYPE,
437
+ grossFloorArea: polyArea(outline),
438
+ });
439
+ if (res && 'expressId' in res) newIds.push(res.expressId);
440
+ else error ??= (res && 'error' in res ? res.error : 'unknown error');
441
+ }
442
+ generatedRef.current.set(sid, newIds);
443
+ return { emitted: newIds.length, skipped, error };
444
+ }, [activeModelId, removeEntity, addSpace, floorToFloor, boundaryMode]);
445
+
446
+ const bake = useCallback(() => {
447
+ const plate = plateRef.current;
448
+ if (!plate || !activeModelId || derivedStorey == null || !ifcDataStore) {
449
+ setStatus('Derive a storey first.');
450
+ return;
451
+ }
452
+ const outlines = (plate.snapshot() as Room[]).map((r) => r.outline);
453
+ const ext = extractionRef.current;
454
+ const authored = existingSpaceFootprintsByStorey(ifcDataStore).get(derivedStorey) ?? [];
455
+ const { emitted, skipped, error } = bakeStorey(derivedStorey, outlines, ext?.segments, ext?.thicknesses, authored);
456
+ if (emitted > 0) revealSpaces();
457
+ setStatus(error
458
+ ? `Baked ${emitted} IfcSpace — others failed: ${error}`
459
+ : `Baked ${emitted} IfcSpace${skipped ? `, skipped ${skipped} (already a space)` : ''}.`);
460
+ }, [activeModelId, derivedStorey, ifcDataStore, bakeStorey, revealSpaces]);
461
+
462
+ const bakeWholeBuilding = useCallback(async () => {
463
+ if (!activeModelId || !ifcDataStore) { setStatus('No model loaded.'); return; }
464
+ setStatus('Generating spaces for every storey…');
465
+ await ensureWasm();
466
+ const authoredMap = existingSpaceFootprintsByStorey(ifcDataStore);
467
+ let totalEmitted = 0, totalSkipped = 0, floors = 0;
468
+ let firstError: string | null = null;
469
+ for (const st of storeys) {
470
+ const { segments, wallThicknesses } = extractWallSegmentsForStorey(ifcDataStore, st.id);
471
+ if (!segments.length) continue;
472
+ const coords = new Float64Array(segments.length * 4);
473
+ const sources = new Int32Array(segments.length).fill(-1);
474
+ segments.forEach((s, i) => { coords[i * 4] = s.a[0]; coords[i * 4 + 1] = s.a[1]; coords[i * 4 + 2] = s.b[0]; coords[i * 4 + 3] = s.b[1]; });
475
+ let plate: SpacePlateHandle | null = null;
476
+ for (const tol of [0.1, 0.25, 0.5]) {
477
+ const p = new SpacePlateHandle(coords, sources, tol, 0.5);
478
+ plate?.free();
479
+ plate = p;
480
+ if (p.roomCount > 0) break;
481
+ }
482
+ const outlines = (plate!.snapshot() as Room[]).map((r) => r.outline);
483
+ plate!.free();
484
+ if (!outlines.length) continue;
485
+ const { emitted, skipped, error } = bakeStorey(st.id, outlines, segments, wallThicknesses, authoredMap.get(st.id) ?? []);
486
+ totalEmitted += emitted; totalSkipped += skipped;
487
+ firstError ??= error;
488
+ if (emitted) floors++;
489
+ }
490
+ if (totalEmitted > 0) revealSpaces();
491
+ setStatus(firstError
492
+ ? `Generated ${totalEmitted} IfcSpace — others failed: ${firstError}`
493
+ : `Generated ${totalEmitted} IfcSpace across ${floors} storey(s)${totalSkipped ? `; skipped ${totalSkipped} existing` : ''}.`);
494
+ }, [activeModelId, ifcDataStore, storeys, bakeStorey, revealSpaces]);
495
+
496
+ useEffect(() => () => {
497
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
498
+ if (rebuildTimerRef.current) clearTimeout(rebuildTimerRef.current);
499
+ freeHistory();
500
+ plateRef.current?.free();
501
+ plateRef.current = null;
502
+ }, [freeHistory]);
503
+
504
+ const svgPoint = (e: React.PointerEvent): Pt => {
505
+ const rect = svgRef.current!.getBoundingClientRect();
506
+ // Clamp to the canvas: during a drag the pointer is captured, so moving it
507
+ // past the panel (e.g. dragging a vertex down off the bottom) would report
508
+ // coordinates far outside the SVG → a huge off-screen world position. That
509
+ // pushed the room off-canvas ("disappears") and made the SVG rasterise a
510
+ // polygon spanning to extreme coordinates, freezing the browser.
511
+ return [
512
+ Math.max(0, Math.min(SVG_W, e.clientX - rect.left)),
513
+ Math.max(0, Math.min(SVG_H, e.clientY - rect.top)),
514
+ ];
515
+ };
516
+
517
+ const pickVertex = useCallback((wx: number, wy: number): number | null => {
518
+ const plate = plateRef.current;
519
+ if (!plate) return null;
520
+ const v = plate.findVertexNear(wx, wy, PICK_PX / fitRef.current.scale);
521
+ return v === undefined ? null : v;
522
+ }, []);
523
+
524
+ const nearestVertPos = useCallback((wx: number, wy: number): Pt | null => {
525
+ let best: Pt | null = null, bestD = PICK_PX / fitRef.current.scale;
526
+ for (const r of rooms) for (const p of r.outline) {
527
+ const d = Math.hypot(p[0] - wx, p[1] - wy);
528
+ if (d < bestD) { bestD = d; best = p; }
529
+ }
530
+ return best;
531
+ }, [rooms]);
532
+
533
+ const pickEdge = useCallback((wx: number, wy: number): { face: number; edge: number; a: Pt; b: Pt } | null => {
534
+ const plate = plateRef.current;
535
+ if (!plate) return null;
536
+ const tol = PICK_PX / fitRef.current.scale;
537
+ let best: { face: number; edge: number; a: Pt; b: Pt; d: number } | null = null;
538
+ for (const r of rooms) {
539
+ const bounds = plate.boundingElements(r.face) as Boundary[];
540
+ const n = r.outline.length;
541
+ for (let i = 0; i < n; i++) {
542
+ const a = r.outline[i], b = r.outline[(i + 1) % n];
543
+ const d = distToSeg(wx, wy, a[0], a[1], b[0], b[1]);
544
+ if (d <= tol && (!best || d < best.d) && bounds[i]) best = { face: r.face, edge: bounds[i].edge, a, b, d };
545
+ }
546
+ }
547
+ return best ? { face: best.face, edge: best.edge, a: best.a, b: best.b } : null;
548
+ }, [rooms]);
549
+
550
+ // Resolve a click to a split endpoint: snap to an existing corner, else a
551
+ // point projected onto the nearest wall edge (a new node on commit).
552
+ const resolveSplitTarget = useCallback((wx: number, wy: number): SplitTarget | null => {
553
+ const v = pickVertex(wx, wy);
554
+ if (v != null) { const pos = nearestVertPos(wx, wy); return pos ? { kind: 'vertex', vid: v, pos } : null; }
555
+ const e = pickEdge(wx, wy);
556
+ if (e) return { kind: 'edge', edge: e.edge, pos: projectOnSeg([wx, wy], e.a, e.b) };
557
+ return null;
558
+ }, [pickVertex, nearestVertPos, pickEdge]);
559
+
560
+ // Commit a split between two targets, inserting nodes for edge endpoints.
561
+ // The whole gesture is atomic: on any failure the inserted nodes roll back.
562
+ const performSplit = useCallback((first: SplitTarget, second: SplitTarget) => {
563
+ const plate = plateRef.current;
564
+ if (!plate) return;
565
+ if (first.kind === 'edge' && second.kind === 'edge' && first.edge === second.edge) {
566
+ setStatus('Pick points on two different edges (or corners).'); return;
567
+ }
568
+ const snapshot = plate.duplicate();
569
+ try {
570
+ const va = first.kind === 'vertex' ? first.vid : plate.splitEdge(first.edge, first.pos[0], first.pos[1]);
571
+ const vb = second.kind === 'vertex' ? second.vid : plate.splitEdge(second.edge, second.pos[0], second.pos[1]);
572
+ if (va === vb) throw new Error('DegenerateCut: same point');
573
+ const fresh = plate.snapshot() as Room[];
574
+ const onBoundary = (r: Room, p: Pt) => r.outline.some((q) => Math.abs(q[0] - p[0]) < EPS && Math.abs(q[1] - p[1]) < EPS);
575
+ const room = fresh.find((r) => onBoundary(r, first.pos) && onBoundary(r, second.pos));
576
+ if (!room) throw new Error('points are not on the same room');
577
+ plate.splitFace(room.face, va, vb, -1);
578
+ } catch (err) {
579
+ plate.free();
580
+ plateRef.current = snapshot; // roll back inserted nodes + partial cut
581
+ refreshRooms();
582
+ setStatus(`Split rejected: ${String(err).replace(/^Error:\s*/, '')}`);
583
+ return;
584
+ }
585
+ commitUndo(snapshot);
586
+ refreshRooms();
587
+ setStatus(`Split — ${plate.roomCount} room(s).`);
588
+ }, [commitUndo, refreshRooms]);
589
+
590
+ const processMove = useCallback(() => {
591
+ rafRef.current = null;
592
+ const m = moveRef.current;
593
+ const plate = plateRef.current;
594
+ if (!m || !plate) return;
595
+ const wx = wX(fitRef.current, m.x), wy = wY(fitRef.current, m.y);
596
+
597
+ const vid = dragRef.current;
598
+ if (vid != null) {
599
+ draggedRef.current = true;
600
+ let tx = wx, ty = wy;
601
+ if (m.shift && dragStartRef.current) {
602
+ const [ox, oy] = dragStartRef.current;
603
+ if (Math.abs(wx - ox) >= Math.abs(wy - oy)) ty = oy; else tx = ox;
604
+ }
605
+ const tol = SNAP_PX / fitRef.current.scale;
606
+ let snapped: Pt | null = null, bestD = tol;
607
+ for (const p of otherVertsRef.current) {
608
+ const d = Math.hypot(p[0] - tx, p[1] - ty);
609
+ if (d < bestD) { bestD = d; snapped = p; }
610
+ }
611
+ if (snapped) { tx = snapped[0]; ty = snapped[1]; }
612
+ setSnapPos(snapped);
613
+ try {
614
+ plate.dragVertex(vid, tx, ty);
615
+ refreshRooms();
616
+ } catch (e) {
617
+ console.debug('[space-sketch] dragVertex failed (plate torn down mid-drag?)', e);
618
+ }
619
+ return;
620
+ }
621
+
622
+ if (mode === 'merge') {
623
+ const e = pickEdge(wx, wy);
624
+ if (e) {
625
+ const nbr = plate.neighborAcross(e.edge);
626
+ setHover({ kind: 'edge', edge: e.edge, rooms: [e.face, ...(nbr !== undefined ? [nbr] : [])], a: e.a, b: e.b });
627
+ } else setHover(null);
628
+ } else if (mode === 'split') {
629
+ const t = resolveSplitTarget(wx, wy);
630
+ setSplitHover(t ? t.pos : null);
631
+ setHover(t && t.kind === 'vertex' ? { kind: 'vertex', pos: t.pos } : null);
632
+ } else {
633
+ const v = pickVertex(wx, wy);
634
+ const pos = v != null ? nearestVertPos(wx, wy) : null;
635
+ setHover(v != null && pos ? { kind: 'vertex', pos } : null);
636
+ }
637
+ }, [mode, pickEdge, pickVertex, nearestVertPos, resolveSplitTarget, refreshRooms]);
638
+
639
+ const onPointerMove = useCallback((e: React.PointerEvent) => {
640
+ const [x, y] = svgPoint(e);
641
+ moveRef.current = { x, y, shift: e.shiftKey };
642
+ if (rafRef.current == null) rafRef.current = requestAnimationFrame(processMove);
643
+ }, [processMove]);
644
+
645
+ const onPointerDown = useCallback((e: React.PointerEvent) => {
646
+ const plate = plateRef.current;
647
+ if (!plate) return;
648
+ const [sx, sy] = svgPoint(e);
649
+ const wx = wX(fitRef.current, sx), wy = wY(fitRef.current, sy);
650
+
651
+ if (mode === 'drag') {
652
+ const v = pickVertex(wx, wy);
653
+ if (v == null) return;
654
+ const start = nearestVertPos(wx, wy);
655
+ dragRef.current = v;
656
+ dragStartRef.current = start;
657
+ draggedRef.current = false;
658
+ pendingUndoRef.current = plate.duplicate();
659
+ otherVertsRef.current = start
660
+ ? uniqueVerts(rooms).filter((p) => Math.hypot(p[0] - start[0], p[1] - start[1]) > 1e-6)
661
+ : uniqueVerts(rooms);
662
+ svgRef.current?.setPointerCapture(e.pointerId);
663
+ return;
664
+ }
665
+ if (mode === 'merge') {
666
+ const hit = pickEdge(wx, wy);
667
+ if (!hit) { setStatus('No edge under cursor.'); return; }
668
+ const snap = plate.duplicate();
669
+ try {
670
+ plate.mergeFaces(hit.edge);
671
+ commitUndo(snap); refreshRooms(); setHover(null);
672
+ setStatus(`Merged across wall — ${plate.roomCount} room(s) left.`);
673
+ } catch (err) {
674
+ // Roll back to the pre-merge snapshot (mirror performSplit) in case
675
+ // mergeFaces mutated before throwing.
676
+ plate.free();
677
+ plateRef.current = snap;
678
+ refreshRooms();
679
+ setStatus(`Merge rejected: ${String(err).replace(/^Error:\s*/, '')}`);
680
+ }
681
+ return;
682
+ }
683
+ if (mode === 'split') {
684
+ const target = resolveSplitTarget(wx, wy);
685
+ if (!target) { setStatus('Click a corner or anywhere on a wall.'); return; }
686
+ if (!splitPick) { setSplitPick(target); setStatus('Pick the second point (corner or wall) on the same room.'); return; }
687
+ const first = splitPick;
688
+ setSplitPick(null);
689
+ performSplit(first, target);
690
+ }
691
+ }, [mode, pickVertex, nearestVertPos, pickEdge, rooms, splitPick, resolveSplitTarget, performSplit, commitUndo, refreshRooms]);
692
+
693
+ const endDrag = useCallback((e: React.PointerEvent) => {
694
+ if (dragRef.current == null) return;
695
+ dragRef.current = null; dragStartRef.current = null; setSnapPos(null);
696
+ svgRef.current?.releasePointerCapture(e.pointerId);
697
+ if (draggedRef.current && pendingUndoRef.current) commitUndo(pendingUndoRef.current);
698
+ else pendingUndoRef.current?.free();
699
+ pendingUndoRef.current = null;
700
+ const total = rooms.reduce((s, r) => s + r.area, 0);
701
+ if (draggedRef.current) setStatus(`Drag done — ${rooms.length} room(s), ${total.toFixed(1)} m² (conserved).`);
702
+ }, [rooms, commitUndo]);
703
+
704
+ const f = fitRef.current;
705
+ const total = rooms.reduce((s, r) => s + r.area, 0);
706
+ const mergeRooms = hover?.kind === 'edge' ? new Set(hover.rooms) : null;
707
+ const cursorWorld = moveRef.current ? [wX(f, moveRef.current.x), wY(f, moveRef.current.y)] as Pt : null;
708
+ const cursor = dragRef.current != null ? 'grabbing' : (mode === 'drag' && hover?.kind === 'vertex') ? 'grab' : 'crosshair';
709
+ const canUndo = undoRef.current.length > 0;
710
+ const canRedo = redoRef.current.length > 0;
711
+ void hist;
712
+
713
+ const gridStep = f.scale > 14 ? 1 : f.scale > 5 ? 2 : 5;
714
+ const gridLines: { x1: number; y1: number; x2: number; y2: number }[] = [];
715
+ if (rooms.length) {
716
+ const gx0 = Math.floor(wX(f, PAD) / gridStep) * gridStep;
717
+ const gx1 = Math.ceil(wX(f, SVG_W - PAD) / gridStep) * gridStep;
718
+ const gy0 = Math.floor(wY(f, SVG_H - PAD) / gridStep) * gridStep;
719
+ const gy1 = Math.ceil(wY(f, PAD) / gridStep) * gridStep;
720
+ for (let x = gx0; x <= gx1; x += gridStep) gridLines.push({ x1: sX(f, x), y1: PAD, x2: sX(f, x), y2: SVG_H - PAD });
721
+ for (let y = gy0; y <= gy1; y += gridStep) gridLines.push({ x1: PAD, y1: sY(f, y), x2: SVG_W - PAD, y2: sY(f, y) });
722
+ }
723
+
724
+ const iconBtn = 'inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-40';
725
+ const previewEnd = splitHover ?? cursorWorld;
726
+ // The 2D preview (and bake) show the room at the chosen wall boundary; the
727
+ // editable vertices stay on the centreline (the topology). `center` shows the
728
+ // raw centreline.
729
+ const ext = extractionRef.current;
730
+ const displayOutline = (outline: Pt[], others: Pt[][]): Pt[] =>
731
+ boundaryMode === 'center' || !ext ? outline : offsetRoomFootprint(outline, ext.segments, ext.thicknesses, boundaryMode, others);
732
+
733
+ return (
734
+ <div ref={panelRef} className="absolute left-1/2 top-4 -translate-x-1/2 z-30 rounded-xl border bg-background/95 shadow-xl backdrop-blur p-3 select-none pointer-events-auto"
735
+ style={{ width: SVG_W + 24 }}>
736
+ <div className="flex items-center justify-between mb-2.5">
737
+ <div className="flex items-center gap-2 text-sm font-semibold">
738
+ <Layers className="h-4 w-4 text-muted-foreground" /> Space Sketch
739
+ </div>
740
+ <button className={iconBtn} onClick={() => setActiveTool('select')} title="Close (Esc)"><X className="h-4 w-4" /></button>
741
+ </div>
742
+
743
+ {/* Storey + whole-building */}
744
+ <div className="flex items-center gap-2 mb-2">
745
+ <select className="h-8 flex-1 min-w-0 rounded-md border bg-background px-2 text-xs" value={storeyId ?? ''}
746
+ onChange={(e) => setStoreyId(Number(e.target.value))} disabled={!storeys.length}>
747
+ {storeys.length ? storeys.map((s) => <option key={s.id} value={s.id}>{s.name}</option>) : <option>no model</option>}
748
+ </select>
749
+ <button className="h-8 shrink-0 rounded-md bg-indigo-600 px-3 text-xs font-medium text-white hover:bg-indigo-700 disabled:opacity-40"
750
+ onClick={() => void bakeWholeBuilding()} disabled={!activeModelId}
751
+ title="Create IfcSpace for every storey at once — auto floor-to-floor height, skips rooms that already have a space">Generate all</button>
752
+ </div>
753
+
754
+ {/* Edit: mode + history */}
755
+ <div className="flex items-center gap-1.5 mb-2">
756
+ <div className="inline-flex rounded-md border p-0.5">
757
+ {(['drag', 'split', 'merge'] as Mode[]).map((m) => (
758
+ <button key={m}
759
+ className={`rounded px-2 py-0.5 text-xs capitalize transition-colors ${mode === m ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'}`}
760
+ onClick={() => { setMode(m); setSplitPick(null); setSplitHover(null); setHover(null); }}
761
+ disabled={!rooms.length}>{m}</button>
762
+ ))}
763
+ </div>
764
+ <button className={iconBtn} onClick={undo} disabled={!canUndo} title="Undo"><Undo2 className="h-4 w-4" /></button>
765
+ <button className={iconBtn} onClick={redo} disabled={!canRedo} title="Redo"><Redo2 className="h-4 w-4" /></button>
766
+ <div className="ml-auto flex items-center gap-1.5 text-[11px] text-muted-foreground"
767
+ title="Corner-closing tolerance — larger closes bigger gaps but can over-merge">
768
+ <span>snap</span>
769
+ <input type="range" min={0.05} max={1} step={0.05} value={usedTol} className="w-20 accent-primary"
770
+ disabled={derivedStorey == null} onChange={(e) => rebuildWithSnap(Number(e.target.value))} />
771
+ <button className="tabular-nums hover:text-foreground" onClick={() => rebuildWithSnap(null)}
772
+ title="Reset to automatic snap">{usedTol.toFixed(2)}m{snapTol == null ? '·a' : ''}</button>
773
+ </div>
774
+ </div>
775
+
776
+ {/* View: boundary relative to walls + building underlay */}
777
+ <div className="flex items-center gap-2 mb-2 text-[11px] text-muted-foreground">
778
+ <span title="Where the space boundary sits relative to its walls — drives the 2D preview and the bake">Boundary</span>
779
+ <div className="inline-flex rounded-md border p-0.5">
780
+ {(['center', 'inner', 'outer'] as BoundaryMode[]).map((m) => (
781
+ <button key={m}
782
+ className={`rounded px-2 py-0.5 capitalize transition-colors ${boundaryMode === m ? 'bg-primary text-primary-foreground' : 'hover:text-foreground'}`}
783
+ onClick={() => setBoundaryMode(m)}
784
+ title={m === 'center' ? 'Wall centreline' : m === 'inner' ? 'Inner (net) face' : 'Outer (gross) face'}>{m}</button>
785
+ ))}
786
+ </div>
787
+ <button className={`${iconBtn} ml-auto ${showBuilding ? 'bg-primary/10 text-primary hover:bg-primary/15' : ''}`}
788
+ onClick={() => setShowBuilding((v) => !v)}
789
+ title="Show surrounding building elements (plan cut ~1.2 m above the floor)"><Building2 className="h-4 w-4" /></button>
790
+ </div>
791
+
792
+ <svg ref={svgRef} width={SVG_W} height={SVG_H} style={{ cursor }}
793
+ className="rounded border bg-muted/20 touch-none"
794
+ onPointerDown={onPointerDown} onPointerMove={onPointerMove} onPointerUp={endDrag}
795
+ onPointerLeave={() => { setHover(null); setSplitHover(null); }}>
796
+ {gridLines.map((l, i) => <line key={`g${i}`} {...l} stroke="currentColor" strokeOpacity={0.06} strokeWidth={1} />)}
797
+
798
+ {/* Building-element underlay (plan cut ~1.2 m above the storey) for orientation. */}
799
+ {underlayEls}
800
+
801
+ {rooms.map((r, ri) => {
802
+ const color = ROOM_COLORS[ri % ROOM_COLORS.length];
803
+ const disp = displayOutline(r.outline, rooms.filter((_, j) => j !== ri).map((x) => x.outline));
804
+ const pts = disp.map((p) => `${sX(f, p[0])},${sY(f, p[1])}`).join(' ');
805
+ const [cwx, cwy] = centroid(disp);
806
+ const cx = sX(f, cwx), cy = sY(f, cwy);
807
+ const lit = mergeRooms?.has(r.face);
808
+ const bad = !r.simple;
809
+ const area = boundaryMode === 'center' ? r.area : polyArea(disp);
810
+ return (
811
+ <g key={r.face}>
812
+ {boundaryMode !== 'center' && (
813
+ <polygon points={r.outline.map((p) => `${sX(f, p[0])},${sY(f, p[1])}`).join(' ')}
814
+ fill="none" stroke={color} strokeOpacity={0.25} strokeDasharray="3 3" strokeWidth={1} />
815
+ )}
816
+ <polygon points={pts} fill={bad ? '#ef4444' : color} fillOpacity={lit ? 0.42 : bad ? 0.3 : 0.16}
817
+ stroke={bad ? '#ef4444' : color} strokeWidth={lit ? 3 : 2} />
818
+ <text x={cx} y={cy - 5} textAnchor="middle" fontSize={12} fontWeight={600} fill="currentColor" className="pointer-events-none">{area.toFixed(2)}</text>
819
+ <text x={cx} y={cy + 9} textAnchor="middle" fontSize={9} fill="currentColor" opacity={0.55} className="pointer-events-none">m²</text>
820
+ </g>
821
+ );
822
+ })}
823
+
824
+ {hover?.kind === 'edge' && (
825
+ <line x1={sX(f, hover.a[0])} y1={sY(f, hover.a[1])} x2={sX(f, hover.b[0])} y2={sY(f, hover.b[1])} stroke="#ef4444" strokeWidth={4} strokeLinecap="round" />
826
+ )}
827
+ {splitPick && previewEnd && (
828
+ <line x1={sX(f, splitPick.pos[0])} y1={sY(f, splitPick.pos[1])} x2={sX(f, previewEnd[0])} y2={sY(f, previewEnd[1])}
829
+ stroke="#3b82f6" strokeWidth={1.5} strokeDasharray="5 4" />
830
+ )}
831
+ {/* split candidate node (corner or new node on a wall) */}
832
+ {mode === 'split' && splitHover && (
833
+ <circle cx={sX(f, splitHover[0])} cy={sY(f, splitHover[1])} r={5} fill="#3b82f6" fillOpacity={0.5} stroke="#3b82f6" strokeWidth={1.5} pointerEvents="none" />
834
+ )}
835
+ {/* first committed split pick */}
836
+ {splitPick && (
837
+ <circle cx={sX(f, splitPick.pos[0])} cy={sY(f, splitPick.pos[1])} r={5} fill="#3b82f6" stroke="#fff" strokeWidth={1.5} pointerEvents="none" />
838
+ )}
839
+ {snapPos && (
840
+ <g pointerEvents="none">
841
+ <circle cx={sX(f, snapPos[0])} cy={sY(f, snapPos[1])} r={9} fill="none" stroke="#22c55e" strokeWidth={1.5} />
842
+ <circle cx={sX(f, snapPos[0])} cy={sY(f, snapPos[1])} r={2.5} fill="#22c55e" />
843
+ </g>
844
+ )}
845
+
846
+ {uniqueVerts(rooms).map((p, i) => {
847
+ const isHover = hover?.kind === 'vertex' && Math.abs(hover.pos[0] - p[0]) < EPS && Math.abs(hover.pos[1] - p[1]) < EPS;
848
+ return (
849
+ <circle key={i} cx={sX(f, p[0])} cy={sY(f, p[1])} r={isHover ? 6 : 4}
850
+ fill={isHover ? '#fbbf24' : '#fff'} stroke="#334155" strokeWidth={1.5} pointerEvents="none" />
851
+ );
852
+ })}
853
+ </svg>
854
+
855
+ <div className="mt-2.5 flex items-center gap-2">
856
+ <button className="h-8 shrink-0 rounded-md bg-emerald-600 px-3 text-xs font-medium text-white hover:bg-emerald-700 disabled:opacity-40"
857
+ onClick={bake} disabled={derivedStorey == null || !rooms.length}
858
+ title="Write this storey's rooms as IfcSpace — replaces any this tool already dropped here">Bake storey</button>
859
+ <div className="min-w-0 flex-1 text-right text-xs text-muted-foreground leading-tight">
860
+ <div>{rooms.length} room(s) · {total.toFixed(1)} m²</div>
861
+ {status && <div className="truncate">{status}</div>}
862
+ </div>
863
+ </div>
864
+ <div className="mt-1.5 text-[11px] text-muted-foreground">
865
+ {!rooms.length && 'Pick a storey to derive its rooms, or “Generate all” for the whole building.'}
866
+ {!!rooms.length && mode === 'drag' && 'Drag a vertex — shared vertices move both rooms; snaps to others, Shift = ortho.'}
867
+ {!!rooms.length && mode === 'split' && 'Click two points — corners or anywhere on a wall (new nodes added as needed).'}
868
+ {!!rooms.length && mode === 'merge' && 'Hover highlights the wall + both rooms; click to merge them.'}
869
+ </div>
870
+ </div>
871
+ );
872
+ }