@pascal-app/nodes 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1717) hide show
  1. package/dist/box-vent/definition.d.ts +30 -0
  2. package/dist/box-vent/definition.d.ts.map +1 -0
  3. package/dist/box-vent/definition.js +210 -0
  4. package/dist/box-vent/floorplan.d.ts +15 -0
  5. package/dist/box-vent/floorplan.d.ts.map +1 -0
  6. package/dist/box-vent/floorplan.js +187 -0
  7. package/dist/box-vent/geometry.d.ts +40 -0
  8. package/dist/box-vent/geometry.d.ts.map +1 -0
  9. package/dist/box-vent/geometry.js +421 -0
  10. package/dist/box-vent/index.d.ts +4 -0
  11. package/dist/box-vent/index.d.ts.map +1 -0
  12. package/dist/box-vent/index.js +3 -0
  13. package/dist/box-vent/move-tool.d.ts +14 -0
  14. package/dist/box-vent/move-tool.d.ts.map +1 -0
  15. package/dist/box-vent/move-tool.js +217 -0
  16. package/dist/box-vent/panel.d.ts +14 -0
  17. package/dist/box-vent/panel.d.ts.map +1 -0
  18. package/dist/box-vent/panel.js +143 -0
  19. package/dist/box-vent/parametrics.d.ts +9 -0
  20. package/dist/box-vent/parametrics.d.ts.map +1 -0
  21. package/dist/box-vent/parametrics.js +35 -0
  22. package/dist/box-vent/preview.d.ts +17 -0
  23. package/dist/box-vent/preview.d.ts.map +1 -0
  24. package/dist/box-vent/preview.js +41 -0
  25. package/dist/box-vent/renderer.d.ts +26 -0
  26. package/dist/box-vent/renderer.d.ts.map +1 -0
  27. package/dist/box-vent/renderer.js +127 -0
  28. package/dist/box-vent/schema.d.ts +2 -0
  29. package/dist/box-vent/schema.d.ts.map +1 -0
  30. package/dist/box-vent/schema.js +3 -0
  31. package/dist/box-vent/tool.d.ts +13 -0
  32. package/dist/box-vent/tool.d.ts.map +1 -0
  33. package/dist/box-vent/tool.js +116 -0
  34. package/dist/building/definition.d.ts +12 -0
  35. package/dist/building/definition.d.ts.map +1 -0
  36. package/dist/building/definition.js +53 -0
  37. package/dist/building/index.d.ts +2 -0
  38. package/dist/building/index.d.ts.map +1 -0
  39. package/dist/building/index.js +1 -0
  40. package/dist/building/move-tool.d.ts +6 -0
  41. package/dist/building/move-tool.d.ts.map +1 -0
  42. package/dist/building/move-tool.js +187 -0
  43. package/dist/building/parametrics.d.ts +3 -0
  44. package/dist/building/parametrics.d.ts.map +1 -0
  45. package/dist/building/parametrics.js +3 -0
  46. package/dist/building/renderer.d.ts +6 -0
  47. package/dist/building/renderer.d.ts.map +1 -0
  48. package/dist/building/renderer.js +12 -0
  49. package/dist/building/schema.d.ts +2 -0
  50. package/dist/building/schema.d.ts.map +1 -0
  51. package/dist/building/schema.js +1 -0
  52. package/dist/cabinet/animation.d.ts +5 -0
  53. package/dist/cabinet/animation.d.ts.map +1 -0
  54. package/dist/cabinet/animation.js +48 -0
  55. package/dist/cabinet/compartment-card.d.ts +17 -0
  56. package/dist/cabinet/compartment-card.d.ts.map +1 -0
  57. package/dist/cabinet/compartment-card.js +145 -0
  58. package/dist/cabinet/continuous-placement.d.ts +49 -0
  59. package/dist/cabinet/continuous-placement.d.ts.map +1 -0
  60. package/dist/cabinet/continuous-placement.js +110 -0
  61. package/dist/cabinet/cooktop-flame.d.ts +14 -0
  62. package/dist/cabinet/cooktop-flame.d.ts.map +1 -0
  63. package/dist/cabinet/cooktop-flame.js +115 -0
  64. package/dist/cabinet/definition.d.ts +26 -0
  65. package/dist/cabinet/definition.d.ts.map +1 -0
  66. package/dist/cabinet/definition.js +1016 -0
  67. package/dist/cabinet/floorplan-move.d.ts +15 -0
  68. package/dist/cabinet/floorplan-move.d.ts.map +1 -0
  69. package/dist/cabinet/floorplan-move.js +192 -0
  70. package/dist/cabinet/floorplan-overrides.d.ts +16 -0
  71. package/dist/cabinet/floorplan-overrides.d.ts.map +1 -0
  72. package/dist/cabinet/floorplan-overrides.js +47 -0
  73. package/dist/cabinet/floorplan.d.ts +4 -0
  74. package/dist/cabinet/floorplan.d.ts.map +1 -0
  75. package/dist/cabinet/floorplan.js +311 -0
  76. package/dist/cabinet/geometry/cooktop.d.ts +20 -0
  77. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -0
  78. package/dist/cabinet/geometry/cooktop.js +269 -0
  79. package/dist/cabinet/geometry/dishwasher.d.ts +4 -0
  80. package/dist/cabinet/geometry/dishwasher.d.ts.map +1 -0
  81. package/dist/cabinet/geometry/dishwasher.js +100 -0
  82. package/dist/cabinet/geometry/fridge.d.ts +5 -0
  83. package/dist/cabinet/geometry/fridge.d.ts.map +1 -0
  84. package/dist/cabinet/geometry/fridge.js +393 -0
  85. package/dist/cabinet/geometry/fronts.d.ts +9 -0
  86. package/dist/cabinet/geometry/fronts.d.ts.map +1 -0
  87. package/dist/cabinet/geometry/fronts.js +468 -0
  88. package/dist/cabinet/geometry/hood.d.ts +6 -0
  89. package/dist/cabinet/geometry/hood.d.ts.map +1 -0
  90. package/dist/cabinet/geometry/hood.js +108 -0
  91. package/dist/cabinet/geometry/oven-microwave.d.ts +5 -0
  92. package/dist/cabinet/geometry/oven-microwave.d.ts.map +1 -0
  93. package/dist/cabinet/geometry/oven-microwave.js +292 -0
  94. package/dist/cabinet/geometry/pantry.d.ts +5 -0
  95. package/dist/cabinet/geometry/pantry.d.ts.map +1 -0
  96. package/dist/cabinet/geometry/pantry.js +80 -0
  97. package/dist/cabinet/geometry/run.d.ts +6 -0
  98. package/dist/cabinet/geometry/run.d.ts.map +1 -0
  99. package/dist/cabinet/geometry/run.js +124 -0
  100. package/dist/cabinet/geometry/shared.d.ts +46 -0
  101. package/dist/cabinet/geometry/shared.d.ts.map +1 -0
  102. package/dist/cabinet/geometry/shared.js +356 -0
  103. package/dist/cabinet/geometry/sink.d.ts +29 -0
  104. package/dist/cabinet/geometry/sink.d.ts.map +1 -0
  105. package/dist/cabinet/geometry/sink.js +262 -0
  106. package/dist/cabinet/geometry.d.ts +6 -0
  107. package/dist/cabinet/geometry.d.ts.map +1 -0
  108. package/dist/cabinet/geometry.js +219 -0
  109. package/dist/cabinet/index.d.ts +5 -0
  110. package/dist/cabinet/index.d.ts.map +1 -0
  111. package/dist/cabinet/index.js +4 -0
  112. package/dist/cabinet/interaction.d.ts +15 -0
  113. package/dist/cabinet/interaction.d.ts.map +1 -0
  114. package/dist/cabinet/interaction.js +109 -0
  115. package/dist/cabinet/move-frame.d.ts +3 -0
  116. package/dist/cabinet/move-frame.d.ts.map +1 -0
  117. package/dist/cabinet/move-frame.js +252 -0
  118. package/dist/cabinet/paint.d.ts +2 -0
  119. package/dist/cabinet/paint.d.ts.map +1 -0
  120. package/dist/cabinet/paint.js +17 -0
  121. package/dist/cabinet/panel.d.ts +2 -0
  122. package/dist/cabinet/panel.d.ts.map +1 -0
  123. package/dist/cabinet/panel.js +356 -0
  124. package/dist/cabinet/parametrics.d.ts +4 -0
  125. package/dist/cabinet/parametrics.d.ts.map +1 -0
  126. package/dist/cabinet/parametrics.js +46 -0
  127. package/dist/cabinet/placement-status.d.ts +7 -0
  128. package/dist/cabinet/placement-status.d.ts.map +1 -0
  129. package/dist/cabinet/placement-status.js +6 -0
  130. package/dist/cabinet/placement-type.d.ts +9 -0
  131. package/dist/cabinet/placement-type.d.ts.map +1 -0
  132. package/dist/cabinet/placement-type.js +13 -0
  133. package/dist/cabinet/presets.d.ts +10 -0
  134. package/dist/cabinet/presets.d.ts.map +1 -0
  135. package/dist/cabinet/presets.js +168 -0
  136. package/dist/cabinet/quick-action-icons.d.ts +13 -0
  137. package/dist/cabinet/quick-action-icons.d.ts.map +1 -0
  138. package/dist/cabinet/quick-action-icons.js +29 -0
  139. package/dist/cabinet/quick-actions.d.ts +6 -0
  140. package/dist/cabinet/quick-actions.d.ts.map +1 -0
  141. package/dist/cabinet/quick-actions.js +203 -0
  142. package/dist/cabinet/run-layout.d.ts +94 -0
  143. package/dist/cabinet/run-layout.d.ts.map +1 -0
  144. package/dist/cabinet/run-layout.js +315 -0
  145. package/dist/cabinet/run-ops.d.ts +140 -0
  146. package/dist/cabinet/run-ops.d.ts.map +1 -0
  147. package/dist/cabinet/run-ops.js +1472 -0
  148. package/dist/cabinet/run-panel.d.ts +17 -0
  149. package/dist/cabinet/run-panel.d.ts.map +1 -0
  150. package/dist/cabinet/run-panel.js +220 -0
  151. package/dist/cabinet/scene-action.d.ts +8 -0
  152. package/dist/cabinet/scene-action.d.ts.map +1 -0
  153. package/dist/cabinet/scene-action.js +130 -0
  154. package/dist/cabinet/schema.d.ts +2 -0
  155. package/dist/cabinet/schema.d.ts.map +1 -0
  156. package/dist/cabinet/schema.js +1 -0
  157. package/dist/cabinet/slots.d.ts +4 -0
  158. package/dist/cabinet/slots.d.ts.map +1 -0
  159. package/dist/cabinet/slots.js +24 -0
  160. package/dist/cabinet/stack-transitions.d.ts +12 -0
  161. package/dist/cabinet/stack-transitions.d.ts.map +1 -0
  162. package/dist/cabinet/stack-transitions.js +112 -0
  163. package/dist/cabinet/stack.d.ts +102 -0
  164. package/dist/cabinet/stack.d.ts.map +1 -0
  165. package/dist/cabinet/stack.js +388 -0
  166. package/dist/cabinet/system.d.ts +13 -0
  167. package/dist/cabinet/system.d.ts.map +1 -0
  168. package/dist/cabinet/system.js +116 -0
  169. package/dist/cabinet/tool.d.ts +3 -0
  170. package/dist/cabinet/tool.d.ts.map +1 -0
  171. package/dist/cabinet/tool.js +850 -0
  172. package/dist/cabinet/tree-structure.d.ts +13 -0
  173. package/dist/cabinet/tree-structure.d.ts.map +1 -0
  174. package/dist/cabinet/tree-structure.js +138 -0
  175. package/dist/cabinet/wall-snap.d.ts +66 -0
  176. package/dist/cabinet/wall-snap.d.ts.map +1 -0
  177. package/dist/cabinet/wall-snap.js +255 -0
  178. package/dist/ceiling/boundary-editor.d.ts +17 -0
  179. package/dist/ceiling/boundary-editor.d.ts.map +1 -0
  180. package/dist/ceiling/boundary-editor.js +118 -0
  181. package/dist/ceiling/definition.d.ts +20 -0
  182. package/dist/ceiling/definition.d.ts.map +1 -0
  183. package/dist/ceiling/definition.js +161 -0
  184. package/dist/ceiling/floorplan-affordances.d.ts +181 -0
  185. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -0
  186. package/dist/ceiling/floorplan-affordances.js +28 -0
  187. package/dist/ceiling/floorplan-move.d.ts +12 -0
  188. package/dist/ceiling/floorplan-move.d.ts.map +1 -0
  189. package/dist/ceiling/floorplan-move.js +16 -0
  190. package/dist/ceiling/floorplan.d.ts +9 -0
  191. package/dist/ceiling/floorplan.d.ts.map +1 -0
  192. package/dist/ceiling/floorplan.js +90 -0
  193. package/dist/ceiling/hole-editor.d.ts +10 -0
  194. package/dist/ceiling/hole-editor.d.ts.map +1 -0
  195. package/dist/ceiling/hole-editor.js +45 -0
  196. package/dist/ceiling/index.d.ts +3 -0
  197. package/dist/ceiling/index.d.ts.map +1 -0
  198. package/dist/ceiling/index.js +2 -0
  199. package/dist/ceiling/materials.d.ts +15 -0
  200. package/dist/ceiling/materials.d.ts.map +1 -0
  201. package/dist/ceiling/materials.js +61 -0
  202. package/dist/ceiling/move-tool.d.ts +6 -0
  203. package/dist/ceiling/move-tool.d.ts.map +1 -0
  204. package/dist/ceiling/move-tool.js +264 -0
  205. package/dist/ceiling/paint.d.ts +9 -0
  206. package/dist/ceiling/paint.d.ts.map +1 -0
  207. package/dist/ceiling/paint.js +37 -0
  208. package/dist/ceiling/panel.d.ts +11 -0
  209. package/dist/ceiling/panel.d.ts.map +1 -0
  210. package/dist/ceiling/panel.js +138 -0
  211. package/dist/ceiling/parametrics.d.ts +11 -0
  212. package/dist/ceiling/parametrics.d.ts.map +1 -0
  213. package/dist/ceiling/parametrics.js +16 -0
  214. package/dist/ceiling/renderer.d.ts +6 -0
  215. package/dist/ceiling/renderer.d.ts.map +1 -0
  216. package/dist/ceiling/renderer.js +87 -0
  217. package/dist/ceiling/schema.d.ts +2 -0
  218. package/dist/ceiling/schema.d.ts.map +1 -0
  219. package/dist/ceiling/schema.js +1 -0
  220. package/dist/ceiling/slots.d.ts +6 -0
  221. package/dist/ceiling/slots.d.ts.map +1 -0
  222. package/dist/ceiling/slots.js +7 -0
  223. package/dist/ceiling/system.d.ts +10 -0
  224. package/dist/ceiling/system.d.ts.map +1 -0
  225. package/dist/ceiling/system.js +14 -0
  226. package/dist/ceiling/tool.d.ts +3 -0
  227. package/dist/ceiling/tool.d.ts.map +1 -0
  228. package/dist/ceiling/tool.js +227 -0
  229. package/dist/chimney/definition.d.ts +18 -0
  230. package/dist/chimney/definition.d.ts.map +1 -0
  231. package/dist/chimney/definition.js +387 -0
  232. package/dist/chimney/floorplan.d.ts +17 -0
  233. package/dist/chimney/floorplan.d.ts.map +1 -0
  234. package/dist/chimney/floorplan.js +190 -0
  235. package/dist/chimney/geometry.d.ts +29 -0
  236. package/dist/chimney/geometry.d.ts.map +1 -0
  237. package/dist/chimney/geometry.js +500 -0
  238. package/dist/chimney/holes.d.ts +30 -0
  239. package/dist/chimney/holes.d.ts.map +1 -0
  240. package/dist/chimney/holes.js +310 -0
  241. package/dist/chimney/index.d.ts +4 -0
  242. package/dist/chimney/index.d.ts.map +1 -0
  243. package/dist/chimney/index.js +3 -0
  244. package/dist/chimney/move-tool.d.ts +19 -0
  245. package/dist/chimney/move-tool.d.ts.map +1 -0
  246. package/dist/chimney/move-tool.js +286 -0
  247. package/dist/chimney/paint.d.ts +24 -0
  248. package/dist/chimney/paint.d.ts.map +1 -0
  249. package/dist/chimney/paint.js +96 -0
  250. package/dist/chimney/panel.d.ts +2 -0
  251. package/dist/chimney/panel.d.ts.map +1 -0
  252. package/dist/chimney/panel.js +350 -0
  253. package/dist/chimney/parametrics.d.ts +4 -0
  254. package/dist/chimney/parametrics.d.ts.map +1 -0
  255. package/dist/chimney/parametrics.js +177 -0
  256. package/dist/chimney/presets.d.ts +27 -0
  257. package/dist/chimney/presets.d.ts.map +1 -0
  258. package/dist/chimney/presets.js +93 -0
  259. package/dist/chimney/preview.d.ts +14 -0
  260. package/dist/chimney/preview.d.ts.map +1 -0
  261. package/dist/chimney/preview.js +74 -0
  262. package/dist/chimney/renderer.d.ts +17 -0
  263. package/dist/chimney/renderer.d.ts.map +1 -0
  264. package/dist/chimney/renderer.js +193 -0
  265. package/dist/chimney/roof-trim.d.ts +23 -0
  266. package/dist/chimney/roof-trim.d.ts.map +1 -0
  267. package/dist/chimney/roof-trim.js +94 -0
  268. package/dist/chimney/schema.d.ts +2 -0
  269. package/dist/chimney/schema.d.ts.map +1 -0
  270. package/dist/chimney/schema.js +1 -0
  271. package/dist/chimney/tool.d.ts +3 -0
  272. package/dist/chimney/tool.d.ts.map +1 -0
  273. package/dist/chimney/tool.js +126 -0
  274. package/dist/column/definition.d.ts +21 -0
  275. package/dist/column/definition.d.ts.map +1 -0
  276. package/dist/column/definition.js +375 -0
  277. package/dist/column/floorplan-affordances.d.ts +32 -0
  278. package/dist/column/floorplan-affordances.d.ts.map +1 -0
  279. package/dist/column/floorplan-affordances.js +126 -0
  280. package/dist/column/floorplan-move.d.ts +11 -0
  281. package/dist/column/floorplan-move.d.ts.map +1 -0
  282. package/dist/column/floorplan-move.js +66 -0
  283. package/dist/column/floorplan.d.ts +15 -0
  284. package/dist/column/floorplan.d.ts.map +1 -0
  285. package/dist/column/floorplan.js +238 -0
  286. package/dist/column/index.d.ts +2 -0
  287. package/dist/column/index.d.ts.map +1 -0
  288. package/dist/column/index.js +1 -0
  289. package/dist/column/paint.d.ts +2 -0
  290. package/dist/column/paint.d.ts.map +1 -0
  291. package/dist/column/paint.js +15 -0
  292. package/dist/column/panel.d.ts +2 -0
  293. package/dist/column/panel.d.ts.map +1 -0
  294. package/dist/column/panel.js +414 -0
  295. package/dist/column/parametrics.d.ts +12 -0
  296. package/dist/column/parametrics.d.ts.map +1 -0
  297. package/dist/column/parametrics.js +21 -0
  298. package/dist/column/renderer.d.ts +20 -0
  299. package/dist/column/renderer.d.ts.map +1 -0
  300. package/dist/column/renderer.js +1016 -0
  301. package/dist/column/schema.d.ts +2 -0
  302. package/dist/column/schema.d.ts.map +1 -0
  303. package/dist/column/schema.js +1 -0
  304. package/dist/column/slots.d.ts +9 -0
  305. package/dist/column/slots.d.ts.map +1 -0
  306. package/dist/column/slots.js +19 -0
  307. package/dist/column/tool.d.ts +14 -0
  308. package/dist/column/tool.d.ts.map +1 -0
  309. package/dist/column/tool.js +133 -0
  310. package/dist/cupola/definition.d.ts +11 -0
  311. package/dist/cupola/definition.d.ts.map +1 -0
  312. package/dist/cupola/definition.js +143 -0
  313. package/dist/cupola/floorplan.d.ts +9 -0
  314. package/dist/cupola/floorplan.d.ts.map +1 -0
  315. package/dist/cupola/floorplan.js +89 -0
  316. package/dist/cupola/geometry.d.ts +23 -0
  317. package/dist/cupola/geometry.d.ts.map +1 -0
  318. package/dist/cupola/geometry.js +262 -0
  319. package/dist/cupola/index.d.ts +4 -0
  320. package/dist/cupola/index.d.ts.map +1 -0
  321. package/dist/cupola/index.js +3 -0
  322. package/dist/cupola/move-tool.d.ts +12 -0
  323. package/dist/cupola/move-tool.d.ts.map +1 -0
  324. package/dist/cupola/move-tool.js +206 -0
  325. package/dist/cupola/panel.d.ts +7 -0
  326. package/dist/cupola/panel.d.ts.map +1 -0
  327. package/dist/cupola/panel.js +106 -0
  328. package/dist/cupola/parametrics.d.ts +9 -0
  329. package/dist/cupola/parametrics.d.ts.map +1 -0
  330. package/dist/cupola/parametrics.js +30 -0
  331. package/dist/cupola/preview.d.ts +13 -0
  332. package/dist/cupola/preview.d.ts.map +1 -0
  333. package/dist/cupola/preview.js +37 -0
  334. package/dist/cupola/renderer.d.ts +12 -0
  335. package/dist/cupola/renderer.d.ts.map +1 -0
  336. package/dist/cupola/renderer.js +66 -0
  337. package/dist/cupola/schema.d.ts +2 -0
  338. package/dist/cupola/schema.d.ts.map +1 -0
  339. package/dist/cupola/schema.js +3 -0
  340. package/dist/cupola/tool.d.ts +8 -0
  341. package/dist/cupola/tool.d.ts.map +1 -0
  342. package/dist/cupola/tool.js +105 -0
  343. package/dist/door/definition.d.ts +23 -0
  344. package/dist/door/definition.d.ts.map +1 -0
  345. package/dist/door/definition.js +257 -0
  346. package/dist/door/door-math.d.ts +23 -0
  347. package/dist/door/door-math.d.ts.map +1 -0
  348. package/dist/door/door-math.js +38 -0
  349. package/dist/door/floorplan-affordances.d.ts +21 -0
  350. package/dist/door/floorplan-affordances.d.ts.map +1 -0
  351. package/dist/door/floorplan-affordances.js +102 -0
  352. package/dist/door/floorplan-move.d.ts +18 -0
  353. package/dist/door/floorplan-move.d.ts.map +1 -0
  354. package/dist/door/floorplan-move.js +239 -0
  355. package/dist/door/floorplan.d.ts +37 -0
  356. package/dist/door/floorplan.d.ts.map +1 -0
  357. package/dist/door/floorplan.js +702 -0
  358. package/dist/door/index.d.ts +3 -0
  359. package/dist/door/index.d.ts.map +1 -0
  360. package/dist/door/index.js +2 -0
  361. package/dist/door/move-tool.d.ts +6 -0
  362. package/dist/door/move-tool.d.ts.map +1 -0
  363. package/dist/door/move-tool.js +898 -0
  364. package/dist/door/paint.d.ts +8 -0
  365. package/dist/door/paint.d.ts.map +1 -0
  366. package/dist/door/paint.js +11 -0
  367. package/dist/door/panel.d.ts +2 -0
  368. package/dist/door/panel.d.ts.map +1 -0
  369. package/dist/door/panel.js +576 -0
  370. package/dist/door/parametrics.d.ts +12 -0
  371. package/dist/door/parametrics.d.ts.map +1 -0
  372. package/dist/door/parametrics.js +27 -0
  373. package/dist/door/preview.d.ts +18 -0
  374. package/dist/door/preview.d.ts.map +1 -0
  375. package/dist/door/preview.js +36 -0
  376. package/dist/door/renderer.d.ts +6 -0
  377. package/dist/door/renderer.d.ts.map +1 -0
  378. package/dist/door/renderer.js +26 -0
  379. package/dist/door/schema.d.ts +2 -0
  380. package/dist/door/schema.d.ts.map +1 -0
  381. package/dist/door/schema.js +1 -0
  382. package/dist/door/slots.d.ts +9 -0
  383. package/dist/door/slots.d.ts.map +1 -0
  384. package/dist/door/slots.js +20 -0
  385. package/dist/door/system.d.ts +18 -0
  386. package/dist/door/system.d.ts.map +1 -0
  387. package/dist/door/system.js +22 -0
  388. package/dist/door/tool.d.ts +15 -0
  389. package/dist/door/tool.d.ts.map +1 -0
  390. package/dist/door/tool.js +555 -0
  391. package/dist/dormer/csg-geometry.d.ts +104 -0
  392. package/dist/dormer/csg-geometry.d.ts.map +1 -0
  393. package/dist/dormer/csg-geometry.js +755 -0
  394. package/dist/dormer/definition.d.ts +20 -0
  395. package/dist/dormer/definition.d.ts.map +1 -0
  396. package/dist/dormer/definition.js +491 -0
  397. package/dist/dormer/floorplan.d.ts +23 -0
  398. package/dist/dormer/floorplan.d.ts.map +1 -0
  399. package/dist/dormer/floorplan.js +193 -0
  400. package/dist/dormer/geometry.d.ts +42 -0
  401. package/dist/dormer/geometry.d.ts.map +1 -0
  402. package/dist/dormer/geometry.js +63 -0
  403. package/dist/dormer/index.d.ts +5 -0
  404. package/dist/dormer/index.d.ts.map +1 -0
  405. package/dist/dormer/index.js +3 -0
  406. package/dist/dormer/move-tool.d.ts +16 -0
  407. package/dist/dormer/move-tool.d.ts.map +1 -0
  408. package/dist/dormer/move-tool.js +136 -0
  409. package/dist/dormer/paint.d.ts +24 -0
  410. package/dist/dormer/paint.d.ts.map +1 -0
  411. package/dist/dormer/paint.js +103 -0
  412. package/dist/dormer/panel-actions-section.d.ts +10 -0
  413. package/dist/dormer/panel-actions-section.d.ts.map +1 -0
  414. package/dist/dormer/panel-actions-section.js +11 -0
  415. package/dist/dormer/panel-position-section.d.ts +17 -0
  416. package/dist/dormer/panel-position-section.d.ts.map +1 -0
  417. package/dist/dormer/panel-position-section.js +162 -0
  418. package/dist/dormer/panel-window-section.d.ts +14 -0
  419. package/dist/dormer/panel-window-section.d.ts.map +1 -0
  420. package/dist/dormer/panel-window-section.js +59 -0
  421. package/dist/dormer/panel.d.ts +2 -0
  422. package/dist/dormer/panel.d.ts.map +1 -0
  423. package/dist/dormer/panel.js +134 -0
  424. package/dist/dormer/parametrics.d.ts +4 -0
  425. package/dist/dormer/parametrics.d.ts.map +1 -0
  426. package/dist/dormer/parametrics.js +110 -0
  427. package/dist/dormer/placement-guides.d.ts +28 -0
  428. package/dist/dormer/placement-guides.d.ts.map +1 -0
  429. package/dist/dormer/placement-guides.js +170 -0
  430. package/dist/dormer/preview.d.ts +7 -0
  431. package/dist/dormer/preview.d.ts.map +1 -0
  432. package/dist/dormer/preview.js +29 -0
  433. package/dist/dormer/renderer.d.ts +8 -0
  434. package/dist/dormer/renderer.d.ts.map +1 -0
  435. package/dist/dormer/renderer.js +134 -0
  436. package/dist/dormer/schema.d.ts +3 -0
  437. package/dist/dormer/schema.d.ts.map +1 -0
  438. package/dist/dormer/schema.js +1 -0
  439. package/dist/dormer/tool.d.ts +11 -0
  440. package/dist/dormer/tool.d.ts.map +1 -0
  441. package/dist/dormer/tool.js +69 -0
  442. package/dist/dormer/use-dormer-placement.d.ts +44 -0
  443. package/dist/dormer/use-dormer-placement.d.ts.map +1 -0
  444. package/dist/dormer/use-dormer-placement.js +166 -0
  445. package/dist/dormer/window-assembly.d.ts +22 -0
  446. package/dist/dormer/window-assembly.d.ts.map +1 -0
  447. package/dist/dormer/window-assembly.js +111 -0
  448. package/dist/dormer/window-frame.d.ts +24 -0
  449. package/dist/dormer/window-frame.d.ts.map +1 -0
  450. package/dist/dormer/window-frame.js +100 -0
  451. package/dist/downspout/definition.d.ts +17 -0
  452. package/dist/downspout/definition.d.ts.map +1 -0
  453. package/dist/downspout/definition.js +173 -0
  454. package/dist/downspout/geometry.d.ts +5 -0
  455. package/dist/downspout/geometry.d.ts.map +1 -0
  456. package/dist/downspout/geometry.js +204 -0
  457. package/dist/downspout/index.d.ts +4 -0
  458. package/dist/downspout/index.d.ts.map +1 -0
  459. package/dist/downspout/index.js +3 -0
  460. package/dist/downspout/inspector-editors.d.ts +25 -0
  461. package/dist/downspout/inspector-editors.d.ts.map +1 -0
  462. package/dist/downspout/inspector-editors.js +61 -0
  463. package/dist/downspout/parametrics.d.ts +4 -0
  464. package/dist/downspout/parametrics.d.ts.map +1 -0
  465. package/dist/downspout/parametrics.js +66 -0
  466. package/dist/downspout/preview.d.ts +19 -0
  467. package/dist/downspout/preview.d.ts.map +1 -0
  468. package/dist/downspout/preview.js +48 -0
  469. package/dist/downspout/renderer.d.ts +22 -0
  470. package/dist/downspout/renderer.d.ts.map +1 -0
  471. package/dist/downspout/renderer.js +153 -0
  472. package/dist/downspout/routing.d.ts +81 -0
  473. package/dist/downspout/routing.d.ts.map +1 -0
  474. package/dist/downspout/routing.js +131 -0
  475. package/dist/downspout/schema.d.ts +2 -0
  476. package/dist/downspout/schema.d.ts.map +1 -0
  477. package/dist/downspout/schema.js +3 -0
  478. package/dist/downspout/tool.d.ts +3 -0
  479. package/dist/downspout/tool.d.ts.map +1 -0
  480. package/dist/downspout/tool.js +148 -0
  481. package/dist/duct-fitting/definition.d.ts +12 -0
  482. package/dist/duct-fitting/definition.d.ts.map +1 -0
  483. package/dist/duct-fitting/definition.js +124 -0
  484. package/dist/duct-fitting/floorplan.d.ts +12 -0
  485. package/dist/duct-fitting/floorplan.d.ts.map +1 -0
  486. package/dist/duct-fitting/floorplan.js +59 -0
  487. package/dist/duct-fitting/geometry.d.ts +26 -0
  488. package/dist/duct-fitting/geometry.d.ts.map +1 -0
  489. package/dist/duct-fitting/geometry.js +341 -0
  490. package/dist/duct-fitting/index.d.ts +5 -0
  491. package/dist/duct-fitting/index.d.ts.map +1 -0
  492. package/dist/duct-fitting/index.js +4 -0
  493. package/dist/duct-fitting/inspector-editors.d.ts +6 -0
  494. package/dist/duct-fitting/inspector-editors.d.ts.map +1 -0
  495. package/dist/duct-fitting/inspector-editors.js +16 -0
  496. package/dist/duct-fitting/move-tool.d.ts +23 -0
  497. package/dist/duct-fitting/move-tool.d.ts.map +1 -0
  498. package/dist/duct-fitting/move-tool.js +302 -0
  499. package/dist/duct-fitting/parametrics.d.ts +4 -0
  500. package/dist/duct-fitting/parametrics.d.ts.map +1 -0
  501. package/dist/duct-fitting/parametrics.js +328 -0
  502. package/dist/duct-fitting/ports.d.ts +32 -0
  503. package/dist/duct-fitting/ports.d.ts.map +1 -0
  504. package/dist/duct-fitting/ports.js +140 -0
  505. package/dist/duct-fitting/schema.d.ts +2 -0
  506. package/dist/duct-fitting/schema.d.ts.map +1 -0
  507. package/dist/duct-fitting/schema.js +1 -0
  508. package/dist/duct-fitting/selection.d.ts +27 -0
  509. package/dist/duct-fitting/selection.d.ts.map +1 -0
  510. package/dist/duct-fitting/selection.js +677 -0
  511. package/dist/duct-fitting/tool.d.ts +18 -0
  512. package/dist/duct-fitting/tool.d.ts.map +1 -0
  513. package/dist/duct-fitting/tool.js +160 -0
  514. package/dist/duct-segment/definition.d.ts +4 -0
  515. package/dist/duct-segment/definition.d.ts.map +1 -0
  516. package/dist/duct-segment/definition.js +180 -0
  517. package/dist/duct-segment/floorplan.d.ts +12 -0
  518. package/dist/duct-segment/floorplan.d.ts.map +1 -0
  519. package/dist/duct-segment/floorplan.js +121 -0
  520. package/dist/duct-segment/geometry.d.ts +99 -0
  521. package/dist/duct-segment/geometry.d.ts.map +1 -0
  522. package/dist/duct-segment/geometry.js +368 -0
  523. package/dist/duct-segment/index.d.ts +4 -0
  524. package/dist/duct-segment/index.d.ts.map +1 -0
  525. package/dist/duct-segment/index.js +3 -0
  526. package/dist/duct-segment/move-tool.d.ts +22 -0
  527. package/dist/duct-segment/move-tool.d.ts.map +1 -0
  528. package/dist/duct-segment/move-tool.js +347 -0
  529. package/dist/duct-segment/parametrics.d.ts +4 -0
  530. package/dist/duct-segment/parametrics.d.ts.map +1 -0
  531. package/dist/duct-segment/parametrics.js +165 -0
  532. package/dist/duct-segment/schema.d.ts +2 -0
  533. package/dist/duct-segment/schema.d.ts.map +1 -0
  534. package/dist/duct-segment/schema.js +1 -0
  535. package/dist/duct-segment/selection.d.ts +34 -0
  536. package/dist/duct-segment/selection.d.ts.map +1 -0
  537. package/dist/duct-segment/selection.js +1395 -0
  538. package/dist/duct-segment/tool.d.ts +3 -0
  539. package/dist/duct-segment/tool.d.ts.map +1 -0
  540. package/dist/duct-segment/tool.js +924 -0
  541. package/dist/duct-terminal/definition.d.ts +13 -0
  542. package/dist/duct-terminal/definition.d.ts.map +1 -0
  543. package/dist/duct-terminal/definition.js +87 -0
  544. package/dist/duct-terminal/floorplan.d.ts +11 -0
  545. package/dist/duct-terminal/floorplan.d.ts.map +1 -0
  546. package/dist/duct-terminal/floorplan.js +61 -0
  547. package/dist/duct-terminal/geometry.d.ts +14 -0
  548. package/dist/duct-terminal/geometry.d.ts.map +1 -0
  549. package/dist/duct-terminal/geometry.js +78 -0
  550. package/dist/duct-terminal/index.d.ts +5 -0
  551. package/dist/duct-terminal/index.d.ts.map +1 -0
  552. package/dist/duct-terminal/index.js +4 -0
  553. package/dist/duct-terminal/parametrics.d.ts +4 -0
  554. package/dist/duct-terminal/parametrics.d.ts.map +1 -0
  555. package/dist/duct-terminal/parametrics.js +69 -0
  556. package/dist/duct-terminal/ports.d.ts +27 -0
  557. package/dist/duct-terminal/ports.d.ts.map +1 -0
  558. package/dist/duct-terminal/ports.js +60 -0
  559. package/dist/duct-terminal/schema.d.ts +2 -0
  560. package/dist/duct-terminal/schema.d.ts.map +1 -0
  561. package/dist/duct-terminal/schema.js +1 -0
  562. package/dist/duct-terminal/tool.d.ts +13 -0
  563. package/dist/duct-terminal/tool.d.ts.map +1 -0
  564. package/dist/duct-terminal/tool.js +360 -0
  565. package/dist/elevator/definition.d.ts +11 -0
  566. package/dist/elevator/definition.d.ts.map +1 -0
  567. package/dist/elevator/definition.js +255 -0
  568. package/dist/elevator/floorplan-affordances.d.ts +21 -0
  569. package/dist/elevator/floorplan-affordances.d.ts.map +1 -0
  570. package/dist/elevator/floorplan-affordances.js +94 -0
  571. package/dist/elevator/floorplan.d.ts +3 -0
  572. package/dist/elevator/floorplan.d.ts.map +1 -0
  573. package/dist/elevator/floorplan.js +360 -0
  574. package/dist/elevator/index.d.ts +2 -0
  575. package/dist/elevator/index.d.ts.map +1 -0
  576. package/dist/elevator/index.js +1 -0
  577. package/dist/elevator/paint.d.ts +2 -0
  578. package/dist/elevator/paint.d.ts.map +1 -0
  579. package/dist/elevator/paint.js +6 -0
  580. package/dist/elevator/panel.d.ts +2 -0
  581. package/dist/elevator/panel.d.ts.map +1 -0
  582. package/dist/elevator/panel.js +397 -0
  583. package/dist/elevator/parametrics.d.ts +3 -0
  584. package/dist/elevator/parametrics.d.ts.map +1 -0
  585. package/dist/elevator/parametrics.js +4 -0
  586. package/dist/elevator/renderer.d.ts +6 -0
  587. package/dist/elevator/renderer.d.ts.map +1 -0
  588. package/dist/elevator/renderer.js +583 -0
  589. package/dist/elevator/schema.d.ts +2 -0
  590. package/dist/elevator/schema.d.ts.map +1 -0
  591. package/dist/elevator/schema.js +1 -0
  592. package/dist/elevator/slots.d.ts +8 -0
  593. package/dist/elevator/slots.d.ts.map +1 -0
  594. package/dist/elevator/slots.js +17 -0
  595. package/dist/elevator/system.d.ts +8 -0
  596. package/dist/elevator/system.d.ts.map +1 -0
  597. package/dist/elevator/system.js +13 -0
  598. package/dist/eyebrow-vent/definition.d.ts +12 -0
  599. package/dist/eyebrow-vent/definition.d.ts.map +1 -0
  600. package/dist/eyebrow-vent/definition.js +150 -0
  601. package/dist/eyebrow-vent/floorplan.d.ts +9 -0
  602. package/dist/eyebrow-vent/floorplan.d.ts.map +1 -0
  603. package/dist/eyebrow-vent/floorplan.js +86 -0
  604. package/dist/eyebrow-vent/geometry.d.ts +25 -0
  605. package/dist/eyebrow-vent/geometry.d.ts.map +1 -0
  606. package/dist/eyebrow-vent/geometry.js +313 -0
  607. package/dist/eyebrow-vent/index.d.ts +4 -0
  608. package/dist/eyebrow-vent/index.d.ts.map +1 -0
  609. package/dist/eyebrow-vent/index.js +3 -0
  610. package/dist/eyebrow-vent/move-tool.d.ts +13 -0
  611. package/dist/eyebrow-vent/move-tool.d.ts.map +1 -0
  612. package/dist/eyebrow-vent/move-tool.js +207 -0
  613. package/dist/eyebrow-vent/panel.d.ts +7 -0
  614. package/dist/eyebrow-vent/panel.d.ts.map +1 -0
  615. package/dist/eyebrow-vent/panel.js +106 -0
  616. package/dist/eyebrow-vent/parametrics.d.ts +9 -0
  617. package/dist/eyebrow-vent/parametrics.d.ts.map +1 -0
  618. package/dist/eyebrow-vent/parametrics.js +31 -0
  619. package/dist/eyebrow-vent/preview.d.ts +13 -0
  620. package/dist/eyebrow-vent/preview.d.ts.map +1 -0
  621. package/dist/eyebrow-vent/preview.js +37 -0
  622. package/dist/eyebrow-vent/renderer.d.ts +12 -0
  623. package/dist/eyebrow-vent/renderer.d.ts.map +1 -0
  624. package/dist/eyebrow-vent/renderer.js +68 -0
  625. package/dist/eyebrow-vent/schema.d.ts +2 -0
  626. package/dist/eyebrow-vent/schema.d.ts.map +1 -0
  627. package/dist/eyebrow-vent/schema.js +3 -0
  628. package/dist/eyebrow-vent/tool.d.ts +9 -0
  629. package/dist/eyebrow-vent/tool.d.ts.map +1 -0
  630. package/dist/eyebrow-vent/tool.js +111 -0
  631. package/dist/fence/actions/move-endpoint.d.ts +32 -0
  632. package/dist/fence/actions/move-endpoint.d.ts.map +1 -0
  633. package/dist/fence/actions/move-endpoint.js +201 -0
  634. package/dist/fence/curve-tool.d.ts +17 -0
  635. package/dist/fence/curve-tool.d.ts.map +1 -0
  636. package/dist/fence/curve-tool.js +122 -0
  637. package/dist/fence/definition.d.ts +17 -0
  638. package/dist/fence/definition.d.ts.map +1 -0
  639. package/dist/fence/definition.js +281 -0
  640. package/dist/fence/floorplan-affordances.d.ts +31 -0
  641. package/dist/fence/floorplan-affordances.d.ts.map +1 -0
  642. package/dist/fence/floorplan-affordances.js +271 -0
  643. package/dist/fence/floorplan-move.d.ts +10 -0
  644. package/dist/fence/floorplan-move.d.ts.map +1 -0
  645. package/dist/fence/floorplan-move.js +162 -0
  646. package/dist/fence/floorplan.d.ts +4 -0
  647. package/dist/fence/floorplan.d.ts.map +1 -0
  648. package/dist/fence/floorplan.js +452 -0
  649. package/dist/fence/geometry.d.ts +6 -0
  650. package/dist/fence/geometry.d.ts.map +1 -0
  651. package/dist/fence/geometry.js +65 -0
  652. package/dist/fence/index.d.ts +3 -0
  653. package/dist/fence/index.d.ts.map +1 -0
  654. package/dist/fence/index.js +2 -0
  655. package/dist/fence/inspector-editors.d.ts +24 -0
  656. package/dist/fence/inspector-editors.d.ts.map +1 -0
  657. package/dist/fence/inspector-editors.js +43 -0
  658. package/dist/fence/move-control-point-tool.d.ts +9 -0
  659. package/dist/fence/move-control-point-tool.d.ts.map +1 -0
  660. package/dist/fence/move-control-point-tool.js +91 -0
  661. package/dist/fence/move-endpoint-tool.d.ts +27 -0
  662. package/dist/fence/move-endpoint-tool.d.ts.map +1 -0
  663. package/dist/fence/move-endpoint-tool.js +190 -0
  664. package/dist/fence/move-tangent-tool.d.ts +10 -0
  665. package/dist/fence/move-tangent-tool.d.ts.map +1 -0
  666. package/dist/fence/move-tangent-tool.js +88 -0
  667. package/dist/fence/move-tool.d.ts +6 -0
  668. package/dist/fence/move-tool.d.ts.map +1 -0
  669. package/dist/fence/move-tool.js +271 -0
  670. package/dist/fence/paint.d.ts +2 -0
  671. package/dist/fence/paint.d.ts.map +1 -0
  672. package/dist/fence/paint.js +17 -0
  673. package/dist/fence/parametrics.d.ts +16 -0
  674. package/dist/fence/parametrics.d.ts.map +1 -0
  675. package/dist/fence/parametrics.js +86 -0
  676. package/dist/fence/schema.d.ts +10 -0
  677. package/dist/fence/schema.d.ts.map +1 -0
  678. package/dist/fence/schema.js +9 -0
  679. package/dist/fence/slots.d.ts +10 -0
  680. package/dist/fence/slots.d.ts.map +1 -0
  681. package/dist/fence/slots.js +23 -0
  682. package/dist/fence/tool.d.ts +3 -0
  683. package/dist/fence/tool.d.ts.map +1 -0
  684. package/dist/fence/tool.js +563 -0
  685. package/dist/guide/definition.d.ts +10 -0
  686. package/dist/guide/definition.d.ts.map +1 -0
  687. package/dist/guide/definition.js +52 -0
  688. package/dist/guide/index.d.ts +2 -0
  689. package/dist/guide/index.d.ts.map +1 -0
  690. package/dist/guide/index.js +1 -0
  691. package/dist/guide/parametrics.d.ts +3 -0
  692. package/dist/guide/parametrics.d.ts.map +1 -0
  693. package/dist/guide/parametrics.js +3 -0
  694. package/dist/guide/renderer.d.ts +6 -0
  695. package/dist/guide/renderer.d.ts.map +1 -0
  696. package/dist/guide/renderer.js +52 -0
  697. package/dist/guide/schema.d.ts +2 -0
  698. package/dist/guide/schema.d.ts.map +1 -0
  699. package/dist/guide/schema.js +1 -0
  700. package/dist/guide/system.d.ts +3 -0
  701. package/dist/guide/system.d.ts.map +1 -0
  702. package/dist/guide/system.js +3 -0
  703. package/dist/gutter/corner-mitre.d.ts +88 -0
  704. package/dist/gutter/corner-mitre.d.ts.map +1 -0
  705. package/dist/gutter/corner-mitre.js +176 -0
  706. package/dist/gutter/definition.d.ts +19 -0
  707. package/dist/gutter/definition.d.ts.map +1 -0
  708. package/dist/gutter/definition.js +164 -0
  709. package/dist/gutter/downspouts-panel.d.ts +8 -0
  710. package/dist/gutter/downspouts-panel.d.ts.map +1 -0
  711. package/dist/gutter/downspouts-panel.js +111 -0
  712. package/dist/gutter/eave-align.d.ts +33 -0
  713. package/dist/gutter/eave-align.d.ts.map +1 -0
  714. package/dist/gutter/eave-align.js +50 -0
  715. package/dist/gutter/eave-snap.d.ts +45 -0
  716. package/dist/gutter/eave-snap.d.ts.map +1 -0
  717. package/dist/gutter/eave-snap.js +128 -0
  718. package/dist/gutter/floorplan.d.ts +18 -0
  719. package/dist/gutter/floorplan.d.ts.map +1 -0
  720. package/dist/gutter/floorplan.js +274 -0
  721. package/dist/gutter/geometry.d.ts +39 -0
  722. package/dist/gutter/geometry.d.ts.map +1 -0
  723. package/dist/gutter/geometry.js +532 -0
  724. package/dist/gutter/index.d.ts +4 -0
  725. package/dist/gutter/index.d.ts.map +1 -0
  726. package/dist/gutter/index.js +3 -0
  727. package/dist/gutter/length-snap.d.ts +16 -0
  728. package/dist/gutter/length-snap.d.ts.map +1 -0
  729. package/dist/gutter/length-snap.js +177 -0
  730. package/dist/gutter/move-tool.d.ts +21 -0
  731. package/dist/gutter/move-tool.d.ts.map +1 -0
  732. package/dist/gutter/move-tool.js +223 -0
  733. package/dist/gutter/outlet-lookup.d.ts +43 -0
  734. package/dist/gutter/outlet-lookup.d.ts.map +1 -0
  735. package/dist/gutter/outlet-lookup.js +50 -0
  736. package/dist/gutter/parametrics.d.ts +4 -0
  737. package/dist/gutter/parametrics.d.ts.map +1 -0
  738. package/dist/gutter/parametrics.js +62 -0
  739. package/dist/gutter/preview.d.ts +22 -0
  740. package/dist/gutter/preview.d.ts.map +1 -0
  741. package/dist/gutter/preview.js +57 -0
  742. package/dist/gutter/profile-geometry.d.ts +44 -0
  743. package/dist/gutter/profile-geometry.d.ts.map +1 -0
  744. package/dist/gutter/profile-geometry.js +56 -0
  745. package/dist/gutter/renderer.d.ts +22 -0
  746. package/dist/gutter/renderer.d.ts.map +1 -0
  747. package/dist/gutter/renderer.js +202 -0
  748. package/dist/gutter/schema.d.ts +2 -0
  749. package/dist/gutter/schema.d.ts.map +1 -0
  750. package/dist/gutter/schema.js +3 -0
  751. package/dist/gutter/tool.d.ts +25 -0
  752. package/dist/gutter/tool.d.ts.map +1 -0
  753. package/dist/gutter/tool.js +124 -0
  754. package/dist/hvac-equipment/definition.d.ts +13 -0
  755. package/dist/hvac-equipment/definition.d.ts.map +1 -0
  756. package/dist/hvac-equipment/definition.js +92 -0
  757. package/dist/hvac-equipment/floorplan.d.ts +10 -0
  758. package/dist/hvac-equipment/floorplan.d.ts.map +1 -0
  759. package/dist/hvac-equipment/floorplan.js +71 -0
  760. package/dist/hvac-equipment/geometry.d.ts +20 -0
  761. package/dist/hvac-equipment/geometry.d.ts.map +1 -0
  762. package/dist/hvac-equipment/geometry.js +701 -0
  763. package/dist/hvac-equipment/index.d.ts +5 -0
  764. package/dist/hvac-equipment/index.d.ts.map +1 -0
  765. package/dist/hvac-equipment/index.js +4 -0
  766. package/dist/hvac-equipment/parametrics.d.ts +4 -0
  767. package/dist/hvac-equipment/parametrics.d.ts.map +1 -0
  768. package/dist/hvac-equipment/parametrics.js +101 -0
  769. package/dist/hvac-equipment/ports.d.ts +36 -0
  770. package/dist/hvac-equipment/ports.d.ts.map +1 -0
  771. package/dist/hvac-equipment/ports.js +91 -0
  772. package/dist/hvac-equipment/schema.d.ts +2 -0
  773. package/dist/hvac-equipment/schema.d.ts.map +1 -0
  774. package/dist/hvac-equipment/schema.js +1 -0
  775. package/dist/hvac-equipment/tool.d.ts +11 -0
  776. package/dist/hvac-equipment/tool.d.ts.map +1 -0
  777. package/dist/hvac-equipment/tool.js +103 -0
  778. package/dist/index.d.ts +62 -0
  779. package/dist/index.d.ts.map +1 -0
  780. package/dist/index.js +158 -0
  781. package/dist/item/definition.d.ts +32 -0
  782. package/dist/item/definition.d.ts.map +1 -0
  783. package/dist/item/definition.js +309 -0
  784. package/dist/item/floorplan-move.d.ts +3 -0
  785. package/dist/item/floorplan-move.d.ts.map +1 -0
  786. package/dist/item/floorplan-move.js +307 -0
  787. package/dist/item/floorplan.d.ts +3 -0
  788. package/dist/item/floorplan.d.ts.map +1 -0
  789. package/dist/item/floorplan.js +204 -0
  790. package/dist/item/index.d.ts +3 -0
  791. package/dist/item/index.d.ts.map +1 -0
  792. package/dist/item/index.js +2 -0
  793. package/dist/item/model-loader.d.ts +18 -0
  794. package/dist/item/model-loader.d.ts.map +1 -0
  795. package/dist/item/model-loader.js +131 -0
  796. package/dist/item/move-tool.d.ts +6 -0
  797. package/dist/item/move-tool.d.ts.map +1 -0
  798. package/dist/item/move-tool.js +150 -0
  799. package/dist/item/paint.d.ts +3 -0
  800. package/dist/item/paint.d.ts.map +1 -0
  801. package/dist/item/paint.js +214 -0
  802. package/dist/item/panel.d.ts +16 -0
  803. package/dist/item/panel.d.ts.map +1 -0
  804. package/dist/item/panel.js +103 -0
  805. package/dist/item/parametrics.d.ts +12 -0
  806. package/dist/item/parametrics.d.ts.map +1 -0
  807. package/dist/item/parametrics.js +12 -0
  808. package/dist/item/renderer.d.ts +6 -0
  809. package/dist/item/renderer.d.ts.map +1 -0
  810. package/dist/item/renderer.js +425 -0
  811. package/dist/item/schema.d.ts +2 -0
  812. package/dist/item/schema.d.ts.map +1 -0
  813. package/dist/item/schema.js +1 -0
  814. package/dist/item/system.d.ts +11 -0
  815. package/dist/item/system.d.ts.map +1 -0
  816. package/dist/item/system.js +15 -0
  817. package/dist/item/tool.d.ts +3 -0
  818. package/dist/item/tool.d.ts.map +1 -0
  819. package/dist/item/tool.js +46 -0
  820. package/dist/level/definition.d.ts +9 -0
  821. package/dist/level/definition.d.ts.map +1 -0
  822. package/dist/level/definition.js +55 -0
  823. package/dist/level/index.d.ts +2 -0
  824. package/dist/level/index.d.ts.map +1 -0
  825. package/dist/level/index.js +1 -0
  826. package/dist/level/parametrics.d.ts +3 -0
  827. package/dist/level/parametrics.d.ts.map +1 -0
  828. package/dist/level/parametrics.js +3 -0
  829. package/dist/level/renderer.d.ts +6 -0
  830. package/dist/level/renderer.d.ts.map +1 -0
  831. package/dist/level/renderer.js +12 -0
  832. package/dist/level/schema.d.ts +2 -0
  833. package/dist/level/schema.d.ts.map +1 -0
  834. package/dist/level/schema.js +1 -0
  835. package/dist/level/system.d.ts +3 -0
  836. package/dist/level/system.d.ts.map +1 -0
  837. package/dist/level/system.js +3 -0
  838. package/dist/lineset/definition.d.ts +15 -0
  839. package/dist/lineset/definition.d.ts.map +1 -0
  840. package/dist/lineset/definition.js +118 -0
  841. package/dist/lineset/floorplan.d.ts +10 -0
  842. package/dist/lineset/floorplan.d.ts.map +1 -0
  843. package/dist/lineset/floorplan.js +78 -0
  844. package/dist/lineset/geometry.d.ts +20 -0
  845. package/dist/lineset/geometry.d.ts.map +1 -0
  846. package/dist/lineset/geometry.js +87 -0
  847. package/dist/lineset/index.d.ts +4 -0
  848. package/dist/lineset/index.d.ts.map +1 -0
  849. package/dist/lineset/index.js +3 -0
  850. package/dist/lineset/move-tool.d.ts +27 -0
  851. package/dist/lineset/move-tool.d.ts.map +1 -0
  852. package/dist/lineset/move-tool.js +256 -0
  853. package/dist/lineset/parametrics.d.ts +4 -0
  854. package/dist/lineset/parametrics.d.ts.map +1 -0
  855. package/dist/lineset/parametrics.js +34 -0
  856. package/dist/lineset/schema.d.ts +2 -0
  857. package/dist/lineset/schema.d.ts.map +1 -0
  858. package/dist/lineset/schema.js +1 -0
  859. package/dist/lineset/selection.d.ts +3 -0
  860. package/dist/lineset/selection.d.ts.map +1 -0
  861. package/dist/lineset/selection.js +3 -0
  862. package/dist/lineset/tool.d.ts +3 -0
  863. package/dist/lineset/tool.d.ts.map +1 -0
  864. package/dist/lineset/tool.js +298 -0
  865. package/dist/liquid-line/definition.d.ts +16 -0
  866. package/dist/liquid-line/definition.d.ts.map +1 -0
  867. package/dist/liquid-line/definition.js +110 -0
  868. package/dist/liquid-line/floorplan.d.ts +10 -0
  869. package/dist/liquid-line/floorplan.d.ts.map +1 -0
  870. package/dist/liquid-line/floorplan.js +66 -0
  871. package/dist/liquid-line/geometry.d.ts +16 -0
  872. package/dist/liquid-line/geometry.d.ts.map +1 -0
  873. package/dist/liquid-line/geometry.js +57 -0
  874. package/dist/liquid-line/index.d.ts +5 -0
  875. package/dist/liquid-line/index.d.ts.map +1 -0
  876. package/dist/liquid-line/index.js +4 -0
  877. package/dist/liquid-line/move-tool.d.ts +23 -0
  878. package/dist/liquid-line/move-tool.d.ts.map +1 -0
  879. package/dist/liquid-line/move-tool.js +231 -0
  880. package/dist/liquid-line/options.d.ts +16 -0
  881. package/dist/liquid-line/options.d.ts.map +1 -0
  882. package/dist/liquid-line/options.js +6 -0
  883. package/dist/liquid-line/parametrics.d.ts +4 -0
  884. package/dist/liquid-line/parametrics.d.ts.map +1 -0
  885. package/dist/liquid-line/parametrics.js +17 -0
  886. package/dist/liquid-line/schema.d.ts +2 -0
  887. package/dist/liquid-line/schema.d.ts.map +1 -0
  888. package/dist/liquid-line/schema.js +1 -0
  889. package/dist/liquid-line/selection.d.ts +3 -0
  890. package/dist/liquid-line/selection.d.ts.map +1 -0
  891. package/dist/liquid-line/selection.js +3 -0
  892. package/dist/liquid-line/tool.d.ts +3 -0
  893. package/dist/liquid-line/tool.d.ts.map +1 -0
  894. package/dist/liquid-line/tool.js +517 -0
  895. package/dist/measurement/definition.d.ts +4 -0
  896. package/dist/measurement/definition.d.ts.map +1 -0
  897. package/dist/measurement/definition.js +61 -0
  898. package/dist/measurement/edit.d.ts +9 -0
  899. package/dist/measurement/edit.d.ts.map +1 -0
  900. package/dist/measurement/edit.js +97 -0
  901. package/dist/measurement/floorplan-affordance.d.ts +3 -0
  902. package/dist/measurement/floorplan-affordance.d.ts.map +1 -0
  903. package/dist/measurement/floorplan-affordance.js +90 -0
  904. package/dist/measurement/floorplan.d.ts +3 -0
  905. package/dist/measurement/floorplan.d.ts.map +1 -0
  906. package/dist/measurement/floorplan.js +195 -0
  907. package/dist/measurement/index.d.ts +3 -0
  908. package/dist/measurement/index.d.ts.map +1 -0
  909. package/dist/measurement/index.js +2 -0
  910. package/dist/measurement/renderer.d.ts +8 -0
  911. package/dist/measurement/renderer.d.ts.map +1 -0
  912. package/dist/measurement/renderer.js +285 -0
  913. package/dist/measurement/resolve.d.ts +42 -0
  914. package/dist/measurement/resolve.d.ts.map +1 -0
  915. package/dist/measurement/resolve.js +207 -0
  916. package/dist/measurement/schema.d.ts +2 -0
  917. package/dist/measurement/schema.d.ts.map +1 -0
  918. package/dist/measurement/schema.js +1 -0
  919. package/dist/measurement/selection.d.ts +3 -0
  920. package/dist/measurement/selection.d.ts.map +1 -0
  921. package/dist/measurement/selection.js +259 -0
  922. package/dist/measurement/smart-surface.d.ts +4 -0
  923. package/dist/measurement/smart-surface.d.ts.map +1 -0
  924. package/dist/measurement/smart-surface.js +21 -0
  925. package/dist/measurement/smart-tool.d.ts +3 -0
  926. package/dist/measurement/smart-tool.d.ts.map +1 -0
  927. package/dist/measurement/smart-tool.js +264 -0
  928. package/dist/measurement/surface-query.d.ts +90 -0
  929. package/dist/measurement/surface-query.d.ts.map +1 -0
  930. package/dist/measurement/surface-query.js +519 -0
  931. package/dist/measurement/tool-router.d.ts +2 -0
  932. package/dist/measurement/tool-router.d.ts.map +1 -0
  933. package/dist/measurement/tool-router.js +9 -0
  934. package/dist/measurement/tool.d.ts +62 -0
  935. package/dist/measurement/tool.d.ts.map +1 -0
  936. package/dist/measurement/tool.js +1342 -0
  937. package/dist/pipe-fitting/definition.d.ts +10 -0
  938. package/dist/pipe-fitting/definition.d.ts.map +1 -0
  939. package/dist/pipe-fitting/definition.js +91 -0
  940. package/dist/pipe-fitting/floorplan.d.ts +10 -0
  941. package/dist/pipe-fitting/floorplan.d.ts.map +1 -0
  942. package/dist/pipe-fitting/floorplan.js +50 -0
  943. package/dist/pipe-fitting/geometry.d.ts +11 -0
  944. package/dist/pipe-fitting/geometry.d.ts.map +1 -0
  945. package/dist/pipe-fitting/geometry.js +31 -0
  946. package/dist/pipe-fitting/index.d.ts +5 -0
  947. package/dist/pipe-fitting/index.d.ts.map +1 -0
  948. package/dist/pipe-fitting/index.js +4 -0
  949. package/dist/pipe-fitting/move-tool.d.ts +30 -0
  950. package/dist/pipe-fitting/move-tool.d.ts.map +1 -0
  951. package/dist/pipe-fitting/move-tool.js +312 -0
  952. package/dist/pipe-fitting/parametrics.d.ts +4 -0
  953. package/dist/pipe-fitting/parametrics.d.ts.map +1 -0
  954. package/dist/pipe-fitting/parametrics.js +105 -0
  955. package/dist/pipe-fitting/ports.d.ts +26 -0
  956. package/dist/pipe-fitting/ports.d.ts.map +1 -0
  957. package/dist/pipe-fitting/ports.js +93 -0
  958. package/dist/pipe-fitting/schema.d.ts +2 -0
  959. package/dist/pipe-fitting/schema.d.ts.map +1 -0
  960. package/dist/pipe-fitting/schema.js +1 -0
  961. package/dist/pipe-fitting/selection.d.ts +3 -0
  962. package/dist/pipe-fitting/selection.d.ts.map +1 -0
  963. package/dist/pipe-fitting/selection.js +579 -0
  964. package/dist/pipe-fitting/tool.d.ts +19 -0
  965. package/dist/pipe-fitting/tool.d.ts.map +1 -0
  966. package/dist/pipe-fitting/tool.js +162 -0
  967. package/dist/pipe-segment/definition.d.ts +14 -0
  968. package/dist/pipe-segment/definition.d.ts.map +1 -0
  969. package/dist/pipe-segment/definition.js +116 -0
  970. package/dist/pipe-segment/floorplan.d.ts +9 -0
  971. package/dist/pipe-segment/floorplan.d.ts.map +1 -0
  972. package/dist/pipe-segment/floorplan.js +87 -0
  973. package/dist/pipe-segment/geometry.d.ts +16 -0
  974. package/dist/pipe-segment/geometry.d.ts.map +1 -0
  975. package/dist/pipe-segment/geometry.js +54 -0
  976. package/dist/pipe-segment/index.d.ts +4 -0
  977. package/dist/pipe-segment/index.d.ts.map +1 -0
  978. package/dist/pipe-segment/index.js +3 -0
  979. package/dist/pipe-segment/move-tool.d.ts +25 -0
  980. package/dist/pipe-segment/move-tool.d.ts.map +1 -0
  981. package/dist/pipe-segment/move-tool.js +254 -0
  982. package/dist/pipe-segment/parametrics.d.ts +4 -0
  983. package/dist/pipe-segment/parametrics.d.ts.map +1 -0
  984. package/dist/pipe-segment/parametrics.js +33 -0
  985. package/dist/pipe-segment/schema.d.ts +2 -0
  986. package/dist/pipe-segment/schema.d.ts.map +1 -0
  987. package/dist/pipe-segment/schema.js +1 -0
  988. package/dist/pipe-segment/selection.d.ts +31 -0
  989. package/dist/pipe-segment/selection.d.ts.map +1 -0
  990. package/dist/pipe-segment/selection.js +841 -0
  991. package/dist/pipe-segment/tool.d.ts +3 -0
  992. package/dist/pipe-segment/tool.d.ts.map +1 -0
  993. package/dist/pipe-segment/tool.js +595 -0
  994. package/dist/pipe-trap/definition.d.ts +10 -0
  995. package/dist/pipe-trap/definition.d.ts.map +1 -0
  996. package/dist/pipe-trap/definition.js +59 -0
  997. package/dist/pipe-trap/floorplan.d.ts +10 -0
  998. package/dist/pipe-trap/floorplan.d.ts.map +1 -0
  999. package/dist/pipe-trap/floorplan.js +41 -0
  1000. package/dist/pipe-trap/geometry.d.ts +16 -0
  1001. package/dist/pipe-trap/geometry.d.ts.map +1 -0
  1002. package/dist/pipe-trap/geometry.js +74 -0
  1003. package/dist/pipe-trap/index.d.ts +5 -0
  1004. package/dist/pipe-trap/index.d.ts.map +1 -0
  1005. package/dist/pipe-trap/index.js +4 -0
  1006. package/dist/pipe-trap/parametrics.d.ts +4 -0
  1007. package/dist/pipe-trap/parametrics.d.ts.map +1 -0
  1008. package/dist/pipe-trap/parametrics.js +16 -0
  1009. package/dist/pipe-trap/ports.d.ts +11 -0
  1010. package/dist/pipe-trap/ports.d.ts.map +1 -0
  1011. package/dist/pipe-trap/ports.js +32 -0
  1012. package/dist/pipe-trap/schema.d.ts +2 -0
  1013. package/dist/pipe-trap/schema.d.ts.map +1 -0
  1014. package/dist/pipe-trap/schema.js +1 -0
  1015. package/dist/pipe-trap/tool.d.ts +9 -0
  1016. package/dist/pipe-trap/tool.d.ts.map +1 -0
  1017. package/dist/pipe-trap/tool.js +99 -0
  1018. package/dist/ridge-vent/definition.d.ts +16 -0
  1019. package/dist/ridge-vent/definition.d.ts.map +1 -0
  1020. package/dist/ridge-vent/definition.js +195 -0
  1021. package/dist/ridge-vent/floorplan.d.ts +15 -0
  1022. package/dist/ridge-vent/floorplan.d.ts.map +1 -0
  1023. package/dist/ridge-vent/floorplan.js +121 -0
  1024. package/dist/ridge-vent/geometry.d.ts +22 -0
  1025. package/dist/ridge-vent/geometry.d.ts.map +1 -0
  1026. package/dist/ridge-vent/geometry.js +526 -0
  1027. package/dist/ridge-vent/index.d.ts +4 -0
  1028. package/dist/ridge-vent/index.d.ts.map +1 -0
  1029. package/dist/ridge-vent/index.js +3 -0
  1030. package/dist/ridge-vent/move-tool.d.ts +12 -0
  1031. package/dist/ridge-vent/move-tool.d.ts.map +1 -0
  1032. package/dist/ridge-vent/move-tool.js +210 -0
  1033. package/dist/ridge-vent/panel.d.ts +7 -0
  1034. package/dist/ridge-vent/panel.d.ts.map +1 -0
  1035. package/dist/ridge-vent/panel.js +118 -0
  1036. package/dist/ridge-vent/parametrics.d.ts +4 -0
  1037. package/dist/ridge-vent/parametrics.d.ts.map +1 -0
  1038. package/dist/ridge-vent/parametrics.js +28 -0
  1039. package/dist/ridge-vent/preview.d.ts +7 -0
  1040. package/dist/ridge-vent/preview.d.ts.map +1 -0
  1041. package/dist/ridge-vent/preview.js +31 -0
  1042. package/dist/ridge-vent/renderer.d.ts +20 -0
  1043. package/dist/ridge-vent/renderer.d.ts.map +1 -0
  1044. package/dist/ridge-vent/renderer.js +205 -0
  1045. package/dist/ridge-vent/schema.d.ts +2 -0
  1046. package/dist/ridge-vent/schema.d.ts.map +1 -0
  1047. package/dist/ridge-vent/schema.js +2 -0
  1048. package/dist/ridge-vent/tool.d.ts +8 -0
  1049. package/dist/ridge-vent/tool.d.ts.map +1 -0
  1050. package/dist/ridge-vent/tool.js +130 -0
  1051. package/dist/roof/definition.d.ts +16 -0
  1052. package/dist/roof/definition.d.ts.map +1 -0
  1053. package/dist/roof/definition.js +170 -0
  1054. package/dist/roof/floorplan.d.ts +21 -0
  1055. package/dist/roof/floorplan.d.ts.map +1 -0
  1056. package/dist/roof/floorplan.js +271 -0
  1057. package/dist/roof/index.d.ts +3 -0
  1058. package/dist/roof/index.d.ts.map +1 -0
  1059. package/dist/roof/index.js +2 -0
  1060. package/dist/roof/panel.d.ts +2 -0
  1061. package/dist/roof/panel.d.ts.map +1 -0
  1062. package/dist/roof/panel.js +214 -0
  1063. package/dist/roof/parametrics.d.ts +3 -0
  1064. package/dist/roof/parametrics.d.ts.map +1 -0
  1065. package/dist/roof/parametrics.js +4 -0
  1066. package/dist/roof/renderer.d.ts +6 -0
  1067. package/dist/roof/renderer.d.ts.map +1 -0
  1068. package/dist/roof/renderer.js +79 -0
  1069. package/dist/roof/roof-materials.d.ts +5 -0
  1070. package/dist/roof/roof-materials.d.ts.map +1 -0
  1071. package/dist/roof/roof-materials.js +43 -0
  1072. package/dist/roof/schema.d.ts +2 -0
  1073. package/dist/roof/schema.d.ts.map +1 -0
  1074. package/dist/roof/schema.js +1 -0
  1075. package/dist/roof/system.d.ts +3 -0
  1076. package/dist/roof/system.d.ts.map +1 -0
  1077. package/dist/roof/system.js +3 -0
  1078. package/dist/roof-segment/definition.d.ts +10 -0
  1079. package/dist/roof-segment/definition.d.ts.map +1 -0
  1080. package/dist/roof-segment/definition.js +305 -0
  1081. package/dist/roof-segment/floorplan-affordances.d.ts +31 -0
  1082. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -0
  1083. package/dist/roof-segment/floorplan-affordances.js +170 -0
  1084. package/dist/roof-segment/floorplan.d.ts +41 -0
  1085. package/dist/roof-segment/floorplan.d.ts.map +1 -0
  1086. package/dist/roof-segment/floorplan.js +265 -0
  1087. package/dist/roof-segment/index.d.ts +2 -0
  1088. package/dist/roof-segment/index.d.ts.map +1 -0
  1089. package/dist/roof-segment/index.js +1 -0
  1090. package/dist/roof-segment/measurement.d.ts +4 -0
  1091. package/dist/roof-segment/measurement.d.ts.map +1 -0
  1092. package/dist/roof-segment/measurement.js +64 -0
  1093. package/dist/roof-segment/panel.d.ts +2 -0
  1094. package/dist/roof-segment/panel.d.ts.map +1 -0
  1095. package/dist/roof-segment/panel.js +180 -0
  1096. package/dist/roof-segment/parametrics.d.ts +3 -0
  1097. package/dist/roof-segment/parametrics.d.ts.map +1 -0
  1098. package/dist/roof-segment/parametrics.js +4 -0
  1099. package/dist/roof-segment/renderer.d.ts +6 -0
  1100. package/dist/roof-segment/renderer.d.ts.map +1 -0
  1101. package/dist/roof-segment/renderer.js +93 -0
  1102. package/dist/roof-segment/schema.d.ts +2 -0
  1103. package/dist/roof-segment/schema.d.ts.map +1 -0
  1104. package/dist/roof-segment/schema.js +1 -0
  1105. package/dist/scan/definition.d.ts +9 -0
  1106. package/dist/scan/definition.d.ts.map +1 -0
  1107. package/dist/scan/definition.js +49 -0
  1108. package/dist/scan/index.d.ts +2 -0
  1109. package/dist/scan/index.d.ts.map +1 -0
  1110. package/dist/scan/index.js +1 -0
  1111. package/dist/scan/parametrics.d.ts +3 -0
  1112. package/dist/scan/parametrics.d.ts.map +1 -0
  1113. package/dist/scan/parametrics.js +3 -0
  1114. package/dist/scan/renderer.d.ts +6 -0
  1115. package/dist/scan/renderer.d.ts.map +1 -0
  1116. package/dist/scan/renderer.js +54 -0
  1117. package/dist/scan/schema.d.ts +2 -0
  1118. package/dist/scan/schema.d.ts.map +1 -0
  1119. package/dist/scan/schema.js +1 -0
  1120. package/dist/scan/system.d.ts +3 -0
  1121. package/dist/scan/system.d.ts.map +1 -0
  1122. package/dist/scan/system.js +3 -0
  1123. package/dist/shared/auto-fitting.d.ts +253 -0
  1124. package/dist/shared/auto-fitting.d.ts.map +1 -0
  1125. package/dist/shared/auto-fitting.js +659 -0
  1126. package/dist/shared/auto-offset-tag.d.ts +67 -0
  1127. package/dist/shared/auto-offset-tag.d.ts.map +1 -0
  1128. package/dist/shared/auto-offset-tag.js +94 -0
  1129. package/dist/shared/draw-alignment.d.ts +25 -0
  1130. package/dist/shared/draw-alignment.d.ts.map +1 -0
  1131. package/dist/shared/draw-alignment.js +30 -0
  1132. package/dist/shared/duct-body-paint.d.ts +6 -0
  1133. package/dist/shared/duct-body-paint.d.ts.map +1 -0
  1134. package/dist/shared/duct-body-paint.js +13 -0
  1135. package/dist/shared/fitting-endpoint-reaim.d.ts +72 -0
  1136. package/dist/shared/fitting-endpoint-reaim.d.ts.map +1 -0
  1137. package/dist/shared/fitting-endpoint-reaim.js +123 -0
  1138. package/dist/shared/fitting-rotation.d.ts +21 -0
  1139. package/dist/shared/fitting-rotation.d.ts.map +1 -0
  1140. package/dist/shared/fitting-rotation.js +39 -0
  1141. package/dist/shared/floor-placement.d.ts +25 -0
  1142. package/dist/shared/floor-placement.d.ts.map +1 -0
  1143. package/dist/shared/floor-placement.js +109 -0
  1144. package/dist/shared/floorplan-cursor.d.ts +11 -0
  1145. package/dist/shared/floorplan-cursor.d.ts.map +1 -0
  1146. package/dist/shared/floorplan-cursor.js +17 -0
  1147. package/dist/shared/ghost-alignment.d.ts +31 -0
  1148. package/dist/shared/ghost-alignment.d.ts.map +1 -0
  1149. package/dist/shared/ghost-alignment.js +29 -0
  1150. package/dist/shared/ghost-materials.d.ts +29 -0
  1151. package/dist/shared/ghost-materials.d.ts.map +1 -0
  1152. package/dist/shared/ghost-materials.js +81 -0
  1153. package/dist/shared/level-offset-group.d.ts +18 -0
  1154. package/dist/shared/level-offset-group.d.ts.map +1 -0
  1155. package/dist/shared/level-offset-group.js +31 -0
  1156. package/dist/shared/mep-ghost.d.ts +37 -0
  1157. package/dist/shared/mep-ghost.d.ts.map +1 -0
  1158. package/dist/shared/mep-ghost.js +83 -0
  1159. package/dist/shared/move-roof-tool.d.ts +6 -0
  1160. package/dist/shared/move-roof-tool.d.ts.map +1 -0
  1161. package/dist/shared/move-roof-tool.js +420 -0
  1162. package/dist/shared/opening-guides-runtime.d.ts +70 -0
  1163. package/dist/shared/opening-guides-runtime.d.ts.map +1 -0
  1164. package/dist/shared/opening-guides-runtime.js +182 -0
  1165. package/dist/shared/opening-placement-dimensions.d.ts +19 -0
  1166. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -0
  1167. package/dist/shared/opening-placement-dimensions.js +152 -0
  1168. package/dist/shared/path-offset.d.ts +10 -0
  1169. package/dist/shared/path-offset.d.ts.map +1 -0
  1170. package/dist/shared/path-offset.js +74 -0
  1171. package/dist/shared/path-point-affordance.d.ts +34 -0
  1172. package/dist/shared/path-point-affordance.d.ts.map +1 -0
  1173. package/dist/shared/path-point-affordance.js +97 -0
  1174. package/dist/shared/path-segment-affordance.d.ts +33 -0
  1175. package/dist/shared/path-segment-affordance.d.ts.map +1 -0
  1176. package/dist/shared/path-segment-affordance.js +77 -0
  1177. package/dist/shared/pipe-run-translation-offset.d.ts +27 -0
  1178. package/dist/shared/pipe-run-translation-offset.d.ts.map +1 -0
  1179. package/dist/shared/pipe-run-translation-offset.js +131 -0
  1180. package/dist/shared/pipe-vertical-offset.d.ts +98 -0
  1181. package/dist/shared/pipe-vertical-offset.d.ts.map +1 -0
  1182. package/dist/shared/pipe-vertical-offset.js +836 -0
  1183. package/dist/shared/placeholder-geometry.d.ts +22 -0
  1184. package/dist/shared/placeholder-geometry.d.ts.map +1 -0
  1185. package/dist/shared/placeholder-geometry.js +31 -0
  1186. package/dist/shared/polygon-centroid-move.d.ts +21 -0
  1187. package/dist/shared/polygon-centroid-move.d.ts.map +1 -0
  1188. package/dist/shared/polygon-centroid-move.js +117 -0
  1189. package/dist/shared/polygon-measurement.d.ts +10 -0
  1190. package/dist/shared/polygon-measurement.d.ts.map +1 -0
  1191. package/dist/shared/polygon-measurement.js +35 -0
  1192. package/dist/shared/polygon-vertex-affordance.d.ts +108 -0
  1193. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -0
  1194. package/dist/shared/polygon-vertex-affordance.js +325 -0
  1195. package/dist/shared/ports.d.ts +75 -0
  1196. package/dist/shared/ports.d.ts.map +1 -0
  1197. package/dist/shared/ports.js +164 -0
  1198. package/dist/shared/quick-measurement.d.ts +8 -0
  1199. package/dist/shared/quick-measurement.d.ts.map +1 -0
  1200. package/dist/shared/quick-measurement.js +15 -0
  1201. package/dist/shared/refrigerant-line-selection.d.ts +4 -0
  1202. package/dist/shared/refrigerant-line-selection.d.ts.map +1 -0
  1203. package/dist/shared/refrigerant-line-selection.js +405 -0
  1204. package/dist/shared/relative-roof-drag.d.ts +18 -0
  1205. package/dist/shared/relative-roof-drag.d.ts.map +1 -0
  1206. package/dist/shared/relative-roof-drag.js +83 -0
  1207. package/dist/shared/ridge-snap.d.ts +31 -0
  1208. package/dist/shared/ridge-snap.d.ts.map +1 -0
  1209. package/dist/shared/ridge-snap.js +61 -0
  1210. package/dist/shared/roof-attachment-fallback-preview.d.ts +14 -0
  1211. package/dist/shared/roof-attachment-fallback-preview.d.ts.map +1 -0
  1212. package/dist/shared/roof-attachment-fallback-preview.js +84 -0
  1213. package/dist/shared/roof-face-host.d.ts +17 -0
  1214. package/dist/shared/roof-face-host.d.ts.map +1 -0
  1215. package/dist/shared/roof-face-host.js +24 -0
  1216. package/dist/shared/roof-opening-host.d.ts +66 -0
  1217. package/dist/shared/roof-opening-host.d.ts.map +1 -0
  1218. package/dist/shared/roof-opening-host.js +98 -0
  1219. package/dist/shared/roof-segment-hit.d.ts +34 -0
  1220. package/dist/shared/roof-segment-hit.d.ts.map +1 -0
  1221. package/dist/shared/roof-segment-hit.js +72 -0
  1222. package/dist/shared/roof-surface-placement-guides.d.ts +68 -0
  1223. package/dist/shared/roof-surface-placement-guides.d.ts.map +1 -0
  1224. package/dist/shared/roof-surface-placement-guides.js +716 -0
  1225. package/dist/shared/roof-surface.d.ts +20 -0
  1226. package/dist/shared/roof-surface.d.ts.map +1 -0
  1227. package/dist/shared/roof-surface.js +467 -0
  1228. package/dist/shared/roof-wall-opening-cut.d.ts +16 -0
  1229. package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -0
  1230. package/dist/shared/roof-wall-opening-cut.js +52 -0
  1231. package/dist/shared/roof-wall-opening-placement.d.ts +53 -0
  1232. package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -0
  1233. package/dist/shared/roof-wall-opening-placement.js +58 -0
  1234. package/dist/shared/rotate-affordance.d.ts +16 -0
  1235. package/dist/shared/rotate-affordance.d.ts.map +1 -0
  1236. package/dist/shared/rotate-affordance.js +20 -0
  1237. package/dist/shared/run-move-connectivity.d.ts +52 -0
  1238. package/dist/shared/run-move-connectivity.d.ts.map +1 -0
  1239. package/dist/shared/run-move-connectivity.js +82 -0
  1240. package/dist/shared/run-translation-offset.d.ts +24 -0
  1241. package/dist/shared/run-translation-offset.d.ts.map +1 -0
  1242. package/dist/shared/run-translation-offset.js +140 -0
  1243. package/dist/shared/selection-handles.d.ts +51 -0
  1244. package/dist/shared/selection-handles.d.ts.map +1 -0
  1245. package/dist/shared/selection-handles.js +74 -0
  1246. package/dist/shared/slot-paint.d.ts +46 -0
  1247. package/dist/shared/slot-paint.d.ts.map +1 -0
  1248. package/dist/shared/slot-paint.js +235 -0
  1249. package/dist/shared/surface-paint.d.ts +3 -0
  1250. package/dist/shared/surface-paint.d.ts.map +1 -0
  1251. package/dist/shared/surface-paint.js +41 -0
  1252. package/dist/shared/use-segment-trim-clip.d.ts +44 -0
  1253. package/dist/shared/use-segment-trim-clip.d.ts.map +1 -0
  1254. package/dist/shared/use-segment-trim-clip.js +149 -0
  1255. package/dist/shared/vertical-offset.d.ts +95 -0
  1256. package/dist/shared/vertical-offset.d.ts.map +1 -0
  1257. package/dist/shared/vertical-offset.js +851 -0
  1258. package/dist/shared/wall-attach-target.d.ts +109 -0
  1259. package/dist/shared/wall-attach-target.d.ts.map +1 -0
  1260. package/dist/shared/wall-attach-target.js +192 -0
  1261. package/dist/shared/wall-opening-alignment.d.ts +34 -0
  1262. package/dist/shared/wall-opening-alignment.d.ts.map +1 -0
  1263. package/dist/shared/wall-opening-alignment.js +113 -0
  1264. package/dist/shelf/definition.d.ts +4 -0
  1265. package/dist/shelf/definition.d.ts.map +1 -0
  1266. package/dist/shelf/definition.js +265 -0
  1267. package/dist/shelf/dimensions.d.ts +3 -0
  1268. package/dist/shelf/dimensions.d.ts.map +1 -0
  1269. package/dist/shelf/dimensions.js +15 -0
  1270. package/dist/shelf/floorplan-affordances.d.ts +26 -0
  1271. package/dist/shelf/floorplan-affordances.d.ts.map +1 -0
  1272. package/dist/shelf/floorplan-affordances.js +88 -0
  1273. package/dist/shelf/floorplan-move.d.ts +25 -0
  1274. package/dist/shelf/floorplan-move.d.ts.map +1 -0
  1275. package/dist/shelf/floorplan-move.js +90 -0
  1276. package/dist/shelf/floorplan.d.ts +20 -0
  1277. package/dist/shelf/floorplan.d.ts.map +1 -0
  1278. package/dist/shelf/floorplan.js +124 -0
  1279. package/dist/shelf/geometry.d.ts +15 -0
  1280. package/dist/shelf/geometry.d.ts.map +1 -0
  1281. package/dist/shelf/geometry.js +304 -0
  1282. package/dist/shelf/index.d.ts +4 -0
  1283. package/dist/shelf/index.d.ts.map +1 -0
  1284. package/dist/shelf/index.js +3 -0
  1285. package/dist/shelf/paint.d.ts +3 -0
  1286. package/dist/shelf/paint.d.ts.map +1 -0
  1287. package/dist/shelf/paint.js +181 -0
  1288. package/dist/shelf/parametrics.d.ts +14 -0
  1289. package/dist/shelf/parametrics.d.ts.map +1 -0
  1290. package/dist/shelf/parametrics.js +81 -0
  1291. package/dist/shelf/preview.d.ts +31 -0
  1292. package/dist/shelf/preview.d.ts.map +1 -0
  1293. package/dist/shelf/preview.js +77 -0
  1294. package/dist/shelf/schema.d.ts +2 -0
  1295. package/dist/shelf/schema.d.ts.map +1 -0
  1296. package/dist/shelf/schema.js +6 -0
  1297. package/dist/shelf/slots.d.ts +9 -0
  1298. package/dist/shelf/slots.d.ts.map +1 -0
  1299. package/dist/shelf/slots.js +30 -0
  1300. package/dist/shelf/tool.d.ts +3 -0
  1301. package/dist/shelf/tool.d.ts.map +1 -0
  1302. package/dist/shelf/tool.js +125 -0
  1303. package/dist/site/definition.d.ts +10 -0
  1304. package/dist/site/definition.d.ts.map +1 -0
  1305. package/dist/site/definition.js +54 -0
  1306. package/dist/site/index.d.ts +2 -0
  1307. package/dist/site/index.d.ts.map +1 -0
  1308. package/dist/site/index.js +1 -0
  1309. package/dist/site/parametrics.d.ts +3 -0
  1310. package/dist/site/parametrics.d.ts.map +1 -0
  1311. package/dist/site/parametrics.js +3 -0
  1312. package/dist/site/recessed-slab-ground-holes.d.ts +3 -0
  1313. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -0
  1314. package/dist/site/recessed-slab-ground-holes.js +46 -0
  1315. package/dist/site/renderer.d.ts +6 -0
  1316. package/dist/site/renderer.d.ts.map +1 -0
  1317. package/dist/site/renderer.js +196 -0
  1318. package/dist/site/schema.d.ts +2 -0
  1319. package/dist/site/schema.d.ts.map +1 -0
  1320. package/dist/site/schema.js +1 -0
  1321. package/dist/skylight/definition.d.ts +10 -0
  1322. package/dist/skylight/definition.d.ts.map +1 -0
  1323. package/dist/skylight/definition.js +268 -0
  1324. package/dist/skylight/floorplan.d.ts +16 -0
  1325. package/dist/skylight/floorplan.d.ts.map +1 -0
  1326. package/dist/skylight/floorplan.js +129 -0
  1327. package/dist/skylight/frame-csg.d.ts +4 -0
  1328. package/dist/skylight/frame-csg.d.ts.map +1 -0
  1329. package/dist/skylight/frame-csg.js +49 -0
  1330. package/dist/skylight/geometry.d.ts +7 -0
  1331. package/dist/skylight/geometry.d.ts.map +1 -0
  1332. package/dist/skylight/geometry.js +114 -0
  1333. package/dist/skylight/index.d.ts +5 -0
  1334. package/dist/skylight/index.d.ts.map +1 -0
  1335. package/dist/skylight/index.js +4 -0
  1336. package/dist/skylight/interaction.d.ts +11 -0
  1337. package/dist/skylight/interaction.d.ts.map +1 -0
  1338. package/dist/skylight/interaction.js +42 -0
  1339. package/dist/skylight/move-tool.d.ts +5 -0
  1340. package/dist/skylight/move-tool.d.ts.map +1 -0
  1341. package/dist/skylight/move-tool.js +233 -0
  1342. package/dist/skylight/panel.d.ts +2 -0
  1343. package/dist/skylight/panel.d.ts.map +1 -0
  1344. package/dist/skylight/panel.js +253 -0
  1345. package/dist/skylight/parametrics.d.ts +4 -0
  1346. package/dist/skylight/parametrics.d.ts.map +1 -0
  1347. package/dist/skylight/parametrics.js +99 -0
  1348. package/dist/skylight/preview.d.ts +7 -0
  1349. package/dist/skylight/preview.d.ts.map +1 -0
  1350. package/dist/skylight/preview.js +49 -0
  1351. package/dist/skylight/renderer.d.ts +6 -0
  1352. package/dist/skylight/renderer.d.ts.map +1 -0
  1353. package/dist/skylight/renderer.js +303 -0
  1354. package/dist/skylight/roof-cut.d.ts +21 -0
  1355. package/dist/skylight/roof-cut.d.ts.map +1 -0
  1356. package/dist/skylight/roof-cut.js +61 -0
  1357. package/dist/skylight/schema.d.ts +2 -0
  1358. package/dist/skylight/schema.d.ts.map +1 -0
  1359. package/dist/skylight/schema.js +1 -0
  1360. package/dist/skylight/system.d.ts +3 -0
  1361. package/dist/skylight/system.d.ts.map +1 -0
  1362. package/dist/skylight/system.js +49 -0
  1363. package/dist/skylight/tool.d.ts +3 -0
  1364. package/dist/skylight/tool.d.ts.map +1 -0
  1365. package/dist/skylight/tool.js +100 -0
  1366. package/dist/slab/boundary-editor.d.ts +24 -0
  1367. package/dist/slab/boundary-editor.d.ts.map +1 -0
  1368. package/dist/slab/boundary-editor.js +127 -0
  1369. package/dist/slab/definition.d.ts +20 -0
  1370. package/dist/slab/definition.d.ts.map +1 -0
  1371. package/dist/slab/definition.js +218 -0
  1372. package/dist/slab/floorplan-affordances.d.ts +177 -0
  1373. package/dist/slab/floorplan-affordances.d.ts.map +1 -0
  1374. package/dist/slab/floorplan-affordances.js +52 -0
  1375. package/dist/slab/floorplan-move.d.ts +12 -0
  1376. package/dist/slab/floorplan-move.d.ts.map +1 -0
  1377. package/dist/slab/floorplan-move.js +19 -0
  1378. package/dist/slab/floorplan.d.ts +20 -0
  1379. package/dist/slab/floorplan.d.ts.map +1 -0
  1380. package/dist/slab/floorplan.js +144 -0
  1381. package/dist/slab/geometry.d.ts +5 -0
  1382. package/dist/slab/geometry.d.ts.map +1 -0
  1383. package/dist/slab/geometry.js +133 -0
  1384. package/dist/slab/hole-editor.d.ts +14 -0
  1385. package/dist/slab/hole-editor.d.ts.map +1 -0
  1386. package/dist/slab/hole-editor.js +54 -0
  1387. package/dist/slab/index.d.ts +3 -0
  1388. package/dist/slab/index.d.ts.map +1 -0
  1389. package/dist/slab/index.js +2 -0
  1390. package/dist/slab/move-tool.d.ts +6 -0
  1391. package/dist/slab/move-tool.d.ts.map +1 -0
  1392. package/dist/slab/move-tool.js +232 -0
  1393. package/dist/slab/paint.d.ts +8 -0
  1394. package/dist/slab/paint.d.ts.map +1 -0
  1395. package/dist/slab/paint.js +26 -0
  1396. package/dist/slab/panel.d.ts +14 -0
  1397. package/dist/slab/panel.d.ts.map +1 -0
  1398. package/dist/slab/panel.js +144 -0
  1399. package/dist/slab/parametrics.d.ts +14 -0
  1400. package/dist/slab/parametrics.d.ts.map +1 -0
  1401. package/dist/slab/parametrics.js +19 -0
  1402. package/dist/slab/quick-measurement.d.ts +3 -0
  1403. package/dist/slab/quick-measurement.d.ts.map +1 -0
  1404. package/dist/slab/quick-measurement.js +35 -0
  1405. package/dist/slab/schema.d.ts +2 -0
  1406. package/dist/slab/schema.d.ts.map +1 -0
  1407. package/dist/slab/schema.js +1 -0
  1408. package/dist/slab/slots.d.ts +10 -0
  1409. package/dist/slab/slots.d.ts.map +1 -0
  1410. package/dist/slab/slots.js +20 -0
  1411. package/dist/slab/system.d.ts +3 -0
  1412. package/dist/slab/system.d.ts.map +1 -0
  1413. package/dist/slab/system.js +63 -0
  1414. package/dist/slab/tool.d.ts +3 -0
  1415. package/dist/slab/tool.d.ts.map +1 -0
  1416. package/dist/slab/tool.js +204 -0
  1417. package/dist/solar-panel/definition.d.ts +15 -0
  1418. package/dist/solar-panel/definition.d.ts.map +1 -0
  1419. package/dist/solar-panel/definition.js +260 -0
  1420. package/dist/solar-panel/floorplan.d.ts +21 -0
  1421. package/dist/solar-panel/floorplan.d.ts.map +1 -0
  1422. package/dist/solar-panel/floorplan.js +120 -0
  1423. package/dist/solar-panel/geometry.d.ts +29 -0
  1424. package/dist/solar-panel/geometry.d.ts.map +1 -0
  1425. package/dist/solar-panel/geometry.js +196 -0
  1426. package/dist/solar-panel/index.d.ts +5 -0
  1427. package/dist/solar-panel/index.d.ts.map +1 -0
  1428. package/dist/solar-panel/index.js +4 -0
  1429. package/dist/solar-panel/move-tool.d.ts +5 -0
  1430. package/dist/solar-panel/move-tool.d.ts.map +1 -0
  1431. package/dist/solar-panel/move-tool.js +257 -0
  1432. package/dist/solar-panel/panel.d.ts +2 -0
  1433. package/dist/solar-panel/panel.d.ts.map +1 -0
  1434. package/dist/solar-panel/panel.js +146 -0
  1435. package/dist/solar-panel/parametrics.d.ts +4 -0
  1436. package/dist/solar-panel/parametrics.d.ts.map +1 -0
  1437. package/dist/solar-panel/parametrics.js +52 -0
  1438. package/dist/solar-panel/preview.d.ts +7 -0
  1439. package/dist/solar-panel/preview.d.ts.map +1 -0
  1440. package/dist/solar-panel/preview.js +46 -0
  1441. package/dist/solar-panel/renderer.d.ts +26 -0
  1442. package/dist/solar-panel/renderer.d.ts.map +1 -0
  1443. package/dist/solar-panel/renderer.js +162 -0
  1444. package/dist/solar-panel/schema.d.ts +2 -0
  1445. package/dist/solar-panel/schema.d.ts.map +1 -0
  1446. package/dist/solar-panel/schema.js +1 -0
  1447. package/dist/solar-panel/tool.d.ts +11 -0
  1448. package/dist/solar-panel/tool.d.ts.map +1 -0
  1449. package/dist/solar-panel/tool.js +120 -0
  1450. package/dist/spawn/definition.d.ts +4 -0
  1451. package/dist/spawn/definition.d.ts.map +1 -0
  1452. package/dist/spawn/definition.js +107 -0
  1453. package/dist/spawn/floorplan-affordances.d.ts +3 -0
  1454. package/dist/spawn/floorplan-affordances.d.ts.map +1 -0
  1455. package/dist/spawn/floorplan-affordances.js +31 -0
  1456. package/dist/spawn/floorplan-move.d.ts +3 -0
  1457. package/dist/spawn/floorplan-move.d.ts.map +1 -0
  1458. package/dist/spawn/floorplan-move.js +31 -0
  1459. package/dist/spawn/floorplan.d.ts +14 -0
  1460. package/dist/spawn/floorplan.d.ts.map +1 -0
  1461. package/dist/spawn/floorplan.js +135 -0
  1462. package/dist/spawn/index.d.ts +3 -0
  1463. package/dist/spawn/index.d.ts.map +1 -0
  1464. package/dist/spawn/index.js +2 -0
  1465. package/dist/spawn/panel.d.ts +2 -0
  1466. package/dist/spawn/panel.d.ts.map +1 -0
  1467. package/dist/spawn/panel.js +71 -0
  1468. package/dist/spawn/parametrics.d.ts +8 -0
  1469. package/dist/spawn/parametrics.d.ts.map +1 -0
  1470. package/dist/spawn/parametrics.js +23 -0
  1471. package/dist/spawn/renderer.d.ts +16 -0
  1472. package/dist/spawn/renderer.d.ts.map +1 -0
  1473. package/dist/spawn/renderer.js +47 -0
  1474. package/dist/spawn/schema.d.ts +2 -0
  1475. package/dist/spawn/schema.d.ts.map +1 -0
  1476. package/dist/spawn/schema.js +5 -0
  1477. package/dist/spawn/tool.d.ts +10 -0
  1478. package/dist/spawn/tool.d.ts.map +1 -0
  1479. package/dist/spawn/tool.js +109 -0
  1480. package/dist/stair/definition.d.ts +9 -0
  1481. package/dist/stair/definition.d.ts.map +1 -0
  1482. package/dist/stair/definition.js +440 -0
  1483. package/dist/stair/floor-stack.d.ts +10 -0
  1484. package/dist/stair/floor-stack.d.ts.map +1 -0
  1485. package/dist/stair/floor-stack.js +77 -0
  1486. package/dist/stair/floorplan-affordances.d.ts +53 -0
  1487. package/dist/stair/floorplan-affordances.d.ts.map +1 -0
  1488. package/dist/stair/floorplan-affordances.js +266 -0
  1489. package/dist/stair/floorplan-move.d.ts +17 -0
  1490. package/dist/stair/floorplan-move.d.ts.map +1 -0
  1491. package/dist/stair/floorplan-move.js +64 -0
  1492. package/dist/stair/floorplan.d.ts +26 -0
  1493. package/dist/stair/floorplan.d.ts.map +1 -0
  1494. package/dist/stair/floorplan.js +455 -0
  1495. package/dist/stair/index.d.ts +2 -0
  1496. package/dist/stair/index.d.ts.map +1 -0
  1497. package/dist/stair/index.js +1 -0
  1498. package/dist/stair/paint.d.ts +2 -0
  1499. package/dist/stair/paint.d.ts.map +1 -0
  1500. package/dist/stair/paint.js +86 -0
  1501. package/dist/stair/panel.d.ts +2 -0
  1502. package/dist/stair/panel.d.ts.map +1 -0
  1503. package/dist/stair/panel.js +196 -0
  1504. package/dist/stair/parametrics.d.ts +3 -0
  1505. package/dist/stair/parametrics.d.ts.map +1 -0
  1506. package/dist/stair/parametrics.js +4 -0
  1507. package/dist/stair/renderer.d.ts +6 -0
  1508. package/dist/stair/renderer.d.ts.map +1 -0
  1509. package/dist/stair/renderer.js +667 -0
  1510. package/dist/stair/schema.d.ts +2 -0
  1511. package/dist/stair/schema.d.ts.map +1 -0
  1512. package/dist/stair/schema.js +1 -0
  1513. package/dist/stair/slots.d.ts +7 -0
  1514. package/dist/stair/slots.d.ts.map +1 -0
  1515. package/dist/stair/slots.js +13 -0
  1516. package/dist/stair/system.d.ts +3 -0
  1517. package/dist/stair/system.d.ts.map +1 -0
  1518. package/dist/stair/system.js +3 -0
  1519. package/dist/stair-segment/definition.d.ts +8 -0
  1520. package/dist/stair-segment/definition.d.ts.map +1 -0
  1521. package/dist/stair-segment/definition.js +133 -0
  1522. package/dist/stair-segment/index.d.ts +2 -0
  1523. package/dist/stair-segment/index.d.ts.map +1 -0
  1524. package/dist/stair-segment/index.js +1 -0
  1525. package/dist/stair-segment/panel.d.ts +2 -0
  1526. package/dist/stair-segment/panel.d.ts.map +1 -0
  1527. package/dist/stair-segment/panel.js +126 -0
  1528. package/dist/stair-segment/parametrics.d.ts +3 -0
  1529. package/dist/stair-segment/parametrics.d.ts.map +1 -0
  1530. package/dist/stair-segment/parametrics.js +4 -0
  1531. package/dist/stair-segment/renderer.d.ts +6 -0
  1532. package/dist/stair-segment/renderer.d.ts.map +1 -0
  1533. package/dist/stair-segment/renderer.js +55 -0
  1534. package/dist/stair-segment/schema.d.ts +2 -0
  1535. package/dist/stair-segment/schema.d.ts.map +1 -0
  1536. package/dist/stair-segment/schema.js +1 -0
  1537. package/dist/turbine-vent/definition.d.ts +24 -0
  1538. package/dist/turbine-vent/definition.d.ts.map +1 -0
  1539. package/dist/turbine-vent/definition.js +119 -0
  1540. package/dist/turbine-vent/floorplan.d.ts +13 -0
  1541. package/dist/turbine-vent/floorplan.d.ts.map +1 -0
  1542. package/dist/turbine-vent/floorplan.js +111 -0
  1543. package/dist/turbine-vent/geometry.d.ts +6 -0
  1544. package/dist/turbine-vent/geometry.d.ts.map +1 -0
  1545. package/dist/turbine-vent/geometry.js +284 -0
  1546. package/dist/turbine-vent/index.d.ts +4 -0
  1547. package/dist/turbine-vent/index.d.ts.map +1 -0
  1548. package/dist/turbine-vent/index.js +3 -0
  1549. package/dist/turbine-vent/move-tool.d.ts +13 -0
  1550. package/dist/turbine-vent/move-tool.d.ts.map +1 -0
  1551. package/dist/turbine-vent/move-tool.js +207 -0
  1552. package/dist/turbine-vent/panel.d.ts +8 -0
  1553. package/dist/turbine-vent/panel.d.ts.map +1 -0
  1554. package/dist/turbine-vent/panel.js +127 -0
  1555. package/dist/turbine-vent/parametrics.d.ts +9 -0
  1556. package/dist/turbine-vent/parametrics.d.ts.map +1 -0
  1557. package/dist/turbine-vent/parametrics.js +34 -0
  1558. package/dist/turbine-vent/preview.d.ts +14 -0
  1559. package/dist/turbine-vent/preview.d.ts.map +1 -0
  1560. package/dist/turbine-vent/preview.js +38 -0
  1561. package/dist/turbine-vent/renderer.d.ts +18 -0
  1562. package/dist/turbine-vent/renderer.d.ts.map +1 -0
  1563. package/dist/turbine-vent/renderer.js +107 -0
  1564. package/dist/turbine-vent/schema.d.ts +2 -0
  1565. package/dist/turbine-vent/schema.d.ts.map +1 -0
  1566. package/dist/turbine-vent/schema.js +3 -0
  1567. package/dist/turbine-vent/tool.d.ts +9 -0
  1568. package/dist/turbine-vent/tool.d.ts.map +1 -0
  1569. package/dist/turbine-vent/tool.js +111 -0
  1570. package/dist/wall/curve-tool.d.ts +14 -0
  1571. package/dist/wall/curve-tool.d.ts.map +1 -0
  1572. package/dist/wall/curve-tool.js +123 -0
  1573. package/dist/wall/definition.d.ts +19 -0
  1574. package/dist/wall/definition.d.ts.map +1 -0
  1575. package/dist/wall/definition.js +132 -0
  1576. package/dist/wall/floorplan-affordances.d.ts +13 -0
  1577. package/dist/wall/floorplan-affordances.d.ts.map +1 -0
  1578. package/dist/wall/floorplan-affordances.js +241 -0
  1579. package/dist/wall/floorplan-move.d.ts +32 -0
  1580. package/dist/wall/floorplan-move.d.ts.map +1 -0
  1581. package/dist/wall/floorplan-move.js +259 -0
  1582. package/dist/wall/floorplan-overrides.d.ts +22 -0
  1583. package/dist/wall/floorplan-overrides.d.ts.map +1 -0
  1584. package/dist/wall/floorplan-overrides.js +32 -0
  1585. package/dist/wall/floorplan.d.ts +23 -0
  1586. package/dist/wall/floorplan.d.ts.map +1 -0
  1587. package/dist/wall/floorplan.js +249 -0
  1588. package/dist/wall/index.d.ts +3 -0
  1589. package/dist/wall/index.d.ts.map +1 -0
  1590. package/dist/wall/index.js +2 -0
  1591. package/dist/wall/measurement.d.ts +5 -0
  1592. package/dist/wall/measurement.d.ts.map +1 -0
  1593. package/dist/wall/measurement.js +174 -0
  1594. package/dist/wall/move-endpoint-tool.d.ts +22 -0
  1595. package/dist/wall/move-endpoint-tool.d.ts.map +1 -0
  1596. package/dist/wall/move-endpoint-tool.js +450 -0
  1597. package/dist/wall/move-shared.d.ts +48 -0
  1598. package/dist/wall/move-shared.d.ts.map +1 -0
  1599. package/dist/wall/move-shared.js +162 -0
  1600. package/dist/wall/move-tool.d.ts +6 -0
  1601. package/dist/wall/move-tool.d.ts.map +1 -0
  1602. package/dist/wall/move-tool.js +523 -0
  1603. package/dist/wall/paint.d.ts +33 -0
  1604. package/dist/wall/paint.d.ts.map +1 -0
  1605. package/dist/wall/paint.js +176 -0
  1606. package/dist/wall/panel.d.ts +2 -0
  1607. package/dist/wall/panel.d.ts.map +1 -0
  1608. package/dist/wall/panel.js +198 -0
  1609. package/dist/wall/parametrics.d.ts +16 -0
  1610. package/dist/wall/parametrics.d.ts.map +1 -0
  1611. package/dist/wall/parametrics.js +30 -0
  1612. package/dist/wall/quick-measurement.d.ts +3 -0
  1613. package/dist/wall/quick-measurement.d.ts.map +1 -0
  1614. package/dist/wall/quick-measurement.js +30 -0
  1615. package/dist/wall/renderer.d.ts +25 -0
  1616. package/dist/wall/renderer.d.ts.map +1 -0
  1617. package/dist/wall/renderer.js +65 -0
  1618. package/dist/wall/schema.d.ts +12 -0
  1619. package/dist/wall/schema.d.ts.map +1 -0
  1620. package/dist/wall/schema.js +10 -0
  1621. package/dist/wall/slots.d.ts +10 -0
  1622. package/dist/wall/slots.d.ts.map +1 -0
  1623. package/dist/wall/slots.js +84 -0
  1624. package/dist/wall/system.d.ts +14 -0
  1625. package/dist/wall/system.d.ts.map +1 -0
  1626. package/dist/wall/system.js +18 -0
  1627. package/dist/wall/tool.d.ts +3 -0
  1628. package/dist/wall/tool.d.ts.map +1 -0
  1629. package/dist/wall/tool.js +628 -0
  1630. package/dist/wall/treatments.d.ts +26 -0
  1631. package/dist/wall/treatments.d.ts.map +1 -0
  1632. package/dist/wall/treatments.js +503 -0
  1633. package/dist/window/definition.d.ts +15 -0
  1634. package/dist/window/definition.d.ts.map +1 -0
  1635. package/dist/window/definition.js +237 -0
  1636. package/dist/window/floor-projection.d.ts +9 -0
  1637. package/dist/window/floor-projection.d.ts.map +1 -0
  1638. package/dist/window/floor-projection.js +84 -0
  1639. package/dist/window/floorplan-affordances.d.ts +22 -0
  1640. package/dist/window/floorplan-affordances.d.ts.map +1 -0
  1641. package/dist/window/floorplan-affordances.js +82 -0
  1642. package/dist/window/floorplan-move.d.ts +14 -0
  1643. package/dist/window/floorplan-move.d.ts.map +1 -0
  1644. package/dist/window/floorplan-move.js +223 -0
  1645. package/dist/window/floorplan.d.ts +16 -0
  1646. package/dist/window/floorplan.d.ts.map +1 -0
  1647. package/dist/window/floorplan.js +151 -0
  1648. package/dist/window/index.d.ts +3 -0
  1649. package/dist/window/index.d.ts.map +1 -0
  1650. package/dist/window/index.js +2 -0
  1651. package/dist/window/move-tool.d.ts +18 -0
  1652. package/dist/window/move-tool.d.ts.map +1 -0
  1653. package/dist/window/move-tool.js +914 -0
  1654. package/dist/window/paint.d.ts +8 -0
  1655. package/dist/window/paint.d.ts.map +1 -0
  1656. package/dist/window/paint.js +11 -0
  1657. package/dist/window/panel.d.ts +2 -0
  1658. package/dist/window/panel.d.ts.map +1 -0
  1659. package/dist/window/panel.js +384 -0
  1660. package/dist/window/parametrics.d.ts +11 -0
  1661. package/dist/window/parametrics.d.ts.map +1 -0
  1662. package/dist/window/parametrics.js +22 -0
  1663. package/dist/window/preview.d.ts +18 -0
  1664. package/dist/window/preview.d.ts.map +1 -0
  1665. package/dist/window/preview.js +36 -0
  1666. package/dist/window/renderer.d.ts +6 -0
  1667. package/dist/window/renderer.d.ts.map +1 -0
  1668. package/dist/window/renderer.js +37 -0
  1669. package/dist/window/schema.d.ts +2 -0
  1670. package/dist/window/schema.d.ts.map +1 -0
  1671. package/dist/window/schema.js +1 -0
  1672. package/dist/window/slots.d.ts +5 -0
  1673. package/dist/window/slots.d.ts.map +1 -0
  1674. package/dist/window/slots.js +11 -0
  1675. package/dist/window/system.d.ts +12 -0
  1676. package/dist/window/system.d.ts.map +1 -0
  1677. package/dist/window/system.js +16 -0
  1678. package/dist/window/tool.d.ts +13 -0
  1679. package/dist/window/tool.d.ts.map +1 -0
  1680. package/dist/window/tool.js +580 -0
  1681. package/dist/window/window-math.d.ts +31 -0
  1682. package/dist/window/window-math.d.ts.map +1 -0
  1683. package/dist/window/window-math.js +41 -0
  1684. package/dist/zone/definition.d.ts +10 -0
  1685. package/dist/zone/definition.d.ts.map +1 -0
  1686. package/dist/zone/definition.js +80 -0
  1687. package/dist/zone/floorplan-affordances.d.ts +81 -0
  1688. package/dist/zone/floorplan-affordances.d.ts.map +1 -0
  1689. package/dist/zone/floorplan-affordances.js +19 -0
  1690. package/dist/zone/floorplan-move.d.ts +13 -0
  1691. package/dist/zone/floorplan-move.d.ts.map +1 -0
  1692. package/dist/zone/floorplan-move.js +17 -0
  1693. package/dist/zone/floorplan.d.ts +13 -0
  1694. package/dist/zone/floorplan.d.ts.map +1 -0
  1695. package/dist/zone/floorplan.js +147 -0
  1696. package/dist/zone/index.d.ts +2 -0
  1697. package/dist/zone/index.d.ts.map +1 -0
  1698. package/dist/zone/index.js +1 -0
  1699. package/dist/zone/parametrics.d.ts +3 -0
  1700. package/dist/zone/parametrics.d.ts.map +1 -0
  1701. package/dist/zone/parametrics.js +4 -0
  1702. package/dist/zone/quantities-panel.d.ts +2 -0
  1703. package/dist/zone/quantities-panel.d.ts.map +1 -0
  1704. package/dist/zone/quantities-panel.js +83 -0
  1705. package/dist/zone/quick-measurement.d.ts +3 -0
  1706. package/dist/zone/quick-measurement.d.ts.map +1 -0
  1707. package/dist/zone/quick-measurement.js +29 -0
  1708. package/dist/zone/renderer.d.ts +6 -0
  1709. package/dist/zone/renderer.d.ts.map +1 -0
  1710. package/dist/zone/renderer.js +205 -0
  1711. package/dist/zone/schema.d.ts +2 -0
  1712. package/dist/zone/schema.d.ts.map +1 -0
  1713. package/dist/zone/schema.js +1 -0
  1714. package/dist/zone/system.d.ts +3 -0
  1715. package/dist/zone/system.d.ts.map +1 -0
  1716. package/dist/zone/system.js +3 -0
  1717. package/package.json +61 -0
@@ -0,0 +1,1395 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
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';
5
+ import { useViewer } from '@pascal-app/viewer';
6
+ import { Html } from '@react-three/drei';
7
+ import { createPortal, useFrame, useThree } from '@react-three/fiber';
8
+ import { useEffect, useMemo, useRef, useState } from 'react';
9
+ import { Euler, Matrix4, Plane, Quaternion, Raycaster, Vector2, Vector3, } from 'three';
10
+ import { newAutoOffsetGroupId, readAutoOffsetTag, translateAutoOffsetBase, withAutoOffsetTag, withoutAutoOffsetTag, } from '../shared/auto-offset-tag';
11
+ import { detectFittingEndpoint, planFittingEndpointReaim, } from '../shared/fitting-endpoint-reaim';
12
+ import { DuctSegmentGhost, FittingGhost } from '../shared/mep-ghost';
13
+ import { collectScenePorts, DUCT_PORT_SYSTEMS, findNearestPortXZ } from '../shared/ports';
14
+ import { planRunTranslationOffsets } from '../shared/run-translation-offset';
15
+ import { HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
16
+ import { planVerticalOffsets } from '../shared/vertical-offset';
17
+ import { INCHES_TO_METERS } from './geometry';
18
+ /** Port-snap radius for dragged run endpoints (meters, XZ). */
19
+ const PORT_SNAP_RADIUS_M = 0.4;
20
+ // In-world arrow handle layout (meters) — the arrows stand off the run body so
21
+ // they clear thick trunks.
22
+ const CORNER_ARROW_GAP = 0.18;
23
+ const CORNER_ARROW_MIN_OFFSET = 0.24;
24
+ /** Roll snap increment — 45°, matching the fitting rotate step. Shift bypasses. */
25
+ const ROLL_STEP_RAD = Math.PI / 4;
26
+ const UP = new Vector3(0, 1, 0);
27
+ function collectPortsFromNodes(nodes, filter = {}) {
28
+ const { excludeNodeId, systems } = filter;
29
+ const result = [];
30
+ for (const node of Object.values(nodes)) {
31
+ if (!node || node.id === excludeNodeId)
32
+ continue;
33
+ const ports = nodeRegistry.get(node.type)?.ports?.(node);
34
+ if (!ports)
35
+ continue;
36
+ for (const port of ports) {
37
+ if (systems && port.system !== undefined && !systems.includes(port.system))
38
+ continue;
39
+ result.push({ ...port, nodeId: node.id });
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ function snap(value, step) {
45
+ if (step <= 0)
46
+ return value;
47
+ return Math.round(value / step) * step;
48
+ }
49
+ /** Half the run's cross-section (meters) — the arrow stand-off radius. */
50
+ function runRadiusM(duct) {
51
+ if (duct.shape === 'round')
52
+ return (duct.diameter * INCHES_TO_METERS) / 2;
53
+ return (Math.max(duct.width, duct.height) * INCHES_TO_METERS) / 2;
54
+ }
55
+ /**
56
+ * Selection-time editing for committed duct runs: each path point shows a
57
+ * cluster of directional arrows instead of a free-drag handle — four XZ
58
+ * chevrons (±X / ±Z) plus an up / down vertical pair.
59
+ *
60
+ * Handles are PORTALED into the duct's registered scene group so they
61
+ * share its exact frame — path coords are node-local, and the level /
62
+ * building transform above the group applies to the handles for free.
63
+ * Drag raycasts run in world space and convert hits back into the
64
+ * group's local frame before writing the path.
65
+ *
66
+ * Drag model: the along-run arrow lengthens / shortens the run (locked to the
67
+ * run axis). The across-run (side) and up / down arrows instead SWING the
68
+ * grabbed endpoint around its neighbour at a fixed radius — the run pivots like
69
+ * a compass arm, keeping its length, rather than stretching. Dragged run
70
+ * endpoints still snap onto nearby typed ports (along-run drag) so a loose run
71
+ * can be mated onto a fitting after the fact, and when the dragged endpoint
72
+ * belongs to a straight run whose OTHER end sits on an elbow collar, the elbow
73
+ * re-aims to follow the drag (junction + far collar fixed, bend angle adapts).
74
+ *
75
+ * Modifiers (mirroring the wall corner drag):
76
+ * - **Alt** detaches: the joint breaks for this drag — the elbow does NOT
77
+ * re-aim and mated fittings / runs do NOT follow; the endpoint moves on its
78
+ * own (port re-mate still allowed so it can be reattached elsewhere).
79
+ * - **Shift** bypasses grid snapping for a perfectly smooth precision drag.
80
+ *
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
+ * change.
85
+ */
86
+ const DuctSegmentSelectionAffordance = () => {
87
+ const selectedIds = useViewer((s) => s.selection.selectedIds);
88
+ const duct = useScene((s) => {
89
+ if (selectedIds.length !== 1)
90
+ return null;
91
+ const node = s.nodes[selectedIds[0]];
92
+ return node?.type === 'duct-segment' ? node : null;
93
+ });
94
+ // Portal target: the duct's registered group. Resolved with a rAF
95
+ // retry because registration happens on the renderer's mount, which
96
+ // can land a frame after selection.
97
+ const ductId = duct?.id ?? null;
98
+ const [target, setTarget] = useState(null);
99
+ useEffect(() => {
100
+ if (!ductId) {
101
+ setTarget(null);
102
+ return;
103
+ }
104
+ let frameId = 0;
105
+ const resolve = () => {
106
+ const next = sceneRegistry.nodes.get(ductId) ?? null;
107
+ setTarget((cur) => (cur === next ? cur : next));
108
+ if (!next)
109
+ frameId = window.requestAnimationFrame(resolve);
110
+ };
111
+ resolve();
112
+ return () => window.cancelAnimationFrame(frameId);
113
+ }, [ductId]);
114
+ if (!duct || !target)
115
+ return null;
116
+ // Mount the handles in the duct group's PARENT (a sibling of the duct
117
+ // mesh), NOT inside the duct group itself. The selection outliner
118
+ // (`MergedOutlineNode`) traces every descendant mesh of the SELECTED node,
119
+ // so a hit-area cylinder parented under the duct would get swept into the
120
+ // duct's selection outline — the stray circle around the arrows. Walls /
121
+ // doors / windows dodge this the same way: their handle rig rides the
122
+ // parent, never the selected node. `DuctPointHandles` re-creates the duct
123
+ // group's own pose on an outer group so placements stay node-local.
124
+ const mount = target.parent ?? target;
125
+ return createPortal(_jsx(DuctPointHandles, { duct: duct, target: target }), mount, undefined);
126
+ };
127
+ const DuctPointHandles = ({ duct, target }) => {
128
+ const { camera, gl } = useThree();
129
+ // Outer group mirrors the duct group's local pose so handles placed in
130
+ // node-local path coords land exactly where the duct mesh sits, even though
131
+ // they're mounted in the parent (to stay out of the duct's selection
132
+ // outline). Mirrors the wall arrow rig's ride-group.
133
+ const outerRef = useRef(null);
134
+ useFrame(() => {
135
+ const outer = outerRef.current;
136
+ if (!outer)
137
+ return;
138
+ outer.position.copy(target.position);
139
+ outer.quaternion.copy(target.quaternion);
140
+ outer.scale.copy(target.scale);
141
+ });
142
+ const unit = useViewer((s) => s.unit);
143
+ const [draggingIndex, setDraggingIndex] = useState(null);
144
+ const [rolling, setRolling] = useState(false);
145
+ const [runMoving, setRunMoving] = useState(false);
146
+ // Auto-routed offset preview shown while the run-center cube's ±Y arrows
147
+ // lift / lower a connected run. Two flavours:
148
+ // - `valid` (green): the elbows + plumb riser the release will mint are
149
+ // ghosted while the run lifts + trims live; release commits them.
150
+ // - `invalid` (red): no clean offset fits at this height. ONLY the dragged
151
+ // run lifts (as a red preview); every partner is frozen and the release
152
+ // snaps back, committing nothing. The fittings/risers arrays are empty
153
+ // here — there's nothing buildable to ghost, the run body carries the cue.
154
+ // Null when the move is a plain translate (open ends, or no connections).
155
+ const [verticalGhost, setVerticalGhost] = useState(null);
156
+ const [openCluster, setOpenCluster] = useState(null);
157
+ const toggleCluster = (key) => setOpenCluster((cur) => (cur === key ? null : key));
158
+ // Set while a drag is live; null otherwise. Holds everything the window
159
+ // pointer handlers need so they never read stale React state.
160
+ const dragRef = useRef(null);
161
+ const makeRay = (clientX, clientY) => {
162
+ const rect = gl.domElement.getBoundingClientRect();
163
+ const ndc = new Vector2(((clientX - rect.left) / rect.width) * 2 - 1, -((clientY - rect.top) / rect.height) * 2 + 1);
164
+ const raycaster = new Raycaster();
165
+ raycaster.setFromCamera(ndc, camera);
166
+ return raycaster.ray;
167
+ };
168
+ const intersect = (clientX, clientY, plane) => {
169
+ const hit = new Vector3();
170
+ return makeRay(clientX, clientY).intersectPlane(plane, hit) ? hit : null;
171
+ };
172
+ /**
173
+ * Local-frame Y where the cursor ray meets a vertical plane through
174
+ * `anchorWorld` that faces the camera — drives the up / down vertical drag.
175
+ * Null when the ray is parallel to the plane.
176
+ */
177
+ const intersectVerticalY = (clientX, clientY, anchorWorld) => {
178
+ // Plane normal: camera forward flattened onto the horizontal plane, so
179
+ // the plane stands upright through the point and faces the viewer.
180
+ const forward = camera.getWorldDirection(new Vector3());
181
+ forward.y = 0;
182
+ if (forward.lengthSq() < 1e-6)
183
+ forward.set(0, 0, 1);
184
+ forward.normalize();
185
+ const plane = new Plane().setFromNormalAndCoplanarPoint(forward, anchorWorld);
186
+ const hit = intersect(clientX, clientY, plane);
187
+ return hit ? toLocal(hit)[1] : null;
188
+ };
189
+ /**
190
+ * Length-preserving HORIZONTAL swing: the unit direction from `pivot` toward
191
+ * a point sharing the cursor's heading but keeping the run's current pitch
192
+ * (vertical component). Caller re-extends it to the fixed radius. Sweeping
193
+ * the end around the pivot in the horizontal plane (a yaw) without changing
194
+ * length. Null when the cursor sits on the pivot's vertical axis (no
195
+ * heading) or the ray misses.
196
+ */
197
+ const swingHorizontal = (event, pivot, startPoint) => {
198
+ const r = Math.hypot(startPoint[0] - pivot[0], startPoint[1] - pivot[1], startPoint[2] - pivot[2]);
199
+ if (r < 1e-6)
200
+ return null;
201
+ const verticalN = (startPoint[1] - pivot[1]) / r;
202
+ const horizN = Math.sqrt(Math.max(0, 1 - verticalN * verticalN));
203
+ const plane = new Plane().setFromNormalAndCoplanarPoint(UP, toWorld(pivot));
204
+ const hit = intersect(event.clientX, event.clientY, plane);
205
+ if (!hit)
206
+ return null;
207
+ const local = toLocal(hit);
208
+ const bx = local[0] - pivot[0];
209
+ const bz = local[2] - pivot[2];
210
+ const blen = Math.hypot(bx, bz);
211
+ if (blen < 1e-6)
212
+ return null;
213
+ return [(bx / blen) * horizN, verticalN, (bz / blen) * horizN];
214
+ };
215
+ /**
216
+ * Length-preserving VERTICAL swing: the unit direction from `pivot` toward
217
+ * the cursor within the vertical plane that contains the run's current
218
+ * horizontal heading — so the end tilts up / down (changing pitch) while its
219
+ * heading and length stay fixed. Falls back to a camera-facing vertical plane
220
+ * for a pure riser (no horizontal heading). Null when the ray misses.
221
+ */
222
+ const swingVertical = (event, pivot, startPoint) => {
223
+ let hx = startPoint[0] - pivot[0];
224
+ let hz = startPoint[2] - pivot[2];
225
+ let hlen = Math.hypot(hx, hz);
226
+ if (hlen < 1e-6) {
227
+ // Pure riser: no heading — sweep in the plane facing the camera.
228
+ const forward = camera.getWorldDirection(new Vector3());
229
+ hx = forward.x;
230
+ hz = forward.z;
231
+ hlen = Math.hypot(hx, hz);
232
+ if (hlen < 1e-6) {
233
+ hx = 0;
234
+ hz = 1;
235
+ hlen = 1;
236
+ }
237
+ }
238
+ const headingWorld = new Vector3(hx / hlen, 0, hz / hlen);
239
+ // Plane normal: horizontal, perpendicular to the heading — the plane stands
240
+ // upright and contains both the heading and world-up through the pivot.
241
+ const normal = new Vector3().crossVectors(UP, headingWorld).normalize();
242
+ const plane = new Plane().setFromNormalAndCoplanarPoint(normal, toWorld(pivot));
243
+ const hit = intersect(event.clientX, event.clientY, plane);
244
+ if (!hit)
245
+ return null;
246
+ const local = toLocal(hit);
247
+ const ax = local[0] - pivot[0];
248
+ const ay = local[1] - pivot[1];
249
+ const az = local[2] - pivot[2];
250
+ const len = Math.hypot(ax, ay, az);
251
+ if (len < 1e-6)
252
+ return null;
253
+ return [ax / len, ay / len, az / len];
254
+ };
255
+ // Build the per-frame update batch for the dragged endpoint at `next`.
256
+ // Detached (Alt): only the duct path moves — no fitting re-aim, no
257
+ // connectivity follow. Re-aim mode: the run rides the fitting's re-aimed
258
+ // collar and the fitting swings to fit (elbow body turns, or a tee branch
259
+ // leans). Otherwise: the dragged point moves and any mated fittings / runs
260
+ // translate via connectivity.
261
+ const buildDragBatch = (drag, next, detached) => {
262
+ if (!detached && drag.fittingEndpoint) {
263
+ const plan = planFittingEndpointReaim(drag.fittingEndpoint, drag.index, next);
264
+ // Out of the fitting's buildable range — hold this frame.
265
+ if (!plan)
266
+ return null;
267
+ return [
268
+ { id: duct.id, data: { path: plan.path } },
269
+ { id: plan.fittingUpdate.id, data: plan.fittingUpdate.data },
270
+ ];
271
+ }
272
+ const path = duct.path.map((p, i) => (i === drag.index ? next : p));
273
+ return [
274
+ { id: duct.id, data: { path } },
275
+ ...(detached ? [] : connectivityUpdatesForPath(drag.connectivity, path)),
276
+ ];
277
+ };
278
+ /** World-space position of a local path point. */
279
+ const toWorld = (p) => target.localToWorld(new Vector3(p[0], p[1], p[2]));
280
+ /** Convert a world-space hit back into the duct group's local frame. */
281
+ const toLocal = (world) => {
282
+ const local = target.worldToLocal(world.clone());
283
+ return [local.x, local.y, local.z];
284
+ };
285
+ // Follow-updates for fittings / ducts mated to this run's endpoints, given
286
+ // the run's live path. Endpoints whose position didn't change resolve to a
287
+ // zero delta, so only the dragged endpoint's partner actually moves.
288
+ const connectivityUpdatesForPath = (connectivity, path) => {
289
+ if (!connectivity)
290
+ return [];
291
+ const preview = { ...duct, path };
292
+ return resolveConnectivityUpdates(connectivity, preview).filter((u) => useScene.getState().nodes[u.id]);
293
+ };
294
+ // A corner arrow drag: the point is locked to one axis (X / Z / Y). All the
295
+ // rich behaviour — port-snap, elbow re-aim, connectivity follow, single-undo
296
+ // — is shared with every arrow; only the
297
+ // cursor→point projection differs per `kind`.
298
+ const onHandleDown = (index, kind) => (e) => {
299
+ e.stopPropagation();
300
+ const initialPath = duct.path.map((p) => [...p]);
301
+ const startPoint = initialPath[index];
302
+ const connectivity = analyzePortConnectivity(duct, useScene.getState().nodes);
303
+ pauseSceneHistory(useScene);
304
+ useViewer.getState().setInputDragging(true);
305
+ document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
306
+ setDraggingIndex(index);
307
+ const isEndpoint = index === 0 || index === initialPath.length - 1;
308
+ // Swing pivot: the across-run (side) and up / down arrows DON'T stretch the
309
+ // run — they sweep the grabbed point around its neighbour at a fixed radius
310
+ // (the segment's current length), so the run pivots like a compass arm
311
+ // instead of lengthening. The along-run pair keeps the plain lengthen /
312
+ // shorten. The pivot is the adjacent vertex; null when there's no neighbour
313
+ // (a lone point) or the grabbed segment has zero length.
314
+ const swings = kind.axis === 'y' ? kind.along !== true : !kind.along;
315
+ // Pivot only at an endpoint (its single neighbour is the unambiguous "other
316
+ // end"); interior vertices keep the plain per-axis drag.
317
+ const neighborIndex = index === 0 ? 1 : index === initialPath.length - 1 ? index - 1 : null;
318
+ const pivot = neighborIndex !== null ? initialPath[neighborIndex] : null;
319
+ const radius = pivot
320
+ ? Math.hypot(startPoint[0] - pivot[0], startPoint[1] - pivot[1], startPoint[2] - pivot[2])
321
+ : 0;
322
+ const canSwing = swings && isEndpoint && pivot !== null && radius > 1e-6;
323
+ // Fitting re-aim: if this is a straight run whose OTHER end sits on an
324
+ // elbow collar (junction + far collar fixed, bend angle adapts) or a tee
325
+ // branch collar (run legs fixed, branch lean adapts), the fitting swings
326
+ // to follow the drag. Detected once against a drag-start snapshot.
327
+ const fittingEndpoint = isEndpoint
328
+ ? detectFittingEndpoint('duct-segment', initialPath, index, useScene.getState().nodes)
329
+ : null;
330
+ const onMove = (event) => {
331
+ const drag = dragRef.current;
332
+ if (!drag)
333
+ return;
334
+ // Shift = precision: bypass grid snapping (snap() is a no-op at step 0).
335
+ const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
336
+ // Alt = detach: break the joint for this drag (it can still port-snap to
337
+ // re-mate elsewhere). Mirrors the wall corner drag.
338
+ const detached = event.altKey;
339
+ let next = null;
340
+ if (canSwing && pivot) {
341
+ // Length-preserving swing: aim from the pivot toward the cursor and
342
+ // re-extend to the fixed radius. The up / down arrow swings in the
343
+ // vertical plane that contains the run (so it tilts the run up / down
344
+ // without changing its length); the side arrow swings in the
345
+ // horizontal plane (a yaw about the pivot).
346
+ const aim = kind.axis === 'y'
347
+ ? swingVertical(event, pivot, startPoint)
348
+ : swingHorizontal(event, pivot, startPoint);
349
+ 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
352
+ // the arc angle) keeps the endpoint on the grid like every other
353
+ // arrow, trading a hair of the fixed radius for grid alignment.
354
+ next = [
355
+ snap(pivot[0] + aim[0] * radius, step),
356
+ Math.max(0, snap(pivot[1] + aim[1] * radius, step)),
357
+ snap(pivot[2] + aim[2] * radius, step),
358
+ ];
359
+ }
360
+ }
361
+ else if (kind.axis === 'y') {
362
+ // Vertical (riser): keep XZ pinned to the start and drive Y off the
363
+ // cursor against a vertical plane through the point.
364
+ const y = intersectVerticalY(event.clientX, event.clientY, toWorld(startPoint));
365
+ if (y !== null)
366
+ next = [startPoint[0], Math.max(0, snap(y, step)), startPoint[2]];
367
+ }
368
+ else {
369
+ // Horizontal: project the cursor onto the plane at the point's height,
370
+ // then lock to the arrow's run-relative line (node-local XZ direction)
371
+ // through the point — so an angled run drags along / across itself, not
372
+ // world ±X / ±Z.
373
+ const plane = new Plane().setFromNormalAndCoplanarPoint(UP, toWorld(startPoint));
374
+ const hit = intersect(event.clientX, event.clientY, plane);
375
+ if (hit) {
376
+ const local = toLocal(hit);
377
+ const [dx, dz] = kind.dir;
378
+ // Signed displacement of the cursor along the lock direction, snapped.
379
+ const t = snap((local[0] - startPoint[0]) * dx + (local[2] - startPoint[2]) * dz, step);
380
+ next = [startPoint[0] + t * dx, startPoint[1], startPoint[2] + t * dz];
381
+ }
382
+ }
383
+ if (!next)
384
+ return;
385
+ // Port re-mate for any endpoint arrow — the along-/across-run drags AND
386
+ // the length-preserving swings all snap onto a nearby typed port so a
387
+ // loose run can be mated onto a fitting after the fact (the swing's fixed
388
+ // radius yields to the port). Stays available while detaching or
389
+ // free-dragging; suppressed only while a fitting is actively re-aiming.
390
+ 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);
392
+ if (port)
393
+ next = [port.position[0], port.position[1], port.position[2]];
394
+ }
395
+ if (next[0] === drag.current[0] && next[1] === drag.current[1] && next[2] === drag.current[2])
396
+ return;
397
+ const batch = buildDragBatch(drag, next, detached);
398
+ if (!batch)
399
+ return;
400
+ drag.current = next;
401
+ drag.detached = detached;
402
+ // Tick on each new snapped position — the same grid-snap SFX the draw
403
+ // tools fire; the player debounces rapid repeats (minIntervalMs). Only
404
+ // when the grid is live (step > 0): Shift-precision has nothing to snap.
405
+ if (step > 0)
406
+ triggerSFX('sfx:grid-snap');
407
+ useScene.getState().updateNodes(batch);
408
+ };
409
+ const onUp = () => {
410
+ const drag = dragRef.current;
411
+ if (!drag)
412
+ return;
413
+ // Swallow the trailing synthetic click so it doesn't reach the
414
+ // background-click deselect handler — `cleanup()` drops `inputDragging`
415
+ // synchronously here, so without this the click that fires after
416
+ // pointerup would land with the drag gate already down and clear the
417
+ // selection. Mirrors `useHandleDrag`'s onUp.
418
+ swallowNextClick();
419
+ drag.cleanup();
420
+ dragRef.current = null;
421
+ 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
424
+ // each live frame (elbow re-aim, rigid connectivity follow, or — when
425
+ // detached — just the duct path).
426
+ const detached = drag.detached;
427
+ 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
+ resumeSceneHistory(useScene);
445
+ const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
446
+ if (moved && finalBatch) {
447
+ // A manual corner edit invalidates any stored auto-offset base (the
448
+ // tag's snapshot no longer matches the geometry), so strip the tag on
449
+ // commit. The duct becomes plain independent geometry.
450
+ const finalWithTagStrip = finalBatch.map((u) => u.id === duct.id && readAutoOffsetTag(duct)
451
+ ? {
452
+ ...u,
453
+ data: {
454
+ ...u.data,
455
+ metadata: withoutAutoOffsetTag(duct.metadata),
456
+ },
457
+ }
458
+ : u);
459
+ useScene.getState().updateNodes(finalWithTagStrip);
460
+ }
461
+ };
462
+ const cleanup = () => {
463
+ window.removeEventListener('pointermove', onMove);
464
+ window.removeEventListener('pointerup', onUp);
465
+ window.removeEventListener('pointercancel', onUp);
466
+ useViewer.getState().setInputDragging(false);
467
+ document.body.style.cursor = '';
468
+ };
469
+ dragRef.current = {
470
+ index,
471
+ initialPath,
472
+ current: startPoint,
473
+ cleanup,
474
+ connectivity,
475
+ fittingEndpoint,
476
+ detached: false,
477
+ };
478
+ window.addEventListener('pointermove', onMove);
479
+ window.addEventListener('pointerup', onUp);
480
+ window.addEventListener('pointercancel', onUp);
481
+ };
482
+ // Roll: spin the rect / oval cross-section about the run (length) axis. The
483
+ // cursor's bearing in the plane perpendicular to the run direction (taken in
484
+ // the cross-section's own width / height basis so the angle maps 1:1 to the
485
+ // visible profile) drives the `roll` field. Round runs look identical at any
486
+ // roll, so the gizmo isn't rendered for them. Roll doesn't move the ports
487
+ // (they sit on the path, whose positions are unchanged), so mated runs /
488
+ // fittings need no follow — just the single-undo dance on the scalar field.
489
+ const onRollDown = (e) => {
490
+ e.stopPropagation();
491
+ const axis = runAxisAndCenter(duct);
492
+ if (!axis)
493
+ return;
494
+ const startRoll = duct.roll;
495
+ const dir = new Vector3(axis.dir[0], axis.dir[1], axis.dir[2]);
496
+ const worldDir = target.localToWorld(dir.clone()).sub(target.localToWorld(new Vector3()));
497
+ worldDir.normalize();
498
+ const center = toWorld(axis.center);
499
+ // Width / height axes at roll 0, mapped to world — the bearing basis. This
500
+ // is the same construction `rectSectionAxes` uses, so a turn of the cursor
501
+ // by θ rolls the section by θ.
502
+ const xBase = new Vector3().crossVectors(UP, dir);
503
+ if (xBase.lengthSq() < 1e-8)
504
+ xBase.set(1, 0, 0);
505
+ xBase.normalize();
506
+ const zBase = new Vector3().crossVectors(xBase, dir).normalize();
507
+ const u = target.localToWorld(xBase.clone()).sub(target.localToWorld(new Vector3())).normalize();
508
+ const v = target.localToWorld(zBase.clone()).sub(target.localToWorld(new Vector3())).normalize();
509
+ const plane = new Plane().setFromNormalAndCoplanarPoint(worldDir, center);
510
+ const bearing = (clientX, clientY) => {
511
+ const hit = intersect(clientX, clientY, plane);
512
+ if (!hit)
513
+ return null;
514
+ const d = hit.sub(center);
515
+ return Math.atan2(d.dot(v), d.dot(u));
516
+ };
517
+ const startBearing = bearing(e.nativeEvent.clientX, e.nativeEvent.clientY);
518
+ pauseSceneHistory(useScene);
519
+ useViewer.getState().setInputDragging(true);
520
+ document.body.style.cursor = 'grabbing';
521
+ setRolling(true);
522
+ let current = startRoll;
523
+ let lastStep = Number.NaN;
524
+ const onMove = (event) => {
525
+ if (startBearing === null)
526
+ return;
527
+ const b = bearing(event.clientX, event.clientY);
528
+ if (b === null)
529
+ return;
530
+ // Snap the roll to 45° steps; Shift = smooth (no snap).
531
+ const raw = b - startBearing;
532
+ const delta = event.shiftKey ? raw : Math.round(raw / ROLL_STEP_RAD) * ROLL_STEP_RAD;
533
+ const next = startRoll + delta;
534
+ if (next === current)
535
+ return;
536
+ 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) {
540
+ const step = Math.round(raw / ROLL_STEP_RAD);
541
+ if (step !== lastStep) {
542
+ lastStep = step;
543
+ triggerSFX('sfx:item-rotate');
544
+ }
545
+ }
546
+ useScene.getState().updateNode(duct.id, { roll: next });
547
+ };
548
+ const onUp = () => {
549
+ swallowNextClick();
550
+ window.removeEventListener('pointermove', onMove);
551
+ window.removeEventListener('pointerup', onUp);
552
+ window.removeEventListener('pointercancel', onUp);
553
+ useViewer.getState().setInputDragging(false);
554
+ document.body.style.cursor = '';
555
+ 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 });
560
+ resumeSceneHistory(useScene);
561
+ if (current !== startRoll) {
562
+ useScene.getState().updateNode(duct.id, {
563
+ roll: current,
564
+ ...(readAutoOffsetTag(duct) ? { metadata: withoutAutoOffsetTag(duct.metadata) } : {}),
565
+ });
566
+ }
567
+ };
568
+ window.addEventListener('pointermove', onMove);
569
+ window.addEventListener('pointerup', onUp);
570
+ window.addEventListener('pointercancel', onUp);
571
+ };
572
+ // Move the WHOLE run, locked to one direction: the vertical world axis, or a
573
+ // run-relative horizontal line (node-local XZ unit dir) so the along-/across-
574
+ // run arrows track the run instead of world ±X / ±Z. Every path point shifts
575
+ // by the same delta; mated fittings / runs follow via connectivity, and the
576
+ // gesture lands as a single undo step (the same dance the per-point drag
577
+ // uses). The center arrows each bind one direction; the projection is the
578
+ // only thing that differs.
579
+ const onRunMoveDown = (kind) => (e) => {
580
+ e.stopPropagation();
581
+ const parentId = (duct.parentId ?? undefined);
582
+ const initialPath = duct.path.map((p) => [...p]);
583
+ const center = runAxisAndCenter(duct)?.center ?? initialPath[0];
584
+ const anchorWorld = toWorld(center);
585
+ // Cross-section the auto-routed offset fittings inherit (vertical move).
586
+ const profile = {
587
+ shape: duct.shape,
588
+ diameter: duct.diameter,
589
+ width: duct.width,
590
+ height: duct.height,
591
+ };
592
+ // Auto-routed offsets carry an auto-offset tag recording the minted
593
+ // elbows/risers + the pre-offset base. A re-drag must REWIND that tag
594
+ // (delete the prior minted nodes, restore the base) before planning the
595
+ // fresh offset — otherwise each re-drag strands the previous elbows/riser
596
+ // in place. Read the tag on vertical drags so the rewind/delete plumbing
597
+ // (keyed on `mintedIds` below) runs; horizontal moves translate a stored
598
+ // base if one remains.
599
+ const isVertical = kind.axis === 'y';
600
+ const preRewindNodes = useScene.getState().nodes;
601
+ const existingTag = readAutoOffsetTag(duct);
602
+ const tag = isVertical ? existingTag : null;
603
+ const runBase = tag?.base.find((b) => b.id === duct.id);
604
+ const logicalPath = (runBase?.data?.path?.map((p) => [...p]) ?? initialPath);
605
+ const baseDy = tag?.dy ?? 0;
606
+ 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();
613
+ pauseSceneHistory(useScene);
614
+ const ensureSceneObjectsVisible = (ids) => {
615
+ const scene = useScene.getState();
616
+ for (const id of ids) {
617
+ const obj = sceneRegistry.nodes.get(id);
618
+ if (obj) {
619
+ obj.visible = true;
620
+ obj.traverse((child) => {
621
+ child.visible = true;
622
+ });
623
+ }
624
+ if (scene.nodes[id])
625
+ scene.markDirty(id);
626
+ }
627
+ };
628
+ const livePreviewIds = new Set();
629
+ const publishLivePreview = (updates) => {
630
+ const scene = useScene.getState();
631
+ const entries = updates
632
+ .filter((update) => scene.nodes[update.id])
633
+ .map((update) => [update.id, update.data]);
634
+ if (entries.length === 0)
635
+ return;
636
+ useLiveNodeOverrides.getState().setMany(entries);
637
+ for (const [id] of entries) {
638
+ livePreviewIds.add(id);
639
+ scene.markDirty(id);
640
+ }
641
+ };
642
+ const clearLivePreview = () => {
643
+ const overrides = useLiveNodeOverrides.getState();
644
+ for (const id of livePreviewIds)
645
+ overrides.clear(id);
646
+ livePreviewIds.clear();
647
+ };
648
+ // Connectivity + ports are read from an IN-MEMORY post-rewind scene (the
649
+ // logical L), so click-only pointerdown doesn't visually snap the committed
650
+ // offset down to the floor. The real scene is only rewound after the first
651
+ // actual drag delta, inside `applyLogicalBasePreview`.
652
+ const nodesById = { ...preRewindNodes };
653
+ if (tag) {
654
+ for (const id of mintedIds)
655
+ delete nodesById[id];
656
+ for (const b of tag.base) {
657
+ const current = nodesById[b.id];
658
+ if (current)
659
+ nodesById[b.id] = { ...current, ...b.data };
660
+ }
661
+ }
662
+ const logicalDuct = DuctSegmentNode.parse({
663
+ ...duct,
664
+ path: logicalPath,
665
+ metadata: withoutAutoOffsetTag(duct.metadata),
666
+ });
667
+ nodesById[duct.id] = logicalDuct;
668
+ const connectivity = analyzePortConnectivity(logicalDuct, nodesById);
669
+ const scenePorts = collectPortsFromNodes(nodesById, {
670
+ excludeNodeId: duct.id,
671
+ systems: DUCT_PORT_SYSTEMS,
672
+ });
673
+ // Grab offset: cursor's start coordinate along the locked direction (signed
674
+ // distance for the horizontal run-relative line), so the run doesn't jump
675
+ // on grab.
676
+ const sample = (clientX, clientY) => {
677
+ if (kind.axis === 'y')
678
+ return intersectVerticalY(clientX, clientY, anchorWorld);
679
+ const plane = new Plane().setFromNormalAndCoplanarPoint(UP, anchorWorld);
680
+ const hit = intersect(clientX, clientY, plane);
681
+ if (!hit)
682
+ return null;
683
+ const local = toLocal(hit);
684
+ return local[0] * kind.dir[0] + local[2] * kind.dir[1];
685
+ };
686
+ const startSample = sample(e.nativeEvent.clientX, e.nativeEvent.clientY);
687
+ useViewer.getState().setInputDragging(true);
688
+ document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
689
+ setRunMoving(true);
690
+ let delta = 0;
691
+ // Last frame's offset outcome (vertical move only): a valid plan to mint on
692
+ // release, an invalid marker (preview-only, snap back), or null for a plain
693
+ // translate. `onUp` reads it to decide create vs. translate vs. nothing.
694
+ let offsetResult = null;
695
+ // Shift the LOGICAL L: vertical adds the carried `baseDy` plus this drag's
696
+ // delta (so a re-drag accumulates from the L, not the lifted Z); horizontal
697
+ // (always untagged → baseDy 0, logicalPath === initialPath) slides in plane.
698
+ const shiftedPath = (d) => logicalPath.map((p) => {
699
+ const next = [...p];
700
+ if (kind.axis === 'y') {
701
+ next[1] = Math.max(0, p[1] + baseDy + d);
702
+ }
703
+ else {
704
+ next[0] = p[0] + d * kind.dir[0];
705
+ next[2] = p[2] + d * kind.dir[1];
706
+ }
707
+ return next;
708
+ });
709
+ const batchFor = (path) => [
710
+ { id: duct.id, data: { path } },
711
+ ...connectivityUpdatesForPath(connectivity, path),
712
+ ];
713
+ // Patches restoring every connected partner to its post-rewind (logical-L)
714
+ // pose — runs by path, fittings by position (+ a re-aimed elbow's rotation /
715
+ // angle). Used to FREEZE partners on an invalid frame.
716
+ const partnerReverts = () => (connectivity?.connections ?? [])
717
+ .map((conn) => {
718
+ if (conn.kind !== 'rigid-node') {
719
+ return { id: conn.nodeId, data: { path: conn.startPath } };
720
+ }
721
+ const start = nodesById[conn.nodeId];
722
+ const data = { position: conn.startPosition };
723
+ if (start?.rotation !== undefined)
724
+ data.rotation = start.rotation;
725
+ if (start?.angle !== undefined)
726
+ data.angle = start.angle;
727
+ return { id: conn.nodeId, data: data };
728
+ })
729
+ .filter((u) => useScene.getState().nodes[u.id]);
730
+ // Base for a NEWLY formed offset (untagged run): the logical L IS the
731
+ // drag-start pose, so the L is `initialPath` and partners are at their
732
+ // start paths / poses. A re-drag carries the existing tag's base forward.
733
+ const freshBase = () => [
734
+ { id: duct.id, data: { path: initialPath } },
735
+ ...partnerReverts().map((u) => ({ id: u.id, data: u.data })),
736
+ ];
737
+ // Patches restoring partners to their PRE-rewind (original Z) poses — the
738
+ // single-undo baseline. Untagged: same as the L (no rewind happened).
739
+ const originalPartnerReverts = () => {
740
+ if (!tag)
741
+ return partnerReverts();
742
+ return tag.base
743
+ .filter((b) => b.id !== duct.id)
744
+ .map((b) => {
745
+ const orig = preRewindNodes[b.id];
746
+ if (!orig)
747
+ return null;
748
+ if ('path' in orig)
749
+ return { id: b.id, data: { path: orig.path } };
750
+ const data = {};
751
+ if (orig.position !== undefined)
752
+ data.position = orig.position;
753
+ if (orig.rotation !== undefined)
754
+ data.rotation = orig.rotation;
755
+ if (orig.angle !== undefined)
756
+ data.angle = orig.angle;
757
+ return { id: b.id, data: data };
758
+ })
759
+ .filter((u) => u !== null)
760
+ .filter((u) => useScene.getState().nodes[u.id]);
761
+ };
762
+ const restoreOriginalOffsetPreview = () => {
763
+ const scene = useScene.getState();
764
+ const partnerUpdates = originalPartnerReverts();
765
+ const updates = [
766
+ {
767
+ id: duct.id,
768
+ data: { path: duct.path, metadata: duct.metadata },
769
+ },
770
+ ...partnerUpdates,
771
+ ];
772
+ 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
+ }
804
+ };
805
+ const applyLogicalBasePreview = () => {
806
+ if (!tag)
807
+ return;
808
+ const scene = useScene.getState();
809
+ const updates = [
810
+ {
811
+ id: duct.id,
812
+ data: {
813
+ path: logicalPath,
814
+ metadata: withoutAutoOffsetTag(duct.metadata),
815
+ },
816
+ },
817
+ ...tag.base
818
+ .filter((b) => b.id !== duct.id && scene.nodes[b.id])
819
+ .map((b) => ({ id: b.id, data: b.data })),
820
+ ];
821
+ publishLivePreview(updates);
822
+ scene.applyNodeChanges({
823
+ delete: mintedIds.filter((id) => scene.nodes[id]),
824
+ update: updates,
825
+ });
826
+ ensureSceneObjectsVisible(updates.map((update) => update.id));
827
+ };
828
+ const onMove = (event) => {
829
+ if (startSample === null)
830
+ return;
831
+ const s = sample(event.clientX, event.clientY);
832
+ if (s === null)
833
+ return;
834
+ const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
835
+ const next = snap(s - startSample, step);
836
+ if (next === delta)
837
+ return;
838
+ delta = next;
839
+ if (step > 0)
840
+ triggerSFX('sfx:grid-snap');
841
+ const dyEff = baseDy + next;
842
+ // Vertical move: connected ends stay welded to their (stationary)
843
+ // partner via an auto-routed elbow → riser → elbow offset, planned from
844
+ // the LOGICAL L by the accumulated lift. The planner returns valid (offset
845
+ // fits), invalid (connected but no clean offset at this height), or null
846
+ // (no connections, or dyEff 0 → back at the L → plain translate).
847
+ offsetResult =
848
+ isVertical && dyEff !== 0
849
+ ? planVerticalOffsets({
850
+ duct: logicalDuct,
851
+ dy: dyEff,
852
+ profile,
853
+ connections: connectivity?.connections ?? [],
854
+ scenePorts,
855
+ nodesById,
856
+ })
857
+ : null;
858
+ if (offsetResult?.status === 'valid') {
859
+ applyLogicalBasePreview();
860
+ // Lift the run to the offset path; trim run-offset partners back one
861
+ // leg, and let connectivity-follow (seeded from followPath, which zeroes
862
+ // the offset ends) lift any FITTING / open partner so its elbow rides
863
+ // up and its riser lengthens into a clean L. Ghost the new elbows +
864
+ // riser GREEN; they're minted for real on release.
865
+ const plan = offsetResult.plan;
866
+ const scene = useScene.getState();
867
+ 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 ?? []);
874
+ const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
875
+ const updates = [
876
+ { id: duct.id, data: { path: plan.ductPath } },
877
+ ...plan.updates.filter((u) => scene.nodes[u.id]),
878
+ ...followUpdates,
879
+ ];
880
+ publishLivePreview(updates);
881
+ scene.applyNodeChanges({
882
+ delete: deletePreview,
883
+ update: updates,
884
+ });
885
+ ensureSceneObjectsVisible(updates.map((update) => update.id));
886
+ setVerticalGhost({ tint: 'valid', fittings: plan.fittings, risers: plan.risers });
887
+ }
888
+ else if (offsetResult?.status === 'invalid') {
889
+ // No clean offset at this height. Keep the last committed network
890
+ // visible (including any prior auto-offset we rewound at drag-start)
891
+ // and show a RED ghost of the run where it WOULD lift to. Nothing is
892
+ // committed on release, so the run snaps back to its prior state.
893
+ restorePreviewDeleted();
894
+ restoreOriginalOffsetPreview();
895
+ const lifted = DuctSegmentNode.parse({ ...logicalDuct, path: shiftedPath(next) });
896
+ setVerticalGhost({ tint: 'invalid', fittings: [], risers: [lifted] });
897
+ }
898
+ else {
899
+ restorePreviewDeleted();
900
+ applyLogicalBasePreview();
901
+ setVerticalGhost(null);
902
+ const updates = batchFor(shiftedPath(next));
903
+ publishLivePreview(updates);
904
+ useScene.getState().updateNodes(updates);
905
+ ensureSceneObjectsVisible(updates.map((update) => update.id));
906
+ }
907
+ };
908
+ const onUp = () => {
909
+ swallowNextClick();
910
+ window.removeEventListener('pointermove', onMove);
911
+ window.removeEventListener('pointerup', onUp);
912
+ window.removeEventListener('pointercancel', onUp);
913
+ useViewer.getState().setInputDragging(false);
914
+ document.body.style.cursor = '';
915
+ setRunMoving(false);
916
+ setVerticalGhost(null);
917
+ 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
+ ]);
947
+ resumeSceneHistory(useScene);
948
+ if (delta === 0)
949
+ return;
950
+ const dyEff = baseDy + delta;
951
+ const result = offsetResult;
952
+ // Invalid lift: nothing buildable at this height — keep the prior state
953
+ // (the revert above already restored it) and commit nothing.
954
+ if (result?.status === 'invalid')
955
+ return;
956
+ const scene = useScene.getState();
957
+ if (result?.status === 'valid') {
958
+ // Mint the new offset (fresh elbows + riser), delete any prior minted,
959
+ // trim run-offset partners, lift fitting / open partners via
960
+ // connectivity-follow, and stamp the run with the offset tag — all one
961
+ // tracked change. The base (logical L) is carried forward unchanged.
962
+ const plan = result.plan;
963
+ const group = tag?.group ?? newAutoOffsetGroupId();
964
+ const base = tag?.base ?? freshBase();
965
+ const minted = [...plan.fittings, ...plan.risers];
966
+ const hasMintedOffset = minted.length > 0;
967
+ const newTag = {
968
+ group,
969
+ dy: plan.dy,
970
+ minted: minted.map((n) => n.id),
971
+ base,
972
+ };
973
+ const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
974
+ const updates = [
975
+ {
976
+ id: duct.id,
977
+ data: {
978
+ path: plan.ductPath,
979
+ metadata: hasMintedOffset
980
+ ? withAutoOffsetTag(duct.metadata, newTag)
981
+ : withoutAutoOffsetTag(duct.metadata),
982
+ },
983
+ },
984
+ ...plan.updates.filter((u) => scene.nodes[u.id]),
985
+ ...followUpdates,
986
+ ];
987
+ scene.applyNodeChanges({
988
+ create: minted.map((node) => ({ node, parentId })),
989
+ delete: [
990
+ ...mintedIds.filter((id) => scene.nodes[id]),
991
+ ...(plan.delete ?? []).filter((id) => scene.nodes[id]),
992
+ ],
993
+ update: updates,
994
+ });
995
+ ensureSceneObjectsVisible([
996
+ ...minted.map((node) => node.id),
997
+ ...updates.map((update) => update.id),
998
+ ]);
999
+ }
1000
+ else if (tag && dyEff === 0) {
1001
+ // Dragged a re-grabbed offset all the way back to its logical L: the Z
1002
+ // dissolves for good — delete the minted nodes, drop the tag, and leave
1003
+ // the run + partners on the clean L.
1004
+ const updates = [
1005
+ {
1006
+ id: duct.id,
1007
+ data: {
1008
+ path: logicalPath,
1009
+ metadata: withoutAutoOffsetTag(duct.metadata),
1010
+ },
1011
+ },
1012
+ ...tag.base
1013
+ .filter((b) => b.id !== duct.id && scene.nodes[b.id])
1014
+ .map((b) => ({ id: b.id, data: b.data })),
1015
+ ];
1016
+ scene.applyNodeChanges({
1017
+ delete: mintedIds.filter((id) => scene.nodes[id]),
1018
+ update: updates,
1019
+ });
1020
+ ensureSceneObjectsVisible(updates.map((update) => update.id));
1021
+ }
1022
+ else {
1023
+ // Plain translate, or a horizontal connected slide that can be
1024
+ // rerouted with elbows + a connector instead of dragging the network.
1025
+ const finalPath = shiftedPath(delta);
1026
+ const translationPlan = !isVertical && connectivity
1027
+ ? planRunTranslationOffsets({
1028
+ duct: logicalDuct,
1029
+ translatedPath: finalPath,
1030
+ profile,
1031
+ connections: connectivity.connections,
1032
+ scenePorts,
1033
+ nodesById,
1034
+ })
1035
+ : null;
1036
+ if (translationPlan) {
1037
+ const created = [...translationPlan.fittings, ...translationPlan.connectors];
1038
+ const updates = [
1039
+ { id: duct.id, data: { path: translationPlan.ductPath } },
1040
+ ...translationPlan.updates,
1041
+ ];
1042
+ scene.applyNodeChanges({
1043
+ create: created.map((node) => ({
1044
+ node: node,
1045
+ parentId,
1046
+ })),
1047
+ update: updates,
1048
+ });
1049
+ ensureSceneObjectsVisible([
1050
+ ...created.map((node) => node.id),
1051
+ ...updates.map((update) => update.id),
1052
+ ]);
1053
+ return;
1054
+ }
1055
+ const updates = batchFor(finalPath);
1056
+ if (isVertical && existingTag) {
1057
+ updates[0] = {
1058
+ ...updates[0],
1059
+ data: {
1060
+ ...updates[0].data,
1061
+ metadata: withoutAutoOffsetTag(duct.metadata),
1062
+ },
1063
+ };
1064
+ }
1065
+ if (!isVertical && existingTag && kind.axis === 'horizontal') {
1066
+ const movedTag = translateAutoOffsetBase(existingTag, [
1067
+ delta * kind.dir[0],
1068
+ 0,
1069
+ delta * kind.dir[1],
1070
+ ]);
1071
+ updates[0] = {
1072
+ ...updates[0],
1073
+ data: {
1074
+ ...updates[0].data,
1075
+ metadata: withAutoOffsetTag(duct.metadata, movedTag),
1076
+ },
1077
+ };
1078
+ }
1079
+ useScene.getState().updateNodes(updates);
1080
+ ensureSceneObjectsVisible(updates.map((update) => update.id));
1081
+ }
1082
+ };
1083
+ window.addEventListener('pointermove', onMove);
1084
+ window.addEventListener('pointerup', onUp);
1085
+ window.addEventListener('pointercancel', onUp);
1086
+ };
1087
+ const cornerArrows = useMemo(() => getCornerArrows(duct), [duct]);
1088
+ const rollGizmo = useMemo(() => (duct.shape === 'round' ? null : runAxisAndCenter(duct)), [duct]);
1089
+ // Run-center cube position (centroid centerline). The six whole-run move
1090
+ // arrows + the roll arc are revealed on hover, like the per-vertex clusters.
1091
+ const runCenter = useMemo(() => runAxisAndCenter(duct)?.center ?? null, [duct]);
1092
+ // Yaw the center cube to the run's horizontal heading so it stays aligned
1093
+ // with the run (matching the per-vertex cubes). A pure riser has no heading.
1094
+ const runCenterYaw = useMemo(() => {
1095
+ const axis = runAxisAndCenter(duct);
1096
+ if (!axis || Math.hypot(axis.dir[0], axis.dir[2]) < 1e-6)
1097
+ return 0;
1098
+ return Math.atan2(-axis.dir[2], axis.dir[0]);
1099
+ }, [duct]);
1100
+ // Six whole-run move arrows offset off the center: four horizontal (along-run
1101
+ // ± and across-run ±, aligned to the run's XZ tangent so they track the run
1102
+ // instead of world ±X / ±Z) plus the up / down vertical pair. All shift every
1103
+ // path point rigidly — no swing (the whole run has no pivot).
1104
+ const centerArrows = useMemo(() => {
1105
+ if (!runCenter)
1106
+ return [];
1107
+ const base = Math.max(runRadiusM(duct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
1108
+ // Run's horizontal heading (node-local XZ). A pure riser has none → fall
1109
+ // back to world +X so the arrows stay usable.
1110
+ const axis = runAxisAndCenter(duct);
1111
+ const t = axis && Math.hypot(axis.dir[0], axis.dir[2]) > 1e-6
1112
+ ? (() => {
1113
+ const len = Math.hypot(axis.dir[0], axis.dir[2]);
1114
+ return [axis.dir[0] / len, axis.dir[2] / len];
1115
+ })()
1116
+ : [1, 0];
1117
+ const runYaw = Math.atan2(-t[1], t[0]);
1118
+ const horiz = [
1119
+ { key: 'along+', dir: [t[0], t[1]] },
1120
+ { key: 'along-', dir: [-t[0], -t[1]] },
1121
+ { key: 'across+', dir: [-t[1], t[0]] },
1122
+ { key: 'across-', dir: [t[1], -t[0]] },
1123
+ ];
1124
+ const arrows = horiz.map(({ key, dir }) => ({
1125
+ key,
1126
+ kind: { axis: 'horizontal', dir },
1127
+ position: [runCenter[0] + dir[0] * base, runCenter[1], runCenter[2] + dir[1] * base],
1128
+ rotationY: Math.atan2(-dir[1], dir[0]),
1129
+ cursor: 'grab',
1130
+ }));
1131
+ arrows.push({
1132
+ key: '+y',
1133
+ kind: { axis: 'y' },
1134
+ position: [runCenter[0], runCenter[1] + base, runCenter[2]],
1135
+ rotationY: runYaw,
1136
+ vertical: 'up',
1137
+ cursor: 'ns-resize',
1138
+ }, {
1139
+ key: '-y',
1140
+ kind: { axis: 'y' },
1141
+ position: [runCenter[0], runCenter[1] - base, runCenter[2]],
1142
+ rotationY: runYaw,
1143
+ vertical: 'down',
1144
+ cursor: 'ns-resize',
1145
+ });
1146
+ return arrows;
1147
+ }, [duct, runCenter]);
1148
+ 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
+ !rolling &&
1150
+ !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 &&
1152
+ cornerArrows
1153
+ .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] &&
1156
+ (() => {
1157
+ // Same pill as the draw tool: signed per-axis deltas from the
1158
+ // drag-start position, dominant axis emphasised.
1159
+ const point = duct.path[draggingIndex];
1160
+ const origin = dragRef.current?.initialPath[draggingIndex] ?? point;
1161
+ const deltas = [point[0] - origin[0], point[1] - origin[1], point[2] - origin[2]];
1162
+ const axes = ['x', 'y', 'z'];
1163
+ const primary = axes.reduce((best, axis, i) => Math.abs(deltas[i]) > Math.abs(deltas[axes.indexOf(best)]) ? axis : best);
1164
+ return (_jsx(Html, { center: true, position: [point[0], point[1] + 0.35, point[2]], style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsx(DimensionPill, { parts: axes.map((axis, i) => ({
1165
+ key: axis,
1166
+ prefix: axis.toUpperCase(),
1167
+ value: deltas[i],
1168
+ signed: true,
1169
+ })), primary: primary, unit: unit }) }));
1170
+ })()] }));
1171
+ };
1172
+ /**
1173
+ * Roll gizmo — the shared `RotateArc` re-oriented to wrap the run's length
1174
+ * axis, seated at a FIXED corner of the section frame. It does NOT track
1175
+ * `roll`, so the grip stays still while the user spins the duct (otherwise it
1176
+ * chases the cursor and is hard to keep hold of).
1177
+ *
1178
+ * The `curved-arrow` geometry wraps its LOCAL +Y (the spin axis) and bulges
1179
+ * its arc apex along LOCAL +X. Orienting with a single `setFromUnitVectors`
1180
+ * only pins the spin axis and leaves the apex pointing an arbitrary way, so the
1181
+ * arc faced inconsistently across run directions. Instead we build a FULLY
1182
+ * determined basis: +Y → run direction (the roll axis), +X → the top-outer 45°
1183
+ * corner direction (so the apex always bulges outward at that corner), +Z the
1184
+ * derived right-handed third axis. Position rides the same corner direction off
1185
+ * the centre, so the grip and its curve always agree.
1186
+ */
1187
+ function RollHandle({ center, dir, radius, onPointerDown, }) {
1188
+ const { position, rotation } = useMemo(() => {
1189
+ const runDir = new Vector3(dir[0], dir[1], dir[2]).normalize();
1190
+ const xBase = new Vector3().crossVectors(UP, runDir);
1191
+ if (xBase.lengthSq() < 1e-8)
1192
+ xBase.set(1, 0, 0);
1193
+ xBase.normalize();
1194
+ const zBase = new Vector3().crossVectors(xBase, runDir).normalize();
1195
+ const a = Math.PI / 4;
1196
+ // Top-outer 45° corner of the section frame (between the top and a side
1197
+ // face) — both the position offset and the arc apex ride this direction.
1198
+ const cornerDir = xBase
1199
+ .clone()
1200
+ .multiplyScalar(Math.sin(a))
1201
+ .addScaledVector(zBase, -Math.cos(a))
1202
+ .normalize();
1203
+ const pos = [
1204
+ center[0] + cornerDir.x * radius,
1205
+ center[1] + cornerDir.y * radius,
1206
+ center[2] + cornerDir.z * radius,
1207
+ ];
1208
+ // Basis: X = apex/corner, Y = roll axis (run dir), Z = right-handed third.
1209
+ const zAxis = new Vector3().crossVectors(cornerDir, runDir).normalize();
1210
+ const q = new Quaternion().setFromRotationMatrix(new Matrix4().makeBasis(cornerDir, runDir, zAxis));
1211
+ const e = new Euler().setFromQuaternion(q);
1212
+ return { position: pos, rotation: [e.x, e.y, e.z] };
1213
+ }, [center, dir, radius]);
1214
+ return _jsx(RotateArc, { onPointerDown: onPointerDown, position: position, rotation: rotation });
1215
+ }
1216
+ // Per-point directional arrows: at every path vertex, four horizontal chevrons
1217
+ // (along-run ± and across-run ±) plus an up / down vertical pair. The
1218
+ // horizontal pair is aligned to the run's node-local TANGENT at that vertex,
1219
+ // not world ±X / ±Z, so a duct drawn at any angle (or rotated) keeps
1220
+ // along-/across-run arrows. Pure vertical risers have no XZ tangent, so their
1221
+ // horizontal arrows become side-swing controls and the outward ±Y chevron
1222
+ // becomes the along-run length handle. `rotationY` orients each flat chevron to
1223
+ // point along its direction (the same `atan2(-z, x)` mapping the wall move
1224
+ // handles use). Arrows stand off the run body so they clear thick trunks. At an
1225
+ // endpoint the chevron pointing back INTO the run (toward the neighbour) is
1226
+ // dropped — its outward twin already shortens / lengthens that end either way.
1227
+ function getCornerArrows(duct) {
1228
+ const arrows = [];
1229
+ const base = Math.max(runRadiusM(duct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
1230
+ const last = duct.path.length - 1;
1231
+ duct.path.forEach((p, i) => {
1232
+ // Run tangent at this vertex (node-local XZ). A pure-riser vertex has no
1233
+ // horizontal extent, so keep its side arrows world-cardinal and let the
1234
+ // outward vertical arrow carry the along-run action.
1235
+ const tangentXZ = vertexTangentXZ(duct, i);
1236
+ const verticalTangentY = tangentXZ ? null : vertexTangentY(duct, i);
1237
+ const t = tangentXZ ?? [1, 0];
1238
+ // Yaw that aligns a handle's local +X with the run tangent — shared by the
1239
+ // up / down chevrons so their flat plates align with the run (the ±Y tip
1240
+ // is added on top, and yawing about Y keeps them pointing up / down).
1241
+ const runYaw = Math.atan2(-t[1], t[0]);
1242
+ // along the run (lengthen / shorten), then across it (swing — tangent
1243
+ // rotated ±90°).
1244
+ const dirs = tangentXZ
1245
+ ? [
1246
+ { dir: [t[0], t[1]], along: true },
1247
+ { dir: [-t[0], -t[1]], along: true },
1248
+ { dir: [-t[1], t[0]], along: false },
1249
+ { dir: [t[1], -t[0]], along: false },
1250
+ ]
1251
+ : [
1252
+ { dir: [1, 0], along: false },
1253
+ { dir: [-1, 0], along: false },
1254
+ { dir: [0, 1], along: false },
1255
+ { dir: [0, -1], along: false },
1256
+ ];
1257
+ // Inward (toward the run body) at an endpoint: i=0 the tangent points at
1258
+ // the neighbour, i=last it points away — so inward is ∓tangent. Interior
1259
+ // points keep all four arrows.
1260
+ const inward = tangentXZ && i === 0 ? [t[0], t[1]] : tangentXZ && i === last ? [-t[0], -t[1]] : null;
1261
+ for (const { dir, along } of dirs) {
1262
+ const [dx, dz] = dir;
1263
+ if (inward && dx * inward[0] + dz * inward[1] > 0.999)
1264
+ continue;
1265
+ arrows.push({
1266
+ key: `pt${i}-${dx.toFixed(3)}:${dz.toFixed(3)}`,
1267
+ index: i,
1268
+ kind: { axis: 'horizontal', dir: [dx, dz], along },
1269
+ position: [p[0] + dx * base, p[1], p[2] + dz * base],
1270
+ rotationY: Math.atan2(-dz, dx),
1271
+ cursor: 'grab',
1272
+ });
1273
+ }
1274
+ // Inward at a vertical endpoint is the chevron that points back toward the
1275
+ // neighbour; hide it so a riser endpoint exposes one clear outer length
1276
+ // handle along the duct instead of a misleading up/down swing pair.
1277
+ const inwardY = verticalTangentY && i === 0
1278
+ ? verticalTangentY
1279
+ : verticalTangentY && i === last
1280
+ ? -verticalTangentY
1281
+ : null;
1282
+ for (const sign of [1, -1]) {
1283
+ if (inwardY === sign)
1284
+ continue;
1285
+ arrows.push({
1286
+ key: `pt${i}-${sign > 0 ? 'up' : 'down'}`,
1287
+ index: i,
1288
+ kind: { axis: 'y', along: verticalTangentY !== null },
1289
+ position: [p[0], p[1] + sign * base, p[2]],
1290
+ rotationY: runYaw,
1291
+ vertical: sign > 0 ? 'up' : 'down',
1292
+ cursor: 'ns-resize',
1293
+ });
1294
+ }
1295
+ });
1296
+ return arrows;
1297
+ }
1298
+ /**
1299
+ * Node-local XZ unit tangent of the run at vertex `i`: toward the neighbour at
1300
+ * an endpoint, the averaged direction of the two adjacent segments at an
1301
+ * interior corner. Null when the run has no horizontal extent there (a pure
1302
+ * riser vertex), so the caller falls back to a world-aligned arrow.
1303
+ */
1304
+ function vertexTangentXZ(duct, i) {
1305
+ const path = duct.path;
1306
+ const last = path.length - 1;
1307
+ if (last < 1)
1308
+ return null;
1309
+ const seg = (a, b) => {
1310
+ const dx = path[b][0] - path[a][0];
1311
+ const dz = path[b][2] - path[a][2];
1312
+ const len = Math.hypot(dx, dz);
1313
+ return len < 1e-6 ? null : [dx / len, dz / len];
1314
+ };
1315
+ if (i === 0)
1316
+ return seg(0, 1);
1317
+ if (i === last)
1318
+ return seg(last - 1, last);
1319
+ const inc = seg(i - 1, i);
1320
+ const out = seg(i, i + 1);
1321
+ if (!inc)
1322
+ return out;
1323
+ if (!out)
1324
+ return inc;
1325
+ const sx = inc[0] + out[0];
1326
+ const sz = inc[1] + out[1];
1327
+ const len = Math.hypot(sx, sz);
1328
+ return len < 1e-6 ? inc : [sx / len, sz / len];
1329
+ }
1330
+ /**
1331
+ * Node-local Y tangent for a vertex whose adjacent run direction is vertical.
1332
+ * Uses the same endpoint orientation convention as `vertexTangentXZ`: start
1333
+ * points toward its neighbour, end points away from its previous neighbour.
1334
+ */
1335
+ function vertexTangentY(duct, i) {
1336
+ const path = duct.path;
1337
+ const last = path.length - 1;
1338
+ if (last < 1)
1339
+ return null;
1340
+ const seg = (a, b) => {
1341
+ const dx = path[b][0] - path[a][0];
1342
+ const dy = path[b][1] - path[a][1];
1343
+ const dz = path[b][2] - path[a][2];
1344
+ if (Math.hypot(dx, dz) > 1e-6 || Math.abs(dy) < 1e-6)
1345
+ return null;
1346
+ return dy > 0 ? 1 : -1;
1347
+ };
1348
+ if (i === 0)
1349
+ return seg(0, 1);
1350
+ if (i === last)
1351
+ return seg(last - 1, last);
1352
+ const inc = seg(i - 1, i);
1353
+ const out = seg(i, i + 1);
1354
+ if (!inc)
1355
+ return out;
1356
+ if (!out)
1357
+ return inc;
1358
+ return inc === out ? inc : null;
1359
+ }
1360
+ /** Y-yaw that aligns a handle's local +X with the run tangent at vertex `i`. */
1361
+ function vertexYaw(duct, i) {
1362
+ const t = vertexTangentXZ(duct, i);
1363
+ return t ? Math.atan2(-t[1], t[0]) : 0;
1364
+ }
1365
+ /**
1366
+ * Overall run direction and midpoint (node-local), for the roll gizmo. The
1367
+ * direction is path[0]→last (the run's gross axis), falling back to the first
1368
+ * segment when the ends coincide; the centre is their midpoint. Null when the
1369
+ * run has no length to roll about.
1370
+ */
1371
+ function runAxisAndCenter(duct) {
1372
+ const path = duct.path;
1373
+ if (path.length < 2)
1374
+ return null;
1375
+ const a = path[0];
1376
+ const b = path[path.length - 1];
1377
+ let dx = b[0] - a[0];
1378
+ let dy = b[1] - a[1];
1379
+ let dz = b[2] - a[2];
1380
+ let len = Math.hypot(dx, dy, dz);
1381
+ if (len < 1e-6) {
1382
+ const c = path[1];
1383
+ dx = c[0] - a[0];
1384
+ dy = c[1] - a[1];
1385
+ dz = c[2] - a[2];
1386
+ len = Math.hypot(dx, dy, dz);
1387
+ if (len < 1e-6)
1388
+ return null;
1389
+ }
1390
+ return {
1391
+ dir: [dx / len, dy / len, dz / len],
1392
+ center: [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2],
1393
+ };
1394
+ }
1395
+ export default DuctSegmentSelectionAffordance;