@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,19 +1,22 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { analyzePortConnectivity, DuctSegmentNode, nodeRegistry, pauseSceneHistory, resolveConnectivityUpdates, resumeSceneHistory, sceneRegistry, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
4
- import { DimensionPill, swallowNextClick, triggerSFX, useEditor } from '@pascal-app/editor';
4
+ import { clearPlacementSurface, DimensionPill, isAngleSnapActive, isGridSnapActive, swallowNextClick, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Html } from '@react-three/drei';
7
7
  import { createPortal, useFrame, useThree } from '@react-three/fiber';
8
8
  import { useEffect, useMemo, useRef, useState } from 'react';
9
9
  import { Euler, Matrix4, Plane, Quaternion, Raycaster, Vector2, Vector3, } from 'three';
10
10
  import { newAutoOffsetGroupId, readAutoOffsetTag, translateAutoOffsetBase, withAutoOffsetTag, withoutAutoOffsetTag, } from '../shared/auto-offset-tag';
11
+ import { planRunEndCapFollowUpdates } from '../shared/automatic-run-end-cap';
11
12
  import { detectFittingEndpoint, planFittingEndpointReaim, } from '../shared/fitting-endpoint-reaim';
12
13
  import { DuctSegmentGhost, FittingGhost } from '../shared/mep-ghost';
13
14
  import { collectScenePorts, DUCT_PORT_SYSTEMS, findNearestPortXZ } from '../shared/ports';
14
15
  import { planRunTranslationOffsets } from '../shared/run-translation-offset';
15
- import { HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
16
+ import { ContinuePlusHandle, HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
16
17
  import { planVerticalOffsets } from '../shared/vertical-offset';
18
+ import { refreshWallRunAttachment } from '../shared/wall-run-move';
19
+ import { activateDuctContinuation, ductContinuationHandlePlan, } from './continuation';
17
20
  import { INCHES_TO_METERS } from './geometry';
18
21
  /** Port-snap radius for dragged run endpoints (meters, XZ). */
19
22
  const PORT_SNAP_RADIUS_M = 0.4;
@@ -21,7 +24,7 @@ const PORT_SNAP_RADIUS_M = 0.4;
21
24
  // they clear thick trunks.
22
25
  const CORNER_ARROW_GAP = 0.18;
23
26
  const CORNER_ARROW_MIN_OFFSET = 0.24;
24
- /** Roll snap increment — 45°, matching the fitting rotate step. Shift bypasses. */
27
+ /** Roll snap increment — 45°, matching the fitting rotate step. */
25
28
  const ROLL_STEP_RAD = Math.PI / 4;
26
29
  const UP = new Vector3(0, 1, 0);
27
30
  function collectPortsFromNodes(nodes, filter = {}) {
@@ -76,11 +79,10 @@ function runRadiusM(duct) {
76
79
  * - **Alt** detaches: the joint breaks for this drag — the elbow does NOT
77
80
  * re-aim and mated fittings / runs do NOT follow; the endpoint moves on its
78
81
  * own (port re-mate still allowed so it can be reattached elsewhere).
79
- * - **Shift** bypasses grid snapping for a perfectly smooth precision drag.
82
+ * - Snapping follows the active editor snapping mode.
80
83
  *
81
- * History does the single-undo dance: paused during the drag (the live
82
- * `updateNode` ticks are untracked), then on release the path is
83
- * reverted, history resumed, and the final path applied as one tracked
84
+ * History is paused during the drag while live overrides drive the preview.
85
+ * On release, history resumes and the final path is applied as one tracked
84
86
  * change.
85
87
  */
86
88
  const DuctSegmentSelectionAffordance = () => {
@@ -126,6 +128,8 @@ const DuctSegmentSelectionAffordance = () => {
126
128
  };
127
129
  const DuctPointHandles = ({ duct, target }) => {
128
130
  const { camera, gl } = useThree();
131
+ const liveOverride = useLiveNodeOverrides((state) => state.overrides.get(duct.id));
132
+ const displayDuct = liveOverride ? { ...duct, ...liveOverride } : duct;
129
133
  // Outer group mirrors the duct group's local pose so handles placed in
130
134
  // node-local path coords land exactly where the duct mesh sits, even though
131
135
  // they're mounted in the parent (to stay out of the duct's selection
@@ -259,21 +263,54 @@ const DuctPointHandles = ({ duct, target }) => {
259
263
  // leans). Otherwise: the dragged point moves and any mated fittings / runs
260
264
  // translate via connectivity.
261
265
  const buildDragBatch = (drag, next, detached) => {
266
+ const wall = duct.wallAttachment
267
+ ? useScene.getState().nodes[duct.wallAttachment.wallId]
268
+ : undefined;
269
+ const attachmentFor = (path) => duct.wallAttachment && wall?.type === 'wall'
270
+ ? refreshWallRunAttachment(path, duct.wallAttachment, wall)
271
+ : duct.wallAttachment;
272
+ const withEndCapFollow = (path, updates) => {
273
+ if (drag.index !== 0 && drag.index !== drag.initialPath.length - 1)
274
+ return updates;
275
+ const endpoint = drag.index === 0 ? 'start' : 'end';
276
+ const nextDuct = { ...duct, path };
277
+ const capUpdates = planRunEndCapFollowUpdates(duct, nextDuct, endpoint, useScene.getState().nodes);
278
+ const capIds = new Set(capUpdates.map((update) => update.id));
279
+ return [...updates.filter((update) => !capIds.has(update.id)), ...capUpdates];
280
+ };
262
281
  if (!detached && drag.fittingEndpoint) {
263
282
  const plan = planFittingEndpointReaim(drag.fittingEndpoint, drag.index, next);
264
283
  // Out of the fitting's buildable range — hold this frame.
265
284
  if (!plan)
266
285
  return null;
267
- return [
268
- { id: duct.id, data: { path: plan.path } },
286
+ return withEndCapFollow(plan.path, [
287
+ {
288
+ id: duct.id,
289
+ data: { path: plan.path, wallAttachment: attachmentFor(plan.path) },
290
+ },
269
291
  { id: plan.fittingUpdate.id, data: plan.fittingUpdate.data },
270
- ];
292
+ ...(drag.jointPartner
293
+ ? [
294
+ {
295
+ id: drag.jointPartner.id,
296
+ data: {
297
+ path: drag.jointPartner.startPath.map((p, i) => i === (drag.index === 0 ? drag.jointPartner.startPath.length - 1 : 0)
298
+ ? drag.index === 0
299
+ ? plan.path[plan.path.length - 1]
300
+ : plan.path[0]
301
+ : p),
302
+ },
303
+ },
304
+ ]
305
+ : []),
306
+ ]);
271
307
  }
272
- const path = duct.path.map((p, i) => (i === drag.index ? next : p));
273
- return [
274
- { id: duct.id, data: { path } },
308
+ const path = drag.initialPath.map((p, i) => (i === drag.index ? next : p));
309
+ const updates = [
310
+ { id: duct.id, data: { path, wallAttachment: attachmentFor(path) } },
275
311
  ...(detached ? [] : connectivityUpdatesForPath(drag.connectivity, path)),
276
312
  ];
313
+ return detached ? updates : withEndCapFollow(path, updates);
277
314
  };
278
315
  /** World-space position of a local path point. */
279
316
  const toWorld = (p) => target.localToWorld(new Vector3(p[0], p[1], p[2]));
@@ -301,6 +338,27 @@ const DuctPointHandles = ({ duct, target }) => {
301
338
  const startPoint = initialPath[index];
302
339
  const connectivity = analyzePortConnectivity(duct, useScene.getState().nodes);
303
340
  pauseSceneHistory(useScene);
341
+ const livePreviewIds = new Set();
342
+ const publishLivePreview = (updates) => {
343
+ const scene = useScene.getState();
344
+ const entries = updates
345
+ .filter((update) => scene.nodes[update.id])
346
+ .map((update) => [update.id, update.data]);
347
+ useLiveNodeOverrides.getState().setMany(entries);
348
+ for (const [id] of entries) {
349
+ livePreviewIds.add(id);
350
+ scene.markDirty(id);
351
+ }
352
+ };
353
+ const clearLivePreview = () => {
354
+ const scene = useScene.getState();
355
+ const overrides = useLiveNodeOverrides.getState();
356
+ for (const id of livePreviewIds) {
357
+ overrides.clear(id);
358
+ if (scene.nodes[id])
359
+ scene.markDirty(id);
360
+ }
361
+ };
304
362
  useViewer.getState().setInputDragging(true);
305
363
  document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
306
364
  setDraggingIndex(index);
@@ -311,7 +369,7 @@ const DuctPointHandles = ({ duct, target }) => {
311
369
  // instead of lengthening. The along-run pair keeps the plain lengthen /
312
370
  // shorten. The pivot is the adjacent vertex; null when there's no neighbour
313
371
  // (a lone point) or the grabbed segment has zero length.
314
- const swings = kind.axis === 'y' ? kind.along !== true : !kind.along;
372
+ const swings = kind.axis === 'y' ? kind.along !== true : kind.axis === 'horizontal' && !kind.along;
315
373
  // Pivot only at an endpoint (its single neighbour is the unambiguous "other
316
374
  // end"); interior vertices keep the plain per-axis drag.
317
375
  const neighborIndex = index === 0 ? 1 : index === initialPath.length - 1 ? index - 1 : null;
@@ -327,15 +385,19 @@ const DuctPointHandles = ({ duct, target }) => {
327
385
  const fittingEndpoint = isEndpoint
328
386
  ? detectFittingEndpoint('duct-segment', initialPath, index, useScene.getState().nodes)
329
387
  : null;
388
+ const partnerId = fittingEndpoint?.fitting.metadata?.altJoint
389
+ ? fittingEndpoint.fitting.metadata.partnerIds?.find((id) => id !== duct.id)
390
+ : undefined;
391
+ const partner = partnerId ? useScene.getState().nodes[partnerId] : undefined;
330
392
  const onMove = (event) => {
331
393
  const drag = dragRef.current;
332
394
  if (!drag)
333
395
  return;
334
- // Shift = precision: bypass grid snapping (snap() is a no-op at step 0).
335
- const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
396
+ // Follow the active snapping mode; Shift cycles that mode globally.
397
+ const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
336
398
  // Alt = detach: break the joint for this drag (it can still port-snap to
337
399
  // re-mate elsewhere). Mirrors the wall corner drag.
338
- const detached = event.altKey;
400
+ const detached = event.altKey && !drag.jointPartner;
339
401
  let next = null;
340
402
  if (canSwing && pivot) {
341
403
  // Length-preserving swing: aim from the pivot toward the cursor and
@@ -347,8 +409,7 @@ const DuctPointHandles = ({ duct, target }) => {
347
409
  ? swingVertical(event, pivot, startPoint)
348
410
  : swingHorizontal(event, pivot, startPoint);
349
411
  if (aim) {
350
- // The swung endpoint follows the grid snap points by default; Shift
351
- // sets step 0 so it sweeps smoothly. Snapping the landed coords (not
412
+ // The swung endpoint follows the active grid snap mode. Snapping the landed coords (not
352
413
  // the arc angle) keeps the endpoint on the grid like every other
353
414
  // arrow, trading a hair of the fixed radius for grid alignment.
354
415
  next = [
@@ -388,7 +449,10 @@ const DuctPointHandles = ({ duct, target }) => {
388
449
  // radius yields to the port). Stays available while detaching or
389
450
  // free-dragging; suppressed only while a fitting is actively re-aiming.
390
451
  if (isEndpoint && (detached || !drag.fittingEndpoint)) {
391
- const port = findNearestPortXZ([next[0], next[1], next[2]], collectScenePorts({ excludeNodeId: duct.id, systems: DUCT_PORT_SYSTEMS }), PORT_SNAP_RADIUS_M);
452
+ const port = findNearestPortXZ([next[0], next[1], next[2]], collectScenePorts({
453
+ excludeNodeId: duct.id,
454
+ systems: DUCT_PORT_SYSTEMS,
455
+ }), PORT_SNAP_RADIUS_M);
392
456
  if (port)
393
457
  next = [port.position[0], port.position[1], port.position[2]];
394
458
  }
@@ -404,7 +468,7 @@ const DuctPointHandles = ({ duct, target }) => {
404
468
  // when the grid is live (step > 0): Shift-precision has nothing to snap.
405
469
  if (step > 0)
406
470
  triggerSFX('sfx:grid-snap');
407
- useScene.getState().updateNodes(batch);
471
+ publishLivePreview(batch);
408
472
  };
409
473
  const onUp = () => {
410
474
  const drag = dragRef.current;
@@ -419,30 +483,15 @@ const DuctPointHandles = ({ duct, target }) => {
419
483
  drag.cleanup();
420
484
  dragRef.current = null;
421
485
  setDraggingIndex(null);
422
- // Single-undo dance: revert (still paused), resume, re-apply the final
423
- // batch as one tracked change. The final batch is built the same way as
486
+ clearLivePreview();
487
+ // Resume history and apply the final batch as one tracked change. The
488
+ // final batch is built the same way as
424
489
  // each live frame (elbow re-aim, rigid connectivity follow, or — when
425
490
  // detached — just the duct path).
426
491
  const detached = drag.detached;
492
+ const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
427
493
  const finalBatch = buildDragBatch(drag, drag.current, detached);
428
- // Revert the run AND whatever the drag carried to their pre-drag state
429
- // while paused so history captures a clean before→after delta. When
430
- // detached nothing else moved, so only the run needs reverting.
431
- const revertUpdates = detached
432
- ? []
433
- : drag.fittingEndpoint
434
- ? [drag.fittingEndpoint.revert]
435
- : (drag.connectivity?.connections ?? []).map((conn) => conn.kind === 'rigid-node'
436
- ? { id: conn.nodeId, data: { position: conn.startPosition } }
437
- : { id: conn.nodeId, data: { path: conn.startPath } });
438
- useScene
439
- .getState()
440
- .updateNodes([
441
- { id: duct.id, data: { path: drag.initialPath } },
442
- ...revertUpdates.filter((u) => useScene.getState().nodes[u.id]),
443
- ]);
444
494
  resumeSceneHistory(useScene);
445
- const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
446
495
  if (moved && finalBatch) {
447
496
  // A manual corner edit invalidates any stored auto-offset base (the
448
497
  // tag's snapshot no longer matches the geometry), so strip the tag on
@@ -473,6 +522,9 @@ const DuctPointHandles = ({ duct, target }) => {
473
522
  cleanup,
474
523
  connectivity,
475
524
  fittingEndpoint,
525
+ jointPartner: partner?.type === 'duct-segment'
526
+ ? { id: partner.id, startPath: partner.path.map((p) => [...p]) }
527
+ : undefined,
476
528
  detached: false,
477
529
  };
478
530
  window.addEventListener('pointermove', onMove);
@@ -527,23 +579,23 @@ const DuctPointHandles = ({ duct, target }) => {
527
579
  const b = bearing(event.clientX, event.clientY);
528
580
  if (b === null)
529
581
  return;
530
- // Snap the roll to 45° steps; Shift = smooth (no snap).
582
+ // Snap the roll to 45° steps only in the active angle mode.
531
583
  const raw = b - startBearing;
532
- const delta = event.shiftKey ? raw : Math.round(raw / ROLL_STEP_RAD) * ROLL_STEP_RAD;
584
+ const delta = isAngleSnapActive() ? Math.round(raw / ROLL_STEP_RAD) * ROLL_STEP_RAD : raw;
533
585
  const next = startRoll + delta;
534
586
  if (next === current)
535
587
  return;
536
588
  current = next;
537
- // Tick the rotate SFX each time a fresh snap step is crossed (snapped
538
- // rolls only — a smooth Shift-drag has no discrete steps to mark).
539
- if (!event.shiftKey) {
589
+ // Tick the rotate SFX each time a fresh snapped step is crossed.
590
+ if (isAngleSnapActive()) {
540
591
  const step = Math.round(raw / ROLL_STEP_RAD);
541
592
  if (step !== lastStep) {
542
593
  lastStep = step;
543
594
  triggerSFX('sfx:item-rotate');
544
595
  }
545
596
  }
546
- useScene.getState().updateNode(duct.id, { roll: next });
597
+ useLiveNodeOverrides.getState().set(duct.id, { roll: next });
598
+ useScene.getState().markDirty(duct.id);
547
599
  };
548
600
  const onUp = () => {
549
601
  swallowNextClick();
@@ -551,12 +603,11 @@ const DuctPointHandles = ({ duct, target }) => {
551
603
  window.removeEventListener('pointerup', onUp);
552
604
  window.removeEventListener('pointercancel', onUp);
553
605
  useViewer.getState().setInputDragging(false);
606
+ clearPlacementSurface();
554
607
  document.body.style.cursor = '';
555
608
  setRolling(false);
556
- // Single-undo dance: revert to the pre-drag roll while paused, resume,
557
- // then re-apply the final roll as one tracked change. A roll edit also
558
- // invalidates any stored auto-offset base, so strip the tag on commit.
559
- useScene.getState().updateNode(duct.id, { roll: startRoll });
609
+ useLiveNodeOverrides.getState().clear(duct.id);
610
+ useScene.getState().markDirty(duct.id);
560
611
  resumeSceneHistory(useScene);
561
612
  if (current !== startRoll) {
562
613
  useScene.getState().updateNode(duct.id, {
@@ -604,12 +655,7 @@ const DuctPointHandles = ({ duct, target }) => {
604
655
  const logicalPath = (runBase?.data?.path?.map((p) => [...p]) ?? initialPath);
605
656
  const baseDy = tag?.dy ?? 0;
606
657
  const mintedIds = (tag?.minted ?? []);
607
- // Snapshots of the existing minted nodes, so the pre-commit revert can
608
- // restore the original Z (the single-undo baseline) before the final write.
609
- const mintedSnapshots = mintedIds
610
- .map((id) => preRewindNodes[id])
611
- .filter((n) => Boolean(n));
612
- const previewDeletedSnapshots = new Map();
658
+ const previewHiddenIds = new Set();
613
659
  pauseSceneHistory(useScene);
614
660
  const ensureSceneObjectsVisible = (ids) => {
615
661
  const scene = useScene.getState();
@@ -640,11 +686,32 @@ const DuctPointHandles = ({ duct, target }) => {
640
686
  }
641
687
  };
642
688
  const clearLivePreview = () => {
689
+ const scene = useScene.getState();
643
690
  const overrides = useLiveNodeOverrides.getState();
644
- for (const id of livePreviewIds)
691
+ for (const id of livePreviewIds) {
645
692
  overrides.clear(id);
693
+ if (scene.nodes[id])
694
+ scene.markDirty(id);
695
+ }
646
696
  livePreviewIds.clear();
647
697
  };
698
+ const setPreviewHidden = (ids) => {
699
+ const next = new Set(ids);
700
+ for (const id of previewHiddenIds) {
701
+ if (next.has(id))
702
+ continue;
703
+ const object = sceneRegistry.nodes.get(id);
704
+ if (object)
705
+ object.visible = true;
706
+ previewHiddenIds.delete(id);
707
+ }
708
+ for (const id of next) {
709
+ const object = sceneRegistry.nodes.get(id);
710
+ if (object)
711
+ object.visible = false;
712
+ previewHiddenIds.add(id);
713
+ }
714
+ };
648
715
  // Connectivity + ports are read from an IN-MEMORY post-rewind scene (the
649
716
  // logical L), so click-only pointerdown doesn't visually snap the committed
650
717
  // offset down to the floor. The real scene is only rewound after the first
@@ -716,10 +783,15 @@ const DuctPointHandles = ({ duct, target }) => {
716
783
  const partnerReverts = () => (connectivity?.connections ?? [])
717
784
  .map((conn) => {
718
785
  if (conn.kind !== 'rigid-node') {
719
- return { id: conn.nodeId, data: { path: conn.startPath } };
786
+ return {
787
+ id: conn.nodeId,
788
+ data: { path: conn.startPath },
789
+ };
720
790
  }
721
791
  const start = nodesById[conn.nodeId];
722
- const data = { position: conn.startPosition };
792
+ const data = {
793
+ position: conn.startPosition,
794
+ };
723
795
  if (start?.rotation !== undefined)
724
796
  data.rotation = start.rotation;
725
797
  if (start?.angle !== undefined)
@@ -732,7 +804,10 @@ const DuctPointHandles = ({ duct, target }) => {
732
804
  // start paths / poses. A re-drag carries the existing tag's base forward.
733
805
  const freshBase = () => [
734
806
  { id: duct.id, data: { path: initialPath } },
735
- ...partnerReverts().map((u) => ({ id: u.id, data: u.data })),
807
+ ...partnerReverts().map((u) => ({
808
+ id: u.id,
809
+ data: u.data,
810
+ })),
736
811
  ];
737
812
  // Patches restoring partners to their PRE-rewind (original Z) poses — the
738
813
  // single-undo baseline. Untagged: same as the L (no rewind happened).
@@ -746,7 +821,10 @@ const DuctPointHandles = ({ duct, target }) => {
746
821
  if (!orig)
747
822
  return null;
748
823
  if ('path' in orig)
749
- return { id: b.id, data: { path: orig.path } };
824
+ return {
825
+ id: b.id,
826
+ data: { path: orig.path },
827
+ };
750
828
  const data = {};
751
829
  if (orig.position !== undefined)
752
830
  data.position = orig.position;
@@ -760,47 +838,19 @@ const DuctPointHandles = ({ duct, target }) => {
760
838
  .filter((u) => useScene.getState().nodes[u.id]);
761
839
  };
762
840
  const restoreOriginalOffsetPreview = () => {
763
- const scene = useScene.getState();
764
841
  const partnerUpdates = originalPartnerReverts();
765
842
  const updates = [
766
843
  {
767
844
  id: duct.id,
768
- data: { path: duct.path, metadata: duct.metadata },
845
+ data: {
846
+ path: duct.path,
847
+ metadata: duct.metadata,
848
+ },
769
849
  },
770
850
  ...partnerUpdates,
771
851
  ];
772
852
  publishLivePreview(updates);
773
- scene.applyNodeChanges({
774
- create: mintedSnapshots
775
- .filter((n) => !scene.nodes[n.id])
776
- .map((node) => ({ node, parentId })),
777
- update: updates,
778
- });
779
- ensureSceneObjectsVisible([
780
- duct.id,
781
- ...mintedSnapshots.map((node) => node.id),
782
- ...partnerUpdates.map((update) => update.id),
783
- ]);
784
- };
785
- const restorePreviewDeleted = (keepDeleted = []) => {
786
- const keep = new Set(keepDeleted);
787
- const scene = useScene.getState();
788
- const create = [];
789
- for (const [id, node] of previewDeletedSnapshots) {
790
- if (keep.has(id))
791
- continue;
792
- if (!scene.nodes[id]) {
793
- create.push({
794
- node,
795
- parentId: (node.parentId ?? undefined),
796
- });
797
- }
798
- previewDeletedSnapshots.delete(id);
799
- }
800
- if (create.length > 0) {
801
- scene.applyNodeChanges({ create });
802
- ensureSceneObjectsVisible(create.map(({ node }) => node.id));
803
- }
853
+ setPreviewHidden([]);
804
854
  };
805
855
  const applyLogicalBasePreview = () => {
806
856
  if (!tag)
@@ -819,11 +869,7 @@ const DuctPointHandles = ({ duct, target }) => {
819
869
  .map((b) => ({ id: b.id, data: b.data })),
820
870
  ];
821
871
  publishLivePreview(updates);
822
- scene.applyNodeChanges({
823
- delete: mintedIds.filter((id) => scene.nodes[id]),
824
- update: updates,
825
- });
826
- ensureSceneObjectsVisible(updates.map((update) => update.id));
872
+ setPreviewHidden(mintedIds);
827
873
  };
828
874
  const onMove = (event) => {
829
875
  if (startSample === null)
@@ -831,7 +877,7 @@ const DuctPointHandles = ({ duct, target }) => {
831
877
  const s = sample(event.clientX, event.clientY);
832
878
  if (s === null)
833
879
  return;
834
- const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
880
+ const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
835
881
  const next = snap(s - startSample, step);
836
882
  if (next === delta)
837
883
  return;
@@ -865,12 +911,7 @@ const DuctPointHandles = ({ duct, target }) => {
865
911
  const plan = offsetResult.plan;
866
912
  const scene = useScene.getState();
867
913
  const deletePreview = (plan.delete ?? []).filter((id) => scene.nodes[id]);
868
- for (const id of deletePreview) {
869
- const node = scene.nodes[id];
870
- if (node)
871
- previewDeletedSnapshots.set(id, node);
872
- }
873
- restorePreviewDeleted(plan.delete ?? []);
914
+ setPreviewHidden([...mintedIds, ...deletePreview]);
874
915
  const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
875
916
  const updates = [
876
917
  { id: duct.id, data: { path: plan.ductPath } },
@@ -878,31 +919,29 @@ const DuctPointHandles = ({ duct, target }) => {
878
919
  ...followUpdates,
879
920
  ];
880
921
  publishLivePreview(updates);
881
- scene.applyNodeChanges({
882
- delete: deletePreview,
883
- update: updates,
922
+ setVerticalGhost({
923
+ tint: 'valid',
924
+ fittings: plan.fittings,
925
+ risers: plan.risers,
884
926
  });
885
- ensureSceneObjectsVisible(updates.map((update) => update.id));
886
- setVerticalGhost({ tint: 'valid', fittings: plan.fittings, risers: plan.risers });
887
927
  }
888
928
  else if (offsetResult?.status === 'invalid') {
889
929
  // No clean offset at this height. Keep the last committed network
890
930
  // visible (including any prior auto-offset we rewound at drag-start)
891
931
  // and show a RED ghost of the run where it WOULD lift to. Nothing is
892
932
  // committed on release, so the run snaps back to its prior state.
893
- restorePreviewDeleted();
894
933
  restoreOriginalOffsetPreview();
895
- const lifted = DuctSegmentNode.parse({ ...logicalDuct, path: shiftedPath(next) });
934
+ const lifted = DuctSegmentNode.parse({
935
+ ...logicalDuct,
936
+ path: shiftedPath(next),
937
+ });
896
938
  setVerticalGhost({ tint: 'invalid', fittings: [], risers: [lifted] });
897
939
  }
898
940
  else {
899
- restorePreviewDeleted();
900
941
  applyLogicalBasePreview();
901
942
  setVerticalGhost(null);
902
943
  const updates = batchFor(shiftedPath(next));
903
944
  publishLivePreview(updates);
904
- useScene.getState().updateNodes(updates);
905
- ensureSceneObjectsVisible(updates.map((update) => update.id));
906
945
  }
907
946
  };
908
947
  const onUp = () => {
@@ -915,35 +954,7 @@ const DuctPointHandles = ({ duct, target }) => {
915
954
  setRunMoving(false);
916
955
  setVerticalGhost(null);
917
956
  clearLivePreview();
918
- // Single-undo dance: while paused, revert to the PRE-drag baseline (the
919
- // original Z — recreate the minted nodes the rewind deleted and restore
920
- // the run + partners), resume, then write the final state as ONE tracked
921
- // change so undo jumps straight back to the original.
922
- const restore = useScene.getState();
923
- const restoredPreviewNodes = Array.from(previewDeletedSnapshots.values()).filter((node) => !restore.nodes[node.id]);
924
- const restoredMintedNodes = mintedSnapshots.filter((n) => !restore.nodes[n.id]);
925
- const restoreUpdates = [
926
- {
927
- id: duct.id,
928
- data: { path: duct.path, metadata: duct.metadata },
929
- },
930
- ...originalPartnerReverts(),
931
- ];
932
- restore.applyNodeChanges({
933
- create: [
934
- ...restoredMintedNodes.map((node) => ({ node, parentId })),
935
- ...restoredPreviewNodes.map((node) => ({
936
- node,
937
- parentId: (node.parentId ?? undefined),
938
- })),
939
- ],
940
- update: restoreUpdates,
941
- });
942
- ensureSceneObjectsVisible([
943
- ...restoredMintedNodes.map((node) => node.id),
944
- ...restoredPreviewNodes.map((node) => node.id),
945
- ...restoreUpdates.map((update) => update.id),
946
- ]);
957
+ setPreviewHidden([]);
947
958
  resumeSceneHistory(useScene);
948
959
  if (delta === 0)
949
960
  return;
@@ -1036,7 +1047,10 @@ const DuctPointHandles = ({ duct, target }) => {
1036
1047
  if (translationPlan) {
1037
1048
  const created = [...translationPlan.fittings, ...translationPlan.connectors];
1038
1049
  const updates = [
1039
- { id: duct.id, data: { path: translationPlan.ductPath } },
1050
+ {
1051
+ id: duct.id,
1052
+ data: { path: translationPlan.ductPath },
1053
+ },
1040
1054
  ...translationPlan.updates,
1041
1055
  ];
1042
1056
  scene.applyNodeChanges({
@@ -1084,19 +1098,19 @@ const DuctPointHandles = ({ duct, target }) => {
1084
1098
  window.addEventListener('pointerup', onUp);
1085
1099
  window.addEventListener('pointercancel', onUp);
1086
1100
  };
1087
- const cornerArrows = useMemo(() => getCornerArrows(duct), [duct]);
1088
- const rollGizmo = useMemo(() => (duct.shape === 'round' ? null : runAxisAndCenter(duct)), [duct]);
1101
+ const cornerArrows = useMemo(() => getCornerArrows(displayDuct), [displayDuct]);
1102
+ const rollGizmo = useMemo(() => (displayDuct.shape === 'round' ? null : runAxisAndCenter(displayDuct)), [displayDuct]);
1089
1103
  // Run-center cube position (centroid centerline). The six whole-run move
1090
1104
  // arrows + the roll arc are revealed on hover, like the per-vertex clusters.
1091
- const runCenter = useMemo(() => runAxisAndCenter(duct)?.center ?? null, [duct]);
1105
+ const runCenter = useMemo(() => runAxisAndCenter(displayDuct)?.center ?? null, [displayDuct]);
1092
1106
  // Yaw the center cube to the run's horizontal heading so it stays aligned
1093
1107
  // with the run (matching the per-vertex cubes). A pure riser has no heading.
1094
1108
  const runCenterYaw = useMemo(() => {
1095
- const axis = runAxisAndCenter(duct);
1109
+ const axis = runAxisAndCenter(displayDuct);
1096
1110
  if (!axis || Math.hypot(axis.dir[0], axis.dir[2]) < 1e-6)
1097
1111
  return 0;
1098
1112
  return Math.atan2(-axis.dir[2], axis.dir[0]);
1099
- }, [duct]);
1113
+ }, [displayDuct]);
1100
1114
  // Six whole-run move arrows offset off the center: four horizontal (along-run
1101
1115
  // ± and across-run ±, aligned to the run's XZ tangent so they track the run
1102
1116
  // instead of world ±X / ±Z) plus the up / down vertical pair. All shift every
@@ -1104,10 +1118,10 @@ const DuctPointHandles = ({ duct, target }) => {
1104
1118
  const centerArrows = useMemo(() => {
1105
1119
  if (!runCenter)
1106
1120
  return [];
1107
- const base = Math.max(runRadiusM(duct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
1121
+ const base = Math.max(runRadiusM(displayDuct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
1108
1122
  // Run's horizontal heading (node-local XZ). A pure riser has none → fall
1109
1123
  // back to world +X so the arrows stay usable.
1110
- const axis = runAxisAndCenter(duct);
1124
+ const axis = runAxisAndCenter(displayDuct);
1111
1125
  const t = axis && Math.hypot(axis.dir[0], axis.dir[2]) > 1e-6
1112
1126
  ? (() => {
1113
1127
  const len = Math.hypot(axis.dir[0], axis.dir[2]);
@@ -1144,19 +1158,22 @@ const DuctPointHandles = ({ duct, target }) => {
1144
1158
  cursor: 'ns-resize',
1145
1159
  });
1146
1160
  return arrows;
1147
- }, [duct, runCenter]);
1161
+ }, [displayDuct, runCenter]);
1148
1162
  return (_jsxs("group", { ref: outerRef, children: [verticalGhost?.fittings.map((f) => (_jsx(FittingGhost, { fitting: f, tint: verticalGhost.tint }, `vghost-fit-${f.id}`))), verticalGhost?.risers.map((r) => (_jsx(DuctSegmentGhost, { duct: r, tint: verticalGhost.tint }, `vghost-riser-${r.id}`))), draggingIndex === null &&
1149
1163
  !rolling &&
1150
1164
  !runMoving &&
1151
- duct.path.map((p, i) => (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === i, onClick: () => toggleCluster(i), position: p, rotationY: vertexYaw(duct, i) }), openCluster === i &&
1165
+ ['start', 'end'].map((endpoint) => (_jsx(DuctContinuationHandle, { duct: displayDuct, endpoint: endpoint }, endpoint))), draggingIndex === null &&
1166
+ !rolling &&
1167
+ !runMoving &&
1168
+ displayDuct.path.map((p, i) => (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === i, onClick: () => toggleCluster(i), position: p, rotationY: vertexYaw(displayDuct, i) }), openCluster === i &&
1152
1169
  cornerArrows
1153
1170
  .filter((a) => a.index === i)
1154
- .map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onHandleDown(a.index, a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key)))] }, `vtx${i}`))), draggingIndex === null && !rolling && !runMoving && runCenter && (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === 'center', onClick: () => toggleCluster('center'), position: runCenter, rotationY: runCenterYaw }), openCluster === 'center' && (_jsxs(_Fragment, { children: [centerArrows.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onRunMoveDown(a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key))), rollGizmo && (_jsx(RollHandle, { center: rollGizmo.center, dir: rollGizmo.dir, onPointerDown: onRollDown, radius: runRadiusM(duct) + CORNER_ARROW_GAP }))] }))] })), draggingIndex !== null &&
1155
- duct.path[draggingIndex] &&
1171
+ .map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onHandleDown(a.index, a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key)))] }, `vtx${i}`))), draggingIndex === null && !rolling && !runMoving && runCenter && (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === 'center', onClick: () => toggleCluster('center'), position: runCenter, rotationY: runCenterYaw }), openCluster === 'center' && (_jsxs(_Fragment, { children: [centerArrows.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onRunMoveDown(a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key))), rollGizmo && (_jsx(RollHandle, { center: rollGizmo.center, dir: rollGizmo.dir, onPointerDown: onRollDown, radius: runRadiusM(displayDuct) + CORNER_ARROW_GAP }))] }))] })), draggingIndex !== null &&
1172
+ displayDuct.path[draggingIndex] &&
1156
1173
  (() => {
1157
1174
  // Same pill as the draw tool: signed per-axis deltas from the
1158
1175
  // drag-start position, dominant axis emphasised.
1159
- const point = duct.path[draggingIndex];
1176
+ const point = displayDuct.path[draggingIndex];
1160
1177
  const origin = dragRef.current?.initialPath[draggingIndex] ?? point;
1161
1178
  const deltas = [point[0] - origin[0], point[1] - origin[1], point[2] - origin[2]];
1162
1179
  const axes = ['x', 'y', 'z'];
@@ -1169,6 +1186,17 @@ const DuctPointHandles = ({ duct, target }) => {
1169
1186
  })), primary: primary, unit: unit }) }));
1170
1187
  })()] }));
1171
1188
  };
1189
+ function DuctContinuationHandle({ duct, endpoint, }) {
1190
+ const nodes = useScene((state) => state.nodes);
1191
+ const gap = Math.max(0.28, runRadiusM(duct) + 0.18);
1192
+ const plan = ductContinuationHandlePlan(duct, endpoint, nodes, gap);
1193
+ if (!plan)
1194
+ return null;
1195
+ return (_jsx(ContinuePlusHandle, { onActivate: () => {
1196
+ triggerSFX('sfx:item-pick');
1197
+ activateDuctContinuation(duct, endpoint, plan.fittingId);
1198
+ }, position: plan.position }));
1199
+ }
1172
1200
  /**
1173
1201
  * Roll gizmo — the shared `RotateArc` re-oriented to wrap the run's length
1174
1202
  * axis, seated at a FIXED corner of the section frame. It does NOT track