@pascal-app/nodes 1.0.0-beta.5 → 1.0.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 (831) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +1 -1
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  102. package/dist/cabinet/compartment-card.js +11 -3
  103. package/dist/cabinet/continuous-placement.d.ts +3 -0
  104. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  105. package/dist/cabinet/continuous-placement.js +6 -0
  106. package/dist/cabinet/definition.d.ts.map +1 -1
  107. package/dist/cabinet/definition.js +400 -54
  108. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  109. package/dist/cabinet/floorplan-move.js +91 -22
  110. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  111. package/dist/cabinet/geometry/fridge.js +25 -1
  112. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  113. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  114. package/dist/cabinet/geometry/fronts.js +1 -1
  115. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  116. package/dist/cabinet/geometry/run.js +19 -1
  117. package/dist/cabinet/geometry.d.ts.map +1 -1
  118. package/dist/cabinet/geometry.js +63 -1
  119. package/dist/cabinet/index.d.ts +1 -0
  120. package/dist/cabinet/index.d.ts.map +1 -1
  121. package/dist/cabinet/index.js +1 -0
  122. package/dist/cabinet/insertion.d.ts +19 -0
  123. package/dist/cabinet/insertion.d.ts.map +1 -0
  124. package/dist/cabinet/insertion.js +49 -0
  125. package/dist/cabinet/move-frame.d.ts.map +1 -1
  126. package/dist/cabinet/move-frame.js +68 -2
  127. package/dist/cabinet/panel-context.d.ts +7 -0
  128. package/dist/cabinet/panel-context.d.ts.map +1 -0
  129. package/dist/cabinet/panel-context.js +16 -0
  130. package/dist/cabinet/panel-visibility.d.ts +9 -0
  131. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  132. package/dist/cabinet/panel-visibility.js +26 -0
  133. package/dist/cabinet/panel.d.ts.map +1 -1
  134. package/dist/cabinet/panel.js +221 -37
  135. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  136. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  137. package/dist/cabinet/placement-dimensions.js +227 -0
  138. package/dist/cabinet/placement-snap.d.ts +21 -1
  139. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  140. package/dist/cabinet/placement-snap.js +48 -6
  141. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  142. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  143. package/dist/cabinet/preset-width-debt.js +45 -0
  144. package/dist/cabinet/presets.d.ts.map +1 -1
  145. package/dist/cabinet/presets.js +14 -13
  146. package/dist/cabinet/profiles.d.ts +14 -0
  147. package/dist/cabinet/profiles.d.ts.map +1 -0
  148. package/dist/cabinet/profiles.js +30 -0
  149. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  150. package/dist/cabinet/quick-actions.js +8 -24
  151. package/dist/cabinet/reveals.d.ts +37 -0
  152. package/dist/cabinet/reveals.d.ts.map +1 -0
  153. package/dist/cabinet/reveals.js +13 -0
  154. package/dist/cabinet/run-layout.d.ts +90 -4
  155. package/dist/cabinet/run-layout.d.ts.map +1 -1
  156. package/dist/cabinet/run-layout.js +408 -23
  157. package/dist/cabinet/run-ops.d.ts +202 -10
  158. package/dist/cabinet/run-ops.d.ts.map +1 -1
  159. package/dist/cabinet/run-ops.js +520 -33
  160. package/dist/cabinet/run-panel.d.ts +6 -2
  161. package/dist/cabinet/run-panel.d.ts.map +1 -1
  162. package/dist/cabinet/run-panel.js +285 -108
  163. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  164. package/dist/cabinet/stack-transitions.js +35 -24
  165. package/dist/cabinet/stack.d.ts +169 -1
  166. package/dist/cabinet/stack.d.ts.map +1 -1
  167. package/dist/cabinet/stack.js +57 -18
  168. package/dist/cabinet/tool.d.ts.map +1 -1
  169. package/dist/cabinet/tool.js +615 -91
  170. package/dist/cabinet/validation.d.ts +27 -0
  171. package/dist/cabinet/validation.d.ts.map +1 -0
  172. package/dist/cabinet/validation.js +56 -0
  173. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  174. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  175. package/dist/cabinet/wall-height-presets.js +15 -0
  176. package/dist/cabinet/wall-snap.d.ts +27 -3
  177. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  178. package/dist/cabinet/wall-snap.js +278 -62
  179. package/dist/cabinet/widths.d.ts +10 -0
  180. package/dist/cabinet/widths.d.ts.map +1 -0
  181. package/dist/cabinet/widths.js +13 -0
  182. package/dist/ceiling/definition.d.ts.map +1 -1
  183. package/dist/ceiling/definition.js +7 -1
  184. package/dist/ceiling/floorplan-affordances.d.ts +8 -8
  185. package/dist/ceiling/materials.d.ts.map +1 -1
  186. package/dist/ceiling/materials.js +0 -1
  187. package/dist/ceiling/panel.js +1 -1
  188. package/dist/ceiling/parametrics.js +1 -1
  189. package/dist/chimney/definition.js +1 -1
  190. package/dist/chimney/panel.js +1 -1
  191. package/dist/chimney/parametrics.js +3 -3
  192. package/dist/column/definition.d.ts.map +1 -1
  193. package/dist/column/definition.js +22 -4
  194. package/dist/column/panel.d.ts.map +1 -1
  195. package/dist/column/panel.js +37 -7
  196. package/dist/column/parametrics.d.ts.map +1 -1
  197. package/dist/column/parametrics.js +5 -3
  198. package/dist/column/tool.d.ts.map +1 -1
  199. package/dist/column/tool.js +50 -14
  200. package/dist/cupola/definition.d.ts.map +1 -1
  201. package/dist/cupola/definition.js +15 -6
  202. package/dist/cupola/geometry.d.ts +6 -0
  203. package/dist/cupola/geometry.d.ts.map +1 -1
  204. package/dist/cupola/geometry.js +60 -13
  205. package/dist/cupola/paint.d.ts +4 -0
  206. package/dist/cupola/paint.d.ts.map +1 -0
  207. package/dist/cupola/paint.js +39 -0
  208. package/dist/cupola/panel.js +1 -1
  209. package/dist/cupola/parametrics.js +3 -3
  210. package/dist/cupola/renderer.d.ts.map +1 -1
  211. package/dist/cupola/renderer.js +27 -8
  212. package/dist/door/floorplan-move.d.ts.map +1 -1
  213. package/dist/door/floorplan-move.js +1 -1
  214. package/dist/door/move-tool.d.ts.map +1 -1
  215. package/dist/door/move-tool.js +86 -32
  216. package/dist/door/panel.d.ts.map +1 -1
  217. package/dist/door/panel.js +1 -1
  218. package/dist/door/parametrics.js +2 -2
  219. package/dist/door/tool.d.ts.map +1 -1
  220. package/dist/door/tool.js +16 -4
  221. package/dist/dormer/csg-geometry.d.ts +6 -42
  222. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  223. package/dist/dormer/csg-geometry.js +38 -209
  224. package/dist/dormer/definition.d.ts +4 -12
  225. package/dist/dormer/definition.d.ts.map +1 -1
  226. package/dist/dormer/definition.js +18 -193
  227. package/dist/dormer/floorplan.d.ts +3 -3
  228. package/dist/dormer/floorplan.d.ts.map +1 -1
  229. package/dist/dormer/floorplan.js +6 -17
  230. package/dist/dormer/geometry.d.ts +5 -24
  231. package/dist/dormer/geometry.d.ts.map +1 -1
  232. package/dist/dormer/geometry.js +64 -41
  233. package/dist/dormer/index.d.ts +1 -1
  234. package/dist/dormer/index.d.ts.map +1 -1
  235. package/dist/dormer/index.js +1 -1
  236. package/dist/dormer/move-tool.d.ts.map +1 -1
  237. package/dist/dormer/move-tool.js +31 -3
  238. package/dist/dormer/panel-windows-section.d.ts +9 -0
  239. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  240. package/dist/dormer/panel-windows-section.js +7 -0
  241. package/dist/dormer/panel.d.ts.map +1 -1
  242. package/dist/dormer/panel.js +100 -18
  243. package/dist/dormer/parametrics.d.ts.map +1 -1
  244. package/dist/dormer/parametrics.js +8 -77
  245. package/dist/dormer/preview.d.ts.map +1 -1
  246. package/dist/dormer/preview.js +9 -1
  247. package/dist/dormer/renderer.d.ts.map +1 -1
  248. package/dist/dormer/renderer.js +24 -26
  249. package/dist/dormer/tool.d.ts.map +1 -1
  250. package/dist/dormer/tool.js +3 -1
  251. package/dist/dormer/window-layout.d.ts +15 -0
  252. package/dist/dormer/window-layout.d.ts.map +1 -0
  253. package/dist/dormer/window-layout.js +59 -0
  254. package/dist/downspout/definition.d.ts.map +1 -1
  255. package/dist/downspout/definition.js +17 -4
  256. package/dist/downspout/geometry.d.ts.map +1 -1
  257. package/dist/downspout/geometry.js +10 -0
  258. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  259. package/dist/downspout/inspector-editors.js +9 -1
  260. package/dist/downspout/parametrics.d.ts.map +1 -1
  261. package/dist/downspout/parametrics.js +2 -1
  262. package/dist/downspout/renderer.d.ts.map +1 -1
  263. package/dist/downspout/renderer.js +19 -3
  264. package/dist/downspout/system.d.ts +7 -0
  265. package/dist/downspout/system.d.ts.map +1 -0
  266. package/dist/downspout/system.js +114 -0
  267. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  268. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  269. package/dist/duct-fitting/accessory-geometry.js +47 -0
  270. package/dist/duct-fitting/definition.d.ts.map +1 -1
  271. package/dist/duct-fitting/definition.js +11 -1
  272. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  273. package/dist/duct-fitting/floorplan.js +8 -0
  274. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  275. package/dist/duct-fitting/geometry.js +52 -38
  276. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  277. package/dist/duct-fitting/parametrics.js +78 -15
  278. package/dist/duct-fitting/ports.d.ts +1 -0
  279. package/dist/duct-fitting/ports.d.ts.map +1 -1
  280. package/dist/duct-fitting/ports.js +46 -0
  281. package/dist/duct-fitting/tool.d.ts +19 -0
  282. package/dist/duct-fitting/tool.d.ts.map +1 -1
  283. package/dist/duct-fitting/tool.js +126 -34
  284. package/dist/duct-segment/continuation.d.ts +21 -0
  285. package/dist/duct-segment/continuation.d.ts.map +1 -0
  286. package/dist/duct-segment/continuation.js +167 -0
  287. package/dist/duct-segment/definition.d.ts.map +1 -1
  288. package/dist/duct-segment/definition.js +19 -18
  289. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  290. package/dist/duct-segment/floorplan.js +43 -0
  291. package/dist/duct-segment/geometry.d.ts.map +1 -1
  292. package/dist/duct-segment/geometry.js +3 -0
  293. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  294. package/dist/duct-segment/move-tool.js +33 -6
  295. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  296. package/dist/duct-segment/parametrics.js +45 -1
  297. package/dist/duct-segment/selection.d.ts +3 -4
  298. package/dist/duct-segment/selection.d.ts.map +1 -1
  299. package/dist/duct-segment/selection.js +186 -158
  300. package/dist/duct-segment/tool.d.ts +37 -0
  301. package/dist/duct-segment/tool.d.ts.map +1 -1
  302. package/dist/duct-segment/tool.js +305 -678
  303. package/dist/duct-terminal/parametrics.js +2 -2
  304. package/dist/duct-terminal/tool.d.ts.map +1 -1
  305. package/dist/duct-terminal/tool.js +37 -7
  306. package/dist/elevator/panel.d.ts.map +1 -1
  307. package/dist/elevator/panel.js +7 -7
  308. package/dist/elevator/system.d.ts.map +1 -1
  309. package/dist/elevator/system.js +10 -1
  310. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  311. package/dist/eyebrow-vent/definition.js +8 -5
  312. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  313. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  314. package/dist/eyebrow-vent/geometry.js +60 -15
  315. package/dist/eyebrow-vent/paint.d.ts +4 -0
  316. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  317. package/dist/eyebrow-vent/paint.js +33 -0
  318. package/dist/eyebrow-vent/panel.js +1 -1
  319. package/dist/eyebrow-vent/parametrics.js +3 -3
  320. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  321. package/dist/eyebrow-vent/renderer.js +27 -8
  322. package/dist/fence/definition.d.ts.map +1 -1
  323. package/dist/fence/definition.js +2 -1
  324. package/dist/fence/floorplan-affordances.d.ts +1 -0
  325. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  326. package/dist/fence/floorplan-affordances.js +30 -1
  327. package/dist/fence/floorplan.d.ts.map +1 -1
  328. package/dist/fence/floorplan.js +14 -0
  329. package/dist/fence/parametrics.js +3 -3
  330. package/dist/fence/tool.d.ts.map +1 -1
  331. package/dist/fence/tool.js +47 -20
  332. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  333. package/dist/gutter/corner-mitre.js +47 -7
  334. package/dist/gutter/definition.d.ts.map +1 -1
  335. package/dist/gutter/definition.js +23 -13
  336. package/dist/gutter/eave-align.d.ts.map +1 -1
  337. package/dist/gutter/eave-align.js +10 -0
  338. package/dist/gutter/eave-snap.d.ts +1 -1
  339. package/dist/gutter/eave-snap.d.ts.map +1 -1
  340. package/dist/gutter/eave-snap.js +10 -23
  341. package/dist/gutter/geometry.d.ts.map +1 -1
  342. package/dist/gutter/geometry.js +126 -8
  343. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  344. package/dist/gutter/outlet-lookup.js +22 -1
  345. package/dist/gutter/paint.d.ts +3 -0
  346. package/dist/gutter/paint.d.ts.map +1 -0
  347. package/dist/gutter/paint.js +6 -0
  348. package/dist/gutter/parametrics.d.ts.map +1 -1
  349. package/dist/gutter/parametrics.js +4 -1
  350. package/dist/gutter/renderer.d.ts.map +1 -1
  351. package/dist/gutter/renderer.js +63 -7
  352. package/dist/gutter/trim-clip.d.ts +3 -0
  353. package/dist/gutter/trim-clip.d.ts.map +1 -0
  354. package/dist/gutter/trim-clip.js +5 -0
  355. package/dist/hvac-equipment/parametrics.js +3 -3
  356. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  357. package/dist/hvac-equipment/tool.js +12 -2
  358. package/dist/index.d.ts +5 -2
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +9 -2
  361. package/dist/item/definition.d.ts.map +1 -1
  362. package/dist/item/definition.js +10 -2
  363. package/dist/item/floorplan-move.d.ts.map +1 -1
  364. package/dist/item/floorplan-move.js +20 -1
  365. package/dist/item/floorplan.d.ts.map +1 -1
  366. package/dist/item/floorplan.js +22 -1
  367. package/dist/item/move-tool.d.ts +28 -1
  368. package/dist/item/move-tool.d.ts.map +1 -1
  369. package/dist/item/move-tool.js +14 -2
  370. package/dist/item/renderer.d.ts.map +1 -1
  371. package/dist/item/renderer.js +16 -6
  372. package/dist/item/system.d.ts +5 -0
  373. package/dist/item/system.d.ts.map +1 -1
  374. package/dist/item/system.js +7 -1
  375. package/dist/lean-to-extension/arc.d.ts +14 -0
  376. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  377. package/dist/lean-to-extension/arc.js +56 -0
  378. package/dist/lean-to-extension/assembly.d.ts +61 -0
  379. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  380. package/dist/lean-to-extension/assembly.js +761 -0
  381. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  382. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  383. package/dist/lean-to-extension/canopy-joint.js +234 -0
  384. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  385. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  386. package/dist/lean-to-extension/conical-host.js +113 -0
  387. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  388. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  389. package/dist/lean-to-extension/corner-joint.js +1202 -0
  390. package/dist/lean-to-extension/definition.d.ts +4 -0
  391. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  392. package/dist/lean-to-extension/definition.js +433 -0
  393. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  394. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  395. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  396. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  397. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  398. package/dist/lean-to-extension/floorplan-move.js +157 -0
  399. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  400. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  401. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  402. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  403. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  404. package/dist/lean-to-extension/floorplan.js +373 -0
  405. package/dist/lean-to-extension/geometry.d.ts +7 -0
  406. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  407. package/dist/lean-to-extension/geometry.js +662 -0
  408. package/dist/lean-to-extension/index.d.ts +8 -0
  409. package/dist/lean-to-extension/index.d.ts.map +1 -0
  410. package/dist/lean-to-extension/index.js +7 -0
  411. package/dist/lean-to-extension/layout.d.ts +108 -0
  412. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  413. package/dist/lean-to-extension/layout.js +477 -0
  414. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  415. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  416. package/dist/lean-to-extension/managed-preview.js +93 -0
  417. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  418. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  419. package/dist/lean-to-extension/move-tool.js +202 -0
  420. package/dist/lean-to-extension/paint.d.ts +2 -0
  421. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  422. package/dist/lean-to-extension/paint.js +16 -0
  423. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  424. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  425. package/dist/lean-to-extension/parametrics.js +570 -0
  426. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  427. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  428. package/dist/lean-to-extension/placement-scope.js +4 -0
  429. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  430. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  431. package/dist/lean-to-extension/placement-validation.js +324 -0
  432. package/dist/lean-to-extension/placement.d.ts +59 -0
  433. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  434. package/dist/lean-to-extension/placement.js +331 -0
  435. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  436. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  437. package/dist/lean-to-extension/plan-footprint.js +27 -0
  438. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  439. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  440. package/dist/lean-to-extension/preview-geometry.js +40 -0
  441. package/dist/lean-to-extension/preview.d.ts +7 -0
  442. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  443. package/dist/lean-to-extension/preview.js +20 -0
  444. package/dist/lean-to-extension/renderer.d.ts +6 -0
  445. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  446. package/dist/lean-to-extension/renderer.js +34 -0
  447. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  448. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  449. package/dist/lean-to-extension/roof-attachment.js +376 -0
  450. package/dist/lean-to-extension/schema.d.ts +2 -0
  451. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  452. package/dist/lean-to-extension/schema.js +1 -0
  453. package/dist/lean-to-extension/slots.d.ts +5 -0
  454. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  455. package/dist/lean-to-extension/slots.js +15 -0
  456. package/dist/lean-to-extension/system.d.ts +7 -0
  457. package/dist/lean-to-extension/system.d.ts.map +1 -0
  458. package/dist/lean-to-extension/system.js +726 -0
  459. package/dist/lean-to-extension/tool.d.ts +3 -0
  460. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  461. package/dist/lean-to-extension/tool.js +580 -0
  462. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  463. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  464. package/dist/lean-to-extension/wall-target.js +29 -0
  465. package/dist/lineset/definition.d.ts.map +1 -1
  466. package/dist/lineset/definition.js +1 -0
  467. package/dist/liquid-line/definition.d.ts.map +1 -1
  468. package/dist/liquid-line/definition.js +1 -0
  469. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  470. package/dist/pipe-fitting/definition.js +16 -2
  471. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  472. package/dist/pipe-fitting/floorplan.js +4 -0
  473. package/dist/pipe-fitting/geometry.d.ts +3 -5
  474. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  475. package/dist/pipe-fitting/geometry.js +154 -21
  476. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  477. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  478. package/dist/pipe-fitting/inline-insertion.js +96 -0
  479. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  480. package/dist/pipe-fitting/parametrics.js +17 -3
  481. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  482. package/dist/pipe-fitting/ports.js +8 -1
  483. package/dist/pipe-fitting/tool.d.ts +26 -0
  484. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  485. package/dist/pipe-fitting/tool.js +182 -37
  486. package/dist/pipe-segment/continuation.d.ts +22 -0
  487. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  488. package/dist/pipe-segment/continuation.js +146 -0
  489. package/dist/pipe-segment/definition.d.ts.map +1 -1
  490. package/dist/pipe-segment/definition.js +23 -7
  491. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  492. package/dist/pipe-segment/floorplan.js +42 -0
  493. package/dist/pipe-segment/geometry.d.ts +2 -1
  494. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  495. package/dist/pipe-segment/geometry.js +4 -1
  496. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  497. package/dist/pipe-segment/move-tool.js +25 -5
  498. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  499. package/dist/pipe-segment/parametrics.js +45 -0
  500. package/dist/pipe-segment/selection.d.ts +3 -4
  501. package/dist/pipe-segment/selection.d.ts.map +1 -1
  502. package/dist/pipe-segment/selection.js +169 -105
  503. package/dist/pipe-segment/slope.d.ts +5 -0
  504. package/dist/pipe-segment/slope.d.ts.map +1 -0
  505. package/dist/pipe-segment/slope.js +10 -0
  506. package/dist/pipe-segment/tool.d.ts.map +1 -1
  507. package/dist/pipe-segment/tool.js +325 -545
  508. package/dist/pipe-trap/tool.d.ts.map +1 -1
  509. package/dist/pipe-trap/tool.js +15 -2
  510. package/dist/ridge-vent/definition.js +1 -1
  511. package/dist/ridge-vent/panel.d.ts.map +1 -1
  512. package/dist/ridge-vent/panel.js +2 -2
  513. package/dist/ridge-vent/parametrics.js +1 -1
  514. package/dist/roof/conical-roof-placement.d.ts +36 -0
  515. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  516. package/dist/roof/conical-roof-placement.js +134 -0
  517. package/dist/roof/conical-roof.d.ts +3 -0
  518. package/dist/roof/conical-roof.d.ts.map +1 -0
  519. package/dist/roof/conical-roof.js +53 -0
  520. package/dist/roof/definition.d.ts +3 -10
  521. package/dist/roof/definition.d.ts.map +1 -1
  522. package/dist/roof/definition.js +83 -13
  523. package/dist/roof/floorplan.d.ts +3 -10
  524. package/dist/roof/floorplan.d.ts.map +1 -1
  525. package/dist/roof/floorplan.js +139 -165
  526. package/dist/roof/index.d.ts +1 -0
  527. package/dist/roof/index.d.ts.map +1 -1
  528. package/dist/roof/index.js +1 -0
  529. package/dist/roof/panel.d.ts.map +1 -1
  530. package/dist/roof/panel.js +22 -23
  531. package/dist/roof/renderer.d.ts.map +1 -1
  532. package/dist/roof/roof-footprint-source.d.ts +16 -0
  533. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  534. package/dist/roof/roof-footprint-source.js +14 -0
  535. package/dist/roof/roof-footprint.d.ts +25 -0
  536. package/dist/roof/roof-footprint.d.ts.map +1 -0
  537. package/dist/roof/roof-footprint.js +94 -0
  538. package/dist/roof/roof-placement-mode.d.ts +18 -0
  539. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  540. package/dist/roof/roof-placement-mode.js +24 -0
  541. package/dist/roof/tool.d.ts +10 -0
  542. package/dist/roof/tool.d.ts.map +1 -0
  543. package/dist/roof/tool.js +922 -0
  544. package/dist/roof-segment/definition.d.ts.map +1 -1
  545. package/dist/roof-segment/definition.js +52 -8
  546. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  547. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  548. package/dist/roof-segment/floorplan-affordances.js +64 -18
  549. package/dist/roof-segment/floorplan.d.ts +3 -2
  550. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  551. package/dist/roof-segment/floorplan.js +95 -46
  552. package/dist/roof-segment/panel.d.ts.map +1 -1
  553. package/dist/roof-segment/panel.js +122 -27
  554. package/dist/scan/definition.d.ts +2 -3
  555. package/dist/scan/definition.d.ts.map +1 -1
  556. package/dist/scan/definition.js +9 -7
  557. package/dist/scan/parametrics.d.ts.map +1 -1
  558. package/dist/scan/parametrics.js +13 -1
  559. package/dist/scan/renderer.d.ts.map +1 -1
  560. package/dist/scan/renderer.js +8 -2
  561. package/dist/shared/accessory-cursor.d.ts +7 -0
  562. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  563. package/dist/shared/accessory-cursor.js +83 -0
  564. package/dist/shared/accessory-floorplan.d.ts +4 -0
  565. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  566. package/dist/shared/accessory-floorplan.js +51 -0
  567. package/dist/shared/accessory-geometry.d.ts +7 -0
  568. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  569. package/dist/shared/accessory-geometry.js +79 -0
  570. package/dist/shared/accessory-placement.d.ts +10 -0
  571. package/dist/shared/accessory-placement.d.ts.map +1 -0
  572. package/dist/shared/accessory-placement.js +126 -0
  573. package/dist/shared/accessory-snapping.d.ts +5 -0
  574. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  575. package/dist/shared/accessory-snapping.js +40 -0
  576. package/dist/shared/automatic-run-end-cap.d.ts +11 -0
  577. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  578. package/dist/shared/automatic-run-end-cap.js +159 -0
  579. package/dist/shared/block-face-host.d.ts +15 -0
  580. package/dist/shared/block-face-host.d.ts.map +1 -0
  581. package/dist/shared/block-face-host.js +36 -0
  582. package/dist/shared/connection-compatibility.d.ts +8 -0
  583. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  584. package/dist/shared/connection-compatibility.js +28 -0
  585. package/dist/shared/connection-feedback.d.ts +10 -0
  586. package/dist/shared/connection-feedback.d.ts.map +1 -0
  587. package/dist/shared/connection-feedback.js +17 -0
  588. package/dist/shared/distribution-run-contract.d.ts +49 -0
  589. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  590. package/dist/shared/distribution-run-contract.js +30 -0
  591. package/dist/shared/distribution-run-tool.d.ts +107 -0
  592. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  593. package/dist/shared/distribution-run-tool.js +941 -0
  594. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  595. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  596. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  597. package/dist/shared/duct-adapter.d.ts +10 -0
  598. package/dist/shared/duct-adapter.d.ts.map +1 -0
  599. package/dist/shared/duct-adapter.js +43 -0
  600. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  601. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  602. package/dist/shared/elbow-branch-continuation.js +200 -0
  603. package/dist/shared/fitting-clearance.d.ts +5 -0
  604. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  605. package/dist/shared/fitting-clearance.js +11 -0
  606. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  607. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  608. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  609. package/dist/shared/fitting-surface-support.d.ts +5 -0
  610. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  611. package/dist/shared/fitting-surface-support.js +42 -0
  612. package/dist/shared/fitting-tool-options.d.ts +4 -0
  613. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  614. package/dist/shared/fitting-tool-options.js +175 -0
  615. package/dist/shared/floor-placement.d.ts +1 -1
  616. package/dist/shared/floor-placement.d.ts.map +1 -1
  617. package/dist/shared/floor-placement.js +13 -33
  618. package/dist/shared/ghost-materials.d.ts.map +1 -1
  619. package/dist/shared/ghost-materials.js +2 -1
  620. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  621. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  622. package/dist/shared/lean-to-post-omissions.js +51 -0
  623. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  624. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  625. package/dist/shared/mep-fitting-actions.js +16 -0
  626. package/dist/shared/mep-presets.d.ts +11 -0
  627. package/dist/shared/mep-presets.d.ts.map +1 -0
  628. package/dist/shared/mep-presets.js +34 -0
  629. package/dist/shared/node-batch/candidates.d.ts +29 -0
  630. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  631. package/dist/shared/node-batch/candidates.js +260 -0
  632. package/dist/shared/node-batch/store.d.ts +26 -0
  633. package/dist/shared/node-batch/store.d.ts.map +1 -0
  634. package/dist/shared/node-batch/store.js +319 -0
  635. package/dist/shared/node-batch/system.d.ts +8 -0
  636. package/dist/shared/node-batch/system.d.ts.map +1 -0
  637. package/dist/shared/node-batch/system.js +569 -0
  638. package/dist/shared/node-batch/types.d.ts +99 -0
  639. package/dist/shared/node-batch/types.d.ts.map +1 -0
  640. package/dist/shared/node-batch/types.js +4 -0
  641. package/dist/shared/opening-move-history.d.ts +47 -0
  642. package/dist/shared/opening-move-history.d.ts.map +1 -0
  643. package/dist/shared/opening-move-history.js +18 -0
  644. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  645. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  646. package/dist/shared/opening-move-wall-gate.js +44 -0
  647. package/dist/shared/path-point-affordance.d.ts +2 -2
  648. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  649. package/dist/shared/path-point-affordance.js +30 -6
  650. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  651. package/dist/shared/placeholder-geometry.js +4 -0
  652. package/dist/shared/ports.d.ts +20 -3
  653. package/dist/shared/ports.d.ts.map +1 -1
  654. package/dist/shared/ports.js +148 -7
  655. package/dist/shared/primitive-uv.d.ts +17 -0
  656. package/dist/shared/primitive-uv.d.ts.map +1 -0
  657. package/dist/shared/primitive-uv.js +107 -0
  658. package/dist/shared/reducer-size.d.ts +2 -0
  659. package/dist/shared/reducer-size.d.ts.map +1 -0
  660. package/dist/shared/reducer-size.js +12 -0
  661. package/dist/shared/ridge-snap.js +1 -1
  662. package/dist/shared/roof-surface.d.ts.map +1 -1
  663. package/dist/shared/roof-surface.js +17 -2
  664. package/dist/shared/run-cursor.d.ts +22 -0
  665. package/dist/shared/run-cursor.d.ts.map +1 -0
  666. package/dist/shared/run-cursor.js +19 -0
  667. package/dist/shared/run-direction-feedback.d.ts +20 -0
  668. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  669. package/dist/shared/run-direction-feedback.js +139 -0
  670. package/dist/shared/run-hanger-controls.d.ts +7 -0
  671. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  672. package/dist/shared/run-hanger-controls.js +44 -0
  673. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  674. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  675. package/dist/shared/run-hanger-inspector.js +43 -0
  676. package/dist/shared/run-hanger-mode.d.ts +11 -0
  677. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  678. package/dist/shared/run-hanger-mode.js +32 -0
  679. package/dist/shared/run-hanger-system.d.ts +3 -0
  680. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  681. package/dist/shared/run-hanger-system.js +39 -0
  682. package/dist/shared/run-hangers.d.ts +25 -0
  683. package/dist/shared/run-hangers.d.ts.map +1 -0
  684. package/dist/shared/run-hangers.js +261 -0
  685. package/dist/shared/run-port-snap.d.ts +11 -0
  686. package/dist/shared/run-port-snap.d.ts.map +1 -0
  687. package/dist/shared/run-port-snap.js +19 -0
  688. package/dist/shared/run-screen-direction.d.ts +5 -0
  689. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  690. package/dist/shared/run-screen-direction.js +24 -0
  691. package/dist/shared/selection-handles.d.ts +4 -0
  692. package/dist/shared/selection-handles.d.ts.map +1 -1
  693. package/dist/shared/selection-handles.js +10 -0
  694. package/dist/shared/slot-paint.d.ts +8 -1
  695. package/dist/shared/slot-paint.d.ts.map +1 -1
  696. package/dist/shared/slot-paint.js +120 -27
  697. package/dist/shared/surface-paint.d.ts +1 -2
  698. package/dist/shared/surface-paint.d.ts.map +1 -1
  699. package/dist/shared/surface-paint.js +9 -20
  700. package/dist/shared/system-check-panel.d.ts +6 -0
  701. package/dist/shared/system-check-panel.d.ts.map +1 -0
  702. package/dist/shared/system-check-panel.js +62 -0
  703. package/dist/shared/system-checks.d.ts +9 -0
  704. package/dist/shared/system-checks.d.ts.map +1 -0
  705. package/dist/shared/system-checks.js +131 -0
  706. package/dist/shared/wall-attach-target.d.ts +14 -2
  707. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  708. package/dist/shared/wall-attach-target.js +108 -4
  709. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  710. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  711. package/dist/shared/wall-opening-clearance.js +28 -0
  712. package/dist/shared/wall-run-move.d.ts +17 -0
  713. package/dist/shared/wall-run-move.d.ts.map +1 -0
  714. package/dist/shared/wall-run-move.js +56 -0
  715. package/dist/shelf/parametrics.js +4 -4
  716. package/dist/site/renderer.d.ts.map +1 -1
  717. package/dist/site/renderer.js +40 -28
  718. package/dist/site/terrain-geometry.d.ts +1 -1
  719. package/dist/site/terrain-geometry.d.ts.map +1 -1
  720. package/dist/site/terrain-geometry.js +35 -9
  721. package/dist/site/terrain-mesh.d.ts +5 -0
  722. package/dist/site/terrain-mesh.d.ts.map +1 -1
  723. package/dist/site/terrain-mesh.js +63 -34
  724. package/dist/skylight/definition.js +1 -1
  725. package/dist/skylight/panel.js +1 -1
  726. package/dist/skylight/parametrics.js +2 -2
  727. package/dist/slab/definition.d.ts.map +1 -1
  728. package/dist/slab/definition.js +6 -1
  729. package/dist/slab/dependency-tracker.d.ts +3 -0
  730. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  731. package/dist/slab/dependency-tracker.js +104 -0
  732. package/dist/slab/floorplan-affordances.d.ts +8 -8
  733. package/dist/slab/geometry.d.ts.map +1 -1
  734. package/dist/slab/geometry.js +16 -2
  735. package/dist/slab/panel.js +1 -1
  736. package/dist/slab/parametrics.js +1 -1
  737. package/dist/slab/system.d.ts.map +1 -1
  738. package/dist/slab/system.js +8 -64
  739. package/dist/solar-panel/definition.js +1 -1
  740. package/dist/solar-panel/panel.js +1 -1
  741. package/dist/solar-panel/parametrics.js +2 -2
  742. package/dist/stair/panel.d.ts.map +1 -1
  743. package/dist/stair/panel.js +18 -13
  744. package/dist/stair/stair-type.d.ts +18 -0
  745. package/dist/stair/stair-type.d.ts.map +1 -0
  746. package/dist/stair/stair-type.js +25 -0
  747. package/dist/stair-segment/panel.d.ts.map +1 -1
  748. package/dist/stair-segment/panel.js +44 -5
  749. package/dist/turbine-vent/definition.d.ts.map +1 -1
  750. package/dist/turbine-vent/definition.js +8 -5
  751. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  752. package/dist/turbine-vent/geometry.js +48 -18
  753. package/dist/turbine-vent/paint.d.ts +4 -0
  754. package/dist/turbine-vent/paint.d.ts.map +1 -0
  755. package/dist/turbine-vent/paint.js +35 -0
  756. package/dist/turbine-vent/panel.js +1 -1
  757. package/dist/turbine-vent/parametrics.js +2 -2
  758. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  759. package/dist/turbine-vent/renderer.js +31 -9
  760. package/dist/wall/curve-eligibility.d.ts +3 -0
  761. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  762. package/dist/wall/curve-eligibility.js +10 -0
  763. package/dist/wall/curve-tool.d.ts.map +1 -1
  764. package/dist/wall/curve-tool.js +8 -11
  765. package/dist/wall/definition.d.ts +1 -1
  766. package/dist/wall/definition.d.ts.map +1 -1
  767. package/dist/wall/definition.js +36 -13
  768. package/dist/wall/floorplan-affordances.d.ts +1 -0
  769. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  770. package/dist/wall/floorplan-affordances.js +46 -7
  771. package/dist/wall/floorplan-move.d.ts +3 -4
  772. package/dist/wall/floorplan-move.d.ts.map +1 -1
  773. package/dist/wall/floorplan-move.js +122 -9
  774. package/dist/wall/floorplan.d.ts.map +1 -1
  775. package/dist/wall/floorplan.js +19 -23
  776. package/dist/wall/move-shared.d.ts.map +1 -1
  777. package/dist/wall/move-shared.js +10 -7
  778. package/dist/wall/paint.d.ts.map +1 -1
  779. package/dist/wall/paint.js +2 -0
  780. package/dist/wall/panel.d.ts.map +1 -1
  781. package/dist/wall/panel.js +10 -17
  782. package/dist/wall/parametrics.js +2 -2
  783. package/dist/wall/pointer-transparency.d.ts +128 -0
  784. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  785. package/dist/wall/pointer-transparency.js +147 -0
  786. package/dist/wall/renderer.d.ts.map +1 -1
  787. package/dist/wall/renderer.js +65 -8
  788. package/dist/wall/selection-hit-owner.d.ts +53 -0
  789. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  790. package/dist/wall/selection-hit-owner.js +79 -0
  791. package/dist/wall/system.d.ts +2 -0
  792. package/dist/wall/system.d.ts.map +1 -1
  793. package/dist/wall/system.js +66 -25
  794. package/dist/wall/tool.d.ts.map +1 -1
  795. package/dist/wall/tool.js +5 -0
  796. package/dist/wall/treatment-level-data.d.ts +6 -1
  797. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  798. package/dist/wall/treatment-level-data.js +82 -5
  799. package/dist/wall/treatments.d.ts +1 -0
  800. package/dist/wall/treatments.d.ts.map +1 -1
  801. package/dist/wall/treatments.js +5 -0
  802. package/dist/wall/wall-batch-system.d.ts +38 -6
  803. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  804. package/dist/wall/wall-batch-system.js +122 -25
  805. package/dist/wall/wall-batch.js +2 -2
  806. package/dist/window/definition.d.ts +2 -1
  807. package/dist/window/definition.d.ts.map +1 -1
  808. package/dist/window/definition.js +51 -24
  809. package/dist/window/floorplan-move.d.ts.map +1 -1
  810. package/dist/window/floorplan-move.js +1 -1
  811. package/dist/window/move-tool.d.ts +7 -5
  812. package/dist/window/move-tool.d.ts.map +1 -1
  813. package/dist/window/move-tool.js +344 -58
  814. package/dist/window/panel.d.ts.map +1 -1
  815. package/dist/window/panel.js +2 -0
  816. package/dist/window/parametrics.js +2 -2
  817. package/dist/window/renderer.d.ts.map +1 -1
  818. package/dist/window/renderer.js +5 -7
  819. package/dist/window/tool.d.ts.map +1 -1
  820. package/dist/window/tool.js +227 -13
  821. package/dist/zone/floorplan-affordances.d.ts +12 -12
  822. package/package.json +11 -9
  823. package/dist/dormer/panel-window-section.d.ts +0 -14
  824. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  825. package/dist/dormer/panel-window-section.js +0 -59
  826. package/dist/dormer/window-assembly.d.ts +0 -22
  827. package/dist/dormer/window-assembly.d.ts.map +0 -1
  828. package/dist/dormer/window-assembly.js +0 -111
  829. package/dist/dormer/window-frame.d.ts +0 -24
  830. package/dist/dormer/window-frame.d.ts.map +0 -1
  831. package/dist/dormer/window-frame.js +0 -100
@@ -1,13 +1,33 @@
1
- import { calculateLevelMiters, getWallThickness, } from '@pascal-app/core';
1
+ import { calculateLevelMiters, getWallThickness, isCurvedWall, pointToKey, } from '@pascal-app/core';
2
2
  import { create } from 'zustand';
3
+ import { shallow } from 'zustand/vanilla/shallow';
3
4
  const PROUD_KEY_PRECISION = 1e6;
4
5
  function proudKey(proud) {
5
6
  return Math.round(proud * PROUD_KEY_PRECISION) / PROUD_KEY_PRECISION;
6
7
  }
7
- export function buildWallTreatmentLevelData(walls, proudOffsets) {
8
- const uniqueProudOffsets = new Set([0, ...proudOffsets.map(proudKey)]);
8
+ export function treatmentProudKeys(proudOffsets) {
9
+ return [...new Set([0, ...proudOffsets.map(proudKey)])].sort((a, b) => a - b);
10
+ }
11
+ export function sameTreatmentWalls(a, b) {
12
+ return a.length === b.length && a.every((wall, index) => wall === b[index]);
13
+ }
14
+ const levelMiterCache = new Map();
15
+ export function clearWallTreatmentMiterCache(levelId) {
16
+ if (levelId === undefined)
17
+ levelMiterCache.clear();
18
+ else
19
+ levelMiterCache.delete(levelId);
20
+ }
21
+ export function buildWallTreatmentLevelData(levelId, walls, proudOffsets) {
22
+ const cached = levelMiterCache.get(levelId);
23
+ const reusable = cached && sameTreatmentWalls(cached.walls, walls) ? cached : undefined;
9
24
  const miterDataByProud = new Map();
10
- for (const proud of uniqueProudOffsets) {
25
+ for (const proud of treatmentProudKeys(proudOffsets)) {
26
+ const previous = reusable?.miterDataByProud.get(proud);
27
+ if (previous) {
28
+ miterDataByProud.set(proud, previous);
29
+ continue;
30
+ }
11
31
  const adjustedWalls = proud === 0
12
32
  ? [...walls]
13
33
  : walls.map((wall) => ({
@@ -16,11 +36,61 @@ export function buildWallTreatmentLevelData(walls, proudOffsets) {
16
36
  }));
17
37
  miterDataByProud.set(proud, calculateLevelMiters(adjustedWalls));
18
38
  }
19
- return { walls, miterDataByProud };
39
+ const data = { walls, miterDataByProud };
40
+ levelMiterCache.set(levelId, data);
41
+ return data;
20
42
  }
21
43
  export function treatmentMiterDataForProud(levelData, proud) {
22
44
  return levelData.miterDataByProud.get(proudKey(proud));
23
45
  }
46
+ export function createWallTreatmentSelector(node, proudOffsets) {
47
+ const keys = isCurvedWall(node)
48
+ ? []
49
+ : [...new Set([node.start, node.end].map(([x, y]) => pointToKey({ x, y })))];
50
+ const prouds = treatmentProudKeys(proudOffsets);
51
+ let previousLevel;
52
+ let previousSlice;
53
+ let previousInputs = [];
54
+ return (state) => {
55
+ const level = node.parentId ? state.byLevelId.get(node.parentId) : undefined;
56
+ if (level === previousLevel)
57
+ return previousSlice;
58
+ previousLevel = level;
59
+ if (!level) {
60
+ previousSlice = undefined;
61
+ previousInputs = [];
62
+ return undefined;
63
+ }
64
+ const inputs = [];
65
+ for (const proud of prouds) {
66
+ const data = level.miterDataByProud.get(proud);
67
+ inputs.push(!!data);
68
+ for (const key of keys) {
69
+ const entry = data?.junctionData.get(key)?.get(node.id);
70
+ inputs.push(entry?.left?.x, entry?.left?.y, entry?.right?.x, entry?.right?.y);
71
+ }
72
+ }
73
+ if (previousSlice && shallow(previousInputs, inputs))
74
+ return previousSlice;
75
+ const miterDataByProud = new Map();
76
+ for (const proud of prouds) {
77
+ const data = level.miterDataByProud.get(proud);
78
+ if (!data)
79
+ continue;
80
+ const junctionData = new Map();
81
+ for (const key of keys) {
82
+ const entry = data.junctionData.get(key)?.get(node.id);
83
+ if (entry)
84
+ junctionData.set(key, new Map([[node.id, entry]]));
85
+ }
86
+ // Trim boundaries read only this wall's endpoint intersections, never junction membership.
87
+ miterDataByProud.set(proud, { junctionData, junctions: new Map() });
88
+ }
89
+ previousInputs = inputs;
90
+ previousSlice = { walls: [node], miterDataByProud };
91
+ return previousSlice;
92
+ };
93
+ }
24
94
  export const useWallTreatmentLevelData = create((set) => ({
25
95
  byLevelId: new Map(),
26
96
  setLevelData: (levelId, data) => set((state) => {
@@ -28,4 +98,11 @@ export const useWallTreatmentLevelData = create((set) => ({
28
98
  byLevelId.set(levelId, data);
29
99
  return { byLevelId };
30
100
  }),
101
+ removeLevelData: (levelId) => set((state) => {
102
+ if (!state.byLevelId.has(levelId))
103
+ return state;
104
+ const byLevelId = new Map(state.byLevelId);
105
+ byLevelId.delete(levelId);
106
+ return { byLevelId };
107
+ }),
31
108
  }));
@@ -12,6 +12,7 @@ type TrimKind = 'skirting' | 'crown' | 'chairRail';
12
12
  type WallSide = 'interior' | 'exterior';
13
13
  type SceneMaterials = Record<SceneMaterialId, SceneMaterial>;
14
14
  type WallTreatmentSlotId = 'skirtingInterior' | 'skirtingExterior' | 'crownInterior' | 'crownExterior' | 'chairRailInterior' | 'chairRailExterior';
15
+ export declare function hasWallTreatments(node: WallNode): boolean;
15
16
  export declare function wallTreatmentProudOffsets(node: WallNode): number[];
16
17
  export declare function buildTrimGeometry(node: WallNode, side: WallSide, trim: WallTrimConfig, kind: TrimKind, childrenNodes: OpeningLike[], levelData: WallTreatmentLevelData): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap> | null;
17
18
  export declare function createWallExtraSlotMaterials(node: WallNode, shading: RenderShading, sceneMaterials: SceneMaterials): {
@@ -1 +1 @@
1
- {"version":3,"file":"treatments.d.ts","sourceRoot":"","sources":["../../src/wall/treatments.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,eAAe,EAMpB,KAAK,QAAQ,EAEb,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAMhG,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC,CAAA;AAED,KAAK,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAA;AAClD,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;AACvC,KAAK,cAAc,GAAG,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;AAE5D,KAAK,mBAAmB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,mBAAmB,CAAA;AAmNvB,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAoBlE;AAuND,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,QAAQ,EACd,aAAa,EAAE,WAAW,EAAE,EAC5B,SAAS,EAAE,sBAAsB,2FAsDlC;AAkBD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,cAAc;;;;;;;EAU/B;AAED,eAAO,MAAM,cAAc,uFAKxB;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,WAAW,EAAE,CAAA;IAC5B,SAAS,EAAE,sBAAsB,CAAA;IACjC,SAAS,EAAE,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;CACvD,iCAmEC,CAAA"}
1
+ {"version":3,"file":"treatments.d.ts","sourceRoot":"","sources":["../../src/wall/treatments.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,eAAe,EAMpB,KAAK,QAAQ,EAEb,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAMhG,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC,CAAA;AAED,KAAK,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAA;AAClD,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;AACvC,KAAK,cAAc,GAAG,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;AAE5D,KAAK,mBAAmB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,mBAAmB,CAAA;AAmNvB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAMzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAoBlE;AAuND,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,QAAQ,EACd,aAAa,EAAE,WAAW,EAAE,EAC5B,SAAS,EAAE,sBAAsB,2FAsDlC;AAkBD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,cAAc;;;;;;;EAU/B;AAED,eAAO,MAAM,cAAc,uFAKxB;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,WAAW,EAAE,CAAA;IAC5B,SAAS,EAAE,sBAAsB,CAAA;IACjC,SAAS,EAAE,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;CACvD,iCAmEC,CAAA"}
@@ -221,6 +221,11 @@ function resolveTrimProfile(kind, trim) {
221
221
  TRIM_PROFILES[kind][defaultProfile] ??
222
222
  TRIM_PROFILES[kind].flat);
223
223
  }
224
+ export function hasWallTreatments(node) {
225
+ return !!((node.skirting?.enabled ?? WALL_SKIRTING_DEFAULT.enabled) ||
226
+ (node.crown?.enabled ?? WALL_CROWN_DEFAULT.enabled) ||
227
+ (node.chairRail?.enabled ?? WALL_CHAIR_RAIL_DEFAULT.enabled));
228
+ }
224
229
  export function wallTreatmentProudOffsets(node) {
225
230
  const offsets = new Set();
226
231
  const configs = [
@@ -1,5 +1,7 @@
1
1
  import { type WallMode } from '@pascal-app/viewer';
2
2
  import { type Material, Mesh } from 'three';
3
+ export declare function revealBatchedWallsForCapture(): void;
4
+ export declare function holdBatchedWallsAfterCapture(): void;
3
5
  export type WallBatchCandidate = {
4
6
  nodeId: string;
5
7
  mesh: Mesh;
@@ -10,14 +12,44 @@ export type WallBatchCandidate = {
10
12
  *
11
13
  * The merged mesh captures one material set when it is sewn and nothing
12
14
  * re-reads it, so batching is only sound while every batched wall's materials
13
- * hold still. That is true in one wall mode. `cutaway` re-assigns materials
14
- * from the camera's facing test as the view turns, `down` makes every wall
15
- * see-through and `translucent` does the same by definition — in all three the
16
- * merged copy would keep drawing walls the cutaway pass has since turned to
17
- * glass. Isolation is the other stand-down: it hides the level root the merged
18
- * mesh hangs off, which would leave a focused batched wall drawn by nobody.
15
+ * hold still. That is true in `up`; in `cutaway`, walls stamped `wallHidden`
16
+ * are released per wall in the same frame because WallCutout runs at priority
17
+ * 0 and this system at 5. `down` and `translucent` make every wall see-through.
18
+ * Isolation is the other stand-down: it hides the level root the merged mesh
19
+ * hangs off, which would leave a focused batched wall drawn by nobody.
19
20
  */
20
21
  export declare function canBatchWalls(wallMode: WallMode, isolationActive: boolean): boolean;
22
+ /**
23
+ * Walls the viewer is currently lighting up — a selection, or any hover.
24
+ *
25
+ * A selection or delete hover paints the wall by swapping the materials on its
26
+ * own mesh, which the merged mesh does not follow. Every other hover draws an
27
+ * outline instead, and that needs the same thing for a different reason: the
28
+ * outline node renders `outliner.hoveredObjects` through the main camera, which
29
+ * enables no batched layer, so a sewn wall reaches neither mask pass and
30
+ * hovering it lights up nothing at all — in select mode, and in paint mode
31
+ * where the outline is the only signal for which surface the next click lands
32
+ * on.
33
+ *
34
+ * Both wants are the same one: a lit wall goes back to drawing its own
35
+ * geometry. Only ever a handful are lit at once, and a handful of extra draw
36
+ * calls is what lighting them costs.
37
+ */
38
+ export declare function collectTintedWalls(wallIds: ReadonlySet<string>): Set<string>;
21
39
  export declare function collectWallBatchCandidates(levelId: string, excludedNodeIds?: ReadonlySet<string>): Map<string, WallBatchCandidate[]>;
22
40
  export declare const WallBatchSystem: () => null;
41
+ /**
42
+ * Follows the scene's dirty tracking rather than watching the walls itself.
43
+ *
44
+ * A wall changes for exactly one reason the merged mesh cares about: the wall
45
+ * system rebuilt its geometry. That system already runs off `dirtyNodes`, so
46
+ * this reads the same signal from both ends — the marks still standing when
47
+ * this frame reaches us, and the rebuild notices the wall system left behind
48
+ * for the walls whose marks it has already cleared. Nothing here re-derives
49
+ * "did this wall move" on its own, and the per-frame cost is the size of the
50
+ * dirty set rather than the size of the floor.
51
+ */
52
+ export declare function runBatchFrame(invalidate: () => void, wakeRef: {
53
+ current: ReturnType<typeof setTimeout> | null;
54
+ }): void;
23
55
  //# sourceMappingURL=wall-batch-system.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wall-batch-system.d.ts","sourceRoot":"","sources":["../../src/wall/wall-batch-system.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,KAAK,QAAQ,EAAW,IAAI,EAAiB,MAAM,OAAO,CAAA;AA4HnE,MAAM,MAAM,kBAAkB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAA;AA8BtF;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAEnF;AA2BD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,eAAe,GAAE,WAAW,CAAC,MAAM,CAAa,GAC/C,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAoBnC;AAqFD,eAAO,MAAM,eAAe,YAwB3B,CAAA"}
1
+ {"version":3,"file":"wall-batch-system.d.ts","sourceRoot":"","sources":["../../src/wall/wall-batch-system.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,KAAK,QAAQ,EAAW,IAAI,EAAiB,MAAM,OAAO,CAAA;AAkGnE,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAKnD;AA6BD,MAAM,MAAM,kBAAkB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAA;AA+BtF;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAEnF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAW5E;AAMD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,eAAe,GAAE,WAAW,CAAC,MAAM,CAAa,GAC/C,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAoBnC;AAsFD,eAAO,MAAM,eAAe,YAmE3B,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAA;CAAE,QAyI3D"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sceneRegistry, useScene } from '@pascal-app/core';
2
+ import { emitter, sceneRegistry, useScene } from '@pascal-app/core';
3
3
  import { drainRebuiltWalls, getPendingWallRebuildCount, isIsolationActive, SCENE_LAYER, useViewer, } from '@pascal-app/viewer';
4
4
  import { useFrame, useThree } from '@react-three/fiber';
5
5
  import { useEffect, useRef } from 'react';
@@ -40,6 +40,7 @@ const batchByNode = new Map();
40
40
  const staleLevels = new Set();
41
41
  const changedWalls = new Set();
42
42
  const EMPTY_IDS = new Set();
43
+ let lastCutawayHiddenWalls = EMPTY_IDS;
43
44
  let knownWallCount = -1;
44
45
  let lastWallChangeAtMs = 0;
45
46
  let batchingSuspended = false;
@@ -56,6 +57,17 @@ function showOwnGeometry(nodeId) {
56
57
  if (mesh)
57
58
  revealBatchedWall(mesh);
58
59
  }
60
+ export function revealBatchedWallsForCapture() {
61
+ for (const nodeId of batchByNode.keys())
62
+ showOwnGeometry(nodeId);
63
+ }
64
+ export function holdBatchedWallsAfterCapture() {
65
+ for (const nodeId of batchByNode.keys()) {
66
+ const mesh = sceneRegistry.nodes.get(nodeId);
67
+ if (mesh)
68
+ hideBatchedWall(mesh);
69
+ }
70
+ }
59
71
  /** Hands a wall back to itself: the merged mesh stops drawing it, it resumes. */
60
72
  function releaseWall(nodeId) {
61
73
  const record = batchByNode.get(nodeId);
@@ -94,6 +106,8 @@ function toCandidate(nodeId, node, excludedNodeIds = EMPTY_IDS) {
94
106
  const mesh = sceneRegistry.nodes.get(nodeId);
95
107
  if (!mesh?.visible)
96
108
  return null;
109
+ if (mesh.userData.wallHidden === true)
110
+ return null;
97
111
  // Solo's shadow-caster-only pass and the viewer's isolation filter both
98
112
  // hide a wall by taking it off the scene layer. Sewing it in would put it
99
113
  // back on screen through the merged mesh, which neither asked for.
@@ -113,25 +127,32 @@ function toCandidate(nodeId, node, excludedNodeIds = EMPTY_IDS) {
113
127
  *
114
128
  * The merged mesh captures one material set when it is sewn and nothing
115
129
  * re-reads it, so batching is only sound while every batched wall's materials
116
- * hold still. That is true in one wall mode. `cutaway` re-assigns materials
117
- * from the camera's facing test as the view turns, `down` makes every wall
118
- * see-through and `translucent` does the same by definition — in all three the
119
- * merged copy would keep drawing walls the cutaway pass has since turned to
120
- * glass. Isolation is the other stand-down: it hides the level root the merged
121
- * mesh hangs off, which would leave a focused batched wall drawn by nobody.
130
+ * hold still. That is true in `up`; in `cutaway`, walls stamped `wallHidden`
131
+ * are released per wall in the same frame because WallCutout runs at priority
132
+ * 0 and this system at 5. `down` and `translucent` make every wall see-through.
133
+ * Isolation is the other stand-down: it hides the level root the merged mesh
134
+ * hangs off, which would leave a focused batched wall drawn by nobody.
122
135
  */
123
136
  export function canBatchWalls(wallMode, isolationActive) {
124
- return !isolationActive && wallMode === 'up';
137
+ return !isolationActive && (wallMode === 'up' || wallMode === 'cutaway');
125
138
  }
126
139
  /**
127
- * Walls the cutaway pass is currently tinting — a selection or a delete hover.
140
+ * Walls the viewer is currently lighting up — a selection, or any hover.
141
+ *
142
+ * A selection or delete hover paints the wall by swapping the materials on its
143
+ * own mesh, which the merged mesh does not follow. Every other hover draws an
144
+ * outline instead, and that needs the same thing for a different reason: the
145
+ * outline node renders `outliner.hoveredObjects` through the main camera, which
146
+ * enables no batched layer, so a sewn wall reaches neither mask pass and
147
+ * hovering it lights up nothing at all — in select mode, and in paint mode
148
+ * where the outline is the only signal for which surface the next click lands
149
+ * on.
128
150
  *
129
- * It paints them by swapping the materials on the wall's own mesh, which the
130
- * merged mesh does not follow, so a lit wall goes back to drawing itself. There
131
- * are only ever a handful, and a handful of extra draw calls is what the tint
132
- * costs.
151
+ * Both wants are the same one: a lit wall goes back to drawing its own
152
+ * geometry. Only ever a handful are lit at once, and a handful of extra draw
153
+ * calls is what lighting them costs.
133
154
  */
134
- function collectTintedWalls(wallIds) {
155
+ export function collectTintedWalls(wallIds) {
135
156
  const viewer = useViewer.getState();
136
157
  const tinted = new Set();
137
158
  for (const id of viewer.selection.selectedIds)
@@ -140,7 +161,7 @@ function collectTintedWalls(wallIds) {
140
161
  for (const id of viewer.previewSelectedIds)
141
162
  if (wallIds.has(id))
142
163
  tinted.add(id);
143
- const hovered = viewer.hoverHighlightMode === 'delete' ? viewer.hoveredId : null;
164
+ const hovered = viewer.hoveredId;
144
165
  if (hovered && wallIds.has(hovered))
145
166
  tinted.add(hovered);
146
167
  return tinted;
@@ -223,6 +244,7 @@ function mergeLevel(levelId, excludedNodeIds = EMPTY_IDS) {
223
244
  continue;
224
245
  const mesh = new Mesh(batch.geometry, candidates[0].materials);
225
246
  mesh.name = 'wall-batch';
247
+ mesh.userData.pascalExport = 'strip';
226
248
  mesh.castShadow = true;
227
249
  mesh.receiveShadow = true;
228
250
  mesh.matrixAutoUpdate = false;
@@ -248,6 +270,49 @@ export const WallBatchSystem = () => {
248
270
  const invalidate = useThree((state) => state.invalidate);
249
271
  const wakeRef = useRef(null);
250
272
  useFrame(() => runBatchFrame(invalidate, wakeRef), 5);
273
+ // Captures and exports clone the scene and prune whatever is off the scene
274
+ // layer, so the sources come back for the capture and go under again after
275
+ // it. The node batch used to reveal them as a side effect of its own sweep
276
+ // (shared hold reason) and nothing ever re-hid them: every batched wall
277
+ // drew twice for the rest of the session.
278
+ useEffect(() => {
279
+ emitter.on('thumbnail:before-capture', revealBatchedWallsForCapture);
280
+ emitter.on('thumbnail:after-capture', holdBatchedWallsAfterCapture);
281
+ return () => {
282
+ emitter.off('thumbnail:before-capture', revealBatchedWallsForCapture);
283
+ emitter.off('thumbnail:after-capture', holdBatchedWallsAfterCapture);
284
+ };
285
+ }, []);
286
+ // Scripted-probe hook, ?perf sessions only (mirrors __itemBatch): the
287
+ // panel has no row for the merged wall batch, so probes read it here.
288
+ useEffect(() => {
289
+ if (!new URLSearchParams(window.location.search).has('perf'))
290
+ return;
291
+ const probe = {
292
+ stats: () => {
293
+ let batches = 0;
294
+ for (const records of batchesByLevel.values())
295
+ batches += records.length;
296
+ let hidden = 0;
297
+ for (const nodeId of sceneRegistry.byType.wall ?? EMPTY_IDS) {
298
+ if (sceneRegistry.nodes.get(nodeId)?.userData.wallHidden === true)
299
+ hidden++;
300
+ }
301
+ return {
302
+ walls: batchByNode.size,
303
+ batches,
304
+ levels: batchesByLevel.size,
305
+ hidden,
306
+ suspended: batchingSuspended,
307
+ wallMode: useViewer.getState().wallMode,
308
+ };
309
+ },
310
+ };
311
+ window.__wallBatch = probe;
312
+ return () => {
313
+ delete window.__wallBatch;
314
+ };
315
+ }, []);
251
316
  useEffect(() => () => {
252
317
  if (wakeRef.current)
253
318
  clearTimeout(wakeRef.current);
@@ -255,6 +320,7 @@ export const WallBatchSystem = () => {
255
320
  disposeLevelBatches(levelId);
256
321
  changedWalls.clear();
257
322
  staleLevels.clear();
323
+ lastCutawayHiddenWalls = EMPTY_IDS;
258
324
  knownWallCount = -1;
259
325
  batchingSuspended = false;
260
326
  lastAppearance.shading = undefined;
@@ -276,7 +342,7 @@ export const WallBatchSystem = () => {
276
342
  * "did this wall move" on its own, and the per-frame cost is the size of the
277
343
  * dirty set rather than the size of the floor.
278
344
  */
279
- function runBatchFrame(invalidate, wakeRef) {
345
+ export function runBatchFrame(invalidate, wakeRef) {
280
346
  const wallIds = sceneRegistry.byType.wall ?? EMPTY_IDS;
281
347
  const nodes = useScene.getState().nodes;
282
348
  // Walls the wall system rebuilt: it clears each mark as it goes, so by the
@@ -313,6 +379,39 @@ function runBatchFrame(invalidate, wakeRef) {
313
379
  releaseWall(nodeId);
314
380
  changed = true;
315
381
  }
382
+ // Only cutaway hides walls one by one; `up` hides none and the other modes
383
+ // stand the batch down, so the stamp scan is worth a frame only there.
384
+ const cutawayHiddenWalls = new Set();
385
+ if (useViewer.getState().wallMode === 'cutaway') {
386
+ for (const nodeId of wallIds) {
387
+ const mesh = sceneRegistry.nodes.get(nodeId);
388
+ if (mesh?.userData.wallHidden === true)
389
+ cutawayHiddenWalls.add(nodeId);
390
+ }
391
+ }
392
+ for (const nodeId of cutawayHiddenWalls) {
393
+ const record = batchByNode.get(nodeId);
394
+ if (!record)
395
+ continue;
396
+ releaseWall(nodeId);
397
+ staleLevels.add(record.levelId);
398
+ changed = true;
399
+ }
400
+ // A stamp that lifts hands the wall back to its own draw call, and nothing
401
+ // else marks the level — so the flip itself has to, or the wall would stay
402
+ // out of the merged mesh until an unrelated edit re-sews the floor.
403
+ for (const nodeId of lastCutawayHiddenWalls) {
404
+ if (cutawayHiddenWalls.has(nodeId))
405
+ continue;
406
+ const node = nodes[nodeId];
407
+ if (node?.type === 'wall' && node.parentId)
408
+ staleLevels.add(node.parentId);
409
+ changed = true;
410
+ }
411
+ lastCutawayHiddenWalls = cutawayHiddenWalls;
412
+ const excludedNodeIds = new Set(cutawayHiddenWalls);
413
+ for (const nodeId of tintedWalls)
414
+ excludedNodeIds.add(nodeId);
316
415
  // A theme, texture or material-library switch re-makes every wall's
317
416
  // materials without marking a single node, so the merged copies have to be
318
417
  // sewn again from the new ones. See `appearanceChanged`.
@@ -336,13 +435,11 @@ function runBatchFrame(invalidate, wakeRef) {
336
435
  changed = true;
337
436
  }
338
437
  }
339
- // Two things make merging unsound, and both are handled the same way: the
340
- // batch stands down for as long as they hold, and sews the floors back
341
- // together once they lift. Isolation hides everything outside the focused
342
- // subtree, and a level's merged mesh hangs off the level root — so it goes
343
- // dark with everything else, leaving a focused batched wall drawn by nobody.
344
- // Every wall mode but `up` re-assigns wall materials the merged mesh does not
345
- // follow. See `canBatchWalls`.
438
+ // Isolation, `down` and `translucent` make batching unsound, so the batch
439
+ // stands down while they hold and sews the floors back together once they
440
+ // lift. `cutaway` stays live because WallCutout stamps hidden walls at
441
+ // priority 0 and this system releases them per wall at priority 5 in the
442
+ // same frame. See `canBatchWalls`.
346
443
  const suspended = !canBatchWalls(useViewer.getState().wallMode, isIsolationActive());
347
444
  if (suspended !== batchingSuspended) {
348
445
  batchingSuspended = suspended;
@@ -381,8 +478,8 @@ function runBatchFrame(invalidate, wakeRef) {
381
478
  return;
382
479
  }
383
480
  for (const levelId of staleLevels) {
384
- if (unbatchedWallCount(levelId, tintedWalls) >= MIN_BATCH_WALLS) {
385
- mergeLevel(levelId, tintedWalls);
481
+ if (unbatchedWallCount(levelId, excludedNodeIds) >= MIN_BATCH_WALLS) {
482
+ mergeLevel(levelId, excludedNodeIds);
386
483
  }
387
484
  }
388
485
  staleLevels.clear();
@@ -161,9 +161,9 @@ export function applyWallBatchGroups(batch, hidden) {
161
161
  * its subtree keeps rendering and picking.
162
162
  */
163
163
  export function hideBatchedWall(mesh) {
164
- hideFromScene(mesh, 'batched');
164
+ hideFromScene(mesh, 'wall-batched');
165
165
  }
166
166
  /** Hands a wall back its own draw call — unless solo or isolation still hide it. */
167
167
  export function revealBatchedWall(mesh) {
168
- showInScene(mesh, 'batched');
168
+ showInScene(mesh, 'wall-batched');
169
169
  }
@@ -1,5 +1,6 @@
1
- import type { NodeDefinition } from '@pascal-app/core';
1
+ import type { AnyNodeId, NodeDefinition, SceneApi, WindowNode as WindowNodeType } from '@pascal-app/core';
2
2
  import { WindowNode } from './schema';
3
+ export declare function resolveWindowHandlePortalTarget(window: WindowNodeType, scene: Pick<SceneApi, 'get'>): AnyNodeId | null;
3
4
  /**
4
5
  * Window — Phase 5 batch kind. Mirrors door's shape: hosted on walls,
5
6
  * cuts holes in them, animated open/close state for opening windows.
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,kBAAkB,CAAA;AAiBzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkIrC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAqG9D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,cAAc,EAEd,QAAQ,EAER,UAAU,IAAI,cAAc,EAC7B,MAAM,kBAAkB,CAAA;AAqBzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAQrC,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAC3B,SAAS,GAAG,IAAI,CAWlB;AA0JD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAqG9D,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { getDormerWallHorizontalBoundsAtHeight, getDormerWallOpeningVerticalBounds, } from '@pascal-app/core';
1
2
  import { buildWindowFloorplanSchedule, computeWindowFloorplanLevelData, } from '../shared/opening-documentation';
2
3
  import { publishOpeningResizeGuides } from '../shared/opening-guides-runtime';
3
4
  import { readRoofFaceHeightMax, readRoofFaceWidthMax } from '../shared/roof-opening-host';
@@ -16,9 +17,19 @@ const SIDE_HANDLE_OFFSET = 0.24;
16
17
  const HEIGHT_HANDLE_OFFSET = 0.24;
17
18
  const MIN_WINDOW_HEIGHT = 0.3;
18
19
  const MIN_WINDOW_WIDTH = 0.3;
19
- // How far the move cross floats off the wall face (+Z, the window's facing
20
- // normal) so it's grabbable instead of buried in the sash/frame.
21
- const MOVE_HANDLE_LIFT = 0.12;
20
+ export function resolveWindowHandlePortalTarget(window, scene) {
21
+ const parentId = window.parentId;
22
+ if (!parentId)
23
+ return null;
24
+ const grandparentId = scene.get(parentId)
25
+ ?.parentId;
26
+ if (!grandparentId)
27
+ return null;
28
+ if (window.dormerId !== parentId)
29
+ return grandparentId;
30
+ return (scene.get(grandparentId)?.parentId ??
31
+ grandparentId);
32
+ }
22
33
  function readWallLength(w, scene) {
23
34
  if (!w.wallId)
24
35
  return Number.POSITIVE_INFINITY;
@@ -27,6 +38,30 @@ function readWallLength(w, scene) {
27
38
  return Number.POSITIVE_INFINITY;
28
39
  return Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
29
40
  }
41
+ function resolveDormerHost(window, scene) {
42
+ const dormerId = window.dormerId ?? window.parentId;
43
+ if (!dormerId)
44
+ return null;
45
+ const dormer = scene.get(dormerId);
46
+ return dormer?.type === 'dormer' ? dormer : null;
47
+ }
48
+ function readDormerFaceWidthMax(window, scene, localGrowSign) {
49
+ const dormer = resolveDormerHost(window, scene);
50
+ if (!dormer)
51
+ return null;
52
+ const bounds = getDormerWallHorizontalBoundsAtHeight(dormer, window.dormerFace ?? 'front', window.position[1] + window.height / 2);
53
+ const faceGrowSign = Math.cos(window.rotation[1]) >= 0 ? localGrowSign : -localGrowSign;
54
+ const anchorX = window.position[0] - (faceGrowSign * window.width) / 2;
55
+ return faceGrowSign > 0 ? bounds.max - anchorX : anchorX - bounds.min;
56
+ }
57
+ function readDormerFaceHeightMax(window, scene, growSign) {
58
+ const dormer = resolveDormerHost(window, scene);
59
+ if (!dormer)
60
+ return null;
61
+ const bounds = getDormerWallOpeningVerticalBounds(dormer, window.dormerFace ?? 'front', window.position[0], window.width);
62
+ const anchorY = window.position[1] - (growSign * window.height) / 2;
63
+ return growSign > 0 ? bounds.max - anchorY : anchorY - bounds.min;
64
+ }
30
65
  function windowWidthHandle(side) {
31
66
  const sign = side === 'right' ? 1 : -1;
32
67
  return {
@@ -36,8 +71,12 @@ function windowWidthHandle(side) {
36
71
  // front instead of edge-on (the window sits on a vertical wall).
37
72
  faceNormal: true,
38
73
  anchor: side === 'right' ? 'min' : 'max',
74
+ gridSnap: true,
39
75
  min: MIN_WINDOW_WIDTH,
40
76
  max: (n, scene) => {
77
+ const dormerMax = readDormerFaceWidthMax(n, scene, sign);
78
+ if (dormerMax !== null)
79
+ return Math.max(MIN_WINDOW_WIDTH, dormerMax);
41
80
  // Roof-hosted windows clamp against the face profile (the
42
81
  // wall-based limits read Infinity when wallId is unset).
43
82
  const roofMax = readRoofFaceWidthMax(n, scene, sign);
@@ -67,6 +106,7 @@ function windowWidthHandle(side) {
67
106
  rotationY: () => (side === 'right' ? 0 : Math.PI),
68
107
  },
69
108
  portal: 'grandparent',
109
+ portalTarget: resolveWindowHandlePortalTarget,
70
110
  };
71
111
  }
72
112
  // Window height has two arrows (top + bottom edge) — each anchors at the
@@ -79,8 +119,12 @@ function windowHeightHandle(edge) {
79
119
  axis: 'y',
80
120
  // top arrow anchors at -Y (bottom stays fixed); bottom at +Y (top stays).
81
121
  anchor: edge === 'top' ? 'min' : 'max',
122
+ gridSnap: true,
82
123
  min: MIN_WINDOW_HEIGHT,
83
124
  max: (n, scene) => {
125
+ const dormerMax = readDormerFaceHeightMax(n, scene, sign);
126
+ if (dormerMax !== null)
127
+ return Math.max(MIN_WINDOW_HEIGHT, dormerMax);
84
128
  const roofMax = readRoofFaceHeightMax(n, scene, sign);
85
129
  if (roofMax !== null)
86
130
  return Math.max(MIN_WINDOW_HEIGHT, roofMax);
@@ -110,27 +154,10 @@ function windowHeightHandle(edge) {
110
154
  position: (n) => [0, sign * (n.height / 2 + HEIGHT_HANDLE_OFFSET), 0],
111
155
  },
112
156
  portal: 'grandparent',
113
- };
114
- }
115
- // Press-drag move grip at the window centre, standing in the wall face. Routes
116
- // through the same move tool as the floating Move button (3D
117
- // `affordanceTools.move`, 2D `floorplanMoveTarget`) — slide within the wall
118
- // plane + re-host onto another wall — committing on release, no second click.
119
- function windowMoveHandle() {
120
- return {
121
- kind: 'tap-action',
122
- shape: 'move-cross',
123
- plane: 'node-normal',
124
- portal: 'grandparent',
125
- cursor: 'move',
126
- onActivate: (node, _scene, editor) => editor.engageMoveDrag(node),
127
- placement: {
128
- position: () => [0, 0, MOVE_HANDLE_LIFT],
129
- },
157
+ portalTarget: resolveWindowHandlePortalTarget,
130
158
  };
131
159
  }
132
160
  const windowHandles = [
133
- windowMoveHandle(),
134
161
  windowWidthHandle('left'),
135
162
  windowWidthHandle('right'),
136
163
  windowHeightHandle('top'),
@@ -151,7 +178,7 @@ export const windowDefinition = {
151
178
  kind: 'window',
152
179
  snapProfile: 'item',
153
180
  facingIndicator: true,
154
- schemaVersion: 2,
181
+ schemaVersion: 3,
155
182
  schema: WindowNode,
156
183
  category: 'structure',
157
184
  extensions: {
@@ -180,9 +207,9 @@ export const windowDefinition = {
180
207
  cutScope: 'wall',
181
208
  dirtyHandledByOwnSystem: true,
182
209
  },
183
- // `wallId` / `roofSegmentId` are re-derived from the surface under
210
+ // `wallId` / `roofSegmentId` / `dormerId` are re-derived from the surface under
184
211
  // the cursor at preset placement time — see door for the pattern.
185
- hostRefFields: ['wallId', 'roofSegmentId', 'roofFace'],
212
+ hostRefFields: ['wallId', 'roofSegmentId', 'roofFace', 'dormerId', 'dormerFace'],
186
213
  // Frame / glass slots painted through the registry. The window system tags
187
214
  // each mesh with its `userData.slotId`; paint writes `node.slots`.
188
215
  slots: () => windowSlots(),
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,CAiPrE,CAAA"}
1
+ {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,CAkPrE,CAAA"}
@@ -198,7 +198,7 @@ export const windowFloorplanMoveTarget = ({ node }) => {
198
198
  return false;
199
199
  // Block on overlap UNLESS Alt force-places — same `placeable` rule as
200
200
  // the 3D move + the shared `resolveOpeningPlacement`.
201
- const collides = hasWallChildOverlap(lastValid.parentId, lastValid.position[0], lastValid.position[1], live.width, live.height, live.id);
201
+ const collides = hasWallChildOverlap(lastValid.parentId, useScene.getState().nodes, lastValid.position[0], lastValid.position[1], live.width, live.height, live.id);
202
202
  return resolveOpeningPlacement({ collides, forcePlace }).placeable;
203
203
  },
204
204
  commit() {