@pascal-app/nodes 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1350) hide show
  1. package/README.md +43 -8
  2. package/dist/agent-operations/index.d.ts +5 -0
  3. package/dist/agent-operations/index.d.ts.map +1 -1
  4. package/dist/agent-operations/index.js +10 -0
  5. package/dist/agent-tools/index.d.ts +195 -0
  6. package/dist/agent-tools/index.d.ts.map +1 -1
  7. package/dist/agent-tools/index.js +82 -2
  8. package/dist/beam/actions/move-endpoint.d.ts +24 -0
  9. package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
  10. package/dist/beam/actions/move-endpoint.js +54 -0
  11. package/dist/beam/definition.d.ts +65 -0
  12. package/dist/beam/definition.d.ts.map +1 -0
  13. package/dist/beam/definition.edit.d.ts +4 -0
  14. package/dist/beam/definition.edit.d.ts.map +1 -0
  15. package/dist/beam/definition.edit.js +133 -0
  16. package/dist/beam/definition.js +4 -0
  17. package/dist/beam/definition.render.d.ts +6 -0
  18. package/dist/beam/definition.render.d.ts.map +1 -0
  19. package/dist/beam/definition.render.js +32 -0
  20. package/dist/beam/draft-settings.d.ts +17 -0
  21. package/dist/beam/draft-settings.d.ts.map +1 -0
  22. package/dist/beam/draft-settings.js +81 -0
  23. package/dist/beam/drafting.d.ts +35 -0
  24. package/dist/beam/drafting.d.ts.map +1 -0
  25. package/dist/beam/drafting.js +103 -0
  26. package/dist/beam/floorplan-affordances.d.ts +8 -0
  27. package/dist/beam/floorplan-affordances.d.ts.map +1 -0
  28. package/dist/beam/floorplan-affordances.js +40 -0
  29. package/dist/beam/floorplan-move.d.ts +11 -0
  30. package/dist/beam/floorplan-move.d.ts.map +1 -0
  31. package/dist/beam/floorplan-move.js +54 -0
  32. package/dist/beam/floorplan.d.ts +11 -0
  33. package/dist/beam/floorplan.d.ts.map +1 -0
  34. package/dist/beam/floorplan.js +91 -0
  35. package/dist/beam/geometry.d.ts +19 -0
  36. package/dist/beam/geometry.d.ts.map +1 -0
  37. package/dist/beam/geometry.js +63 -0
  38. package/dist/beam/index.d.ts +3 -0
  39. package/dist/beam/index.d.ts.map +1 -0
  40. package/dist/beam/index.js +2 -0
  41. package/dist/beam/move-endpoint-tool.d.ts +21 -0
  42. package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
  43. package/dist/beam/move-endpoint-tool.js +49 -0
  44. package/dist/beam/move-tool.d.ts +12 -0
  45. package/dist/beam/move-tool.d.ts.map +1 -0
  46. package/dist/beam/move-tool.js +114 -0
  47. package/dist/beam/panel-model.d.ts +28 -0
  48. package/dist/beam/panel-model.d.ts.map +1 -0
  49. package/dist/beam/panel-model.js +123 -0
  50. package/dist/beam/panel.d.ts +13 -0
  51. package/dist/beam/panel.d.ts.map +1 -0
  52. package/dist/beam/panel.js +107 -0
  53. package/dist/beam/parametrics.d.ts +3 -0
  54. package/dist/beam/parametrics.d.ts.map +1 -0
  55. package/dist/beam/parametrics.js +4 -0
  56. package/dist/beam/renderer.d.ts +13 -0
  57. package/dist/beam/renderer.d.ts.map +1 -0
  58. package/dist/beam/renderer.js +36 -0
  59. package/dist/beam/schema.d.ts +2 -0
  60. package/dist/beam/schema.d.ts.map +1 -0
  61. package/dist/beam/schema.js +1 -0
  62. package/dist/beam/tool.d.ts +13 -0
  63. package/dist/beam/tool.d.ts.map +1 -0
  64. package/dist/beam/tool.js +152 -0
  65. package/dist/block/definition.d.ts +67 -7
  66. package/dist/block/definition.d.ts.map +1 -1
  67. package/dist/block/definition.edit.d.ts +4 -0
  68. package/dist/block/definition.edit.d.ts.map +1 -0
  69. package/dist/block/definition.edit.js +28 -0
  70. package/dist/block/definition.js +5 -144
  71. package/dist/block/definition.render.d.ts +11 -0
  72. package/dist/block/definition.render.d.ts.map +1 -0
  73. package/dist/block/definition.render.js +120 -0
  74. package/dist/box-vent/definition.d.ts +103 -29
  75. package/dist/box-vent/definition.d.ts.map +1 -1
  76. package/dist/box-vent/definition.edit.d.ts +4 -0
  77. package/dist/box-vent/definition.edit.d.ts.map +1 -0
  78. package/dist/box-vent/definition.edit.js +151 -0
  79. package/dist/box-vent/definition.js +4 -212
  80. package/dist/box-vent/definition.render.d.ts +6 -0
  81. package/dist/box-vent/definition.render.d.ts.map +1 -0
  82. package/dist/box-vent/definition.render.js +40 -0
  83. package/dist/box-vent/move-tool.d.ts.map +1 -1
  84. package/dist/box-vent/move-tool.js +6 -5
  85. package/dist/box-vent/panel.d.ts.map +1 -1
  86. package/dist/box-vent/panel.js +8 -7
  87. package/dist/building/definition.d.ts +49 -11
  88. package/dist/building/definition.d.ts.map +1 -1
  89. package/dist/building/definition.edit.d.ts +4 -0
  90. package/dist/building/definition.edit.d.ts.map +1 -0
  91. package/dist/building/definition.edit.js +10 -0
  92. package/dist/building/definition.js +4 -54
  93. package/dist/building/definition.render.d.ts +6 -0
  94. package/dist/building/definition.render.d.ts.map +1 -0
  95. package/dist/building/definition.render.js +38 -0
  96. package/dist/builtin-definitions.d.ts +9784 -0
  97. package/dist/builtin-definitions.d.ts.map +1 -0
  98. package/dist/builtin-definitions.js +113 -0
  99. package/dist/builtin-edit-contributions.d.ts +9608 -0
  100. package/dist/builtin-edit-contributions.d.ts.map +1 -0
  101. package/dist/builtin-edit-contributions.js +112 -0
  102. package/dist/builtin-plugin-metadata.d.ts +5 -0
  103. package/dist/builtin-plugin-metadata.d.ts.map +1 -0
  104. package/dist/builtin-plugin-metadata.js +1 -0
  105. package/dist/cabinet/batchable.d.ts +10 -0
  106. package/dist/cabinet/batchable.d.ts.map +1 -0
  107. package/dist/cabinet/batchable.js +12 -0
  108. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  109. package/dist/cabinet/compartment-card.js +142 -46
  110. package/dist/cabinet/countertop-layout.d.ts +5 -0
  111. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  112. package/dist/cabinet/definition.d.ts +497 -25
  113. package/dist/cabinet/definition.d.ts.map +1 -1
  114. package/dist/cabinet/definition.edit.d.ts +5 -0
  115. package/dist/cabinet/definition.edit.d.ts.map +1 -0
  116. package/dist/cabinet/definition.edit.js +1375 -0
  117. package/dist/cabinet/definition.js +6 -2112
  118. package/dist/cabinet/definition.render.d.ts +66 -0
  119. package/dist/cabinet/definition.render.d.ts.map +1 -0
  120. package/dist/cabinet/definition.render.js +751 -0
  121. package/dist/cabinet/dimension-input.d.ts +6 -0
  122. package/dist/cabinet/dimension-input.d.ts.map +1 -0
  123. package/dist/cabinet/dimension-input.js +8 -0
  124. package/dist/cabinet/essential-controls.d.ts.map +1 -1
  125. package/dist/cabinet/essential-controls.js +82 -17
  126. package/dist/cabinet/index.d.ts +1 -1
  127. package/dist/cabinet/index.d.ts.map +1 -1
  128. package/dist/cabinet/index.js +1 -1
  129. package/dist/cabinet/kitchen-catalog.d.ts +17 -4
  130. package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
  131. package/dist/cabinet/kitchen-catalog.js +45 -7
  132. package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
  133. package/dist/cabinet/kitchen-collection.js +21 -5
  134. package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
  135. package/dist/cabinet/kitchen-module-actions.js +108 -15
  136. package/dist/cabinet/neighbor-placement.d.ts +10 -0
  137. package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
  138. package/dist/cabinet/panel.d.ts.map +1 -1
  139. package/dist/cabinet/panel.js +127 -50
  140. package/dist/cabinet/placement-dimensions.d.ts +36 -2
  141. package/dist/cabinet/placement-dimensions.d.ts.map +1 -1
  142. package/dist/cabinet/placement-dimensions.js +68 -2
  143. package/dist/cabinet/run-finishing.d.ts +5 -0
  144. package/dist/cabinet/run-finishing.d.ts.map +1 -1
  145. package/dist/cabinet/run-ops.d.ts +5 -0
  146. package/dist/cabinet/run-ops.d.ts.map +1 -1
  147. package/dist/cabinet/run-panel.d.ts.map +1 -1
  148. package/dist/cabinet/run-panel.js +203 -52
  149. package/dist/cabinet/system.js +1 -1
  150. package/dist/cabinet/tool.d.ts.map +1 -1
  151. package/dist/cabinet/tool.js +275 -19
  152. package/dist/cabinet/wall-snap.d.ts +5 -1
  153. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  154. package/dist/cabinet/wall-snap.js +2 -2
  155. package/dist/ceiling/build-up-section.d.ts +7 -0
  156. package/dist/ceiling/build-up-section.d.ts.map +1 -0
  157. package/dist/ceiling/build-up-section.js +57 -0
  158. package/dist/ceiling/definition.d.ts +152 -19
  159. package/dist/ceiling/definition.d.ts.map +1 -1
  160. package/dist/ceiling/definition.edit.d.ts +4 -0
  161. package/dist/ceiling/definition.edit.d.ts.map +1 -0
  162. package/dist/ceiling/definition.edit.js +125 -0
  163. package/dist/ceiling/definition.js +4 -205
  164. package/dist/ceiling/definition.render.d.ts +6 -0
  165. package/dist/ceiling/definition.render.d.ts.map +1 -0
  166. package/dist/ceiling/definition.render.js +71 -0
  167. package/dist/ceiling/floorplan-affordances.d.ts +112 -0
  168. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  169. package/dist/ceiling/materials.d.ts +5 -0
  170. package/dist/ceiling/materials.d.ts.map +1 -1
  171. package/dist/ceiling/materials.js +17 -0
  172. package/dist/ceiling/panel-model.d.ts +13 -0
  173. package/dist/ceiling/panel-model.d.ts.map +1 -0
  174. package/dist/ceiling/panel-model.js +49 -0
  175. package/dist/ceiling/panel.d.ts.map +1 -1
  176. package/dist/ceiling/panel.js +82 -18
  177. package/dist/ceiling/renderer.d.ts.map +1 -1
  178. package/dist/ceiling/renderer.js +10 -4
  179. package/dist/ceiling/tool.d.ts.map +1 -1
  180. package/dist/ceiling/tool.js +24 -4
  181. package/dist/chimney/definition.d.ts +186 -17
  182. package/dist/chimney/definition.d.ts.map +1 -1
  183. package/dist/chimney/definition.edit.d.ts +4 -0
  184. package/dist/chimney/definition.edit.d.ts.map +1 -0
  185. package/dist/chimney/definition.edit.js +219 -0
  186. package/dist/chimney/definition.js +4 -390
  187. package/dist/chimney/definition.render.d.ts +6 -0
  188. package/dist/chimney/definition.render.d.ts.map +1 -0
  189. package/dist/chimney/definition.render.js +59 -0
  190. package/dist/chimney/move-tool.d.ts.map +1 -1
  191. package/dist/chimney/move-tool.js +6 -4
  192. package/dist/chimney/panel.d.ts.map +1 -1
  193. package/dist/chimney/panel.js +113 -41
  194. package/dist/column/__bench__/geometry.d.ts +2 -0
  195. package/dist/column/__bench__/geometry.d.ts.map +1 -0
  196. package/dist/column/__bench__/geometry.js +36 -0
  197. package/dist/column/bounds.d.ts +7 -0
  198. package/dist/column/bounds.d.ts.map +1 -0
  199. package/dist/column/bounds.js +127 -0
  200. package/dist/column/definition.d.ts +372 -20
  201. package/dist/column/definition.d.ts.map +1 -1
  202. package/dist/column/definition.edit.d.ts +4 -0
  203. package/dist/column/definition.edit.d.ts.map +1 -0
  204. package/dist/column/definition.edit.js +323 -0
  205. package/dist/column/definition.js +4 -436
  206. package/dist/column/definition.render.d.ts +6 -0
  207. package/dist/column/definition.render.d.ts.map +1 -0
  208. package/dist/column/definition.render.js +81 -0
  209. package/dist/column/edit-policy.d.ts +5 -0
  210. package/dist/column/edit-policy.d.ts.map +1 -0
  211. package/dist/column/edit-policy.js +43 -0
  212. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  213. package/dist/column/floorplan-affordances.js +2 -0
  214. package/dist/column/floorplan-move.d.ts.map +1 -1
  215. package/dist/column/floorplan-move.js +5 -1
  216. package/dist/column/floorplan.d.ts.map +1 -1
  217. package/dist/column/floorplan.js +50 -91
  218. package/dist/column/geometry.d.ts +13 -0
  219. package/dist/column/geometry.d.ts.map +1 -0
  220. package/dist/column/geometry.js +294 -0
  221. package/dist/column/hosted-resize.d.ts +31 -3
  222. package/dist/column/hosted-resize.d.ts.map +1 -1
  223. package/dist/column/hosted-resize.js +7 -1
  224. package/dist/column/inspector-highlight.d.ts +29 -0
  225. package/dist/column/inspector-highlight.d.ts.map +1 -0
  226. package/dist/column/inspector-highlight.js +166 -0
  227. package/dist/column/paint.d.ts.map +1 -1
  228. package/dist/column/paint.js +12 -2
  229. package/dist/column/panel.d.ts.map +1 -1
  230. package/dist/column/panel.js +459 -283
  231. package/dist/column/parametrics.js +1 -1
  232. package/dist/column/post-options.d.ts +10 -0
  233. package/dist/column/post-options.d.ts.map +1 -0
  234. package/dist/column/post-options.js +71 -0
  235. package/dist/column/post-placement.d.ts +78 -0
  236. package/dist/column/post-placement.d.ts.map +1 -0
  237. package/dist/column/post-placement.js +157 -0
  238. package/dist/column/post-section.d.ts +17 -0
  239. package/dist/column/post-section.d.ts.map +1 -0
  240. package/dist/column/post-section.js +95 -0
  241. package/dist/column/post-tool.d.ts +11 -0
  242. package/dist/column/post-tool.d.ts.map +1 -0
  243. package/dist/column/post-tool.js +94 -0
  244. package/dist/column/preset-gallery.d.ts +8 -0
  245. package/dist/column/preset-gallery.d.ts.map +1 -0
  246. package/dist/column/preset-gallery.js +98 -0
  247. package/dist/column/presets.d.ts +16 -0
  248. package/dist/column/presets.d.ts.map +1 -0
  249. package/dist/column/presets.js +96 -0
  250. package/dist/column/property-preview.d.ts +8 -0
  251. package/dist/column/property-preview.d.ts.map +1 -0
  252. package/dist/column/property-preview.js +50 -0
  253. package/dist/column/renderer.d.ts +13 -1
  254. package/dist/column/renderer.d.ts.map +1 -1
  255. package/dist/column/renderer.js +174 -198
  256. package/dist/column/shape.d.ts +4 -4
  257. package/dist/column/shape.d.ts.map +1 -1
  258. package/dist/column/shape.js +1 -1
  259. package/dist/column/surface.d.ts.map +1 -1
  260. package/dist/column/surface.js +15 -8
  261. package/dist/column/tool.d.ts +3 -10
  262. package/dist/column/tool.d.ts.map +1 -1
  263. package/dist/column/tool.js +34 -11
  264. package/dist/construction-dimension/definition.d.ts +129 -3
  265. package/dist/construction-dimension/definition.d.ts.map +1 -1
  266. package/dist/construction-dimension/definition.edit.d.ts +4 -0
  267. package/dist/construction-dimension/definition.edit.d.ts.map +1 -0
  268. package/dist/construction-dimension/definition.edit.js +32 -0
  269. package/dist/construction-dimension/definition.js +4 -83
  270. package/dist/construction-dimension/definition.render.d.ts +6 -0
  271. package/dist/construction-dimension/definition.render.d.ts.map +1 -0
  272. package/dist/construction-dimension/definition.render.js +53 -0
  273. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -1
  274. package/dist/construction-dimension/floorplan-tool.js +2 -2
  275. package/dist/cupola/definition.d.ts +95 -10
  276. package/dist/cupola/definition.d.ts.map +1 -1
  277. package/dist/cupola/definition.edit.d.ts +4 -0
  278. package/dist/cupola/definition.edit.d.ts.map +1 -0
  279. package/dist/cupola/definition.edit.js +103 -0
  280. package/dist/cupola/definition.js +4 -148
  281. package/dist/cupola/definition.render.d.ts +6 -0
  282. package/dist/cupola/definition.render.d.ts.map +1 -0
  283. package/dist/cupola/definition.render.js +43 -0
  284. package/dist/cupola/move-tool.d.ts.map +1 -1
  285. package/dist/cupola/move-tool.js +6 -5
  286. package/dist/cupola/panel.d.ts.map +1 -1
  287. package/dist/cupola/panel.js +14 -7
  288. package/dist/definition-contributions.d.ts +14 -0
  289. package/dist/definition-contributions.d.ts.map +1 -0
  290. package/dist/definition-contributions.js +8 -0
  291. package/dist/door/actions.d.ts +7 -0
  292. package/dist/door/actions.d.ts.map +1 -0
  293. package/dist/door/actions.js +32 -0
  294. package/dist/door/contextual-dimensions.d.ts.map +1 -1
  295. package/dist/door/contextual-dimensions.js +11 -1
  296. package/dist/door/definition.d.ts +350 -22
  297. package/dist/door/definition.d.ts.map +1 -1
  298. package/dist/door/definition.edit.d.ts +4 -0
  299. package/dist/door/definition.edit.d.ts.map +1 -0
  300. package/dist/door/definition.edit.js +246 -0
  301. package/dist/door/definition.js +4 -314
  302. package/dist/door/definition.render.d.ts +6 -0
  303. package/dist/door/definition.render.d.ts.map +1 -0
  304. package/dist/door/definition.render.js +88 -0
  305. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  306. package/dist/door/floorplan-affordances.js +5 -2
  307. package/dist/door/floorplan-move.d.ts.map +1 -1
  308. package/dist/door/floorplan-move.js +34 -9
  309. package/dist/door/floorplan.d.ts +2 -0
  310. package/dist/door/floorplan.d.ts.map +1 -1
  311. package/dist/door/floorplan.js +89 -16
  312. package/dist/door/mechanism.d.ts.map +1 -1
  313. package/dist/door/mechanism.js +1 -2
  314. package/dist/door/move-tool.d.ts.map +1 -1
  315. package/dist/door/move-tool.js +81 -35
  316. package/dist/door/paint.d.ts +2 -7
  317. package/dist/door/paint.d.ts.map +1 -1
  318. package/dist/door/paint.js +26 -2
  319. package/dist/door/panel.d.ts.map +1 -1
  320. package/dist/door/panel.js +242 -90
  321. package/dist/door/parametrics.js +1 -1
  322. package/dist/door/placement.d.ts.map +1 -1
  323. package/dist/door/placement.js +9 -2
  324. package/dist/door/swing.d.ts +22 -0
  325. package/dist/door/swing.d.ts.map +1 -0
  326. package/dist/door/swing.js +36 -0
  327. package/dist/door/tool.d.ts.map +1 -1
  328. package/dist/door/tool.js +77 -29
  329. package/dist/dormer/definition.d.ts +240 -11
  330. package/dist/dormer/definition.d.ts.map +1 -1
  331. package/dist/dormer/definition.edit.d.ts +4 -0
  332. package/dist/dormer/definition.edit.d.ts.map +1 -0
  333. package/dist/dormer/definition.edit.js +214 -0
  334. package/dist/dormer/definition.js +4 -319
  335. package/dist/dormer/definition.render.d.ts +6 -0
  336. package/dist/dormer/definition.render.d.ts.map +1 -0
  337. package/dist/dormer/definition.render.js +52 -0
  338. package/dist/dormer/panel-actions-section.d.ts.map +1 -1
  339. package/dist/dormer/panel-actions-section.js +3 -1
  340. package/dist/dormer/panel-position-section.d.ts.map +1 -1
  341. package/dist/dormer/panel-position-section.js +4 -3
  342. package/dist/dormer/panel-windows-section.d.ts.map +1 -1
  343. package/dist/dormer/panel-windows-section.js +38 -1
  344. package/dist/dormer/panel.d.ts.map +1 -1
  345. package/dist/dormer/panel.js +24 -18
  346. package/dist/downspout/definition.d.ts +108 -16
  347. package/dist/downspout/definition.d.ts.map +1 -1
  348. package/dist/downspout/definition.edit.d.ts +4 -0
  349. package/dist/downspout/definition.edit.d.ts.map +1 -0
  350. package/dist/downspout/definition.edit.js +134 -0
  351. package/dist/downspout/definition.js +4 -188
  352. package/dist/downspout/definition.render.d.ts +6 -0
  353. package/dist/downspout/definition.render.d.ts.map +1 -0
  354. package/dist/downspout/definition.render.js +46 -0
  355. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  356. package/dist/downspout/inspector-editors.js +3 -2
  357. package/dist/duct-fitting/definition.d.ts +99 -11
  358. package/dist/duct-fitting/definition.d.ts.map +1 -1
  359. package/dist/duct-fitting/definition.edit.d.ts +4 -0
  360. package/dist/duct-fitting/definition.edit.d.ts.map +1 -0
  361. package/dist/duct-fitting/definition.edit.js +49 -0
  362. package/dist/duct-fitting/definition.js +4 -135
  363. package/dist/duct-fitting/definition.render.d.ts +6 -0
  364. package/dist/duct-fitting/definition.render.d.ts.map +1 -0
  365. package/dist/duct-fitting/definition.render.js +82 -0
  366. package/dist/duct-fitting/floorplan.js +1 -1
  367. package/dist/duct-fitting/geometry.js +2 -1
  368. package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
  369. package/dist/duct-fitting/inspector-editors.js +6 -1
  370. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  371. package/dist/duct-fitting/move-tool.js +19 -13
  372. package/dist/duct-fitting/selection.d.ts.map +1 -1
  373. package/dist/duct-fitting/selection.js +92 -80
  374. package/dist/duct-fitting/tool.d.ts.map +1 -1
  375. package/dist/duct-fitting/tool.js +11 -2
  376. package/dist/duct-segment/continuation.d.ts +2 -2
  377. package/dist/duct-segment/continuation.d.ts.map +1 -1
  378. package/dist/duct-segment/continuation.js +53 -2
  379. package/dist/duct-segment/definition.d.ts +91 -3
  380. package/dist/duct-segment/definition.d.ts.map +1 -1
  381. package/dist/duct-segment/definition.edit.d.ts +4 -0
  382. package/dist/duct-segment/definition.edit.d.ts.map +1 -0
  383. package/dist/duct-segment/definition.edit.js +100 -0
  384. package/dist/duct-segment/definition.js +4 -181
  385. package/dist/duct-segment/definition.render.d.ts +6 -0
  386. package/dist/duct-segment/definition.render.d.ts.map +1 -0
  387. package/dist/duct-segment/definition.render.js +89 -0
  388. package/dist/duct-segment/edit-inspector.d.ts +5 -0
  389. package/dist/duct-segment/edit-inspector.d.ts.map +1 -0
  390. package/dist/duct-segment/edit-inspector.js +163 -0
  391. package/dist/duct-segment/edit-operation.d.ts +17 -0
  392. package/dist/duct-segment/edit-operation.d.ts.map +1 -0
  393. package/dist/duct-segment/edit-operation.js +283 -0
  394. package/dist/duct-segment/floorplan.js +1 -1
  395. package/dist/duct-segment/geometry.d.ts +0 -40
  396. package/dist/duct-segment/geometry.d.ts.map +1 -1
  397. package/dist/duct-segment/geometry.js +2 -77
  398. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  399. package/dist/duct-segment/move-tool.js +34 -35
  400. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  401. package/dist/duct-segment/parametrics.js +2 -35
  402. package/dist/duct-segment/profile.d.ts +42 -0
  403. package/dist/duct-segment/profile.d.ts.map +1 -0
  404. package/dist/duct-segment/profile.js +78 -0
  405. package/dist/duct-segment/selection.d.ts.map +1 -1
  406. package/dist/duct-segment/selection.js +112 -53
  407. package/dist/duct-segment/tool.d.ts.map +1 -1
  408. package/dist/duct-segment/tool.js +103 -27
  409. package/dist/duct-terminal/definition.d.ts +68 -12
  410. package/dist/duct-terminal/definition.d.ts.map +1 -1
  411. package/dist/duct-terminal/definition.edit.d.ts +4 -0
  412. package/dist/duct-terminal/definition.edit.d.ts.map +1 -0
  413. package/dist/duct-terminal/definition.edit.js +14 -0
  414. package/dist/duct-terminal/definition.js +4 -87
  415. package/dist/duct-terminal/definition.render.d.ts +6 -0
  416. package/dist/duct-terminal/definition.render.d.ts.map +1 -0
  417. package/dist/duct-terminal/definition.render.js +66 -0
  418. package/dist/duct-terminal/geometry.d.ts.map +1 -1
  419. package/dist/duct-terminal/geometry.js +2 -1
  420. package/dist/duct-terminal/parametrics.d.ts.map +1 -1
  421. package/dist/duct-terminal/parametrics.js +1 -0
  422. package/dist/duct-terminal/ports.js +1 -1
  423. package/dist/duct-terminal/tool.d.ts.map +1 -1
  424. package/dist/duct-terminal/tool.js +11 -2
  425. package/dist/elevator/__bench__/runtime.d.ts +2 -0
  426. package/dist/elevator/__bench__/runtime.d.ts.map +1 -0
  427. package/dist/elevator/__bench__/runtime.js +38 -0
  428. package/dist/elevator/definition.d.ts +117 -10
  429. package/dist/elevator/definition.d.ts.map +1 -1
  430. package/dist/elevator/definition.edit.d.ts +4 -0
  431. package/dist/elevator/definition.edit.d.ts.map +1 -0
  432. package/dist/elevator/definition.edit.js +177 -0
  433. package/dist/elevator/definition.js +4 -258
  434. package/dist/elevator/definition.render.d.ts +11 -0
  435. package/dist/elevator/definition.render.d.ts.map +1 -0
  436. package/dist/elevator/definition.render.js +96 -0
  437. package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
  438. package/dist/elevator/floorplan-affordances.js +11 -9
  439. package/dist/elevator/floorplan.d.ts +19 -0
  440. package/dist/elevator/floorplan.d.ts.map +1 -1
  441. package/dist/elevator/floorplan.js +3 -9
  442. package/dist/elevator/inspection.d.ts +17 -0
  443. package/dist/elevator/inspection.d.ts.map +1 -0
  444. package/dist/elevator/inspection.js +78 -0
  445. package/dist/elevator/panel.d.ts.map +1 -1
  446. package/dist/elevator/panel.js +177 -102
  447. package/dist/elevator/parametrics.d.ts +1 -1
  448. package/dist/elevator/parametrics.d.ts.map +1 -1
  449. package/dist/elevator/parametrics.js +7 -10
  450. package/dist/elevator/presets.d.ts +17 -0
  451. package/dist/elevator/presets.d.ts.map +1 -0
  452. package/dist/elevator/presets.js +52 -0
  453. package/dist/elevator/renderer.d.ts +2 -1
  454. package/dist/elevator/renderer.d.ts.map +1 -1
  455. package/dist/elevator/renderer.edit.d.ts +5 -0
  456. package/dist/elevator/renderer.edit.d.ts.map +1 -0
  457. package/dist/elevator/renderer.edit.js +8 -0
  458. package/dist/elevator/renderer.js +159 -60
  459. package/dist/elevator/tool.d.ts +2 -0
  460. package/dist/elevator/tool.d.ts.map +1 -0
  461. package/dist/elevator/tool.js +250 -0
  462. package/dist/eyebrow-vent/definition.d.ts +97 -11
  463. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  464. package/dist/eyebrow-vent/definition.edit.d.ts +4 -0
  465. package/dist/eyebrow-vent/definition.edit.d.ts.map +1 -0
  466. package/dist/eyebrow-vent/definition.edit.js +106 -0
  467. package/dist/eyebrow-vent/definition.js +4 -152
  468. package/dist/eyebrow-vent/definition.render.d.ts +6 -0
  469. package/dist/eyebrow-vent/definition.render.d.ts.map +1 -0
  470. package/dist/eyebrow-vent/definition.render.js +43 -0
  471. package/dist/eyebrow-vent/move-tool.d.ts.map +1 -1
  472. package/dist/eyebrow-vent/move-tool.js +6 -5
  473. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  474. package/dist/eyebrow-vent/panel.js +16 -6
  475. package/dist/fence/definition.d.ts +186 -17
  476. package/dist/fence/definition.d.ts.map +1 -1
  477. package/dist/fence/definition.edit.d.ts +4 -0
  478. package/dist/fence/definition.edit.d.ts.map +1 -0
  479. package/dist/fence/definition.edit.js +282 -0
  480. package/dist/fence/definition.js +5 -413
  481. package/dist/fence/definition.render.d.ts +8 -0
  482. package/dist/fence/definition.render.d.ts.map +1 -0
  483. package/dist/fence/definition.render.js +124 -0
  484. package/dist/fence/drafting.d.ts +2 -3
  485. package/dist/fence/drafting.d.ts.map +1 -1
  486. package/dist/fence/drafting.js +2 -3
  487. package/dist/fence/inspector-editors.d.ts.map +1 -1
  488. package/dist/fence/inspector-editors.js +64 -21
  489. package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
  490. package/dist/fence/move-endpoint-tool.js +12 -3
  491. package/dist/fence/system.d.ts.map +1 -1
  492. package/dist/fence/system.js +13 -0
  493. package/dist/fence/tool.js +2 -2
  494. package/dist/fence-feature/actions.d.ts.map +1 -1
  495. package/dist/fence-feature/actions.js +5 -2
  496. package/dist/fence-feature/definition.d.ts +270 -3
  497. package/dist/fence-feature/definition.d.ts.map +1 -1
  498. package/dist/fence-feature/definition.edit.d.ts +5 -0
  499. package/dist/fence-feature/definition.edit.d.ts.map +1 -0
  500. package/dist/fence-feature/definition.edit.js +69 -0
  501. package/dist/fence-feature/definition.js +5 -116
  502. package/dist/fence-feature/definition.render.d.ts +9 -0
  503. package/dist/fence-feature/definition.render.d.ts.map +1 -0
  504. package/dist/fence-feature/definition.render.js +69 -0
  505. package/dist/fence-feature/inspector.d.ts.map +1 -1
  506. package/dist/fence-feature/inspector.js +150 -34
  507. package/dist/fence-feature/move-session.d.ts +1 -1
  508. package/dist/floor-opening/definition.d.ts +58 -2
  509. package/dist/floor-opening/definition.d.ts.map +1 -1
  510. package/dist/floor-opening/definition.edit.d.ts +4 -0
  511. package/dist/floor-opening/definition.edit.d.ts.map +1 -0
  512. package/dist/floor-opening/definition.edit.js +11 -0
  513. package/dist/floor-opening/definition.js +4 -41
  514. package/dist/floor-opening/definition.render.d.ts +6 -0
  515. package/dist/floor-opening/definition.render.d.ts.map +1 -0
  516. package/dist/floor-opening/definition.render.js +32 -0
  517. package/dist/floor-opening/floorplan.d.ts +29 -6
  518. package/dist/floor-opening/floorplan.d.ts.map +1 -1
  519. package/dist/floor-opening/floorplan.js +172 -14
  520. package/dist/guide/definition.d.ts +65 -9
  521. package/dist/guide/definition.d.ts.map +1 -1
  522. package/dist/guide/definition.edit.d.ts +4 -0
  523. package/dist/guide/definition.edit.d.ts.map +1 -0
  524. package/dist/guide/definition.edit.js +4 -0
  525. package/dist/guide/definition.js +4 -53
  526. package/dist/guide/definition.render.d.ts +6 -0
  527. package/dist/guide/definition.render.d.ts.map +1 -0
  528. package/dist/guide/definition.render.js +45 -0
  529. package/dist/gutter/definition.d.ts +113 -18
  530. package/dist/gutter/definition.d.ts.map +1 -1
  531. package/dist/gutter/definition.edit.d.ts +4 -0
  532. package/dist/gutter/definition.edit.d.ts.map +1 -0
  533. package/dist/gutter/definition.edit.js +121 -0
  534. package/dist/gutter/definition.js +4 -176
  535. package/dist/gutter/definition.render.d.ts +6 -0
  536. package/dist/gutter/definition.render.d.ts.map +1 -0
  537. package/dist/gutter/definition.render.js +44 -0
  538. package/dist/gutter/downspouts-panel.d.ts.map +1 -1
  539. package/dist/gutter/downspouts-panel.js +14 -2
  540. package/dist/gutter/move-tool.d.ts.map +1 -1
  541. package/dist/gutter/move-tool.js +5 -4
  542. package/dist/hvac-equipment/definition.d.ts +72 -12
  543. package/dist/hvac-equipment/definition.d.ts.map +1 -1
  544. package/dist/hvac-equipment/definition.edit.d.ts +4 -0
  545. package/dist/hvac-equipment/definition.edit.d.ts.map +1 -0
  546. package/dist/hvac-equipment/definition.edit.js +13 -0
  547. package/dist/hvac-equipment/definition.js +4 -92
  548. package/dist/hvac-equipment/definition.render.d.ts +6 -0
  549. package/dist/hvac-equipment/definition.render.d.ts.map +1 -0
  550. package/dist/hvac-equipment/definition.render.js +72 -0
  551. package/dist/hvac-equipment/floorplan.js +1 -1
  552. package/dist/hvac-equipment/geometry.d.ts.map +1 -1
  553. package/dist/hvac-equipment/geometry.js +2 -1
  554. package/dist/hvac-equipment/parametrics.d.ts.map +1 -1
  555. package/dist/hvac-equipment/parametrics.js +1 -0
  556. package/dist/hvac-equipment/ports.js +1 -1
  557. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  558. package/dist/hvac-equipment/tool.js +3 -2
  559. package/dist/i18n/definition-messages.d.ts +5 -0
  560. package/dist/i18n/definition-messages.d.ts.map +1 -0
  561. package/dist/i18n/definition-messages.js +771 -0
  562. package/dist/imported-mesh/definition.d.ts +54 -4
  563. package/dist/imported-mesh/definition.d.ts.map +1 -1
  564. package/dist/imported-mesh/definition.edit.d.ts +4 -0
  565. package/dist/imported-mesh/definition.edit.d.ts.map +1 -0
  566. package/dist/imported-mesh/definition.edit.js +5 -0
  567. package/dist/imported-mesh/definition.js +4 -40
  568. package/dist/imported-mesh/definition.render.d.ts +6 -0
  569. package/dist/imported-mesh/definition.render.d.ts.map +1 -0
  570. package/dist/imported-mesh/definition.render.js +36 -0
  571. package/dist/index.d.ts +7 -17
  572. package/dist/index.d.ts.map +1 -1
  573. package/dist/index.js +13 -135
  574. package/dist/item/authored-params.d.ts.map +1 -1
  575. package/dist/item/authored-params.js +19 -4
  576. package/dist/item/definition.d.ts +280 -31
  577. package/dist/item/definition.d.ts.map +1 -1
  578. package/dist/item/definition.edit.d.ts +4 -0
  579. package/dist/item/definition.edit.d.ts.map +1 -0
  580. package/dist/item/definition.edit.js +206 -0
  581. package/dist/item/definition.js +4 -356
  582. package/dist/item/definition.render.d.ts +6 -0
  583. package/dist/item/definition.render.d.ts.map +1 -0
  584. package/dist/item/definition.render.js +128 -0
  585. package/dist/item/floorplan.d.ts +1 -1
  586. package/dist/item/floorplan.d.ts.map +1 -1
  587. package/dist/item/floorplan.js +2 -2
  588. package/dist/item/panel.d.ts.map +1 -1
  589. package/dist/item/panel.js +9 -7
  590. package/dist/item/renderer.d.ts.map +1 -1
  591. package/dist/item/renderer.js +2 -2
  592. package/dist/lean-to-extension/definition.d.ts +177 -3
  593. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  594. package/dist/lean-to-extension/definition.edit.d.ts +4 -0
  595. package/dist/lean-to-extension/definition.edit.d.ts.map +1 -0
  596. package/dist/lean-to-extension/definition.edit.js +392 -0
  597. package/dist/lean-to-extension/definition.js +4 -433
  598. package/dist/lean-to-extension/definition.render.d.ts +6 -0
  599. package/dist/lean-to-extension/definition.render.d.ts.map +1 -0
  600. package/dist/lean-to-extension/definition.render.js +46 -0
  601. package/dist/level/definition.d.ts +49 -8
  602. package/dist/level/definition.d.ts.map +1 -1
  603. package/dist/level/definition.edit.d.ts +4 -0
  604. package/dist/level/definition.edit.d.ts.map +1 -0
  605. package/dist/level/definition.edit.js +4 -0
  606. package/dist/level/definition.js +4 -60
  607. package/dist/level/definition.render.d.ts +6 -0
  608. package/dist/level/definition.render.d.ts.map +1 -0
  609. package/dist/level/definition.render.js +53 -0
  610. package/dist/lineset/definition.d.ts +49 -14
  611. package/dist/lineset/definition.d.ts.map +1 -1
  612. package/dist/lineset/definition.edit.d.ts +4 -0
  613. package/dist/lineset/definition.edit.d.ts.map +1 -0
  614. package/dist/lineset/definition.edit.js +38 -0
  615. package/dist/lineset/definition.js +4 -119
  616. package/dist/lineset/definition.render.d.ts +6 -0
  617. package/dist/lineset/definition.render.d.ts.map +1 -0
  618. package/dist/lineset/definition.render.js +72 -0
  619. package/dist/lineset/floorplan.js +1 -1
  620. package/dist/lineset/geometry.js +1 -1
  621. package/dist/lineset/move-tool.d.ts.map +1 -1
  622. package/dist/lineset/move-tool.js +14 -7
  623. package/dist/liquid-line/definition.d.ts +47 -15
  624. package/dist/liquid-line/definition.d.ts.map +1 -1
  625. package/dist/liquid-line/definition.edit.d.ts +4 -0
  626. package/dist/liquid-line/definition.edit.d.ts.map +1 -0
  627. package/dist/liquid-line/definition.edit.js +31 -0
  628. package/dist/liquid-line/definition.js +4 -111
  629. package/dist/liquid-line/definition.render.d.ts +6 -0
  630. package/dist/liquid-line/definition.render.d.ts.map +1 -0
  631. package/dist/liquid-line/definition.render.js +70 -0
  632. package/dist/liquid-line/floorplan.js +1 -1
  633. package/dist/liquid-line/geometry.js +1 -1
  634. package/dist/liquid-line/tool.d.ts.map +1 -1
  635. package/dist/liquid-line/tool.js +10 -3
  636. package/dist/measurement/definition.d.ts +126 -3
  637. package/dist/measurement/definition.d.ts.map +1 -1
  638. package/dist/measurement/definition.edit.d.ts +4 -0
  639. package/dist/measurement/definition.edit.d.ts.map +1 -0
  640. package/dist/measurement/definition.edit.js +26 -0
  641. package/dist/measurement/definition.js +4 -67
  642. package/dist/measurement/definition.render.d.ts +6 -0
  643. package/dist/measurement/definition.render.d.ts.map +1 -0
  644. package/dist/measurement/definition.render.js +43 -0
  645. package/dist/measurement/floorplan.d.ts.map +1 -1
  646. package/dist/measurement/floorplan.js +3 -2
  647. package/dist/measurement/renderer.d.ts.map +1 -1
  648. package/dist/measurement/renderer.js +2 -3
  649. package/dist/measurement/selection.d.ts.map +1 -1
  650. package/dist/measurement/selection.js +2 -2
  651. package/dist/measurement/tool.d.ts +3 -3
  652. package/dist/measurement/tool.d.ts.map +1 -1
  653. package/dist/measurement/tool.js +9 -9
  654. package/dist/pipe-fitting/definition.d.ts +73 -9
  655. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  656. package/dist/pipe-fitting/definition.edit.d.ts +4 -0
  657. package/dist/pipe-fitting/definition.edit.d.ts.map +1 -0
  658. package/dist/pipe-fitting/definition.edit.js +47 -0
  659. package/dist/pipe-fitting/definition.js +4 -105
  660. package/dist/pipe-fitting/definition.render.d.ts +6 -0
  661. package/dist/pipe-fitting/definition.render.d.ts.map +1 -0
  662. package/dist/pipe-fitting/definition.render.js +54 -0
  663. package/dist/pipe-fitting/floorplan.js +1 -1
  664. package/dist/pipe-fitting/geometry.js +1 -1
  665. package/dist/pipe-fitting/move-tool.d.ts +1 -1
  666. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  667. package/dist/pipe-fitting/move-tool.js +28 -22
  668. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  669. package/dist/pipe-fitting/parametrics.js +1 -0
  670. package/dist/pipe-fitting/ports.js +1 -1
  671. package/dist/pipe-fitting/selection.d.ts.map +1 -1
  672. package/dist/pipe-fitting/selection.js +73 -29
  673. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  674. package/dist/pipe-fitting/tool.js +3 -2
  675. package/dist/pipe-segment/collar-connection.d.ts +12 -0
  676. package/dist/pipe-segment/collar-connection.d.ts.map +1 -0
  677. package/dist/pipe-segment/collar-connection.js +58 -0
  678. package/dist/pipe-segment/connect-operation.d.ts +9 -0
  679. package/dist/pipe-segment/connect-operation.d.ts.map +1 -0
  680. package/dist/pipe-segment/connect-operation.js +44 -0
  681. package/dist/pipe-segment/continuation.d.ts +3 -2
  682. package/dist/pipe-segment/continuation.d.ts.map +1 -1
  683. package/dist/pipe-segment/continuation.js +60 -1
  684. package/dist/pipe-segment/definition.d.ts +78 -13
  685. package/dist/pipe-segment/definition.d.ts.map +1 -1
  686. package/dist/pipe-segment/definition.edit.d.ts +4 -0
  687. package/dist/pipe-segment/definition.edit.d.ts.map +1 -0
  688. package/dist/pipe-segment/definition.edit.js +48 -0
  689. package/dist/pipe-segment/definition.js +4 -132
  690. package/dist/pipe-segment/definition.render.d.ts +6 -0
  691. package/dist/pipe-segment/definition.render.d.ts.map +1 -0
  692. package/dist/pipe-segment/definition.render.js +78 -0
  693. package/dist/pipe-segment/floorplan.d.ts +1 -1
  694. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  695. package/dist/pipe-segment/floorplan.js +34 -1
  696. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  697. package/dist/pipe-segment/geometry.js +2 -1
  698. package/dist/pipe-segment/grade-affordance.d.ts +8 -0
  699. package/dist/pipe-segment/grade-affordance.d.ts.map +1 -0
  700. package/dist/pipe-segment/grade-affordance.js +116 -0
  701. package/dist/pipe-segment/grade-inspector.d.ts +5 -0
  702. package/dist/pipe-segment/grade-inspector.d.ts.map +1 -0
  703. package/dist/pipe-segment/grade-inspector.js +91 -0
  704. package/dist/pipe-segment/grade-label.d.ts +7 -0
  705. package/dist/pipe-segment/grade-label.d.ts.map +1 -0
  706. package/dist/pipe-segment/grade-label.js +32 -0
  707. package/dist/pipe-segment/grade-operation.d.ts +22 -0
  708. package/dist/pipe-segment/grade-operation.d.ts.map +1 -0
  709. package/dist/pipe-segment/grade-operation.js +114 -0
  710. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  711. package/dist/pipe-segment/move-tool.js +38 -15
  712. package/dist/pipe-segment/offset-inspector.d.ts +5 -0
  713. package/dist/pipe-segment/offset-inspector.d.ts.map +1 -0
  714. package/dist/pipe-segment/offset-inspector.js +112 -0
  715. package/dist/pipe-segment/offset-operation.d.ts +9 -0
  716. package/dist/pipe-segment/offset-operation.d.ts.map +1 -0
  717. package/dist/pipe-segment/offset-operation.js +104 -0
  718. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  719. package/dist/pipe-segment/parametrics.js +1 -9
  720. package/dist/pipe-segment/resize-inspector.d.ts +5 -0
  721. package/dist/pipe-segment/resize-inspector.d.ts.map +1 -0
  722. package/dist/pipe-segment/resize-inspector.js +75 -0
  723. package/dist/pipe-segment/resize-operation.d.ts +8 -0
  724. package/dist/pipe-segment/resize-operation.d.ts.map +1 -0
  725. package/dist/pipe-segment/resize-operation.js +143 -0
  726. package/dist/pipe-segment/run-move.d.ts +65 -0
  727. package/dist/pipe-segment/run-move.d.ts.map +1 -0
  728. package/dist/pipe-segment/run-move.js +110 -0
  729. package/dist/pipe-segment/selection.d.ts.map +1 -1
  730. package/dist/pipe-segment/selection.js +122 -178
  731. package/dist/pipe-segment/slope.d.ts +3 -0
  732. package/dist/pipe-segment/slope.d.ts.map +1 -1
  733. package/dist/pipe-segment/slope.js +47 -0
  734. package/dist/pipe-segment/tool.d.ts.map +1 -1
  735. package/dist/pipe-segment/tool.js +123 -28
  736. package/dist/pipe-trap/definition.d.ts +54 -9
  737. package/dist/pipe-trap/definition.d.ts.map +1 -1
  738. package/dist/pipe-trap/definition.edit.d.ts +4 -0
  739. package/dist/pipe-trap/definition.edit.d.ts.map +1 -0
  740. package/dist/pipe-trap/definition.edit.js +13 -0
  741. package/dist/pipe-trap/definition.js +4 -59
  742. package/dist/pipe-trap/definition.render.d.ts +6 -0
  743. package/dist/pipe-trap/definition.render.d.ts.map +1 -0
  744. package/dist/pipe-trap/definition.render.js +43 -0
  745. package/dist/pipe-trap/geometry.d.ts.map +1 -1
  746. package/dist/pipe-trap/geometry.js +2 -1
  747. package/dist/pipe-trap/parametrics.d.ts.map +1 -1
  748. package/dist/pipe-trap/parametrics.js +1 -0
  749. package/dist/pipe-trap/tool.d.ts.map +1 -1
  750. package/dist/pipe-trap/tool.js +7 -2
  751. package/dist/procedural-item/definition.d.ts +734 -3
  752. package/dist/procedural-item/definition.d.ts.map +1 -1
  753. package/dist/procedural-item/definition.edit.d.ts +4 -0
  754. package/dist/procedural-item/definition.edit.d.ts.map +1 -0
  755. package/dist/procedural-item/definition.edit.js +255 -0
  756. package/dist/procedural-item/definition.js +4 -325
  757. package/dist/procedural-item/definition.render.d.ts +6 -0
  758. package/dist/procedural-item/definition.render.d.ts.map +1 -0
  759. package/dist/procedural-item/definition.render.js +84 -0
  760. package/dist/procedural-item/renderer.d.ts.map +1 -1
  761. package/dist/procedural-item/renderer.edit.d.ts +5 -0
  762. package/dist/procedural-item/renderer.edit.d.ts.map +1 -0
  763. package/dist/procedural-item/renderer.edit.js +49 -0
  764. package/dist/procedural-item/renderer.js +12 -22
  765. package/dist/render.d.ts +4 -0
  766. package/dist/render.d.ts.map +1 -0
  767. package/dist/render.js +4 -0
  768. package/dist/ridge-vent/definition.d.ts +95 -15
  769. package/dist/ridge-vent/definition.d.ts.map +1 -1
  770. package/dist/ridge-vent/definition.edit.d.ts +4 -0
  771. package/dist/ridge-vent/definition.edit.d.ts.map +1 -0
  772. package/dist/ridge-vent/definition.edit.js +148 -0
  773. package/dist/ridge-vent/definition.js +4 -197
  774. package/dist/ridge-vent/definition.render.d.ts +6 -0
  775. package/dist/ridge-vent/definition.render.d.ts.map +1 -0
  776. package/dist/ridge-vent/definition.render.js +42 -0
  777. package/dist/ridge-vent/move-tool.d.ts.map +1 -1
  778. package/dist/ridge-vent/move-tool.js +5 -4
  779. package/dist/ridge-vent/panel.d.ts.map +1 -1
  780. package/dist/ridge-vent/panel.js +22 -9
  781. package/dist/roof/barrel-panel.d.ts.map +1 -1
  782. package/dist/roof/barrel-panel.js +8 -4
  783. package/dist/roof/definition.d.ts +325 -8
  784. package/dist/roof/definition.d.ts.map +1 -1
  785. package/dist/roof/definition.edit.d.ts +4 -0
  786. package/dist/roof/definition.edit.d.ts.map +1 -0
  787. package/dist/roof/definition.edit.js +183 -0
  788. package/dist/roof/definition.js +4 -254
  789. package/dist/roof/definition.render.d.ts +7 -0
  790. package/dist/roof/definition.render.d.ts.map +1 -0
  791. package/dist/roof/definition.render.js +101 -0
  792. package/dist/roof/floorplan-overrides.d.ts +22 -0
  793. package/dist/roof/floorplan-overrides.d.ts.map +1 -0
  794. package/dist/roof/floorplan-overrides.js +46 -0
  795. package/dist/roof/floorplan-tool.d.ts +9 -0
  796. package/dist/roof/floorplan-tool.d.ts.map +1 -0
  797. package/dist/roof/floorplan-tool.js +168 -0
  798. package/dist/roof/floorplan.d.ts.map +1 -1
  799. package/dist/roof/floorplan.js +131 -41
  800. package/dist/roof/geometry-notice.d.ts +5 -0
  801. package/dist/roof/geometry-notice.d.ts.map +1 -0
  802. package/dist/roof/geometry-notice.js +27 -0
  803. package/dist/roof/glazing-controls.d.ts +2 -1
  804. package/dist/roof/glazing-controls.d.ts.map +1 -1
  805. package/dist/roof/glazing-controls.js +52 -14
  806. package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
  807. package/dist/roof/glazing-panel-editor.js +40 -13
  808. package/dist/roof/glazing-panel.d.ts.map +1 -1
  809. package/dist/roof/glazing-panel.js +73 -9
  810. package/dist/roof/paint.d.ts +19 -0
  811. package/dist/roof/paint.d.ts.map +1 -0
  812. package/dist/roof/paint.js +158 -0
  813. package/dist/roof/panel.d.ts.map +1 -1
  814. package/dist/roof/panel.js +91 -22
  815. package/dist/roof/renderer.d.ts.map +1 -1
  816. package/dist/roof/renderer.js +13 -2
  817. package/dist/roof/roof-footprint-source.d.ts +17 -0
  818. package/dist/roof/roof-footprint-source.d.ts.map +1 -1
  819. package/dist/roof/roof-footprint-source.js +14 -0
  820. package/dist/roof/roof-footprint.d.ts +36 -2
  821. package/dist/roof/roof-footprint.d.ts.map +1 -1
  822. package/dist/roof/roof-footprint.js +124 -2
  823. package/dist/roof/roof-materials.d.ts.map +1 -1
  824. package/dist/roof/roof-materials.js +10 -1
  825. package/dist/roof/roof-placement-mode.d.ts +0 -2
  826. package/dist/roof/roof-placement-mode.d.ts.map +1 -1
  827. package/dist/roof/roof-placement-mode.js +8 -6
  828. package/dist/roof/roof-plan-creases.d.ts +50 -0
  829. package/dist/roof/roof-plan-creases.d.ts.map +1 -0
  830. package/dist/roof/roof-plan-creases.js +194 -0
  831. package/dist/roof/roof-ridge-mode.d.ts +20 -0
  832. package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
  833. package/dist/roof/roof-ridge-mode.js +16 -0
  834. package/dist/roof/tool.d.ts +20 -4
  835. package/dist/roof/tool.d.ts.map +1 -1
  836. package/dist/roof/tool.js +264 -280
  837. package/dist/roof/type-thumbnail-assets.d.ts +3 -0
  838. package/dist/roof/type-thumbnail-assets.d.ts.map +1 -0
  839. package/dist/roof/type-thumbnail-assets.js +12 -0
  840. package/dist/roof/type-thumbnail.d.ts +5 -0
  841. package/dist/roof/type-thumbnail.d.ts.map +1 -0
  842. package/dist/roof/type-thumbnail.js +5 -0
  843. package/dist/roof/wall-catch.d.ts +106 -0
  844. package/dist/roof/wall-catch.d.ts.map +1 -0
  845. package/dist/roof/wall-catch.js +267 -0
  846. package/dist/roof-segment/build-up-section.d.ts +9 -0
  847. package/dist/roof-segment/build-up-section.d.ts.map +1 -0
  848. package/dist/roof-segment/build-up-section.js +191 -0
  849. package/dist/roof-segment/definition.d.ts +564 -9
  850. package/dist/roof-segment/definition.d.ts.map +1 -1
  851. package/dist/roof-segment/definition.edit.d.ts +4 -0
  852. package/dist/roof-segment/definition.edit.d.ts.map +1 -0
  853. package/dist/roof-segment/definition.edit.js +305 -0
  854. package/dist/roof-segment/definition.js +4 -319
  855. package/dist/roof-segment/definition.render.d.ts +6 -0
  856. package/dist/roof-segment/definition.render.d.ts.map +1 -0
  857. package/dist/roof-segment/definition.render.js +59 -0
  858. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  859. package/dist/roof-segment/floorplan-affordances.js +70 -21
  860. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  861. package/dist/roof-segment/floorplan.js +16 -12
  862. package/dist/roof-segment/paint.d.ts +3 -2
  863. package/dist/roof-segment/paint.d.ts.map +1 -1
  864. package/dist/roof-segment/paint.js +43 -3
  865. package/dist/roof-segment/panel-model.d.ts +23 -0
  866. package/dist/roof-segment/panel-model.d.ts.map +1 -0
  867. package/dist/roof-segment/panel-model.js +64 -0
  868. package/dist/roof-segment/panel.d.ts.map +1 -1
  869. package/dist/roof-segment/panel.js +117 -37
  870. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  871. package/dist/roof-segment/parametrics.js +17 -11
  872. package/dist/roof-segment/renderer.d.ts.map +1 -1
  873. package/dist/roof-segment/renderer.js +26 -5
  874. package/dist/roof-segment/slots.d.ts +2 -0
  875. package/dist/roof-segment/slots.d.ts.map +1 -0
  876. package/dist/roof-segment/slots.js +1 -0
  877. package/dist/scan/definition.d.ts +57 -7
  878. package/dist/scan/definition.d.ts.map +1 -1
  879. package/dist/scan/definition.edit.d.ts +4 -0
  880. package/dist/scan/definition.edit.d.ts.map +1 -0
  881. package/dist/scan/definition.edit.js +4 -0
  882. package/dist/scan/definition.js +4 -52
  883. package/dist/scan/definition.render.d.ts +6 -0
  884. package/dist/scan/definition.render.d.ts.map +1 -0
  885. package/dist/scan/definition.render.js +46 -0
  886. package/dist/separator/definition.d.ts +47 -2
  887. package/dist/separator/definition.d.ts.map +1 -1
  888. package/dist/separator/definition.edit.d.ts +4 -0
  889. package/dist/separator/definition.edit.d.ts.map +1 -0
  890. package/dist/separator/definition.edit.js +13 -0
  891. package/dist/separator/definition.js +4 -39
  892. package/dist/separator/definition.render.d.ts +6 -0
  893. package/dist/separator/definition.render.d.ts.map +1 -0
  894. package/dist/separator/definition.render.js +27 -0
  895. package/dist/separator/floorplan-affordances.d.ts +9 -0
  896. package/dist/separator/floorplan-affordances.d.ts.map +1 -0
  897. package/dist/separator/floorplan-affordances.js +23 -0
  898. package/dist/separator/floorplan.d.ts +9 -0
  899. package/dist/separator/floorplan.d.ts.map +1 -0
  900. package/dist/separator/floorplan.js +54 -0
  901. package/dist/separator/renderer.d.ts +6 -1
  902. package/dist/separator/renderer.d.ts.map +1 -1
  903. package/dist/separator/renderer.edit.d.ts +5 -0
  904. package/dist/separator/renderer.edit.d.ts.map +1 -0
  905. package/dist/separator/renderer.edit.js +8 -0
  906. package/dist/separator/renderer.js +22 -9
  907. package/dist/separator/selection.d.ts +10 -0
  908. package/dist/separator/selection.d.ts.map +1 -0
  909. package/dist/separator/selection.js +35 -0
  910. package/dist/shared/accessory-placement.js +1 -1
  911. package/dist/shared/auto-fitting.js +1 -1
  912. package/dist/shared/auto-offset-tag.d.ts +1 -1
  913. package/dist/shared/auto-offset-tag.d.ts.map +1 -1
  914. package/dist/shared/auto-offset-tag.js +3 -1
  915. package/dist/shared/automatic-run-end-cap.d.ts +5 -0
  916. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -1
  917. package/dist/shared/automatic-run-end-cap.js +17 -9
  918. package/dist/shared/build-up-controls.d.ts +88 -0
  919. package/dist/shared/build-up-controls.d.ts.map +1 -0
  920. package/dist/shared/build-up-controls.js +139 -0
  921. package/dist/shared/connection-feedback.d.ts +6 -3
  922. package/dist/shared/connection-feedback.d.ts.map +1 -1
  923. package/dist/shared/connection-feedback.js +29 -6
  924. package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
  925. package/dist/shared/curtain-opening-limits.js +45 -16
  926. package/dist/shared/draft-axis-guides.d.ts.map +1 -1
  927. package/dist/shared/draft-axis-guides.js +2 -1
  928. package/dist/shared/duct-adapter.js +1 -1
  929. package/dist/shared/duct-collar-inspector.d.ts +5 -0
  930. package/dist/shared/duct-collar-inspector.d.ts.map +1 -0
  931. package/dist/shared/duct-collar-inspector.js +36 -0
  932. package/dist/shared/follower-frames.d.ts +15 -0
  933. package/dist/shared/follower-frames.d.ts.map +1 -0
  934. package/dist/shared/follower-frames.js +36 -0
  935. package/dist/shared/handle-drag-scope.d.ts +14 -0
  936. package/dist/shared/handle-drag-scope.d.ts.map +1 -0
  937. package/dist/shared/handle-drag-scope.js +36 -0
  938. package/dist/shared/hosted-resize.d.ts +3 -1
  939. package/dist/shared/hosted-resize.d.ts.map +1 -1
  940. package/dist/shared/hosted-resize.js +10 -8
  941. package/dist/shared/item-interaction-actions.d.ts.map +1 -1
  942. package/dist/shared/item-interaction-actions.js +11 -2
  943. package/dist/shared/layer-thickness.d.ts +2 -0
  944. package/dist/shared/layer-thickness.d.ts.map +1 -0
  945. package/dist/shared/layer-thickness.js +3 -0
  946. package/dist/shared/live-preview.d.ts +16 -0
  947. package/dist/shared/live-preview.d.ts.map +1 -0
  948. package/dist/shared/live-preview.js +36 -0
  949. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  950. package/dist/shared/move-roof-tool.js +100 -5
  951. package/dist/shared/node-batch/batchable.d.ts +2 -0
  952. package/dist/shared/node-batch/batchable.d.ts.map +1 -1
  953. package/dist/shared/node-batch/batchable.js +4 -0
  954. package/dist/shared/node-batch/candidates.d.ts +21 -5
  955. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  956. package/dist/shared/node-batch/candidates.js +85 -50
  957. package/dist/shared/node-batch/system.d.ts.map +1 -1
  958. package/dist/shared/node-batch/system.js +24 -15
  959. package/dist/shared/opening-casing-move.d.ts +16 -0
  960. package/dist/shared/opening-casing-move.d.ts.map +1 -0
  961. package/dist/shared/opening-casing-move.js +33 -0
  962. package/dist/shared/opening-casing-section.d.ts +15 -0
  963. package/dist/shared/opening-casing-section.d.ts.map +1 -0
  964. package/dist/shared/opening-casing-section.js +38 -0
  965. package/dist/shared/opening-casing.d.ts +26 -0
  966. package/dist/shared/opening-casing.d.ts.map +1 -0
  967. package/dist/shared/opening-casing.js +80 -0
  968. package/dist/shared/opening-depth-position.d.ts +13 -0
  969. package/dist/shared/opening-depth-position.d.ts.map +1 -0
  970. package/dist/shared/opening-depth-position.js +34 -0
  971. package/dist/shared/opening-documentation.d.ts.map +1 -1
  972. package/dist/shared/opening-documentation.js +17 -8
  973. package/dist/shared/opening-guides-runtime.d.ts +2 -1
  974. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  975. package/dist/shared/opening-guides-runtime.js +13 -9
  976. package/dist/shared/opening-labels.d.ts +11 -0
  977. package/dist/shared/opening-labels.d.ts.map +1 -0
  978. package/dist/shared/opening-labels.js +46 -0
  979. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  980. package/dist/shared/opening-placement-dimensions.js +12 -10
  981. package/dist/shared/opening-plane-offset.d.ts +4 -3
  982. package/dist/shared/opening-plane-offset.d.ts.map +1 -1
  983. package/dist/shared/opening-plane-offset.js +7 -4
  984. package/dist/shared/opening-swap.d.ts +8 -0
  985. package/dist/shared/opening-swap.d.ts.map +1 -0
  986. package/dist/shared/opening-swap.js +18 -0
  987. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  988. package/dist/shared/path-point-affordance.js +19 -24
  989. package/dist/shared/path-segment-affordance.d.ts +2 -1
  990. package/dist/shared/path-segment-affordance.d.ts.map +1 -1
  991. package/dist/shared/path-segment-affordance.js +11 -8
  992. package/dist/shared/pipe-collar-inspector.d.ts +5 -0
  993. package/dist/shared/pipe-collar-inspector.d.ts.map +1 -0
  994. package/dist/shared/pipe-collar-inspector.js +27 -0
  995. package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
  996. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  997. package/dist/shared/polygon-vertex-affordance.js +65 -6
  998. package/dist/shared/refrigerant-line-selection.d.ts.map +1 -1
  999. package/dist/shared/refrigerant-line-selection.js +46 -29
  1000. package/dist/shared/relative-roof-drag.d.ts.map +1 -1
  1001. package/dist/shared/relative-roof-drag.js +5 -4
  1002. package/dist/shared/roof-opening-host.d.ts +2 -1
  1003. package/dist/shared/roof-opening-host.d.ts.map +1 -1
  1004. package/dist/shared/roof-opening-host.js +14 -5
  1005. package/dist/shared/roof-surface.d.ts.map +1 -1
  1006. package/dist/shared/roof-surface.js +2 -0
  1007. package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
  1008. package/dist/shared/roof-wall-opening-cut.js +14 -6
  1009. package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
  1010. package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
  1011. package/dist/shared/roof-wall-opening-placement.js +6 -4
  1012. package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
  1013. package/dist/shared/run-hanger-inspector.js +39 -5
  1014. package/dist/shared/run-hangers.d.ts.map +1 -1
  1015. package/dist/shared/run-hangers.js +2 -2
  1016. package/dist/shared/run-move-connectivity.d.ts +15 -6
  1017. package/dist/shared/run-move-connectivity.d.ts.map +1 -1
  1018. package/dist/shared/run-move-connectivity.js +14 -5
  1019. package/dist/shared/run-tool-options.d.ts +8 -0
  1020. package/dist/shared/run-tool-options.d.ts.map +1 -0
  1021. package/dist/shared/run-tool-options.js +166 -0
  1022. package/dist/shared/system-check-panel.d.ts.map +1 -1
  1023. package/dist/shared/system-check-panel.js +94 -15
  1024. package/dist/shared/system-checks.d.ts.map +1 -1
  1025. package/dist/shared/system-checks.js +2 -1
  1026. package/dist/shared/vertical-offset.js +1 -1
  1027. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  1028. package/dist/shared/wall-attach-target.js +6 -3
  1029. package/dist/shared/wall-opening-ceiling.d.ts +6 -0
  1030. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  1031. package/dist/shared/wall-opening-ceiling.js +36 -7
  1032. package/dist/shelf/definition.d.ts +108 -3
  1033. package/dist/shelf/definition.d.ts.map +1 -1
  1034. package/dist/shelf/definition.edit.d.ts +4 -0
  1035. package/dist/shelf/definition.edit.d.ts.map +1 -0
  1036. package/dist/shelf/definition.edit.js +155 -0
  1037. package/dist/shelf/definition.js +4 -270
  1038. package/dist/shelf/definition.render.d.ts +6 -0
  1039. package/dist/shelf/definition.render.d.ts.map +1 -0
  1040. package/dist/shelf/definition.render.js +122 -0
  1041. package/dist/site/definition.d.ts +312 -9
  1042. package/dist/site/definition.d.ts.map +1 -1
  1043. package/dist/site/definition.edit.d.ts +4 -0
  1044. package/dist/site/definition.edit.d.ts.map +1 -0
  1045. package/dist/site/definition.edit.js +4 -0
  1046. package/dist/site/definition.js +4 -55
  1047. package/dist/site/definition.render.d.ts +6 -0
  1048. package/dist/site/definition.render.d.ts.map +1 -0
  1049. package/dist/site/definition.render.js +47 -0
  1050. package/dist/site/ground-hole.d.ts +3 -3
  1051. package/dist/site/ground-hole.js +3 -3
  1052. package/dist/site/ground-veil.d.ts +5 -12
  1053. package/dist/site/ground-veil.d.ts.map +1 -1
  1054. package/dist/site/ground-veil.js +9 -33
  1055. package/dist/site/panel.d.ts.map +1 -1
  1056. package/dist/site/panel.js +52 -12
  1057. package/dist/site/renderer.d.ts.map +1 -1
  1058. package/dist/site/renderer.js +52 -23
  1059. package/dist/skylight/definition.d.ts +158 -9
  1060. package/dist/skylight/definition.d.ts.map +1 -1
  1061. package/dist/skylight/definition.edit.d.ts +4 -0
  1062. package/dist/skylight/definition.edit.d.ts.map +1 -0
  1063. package/dist/skylight/definition.edit.js +218 -0
  1064. package/dist/skylight/definition.js +4 -271
  1065. package/dist/skylight/definition.render.d.ts +6 -0
  1066. package/dist/skylight/definition.render.d.ts.map +1 -0
  1067. package/dist/skylight/definition.render.js +50 -0
  1068. package/dist/skylight/move-tool.d.ts.map +1 -1
  1069. package/dist/skylight/move-tool.js +7 -5
  1070. package/dist/skylight/panel.d.ts.map +1 -1
  1071. package/dist/skylight/panel.js +49 -19
  1072. package/dist/slab/deck-geometry.d.ts +28 -0
  1073. package/dist/slab/deck-geometry.d.ts.map +1 -0
  1074. package/dist/slab/deck-geometry.js +320 -0
  1075. package/dist/slab/definition.d.ts +289 -19
  1076. package/dist/slab/definition.d.ts.map +1 -1
  1077. package/dist/slab/definition.edit.d.ts +4 -0
  1078. package/dist/slab/definition.edit.d.ts.map +1 -0
  1079. package/dist/slab/definition.edit.js +230 -0
  1080. package/dist/slab/definition.js +4 -329
  1081. package/dist/slab/definition.render.d.ts +6 -0
  1082. package/dist/slab/definition.render.d.ts.map +1 -0
  1083. package/dist/slab/definition.render.js +92 -0
  1084. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  1085. package/dist/slab/dependency-tracker.js +3 -0
  1086. package/dist/slab/floorplan-affordances.d.ts +500 -0
  1087. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  1088. package/dist/slab/geometry.d.ts.map +1 -1
  1089. package/dist/slab/geometry.js +46 -9
  1090. package/dist/slab/panel.d.ts.map +1 -1
  1091. package/dist/slab/panel.js +97 -21
  1092. package/dist/slab/renderer.d.ts +11 -0
  1093. package/dist/slab/renderer.d.ts.map +1 -0
  1094. package/dist/slab/renderer.js +19 -0
  1095. package/dist/slab/system.d.ts.map +1 -1
  1096. package/dist/slab/system.js +12 -1
  1097. package/dist/solar-panel/definition.d.ts +145 -14
  1098. package/dist/solar-panel/definition.d.ts.map +1 -1
  1099. package/dist/solar-panel/definition.edit.d.ts +4 -0
  1100. package/dist/solar-panel/definition.edit.d.ts.map +1 -0
  1101. package/dist/solar-panel/definition.edit.js +213 -0
  1102. package/dist/solar-panel/definition.js +4 -263
  1103. package/dist/solar-panel/definition.render.d.ts +6 -0
  1104. package/dist/solar-panel/definition.render.d.ts.map +1 -0
  1105. package/dist/solar-panel/definition.render.js +42 -0
  1106. package/dist/solar-panel/move-tool.d.ts.map +1 -1
  1107. package/dist/solar-panel/move-tool.js +7 -5
  1108. package/dist/solar-panel/panel.d.ts.map +1 -1
  1109. package/dist/solar-panel/panel.js +49 -14
  1110. package/dist/spawn/definition.d.ts +48 -3
  1111. package/dist/spawn/definition.d.ts.map +1 -1
  1112. package/dist/spawn/definition.edit.d.ts +4 -0
  1113. package/dist/spawn/definition.edit.d.ts.map +1 -0
  1114. package/dist/spawn/definition.edit.js +64 -0
  1115. package/dist/spawn/definition.js +4 -109
  1116. package/dist/spawn/definition.render.d.ts +6 -0
  1117. package/dist/spawn/definition.render.d.ts.map +1 -0
  1118. package/dist/spawn/definition.render.js +48 -0
  1119. package/dist/stair/construction-controls.d.ts +3 -1
  1120. package/dist/stair/construction-controls.d.ts.map +1 -1
  1121. package/dist/stair/construction-controls.js +75 -12
  1122. package/dist/stair/definition.d.ts +334 -8
  1123. package/dist/stair/definition.d.ts.map +1 -1
  1124. package/dist/stair/definition.edit.d.ts +4 -0
  1125. package/dist/stair/definition.edit.d.ts.map +1 -0
  1126. package/dist/stair/definition.edit.js +377 -0
  1127. package/dist/stair/definition.js +4 -443
  1128. package/dist/stair/definition.render.d.ts +6 -0
  1129. package/dist/stair/definition.render.d.ts.map +1 -0
  1130. package/dist/stair/definition.render.js +65 -0
  1131. package/dist/stair/paint.d.ts +6 -0
  1132. package/dist/stair/paint.d.ts.map +1 -1
  1133. package/dist/stair/panel.d.ts.map +1 -1
  1134. package/dist/stair/panel.js +244 -52
  1135. package/dist/stair/parametrics.d.ts.map +1 -1
  1136. package/dist/stair/parametrics.js +7 -0
  1137. package/dist/stair/placement-defaults.d.ts +18 -0
  1138. package/dist/stair/placement-defaults.d.ts.map +1 -0
  1139. package/dist/stair/placement-defaults.js +27 -0
  1140. package/dist/stair/railing-controls.d.ts.map +1 -1
  1141. package/dist/stair/railing-controls.js +78 -18
  1142. package/dist/stair/renderer.d.ts.map +1 -1
  1143. package/dist/stair/renderer.js +16 -10
  1144. package/dist/stair/structure-controls.d.ts +18 -0
  1145. package/dist/stair/structure-controls.d.ts.map +1 -0
  1146. package/dist/stair/structure-controls.js +275 -0
  1147. package/dist/stair/tool.d.ts.map +1 -1
  1148. package/dist/stair/tool.js +13 -9
  1149. package/dist/stair/use-stair-render-data.d.ts +41 -0
  1150. package/dist/stair/use-stair-render-data.d.ts.map +1 -1
  1151. package/dist/stair-segment/definition.d.ts +130 -7
  1152. package/dist/stair-segment/definition.d.ts.map +1 -1
  1153. package/dist/stair-segment/definition.edit.d.ts +4 -0
  1154. package/dist/stair-segment/definition.edit.d.ts.map +1 -0
  1155. package/dist/stair-segment/definition.edit.js +135 -0
  1156. package/dist/stair-segment/definition.js +4 -172
  1157. package/dist/stair-segment/definition.render.d.ts +6 -0
  1158. package/dist/stair-segment/definition.render.d.ts.map +1 -0
  1159. package/dist/stair-segment/definition.render.js +38 -0
  1160. package/dist/stair-segment/panel.d.ts.map +1 -1
  1161. package/dist/stair-segment/panel.js +65 -18
  1162. package/dist/structural-grid/definition.d.ts +50 -3
  1163. package/dist/structural-grid/definition.d.ts.map +1 -1
  1164. package/dist/structural-grid/definition.edit.d.ts +4 -0
  1165. package/dist/structural-grid/definition.edit.d.ts.map +1 -0
  1166. package/dist/structural-grid/definition.edit.js +18 -0
  1167. package/dist/structural-grid/definition.js +4 -51
  1168. package/dist/structural-grid/definition.render.d.ts +6 -0
  1169. package/dist/structural-grid/definition.render.d.ts.map +1 -0
  1170. package/dist/structural-grid/definition.render.js +35 -0
  1171. package/dist/turbine-vent/definition.d.ts +97 -23
  1172. package/dist/turbine-vent/definition.d.ts.map +1 -1
  1173. package/dist/turbine-vent/definition.edit.d.ts +4 -0
  1174. package/dist/turbine-vent/definition.edit.d.ts.map +1 -0
  1175. package/dist/turbine-vent/definition.edit.js +66 -0
  1176. package/dist/turbine-vent/definition.js +4 -121
  1177. package/dist/turbine-vent/definition.render.d.ts +6 -0
  1178. package/dist/turbine-vent/definition.render.d.ts.map +1 -0
  1179. package/dist/turbine-vent/definition.render.js +40 -0
  1180. package/dist/turbine-vent/move-tool.d.ts.map +1 -1
  1181. package/dist/turbine-vent/move-tool.js +6 -5
  1182. package/dist/turbine-vent/panel.d.ts.map +1 -1
  1183. package/dist/turbine-vent/panel.js +14 -5
  1184. package/dist/unit/definition.d.ts +53 -9
  1185. package/dist/unit/definition.d.ts.map +1 -1
  1186. package/dist/unit/definition.edit.d.ts +4 -0
  1187. package/dist/unit/definition.edit.d.ts.map +1 -0
  1188. package/dist/unit/definition.edit.js +4 -0
  1189. package/dist/unit/definition.js +4 -38
  1190. package/dist/unit/definition.render.d.ts +6 -0
  1191. package/dist/unit/definition.render.d.ts.map +1 -0
  1192. package/dist/unit/definition.render.js +30 -0
  1193. package/dist/unit/unit-panel.d.ts.map +1 -1
  1194. package/dist/unit/unit-panel.js +28 -12
  1195. package/dist/wall/actions.d.ts +1 -1
  1196. package/dist/wall/actions.d.ts.map +1 -1
  1197. package/dist/wall/actions.js +17 -13
  1198. package/dist/wall/construction-dimensions.d.ts +6 -0
  1199. package/dist/wall/construction-dimensions.d.ts.map +1 -1
  1200. package/dist/wall/construction-dimensions.js +8 -0
  1201. package/dist/wall/contextual-dimensions.d.ts +6 -0
  1202. package/dist/wall/contextual-dimensions.d.ts.map +1 -1
  1203. package/dist/wall/contextual-dimensions.js +105 -18
  1204. package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
  1205. package/dist/wall/curtain-opening-frame.js +6 -4
  1206. package/dist/wall/curtain-wall-layout.d.ts +1 -1
  1207. package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
  1208. package/dist/wall/curtain-wall-layout.js +6 -4
  1209. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  1210. package/dist/wall/curtain-wall-materials.js +8 -3
  1211. package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
  1212. package/dist/wall/curtain-wall-panel.js +242 -38
  1213. package/dist/wall/curve-tool.d.ts.map +1 -1
  1214. package/dist/wall/curve-tool.js +2 -3
  1215. package/dist/wall/definition.d.ts +809 -3
  1216. package/dist/wall/definition.d.ts.map +1 -1
  1217. package/dist/wall/definition.edit.d.ts +4 -0
  1218. package/dist/wall/definition.edit.d.ts.map +1 -0
  1219. package/dist/wall/definition.edit.js +184 -0
  1220. package/dist/wall/definition.js +4 -264
  1221. package/dist/wall/definition.render.d.ts +6 -0
  1222. package/dist/wall/definition.render.d.ts.map +1 -0
  1223. package/dist/wall/definition.render.js +100 -0
  1224. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  1225. package/dist/wall/floorplan-affordances.js +9 -6
  1226. package/dist/wall/floorplan-move.d.ts.map +1 -1
  1227. package/dist/wall/floorplan-move.js +66 -16
  1228. package/dist/wall/floorplan.d.ts +4 -5
  1229. package/dist/wall/floorplan.d.ts.map +1 -1
  1230. package/dist/wall/floorplan.js +63 -47
  1231. package/dist/wall/measurement.d.ts.map +1 -1
  1232. package/dist/wall/measurement.js +22 -5
  1233. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  1234. package/dist/wall/move-endpoint-tool.js +4 -3
  1235. package/dist/wall/move-shared.js +1 -1
  1236. package/dist/wall/move-tool.d.ts.map +1 -1
  1237. package/dist/wall/move-tool.js +77 -12
  1238. package/dist/wall/paint.d.ts +2 -2
  1239. package/dist/wall/paint.d.ts.map +1 -1
  1240. package/dist/wall/paint.js +11 -4
  1241. package/dist/wall/panel-model.d.ts +17 -2
  1242. package/dist/wall/panel-model.d.ts.map +1 -1
  1243. package/dist/wall/panel-model.js +159 -18
  1244. package/dist/wall/panel.d.ts +8 -0
  1245. package/dist/wall/panel.d.ts.map +1 -1
  1246. package/dist/wall/panel.js +240 -159
  1247. package/dist/wall/parametrics.d.ts +1 -1
  1248. package/dist/wall/parametrics.d.ts.map +1 -1
  1249. package/dist/wall/parametrics.js +14 -1
  1250. package/dist/wall/quick-measurement.js +1 -1
  1251. package/dist/wall/railing-wall-adapter.d.ts +7 -0
  1252. package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
  1253. package/dist/wall/railing-wall-adapter.js +38 -0
  1254. package/dist/wall/railing-wall-floorplan.d.ts +8 -0
  1255. package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
  1256. package/dist/wall/railing-wall-floorplan.js +27 -0
  1257. package/dist/wall/railing-wall-geometry.d.ts +12 -0
  1258. package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
  1259. package/dist/wall/railing-wall-geometry.js +51 -0
  1260. package/dist/wall/railing-wall-guard.d.ts +81 -0
  1261. package/dist/wall/railing-wall-guard.d.ts.map +1 -0
  1262. package/dist/wall/railing-wall-guard.js +435 -0
  1263. package/dist/wall/railing-wall-materials.d.ts +11 -0
  1264. package/dist/wall/railing-wall-materials.d.ts.map +1 -0
  1265. package/dist/wall/railing-wall-materials.js +31 -0
  1266. package/dist/wall/railing-wall-panel-model.d.ts +30 -0
  1267. package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
  1268. package/dist/wall/railing-wall-panel-model.js +117 -0
  1269. package/dist/wall/railing-wall-panel.d.ts +17 -0
  1270. package/dist/wall/railing-wall-panel.d.ts.map +1 -0
  1271. package/dist/wall/railing-wall-panel.js +42 -0
  1272. package/dist/wall/rectangle-command.d.ts +80 -1
  1273. package/dist/wall/rectangle-command.d.ts.map +1 -1
  1274. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  1275. package/dist/wall/rectangle-tool.js +4 -2
  1276. package/dist/wall/renderer.d.ts.map +1 -1
  1277. package/dist/wall/renderer.js +3 -1
  1278. package/dist/wall/skirting-floor-gaps.d.ts +8 -0
  1279. package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
  1280. package/dist/wall/skirting-floor-gaps.js +36 -0
  1281. package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
  1282. package/dist/wall/split-floorplan-layer.js +2 -2
  1283. package/dist/wall/split-tool.d.ts.map +1 -1
  1284. package/dist/wall/split-tool.js +2 -2
  1285. package/dist/wall/system.d.ts +0 -14
  1286. package/dist/wall/system.d.ts.map +1 -1
  1287. package/dist/wall/system.js +6 -1
  1288. package/dist/wall/tool.d.ts +16 -0
  1289. package/dist/wall/tool.d.ts.map +1 -1
  1290. package/dist/wall/tool.js +285 -70
  1291. package/dist/wall/treatments.d.ts +3 -0
  1292. package/dist/wall/treatments.d.ts.map +1 -1
  1293. package/dist/wall/treatments.js +57 -14
  1294. package/dist/window/actions.d.ts +7 -0
  1295. package/dist/window/actions.d.ts.map +1 -0
  1296. package/dist/window/actions.js +29 -0
  1297. package/dist/window/definition.d.ts +356 -15
  1298. package/dist/window/definition.d.ts.map +1 -1
  1299. package/dist/window/definition.edit.d.ts +4 -0
  1300. package/dist/window/definition.edit.d.ts.map +1 -0
  1301. package/dist/window/definition.edit.js +255 -0
  1302. package/dist/window/definition.js +5 -329
  1303. package/dist/window/definition.render.d.ts +8 -0
  1304. package/dist/window/definition.render.d.ts.map +1 -0
  1305. package/dist/window/definition.render.js +83 -0
  1306. package/dist/window/floorplan-move.d.ts.map +1 -1
  1307. package/dist/window/floorplan-move.js +12 -4
  1308. package/dist/window/floorplan.d.ts +2 -0
  1309. package/dist/window/floorplan.d.ts.map +1 -1
  1310. package/dist/window/floorplan.js +58 -1
  1311. package/dist/window/mechanism.d.ts.map +1 -1
  1312. package/dist/window/mechanism.js +21 -1
  1313. package/dist/window/move-tool.d.ts.map +1 -1
  1314. package/dist/window/move-tool.js +17 -14
  1315. package/dist/window/paint.d.ts +2 -7
  1316. package/dist/window/paint.d.ts.map +1 -1
  1317. package/dist/window/paint.js +31 -3
  1318. package/dist/window/panel.d.ts.map +1 -1
  1319. package/dist/window/panel.js +311 -69
  1320. package/dist/window/placement.d.ts.map +1 -1
  1321. package/dist/window/placement.js +5 -1
  1322. package/dist/window/swing.d.ts +13 -0
  1323. package/dist/window/swing.d.ts.map +1 -0
  1324. package/dist/window/swing.js +16 -0
  1325. package/dist/window/tool.d.ts.map +1 -1
  1326. package/dist/window/tool.js +24 -16
  1327. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  1328. package/dist/zone/contextual-dimensions.js +1 -2
  1329. package/dist/zone/definition.d.ts +264 -9
  1330. package/dist/zone/definition.d.ts.map +1 -1
  1331. package/dist/zone/definition.edit.d.ts +4 -0
  1332. package/dist/zone/definition.edit.d.ts.map +1 -0
  1333. package/dist/zone/definition.edit.js +38 -0
  1334. package/dist/zone/definition.js +4 -97
  1335. package/dist/zone/definition.render.d.ts +6 -0
  1336. package/dist/zone/definition.render.d.ts.map +1 -0
  1337. package/dist/zone/definition.render.js +55 -0
  1338. package/dist/zone/floorplan-affordances.d.ts +136 -0
  1339. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  1340. package/dist/zone/quantities-panel.d.ts.map +1 -1
  1341. package/dist/zone/quantities-panel.js +34 -9
  1342. package/dist/zone/renderer.d.ts.map +1 -1
  1343. package/dist/zone/renderer.js +9 -5
  1344. package/package.json +27 -16
  1345. package/dist/site/generic-foundation-geometry.d.ts +0 -16
  1346. package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
  1347. package/dist/site/generic-foundation-geometry.js +0 -75
  1348. package/dist/site/generic-foundation.d.ts +0 -4
  1349. package/dist/site/generic-foundation.d.ts.map +0 -1
  1350. package/dist/site/generic-foundation.js +0 -91
package/dist/roof/tool.js CHANGED
@@ -1,17 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { collectAlignmentAnchors, emitter, getActiveRoofHeight, getWallArcData, getWallBaseElevationForNodes, getWallEffectiveHeightForNodes, isCurvedWall, RoofNode, RoofSegmentNode, RoofType as RoofTypeSchema, resolveBuildingForLevel, resolveLevelId, resolveRoomRoofFootprint, sceneRegistry, wallSegmentAnchors, } from '@pascal-app/core';
3
- import { CursorSphere, clearSurfacePlanSnapFeedback, EDITOR_LAYER, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, resolveSurfacePlanPointSnap, snapWorldXZForActiveBuilding, triggerSFX, useEditor, useFloorplanDraftPreview, useInteractionScope, useRegistryToolContext, } from '@pascal-app/editor';
2
+ import { collectAlignmentAnchors, emitter, getActiveRoofHeight, getRoofModuleFaces, getRoofShapeRatios, getSegmentSlopeFrame, getWallArcData, getWallBaseElevationForNodes, getWallEffectiveHeightForNodes, getWallThickness, isCurvedWall, RoofNode, RoofSegmentNode, RoofType as RoofTypeSchema, resolveBuildingForLevel, resolveLevelId, wallSegmentAnchors, } from '@pascal-app/core';
3
+ import { CursorSphere, clearSurfacePlanSnapFeedback, EDITOR_LAYER, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, resolveSurfacePlanPointSnap, snapWorldXZForActiveBuilding, triggerSFX, useEditor, useFloorplanDraftPreview, useInteractionScope, useRegistryToolContext, visibleScene, } from '@pascal-app/editor';
4
4
  import { generateRoofSegmentGeometry, useViewer } from '@pascal-app/viewer';
5
5
  import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
6
6
  import * as THREE from 'three';
7
7
  import { BufferGeometry, DoubleSide, Float32BufferAttribute, Vector3, } from 'three';
8
8
  import { createConicalRoofSectorAboveWall } from './conical-roof.js';
9
9
  import { resolveConicalRoofPlacement } from './conical-roof-placement.js';
10
- import { isStandardRoofWallEligible, parseRoofFootprintSource, resolveRoofFootprintElevation, resolveRoofFootprintWorldElevation, resolveRoofWallTopWorldElevation, subscribeToConicalRoofWallClicks, } from './roof-footprint.js';
10
+ import { isStandardRoofWallEligible, parseRoofFootprintSource, pickRoofRoom, resolveRoofFootprintElevation, resolveRoofFootprintWorldElevation, resolveRoofWallTopWorldElevation, roofEdgeAnchors, roofFootprintPreviewIds, roofSnapEdges, subscribeToConicalRoofWallClicks, } from './roof-footprint.js';
11
11
  import useRoofFootprintSource from './roof-footprint-source.js';
12
12
  import { drawnRoofLevelTarget, drawnRoofSupport, roofLevelTarget, roofLevelTargetOffset, seatedRoofElevation, writeRoofNodes, writeSeatedRoofEdit, } from './roof-level-target.js';
13
13
  import useRoofPlacementMode, {} from './roof-placement-mode.js';
14
- const DEFAULT_WALL_HEIGHT = 0.5;
14
+ import useRoofRidgeMode, { ridgeQuarterTurn } from './roof-ridge-mode.js';
15
+ import { bearingWallThickness, roofCatchWalls, segmentWallLine, settleSegmentOnEdges, } from './wall-catch.js';
16
+ // Rafters bear on the top plate, as standard trusses do; a raised heel is the segment's Wall Height.
17
+ const DEFAULT_HEEL_HEIGHT = 0;
18
+ // A cone's curb: it stands on the ground or on another roof, not on a plate.
19
+ const DEFAULT_CONICAL_CURB_HEIGHT = 0.5;
15
20
  const DEFAULT_PITCH_DEG = 40;
16
21
  const GRID_OFFSET = 0.02;
17
22
  function placementOptions(mode) {
@@ -20,11 +25,21 @@ function placementOptions(mode) {
20
25
  requireRoofSupport: mode === 'roof',
21
26
  };
22
27
  }
23
- function resolveRoofDraftPlacement(footprintWidth, footprintDepth, quarterTurn, parentRotation = 0, roofType = 'gable') {
28
+ /**
29
+ * A placed segment's quarter turn: given outright, or from a ridge mode, which
30
+ * runs the ridge along the footprint's long side ('long') or across it.
31
+ */
32
+ function resolveQuarterTurn(ridge, footprintWidth, footprintDepth) {
33
+ return typeof ridge === 'boolean'
34
+ ? ridge
35
+ : ridgeQuarterTurn(footprintWidth, footprintDepth, ridge);
36
+ }
37
+ function resolveRoofDraftPlacement(footprintWidth, footprintDepth, ridge, parentRotation = 0, roofType = 'gable') {
24
38
  if (roofType === 'conical') {
25
39
  const diameter = Math.max(footprintWidth, footprintDepth);
26
40
  return { width: diameter, depth: diameter, rotation: -parentRotation };
27
41
  }
42
+ const quarterTurn = resolveQuarterTurn(ridge, footprintWidth, footprintDepth);
28
43
  return {
29
44
  width: quarterTurn ? footprintDepth : footprintWidth,
30
45
  depth: quarterTurn ? footprintWidth : footprintDepth,
@@ -42,47 +57,62 @@ function getLevelWalls(levelId, nodes) {
42
57
  .map((childId) => nodes[childId])
43
58
  .filter((node) => node?.type === 'wall');
44
59
  }
45
- // Walls on the level directly beneath the active one. Levels share the same
46
- // local XZ origin (they only differ in world Y), so these walls live in the
47
- // identical coordinate frame and feed straight into both the alignment pool
48
- // and the magnetic wall-snap pipeline — letting a roof drawn on the upper
49
- // floor snap onto the wall corners of the floor below.
50
- function getBelowLevelWalls(currentLevelId, nodes) {
60
+ // The level directly beneath the active one. Levels share the same local XZ
61
+ // origin (they only differ in world Y), so its walls live in the identical
62
+ // coordinate frame and feed straight into both the alignment pool and the
63
+ // magnetic wall-snap pipeline — letting a roof drawn on the upper floor snap
64
+ // onto the wall corners of the floor below.
65
+ function getBelowLevel(currentLevelId, nodes) {
51
66
  if (!currentLevelId)
52
- return [];
67
+ return undefined;
53
68
  const currentLevel = nodes[currentLevelId];
54
69
  if (currentLevel?.type !== 'level')
55
- return [];
70
+ return undefined;
56
71
  const buildingId = resolveBuildingForLevel(currentLevel.id, nodes);
57
72
  if (!buildingId)
58
- return [];
73
+ return undefined;
59
74
  const building = nodes[buildingId];
60
75
  if (building?.type !== 'building')
61
- return [];
76
+ return undefined;
62
77
  const currentIndex = currentLevel.level;
63
- const belowLevel = (building.children ?? [])
78
+ return (building.children ?? [])
64
79
  .map((childId) => nodes[childId])
65
80
  .filter((node) => node?.type === 'level' && node.level < currentIndex)
66
81
  .sort((a, b) => b.level - a.level)[0];
67
- return getLevelWalls(belowLevel?.id ?? null, nodes);
82
+ }
83
+ // Walls on the level directly beneath the active one.
84
+ function getBelowLevelWalls(currentLevelId, nodes) {
85
+ return getLevelWalls(getBelowLevel(currentLevelId, nodes)?.id ?? null, nodes);
86
+ }
87
+ // The active level and the one beneath it, whose rooms' edges a roof draws to.
88
+ function roofEdgeLevelIds(currentLevelId, nodes) {
89
+ const below = getBelowLevel(currentLevelId, nodes);
90
+ return [currentLevelId, below?.id].filter((id) => !!id);
68
91
  }
69
92
  // Current-level + floor-below walls — the magnetic snap targets the roof draft
70
93
  // locks onto (corners, midpoints, crossings, wall bodies), matching the wall
71
- // tool. Same coordinate frame, so no transform is needed.
94
+ // tool. Same coordinate frame, so no transform is needed. A porch, deck or
95
+ // patio is drawn to as the house is: its invisible walls, and its railings at
96
+ // their outside faces in place of their centre lines (`roofSnapEdges`).
72
97
  function getRoofSnapWalls(currentLevelId, nodes, roofType) {
73
98
  const walls = [
74
99
  ...getLevelWalls(currentLevelId, nodes),
75
100
  ...getBelowLevelWalls(currentLevelId, nodes),
76
101
  ];
77
- return roofType === 'conical'
78
- ? walls.filter((wall) => isCurvedWall(wall))
79
- : walls.filter(isStandardRoofWallEligible);
102
+ if (roofType === 'conical')
103
+ return walls.filter((wall) => isCurvedWall(wall));
104
+ const edges = roofSnapEdges(nodes, roofEdgeLevelIds(currentLevelId, nodes));
105
+ return [...walls.filter((wall) => !edges.faced.has(wall.id)), ...edges.references].filter(isStandardRoofWallEligible);
80
106
  }
81
- // Current-level alignment anchors plus the floor-below wall corners.
82
- function collectRoofAlignmentAnchors(nodes, currentLevelId, roofType) {
107
+ // Current-level alignment anchors plus the floor-below wall corners, and both
108
+ // levels' invisible walls and porch, deck and patio corners.
109
+ export function collectRoofAlignmentAnchors(nodes, currentLevelId, roofType) {
83
110
  const anchors = [
84
111
  ...collectAlignmentAnchors(nodes, '', currentLevelId),
85
- ...getBelowLevelWalls(currentLevelId, nodes).flatMap((wall) => wallSegmentAnchors(wall.id, wall.start, wall.end, wall.thickness)),
112
+ ...getBelowLevelWalls(currentLevelId, nodes).flatMap((wall) => wallSegmentAnchors(wall.id, wall.start, wall.end, wall.thickness, wall.justification)),
113
+ ...(roofType === 'conical'
114
+ ? []
115
+ : roofEdgeAnchors(nodes, roofEdgeLevelIds(currentLevelId, nodes))),
86
116
  ];
87
117
  if (roofType === 'conical') {
88
118
  return anchors.filter((anchor) => {
@@ -96,9 +126,51 @@ function collectRoofAlignmentAnchors(nodes, currentLevelId, roofType) {
96
126
  });
97
127
  }
98
128
  /**
99
- * Creates a roof group with one default gable segment
129
+ * A grid event's point as the roof tools draft and commit it, the 3D tool and the plan's alike:
130
+ * through the shared surface snap pipeline, magnetic lock onto wall corners / midpoints / crossings
131
+ * / bodies on the active level and the floor below (raising the green beacon), falling back to
132
+ * alignment guides, then to the building-grid snap. The pipeline reads the active snapping mode
133
+ * (grid / lines / angles / off). `levelId` is intentionally omitted so the explicit floor-below
134
+ * `walls` aren't filtered back out.
100
135
  */
101
- export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selectedIds, quarterTurn, placementMode) => {
136
+ export function resolveRoofDraftPoint(event, levelId, nodes, roofType, candidates) {
137
+ const rawPoint = [event.localPosition[0], event.localPosition[2]];
138
+ const gridFallback = isGridSnapActive()
139
+ ? snapWorldXZForActiveBuilding(event.position[0], event.position[2], useEditor.getState().gridSnapStep).local
140
+ : rawPoint;
141
+ return resolveSurfacePlanPointSnap({
142
+ rawPoint,
143
+ fallbackPoint: gridFallback,
144
+ walls: getRoofSnapWalls(levelId, nodes, roofType),
145
+ candidates,
146
+ movingId: '__roof-draft__',
147
+ highlightWalls: true,
148
+ }).point;
149
+ }
150
+ /**
151
+ * A drawn segment whose gable and heel walls stand flush on the walls it is drawn over, and whose
152
+ * walls' outer faces stand on the rooms' edges it is drawn out to: a porch's invisible walls, a
153
+ * deck's railings at their outside faces (`settleSegmentOnEdges`).
154
+ */
155
+ function onBearingWalls(segment, roof, walls) {
156
+ const thickness = bearingWallThickness(segmentWallLine(roof, segment), walls);
157
+ const bearing = thickness === null ? segment : { ...segment, wallThickness: thickness };
158
+ return { ...bearing, ...settleSegmentOnEdges(roof, bearing, walls) };
159
+ }
160
+ /**
161
+ * A new roof's place, and its one segment centred in it: the segment settled onto a room's edge
162
+ * (`onBearingWalls`) moves off the roof's centre, so the roof moves with it.
163
+ */
164
+ function centredRoof(roof, segment) {
165
+ const [x, z] = segmentWallLine(roof, segment).center;
166
+ return { center: [x, z], segment: { ...segment, position: [0, segment.position[1], 0] } };
167
+ }
168
+ /**
169
+ * Creates a roof group with one default gable segment. `ridge` is a quarter
170
+ * turn outright, or a ridge mode: 'long' runs the ridge along the drawn
171
+ * rectangle's long side, 'short' across it.
172
+ */
173
+ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selectedIds, ridge, placementMode) => {
102
174
  const nodes = sceneApi.nodes();
103
175
  // A placed roof preset seeds `toolDefaults.roof` with the flattened
104
176
  // subtree params (roofType, pitch, wallHeight, overhang, materials, …)
@@ -114,7 +186,7 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
114
186
  const footprintDepth = Math.max(Math.abs(corner2[2] - corner1[2]), 1);
115
187
  if (roofType === 'conical') {
116
188
  const diameter = Math.max(footprintWidth, footprintDepth);
117
- const curbHeight = typeof defaults.wallHeight === 'number' ? defaults.wallHeight : DEFAULT_WALL_HEIGHT;
189
+ const curbHeight = typeof defaults.wallHeight === 'number' ? defaults.wallHeight : DEFAULT_CONICAL_CURB_HEIGHT;
118
190
  const cone = RoofSegmentNode.parse({
119
191
  pitch: DEFAULT_PITCH_DEG,
120
192
  ...defaults,
@@ -177,34 +249,24 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
177
249
  }
178
250
  if (targetRoofId) {
179
251
  const targetRoof = nodes[targetRoofId];
180
- let localX = centerX;
181
- let localZ = centerZ;
182
- // Convert world coordinates to the local space of the parent roof
183
- const targetObj = sceneRegistry.nodes.get(targetRoofId);
184
- if (targetObj) {
185
- const worldVec = new THREE.Vector3(centerX, 0, centerZ);
186
- targetObj.worldToLocal(worldVec);
187
- localX = worldVec.x;
188
- localZ = worldVec.z;
189
- }
190
- else {
191
- // Math fallback if mesh isn't ready
192
- const dx = centerX - targetRoof.position[0];
193
- const dz = centerZ - targetRoof.position[2];
194
- const angle = -targetRoof.rotation;
195
- localX = dx * Math.cos(angle) - dz * Math.sin(angle);
196
- localZ = dx * Math.sin(angle) + dz * Math.cos(angle);
197
- }
198
- const placement = resolveRoofDraftPlacement(footprintWidth, footprintDepth, quarterTurn, targetRoof.rotation, roofType);
252
+ // The corners are in the level's plan, the roof's frame: its own place and turn in it. (Its
253
+ // mesh's world matrix also carries the building's, which would throw the plane off.)
254
+ const dx = centerX - targetRoof.position[0];
255
+ const dz = centerZ - targetRoof.position[2];
256
+ const angle = -targetRoof.rotation;
257
+ const localX = dx * Math.cos(angle) - dz * Math.sin(angle);
258
+ const localZ = dx * Math.sin(angle) + dz * Math.cos(angle);
259
+ const placement = resolveRoofDraftPlacement(footprintWidth, footprintDepth, ridge, targetRoof.rotation, roofType);
199
260
  const sibling = targetRoof.children
200
261
  .map((id) => nodes[id])
201
262
  .find((node) => node?.type === 'roof-segment');
202
- const segment = RoofSegmentNode.parse({
263
+ const drawn = RoofSegmentNode.parse({
203
264
  roofSystem: sibling?.type === 'roof-segment' ? sibling.roofSystem : undefined,
204
265
  glazing: sibling?.type === 'roof-segment' ? sibling.glazing : undefined,
205
266
  barrelRise: sibling?.type === 'roof-segment' ? sibling.barrelRise : undefined,
206
267
  barrelSegments: sibling?.type === 'roof-segment' ? sibling.barrelSegments : undefined,
207
- wallHeight: DEFAULT_WALL_HEIGHT,
268
+ // A wing bears where the roof it joins does: on the plate, or on the same raised heel.
269
+ wallHeight: sibling?.type === 'roof-segment' ? sibling.wallHeight : DEFAULT_HEEL_HEIGHT,
208
270
  pitch: DEFAULT_PITCH_DEG,
209
271
  roofType: 'gable',
210
272
  ...defaults,
@@ -213,6 +275,7 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
213
275
  position: [localX, 0, localZ],
214
276
  rotation: placement.rotation,
215
277
  });
278
+ const segment = onBearingWalls(drawn, targetRoof, roofCatchWalls(nodes, targetRoof.parentId));
216
279
  writeSeatedRoofEdit(sceneApi, {
217
280
  create: [{ node: segment, parentId: targetRoofId }],
218
281
  });
@@ -223,10 +286,14 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
223
286
  const roofCount = Object.values(nodes).filter((n) => n.type === 'roof').length;
224
287
  const name = `Roof ${roofCount + 1}`;
225
288
  const roofRotation = typeof defaults.rotation === 'number' ? defaults.rotation : 0;
226
- const placement = resolveRoofDraftPlacement(footprintWidth, footprintDepth, quarterTurn, roofRotation, roofType);
289
+ const placement = resolveRoofDraftPlacement(footprintWidth, footprintDepth, ridge, roofRotation, roofType);
227
290
  // Create the segment first (centered in its new parent)
228
- const segment = RoofSegmentNode.parse({
229
- wallHeight: DEFAULT_WALL_HEIGHT,
291
+ const drawnRoof = {
292
+ position: [centerX, 0, centerZ],
293
+ rotation: roofRotation,
294
+ };
295
+ const { center: [roofX, roofZ], segment, } = centredRoof(drawnRoof, onBearingWalls(RoofSegmentNode.parse({
296
+ wallHeight: DEFAULT_HEEL_HEIGHT,
230
297
  pitch: DEFAULT_PITCH_DEG,
231
298
  roofType: 'gable',
232
299
  ...defaults,
@@ -234,7 +301,7 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
234
301
  depth: placement.depth,
235
302
  position: [0, 0, 0],
236
303
  rotation: placement.rotation,
237
- });
304
+ }), drawnRoof, roofCatchWalls(nodes, levelId)));
238
305
  // Drawn over a storey's walls, the roof goes on the level above them.
239
306
  const target = drawnRoofLevelTarget(nodes, levelId, segment.wallHeight + getActiveRoofHeight(segment), { center: [centerX, centerZ], width: footprintWidth, depth: footprintDepth, roofType });
240
307
  const support = drawnRoofSupport(target, levelId);
@@ -243,14 +310,14 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
243
310
  const placed = RoofNode.parse({
244
311
  ...defaults,
245
312
  name,
246
- position: [centerX, 0, centerZ],
313
+ position: [roofX, 0, roofZ],
247
314
  support,
248
315
  children: [segment.id],
249
316
  });
250
317
  const roof = support.kind === 'walls'
251
318
  ? RoofNode.parse({
252
319
  ...placed,
253
- position: [centerX, seatedRoofElevation(target, placed, [segment]), centerZ],
320
+ position: [roofX, seatedRoofElevation(target, placed, [segment]), roofZ],
254
321
  })
255
322
  : placed;
256
323
  // Create roof first (so segment can be parented to it), then segment
@@ -261,9 +328,10 @@ export const commitRoofPlacement = (sceneApi, levelId, corner1, corner2, selecte
261
328
  triggerSFX('sfx:structure-build');
262
329
  return roof.id;
263
330
  };
264
- export const commitRoofFootprint = (sceneApi, levelId, target, quarterTurn) => {
331
+ export const commitRoofFootprint = (sceneApi, levelId, target, ridge) => {
265
332
  if (!target.rectangular)
266
333
  return null;
334
+ const quarterTurn = resolveQuarterTurn(ridge, target.width, target.depth);
267
335
  const nodes = sceneApi.nodes();
268
336
  const defaults = useEditor.getState().toolDefaults.roof ?? {};
269
337
  const parsedRoofType = RoofTypeSchema.safeParse(defaults.roofType);
@@ -271,10 +339,15 @@ export const commitRoofFootprint = (sceneApi, levelId, target, quarterTurn) => {
271
339
  if (roofType === 'conical')
272
340
  return null;
273
341
  const roofCount = Object.values(nodes).filter((node) => node.type === 'roof').length;
274
- const segment = RoofSegmentNode.parse({
342
+ const walls = target.wallIds
343
+ .map((id) => nodes[id])
344
+ .filter((node) => node?.type === 'wall');
345
+ const picked = RoofSegmentNode.parse({
275
346
  pitch: DEFAULT_PITCH_DEG,
276
347
  roofType: 'gable',
277
348
  ...defaults,
349
+ // Its gable and heel walls stand flush on the room's walls.
350
+ ...(walls.length > 0 && { wallThickness: Math.max(...walls.map(getWallThickness)) }),
278
351
  wallHeight: 0,
279
352
  width: quarterTurn ? target.depth : target.width,
280
353
  depth: quarterTurn ? target.width : target.depth,
@@ -283,16 +356,27 @@ export const commitRoofFootprint = (sceneApi, levelId, target, quarterTurn) => {
283
356
  });
284
357
  // A roof belongs to the level above the walls it covers, whichever level the tool was armed
285
358
  // on: over the top floor, the building's roof level.
286
- const firstWall = target.wallIds.map((id) => nodes[id]).find((node) => node?.type === 'wall');
287
- const wallsLevelId = (firstWall ? resolveLevelId(firstWall, nodes) : levelId);
359
+ const firstWall = walls[0];
360
+ const wallsLevelId = (target.levelId ??
361
+ (firstWall ? resolveLevelId(firstWall, nodes) : levelId));
362
+ // Over a porch, deck or patio, the roof's walls stand their outer faces on the room's outside
363
+ // edge, as a house roof's stand on the walls' outside faces.
364
+ const pickedRoof = {
365
+ position: [target.center[0], 0, target.center[1]],
366
+ rotation: target.rotation,
367
+ };
368
+ const { center, segment } = centredRoof(pickedRoof, {
369
+ ...picked,
370
+ ...settleSegmentOnEdges(pickedRoof, picked, roofCatchWalls(nodes, wallsLevelId)),
371
+ });
288
372
  const level = roofLevelTarget(nodes, wallsLevelId, getActiveRoofHeight(segment));
289
373
  const roof = RoofNode.parse({
290
374
  ...defaults,
291
375
  name: `Roof ${roofCount + 1}`,
292
376
  position: [
293
- target.center[0],
377
+ center[0],
294
378
  resolveRoofFootprintElevation(level.levelId, target, level.nodes),
295
- target.center[1],
379
+ center[1],
296
380
  ],
297
381
  rotation: target.rotation,
298
382
  support: { kind: 'walls' },
@@ -305,157 +389,59 @@ export const commitRoofFootprint = (sceneApi, levelId, target, quarterTurn) => {
305
389
  triggerSFX('sfx:structure-build');
306
390
  return roof.id;
307
391
  };
308
- function buildRoofGhostGeometry(width, depth, wallHeight, pitchDeg, roofType) {
309
- const safeWidth = Math.max(width, 0.1);
310
- const safeDepth = Math.max(depth, 0.1);
311
- const halfWidth = safeWidth / 2;
312
- const halfDepth = safeDepth / 2;
313
- const ridgeHeight = wallHeight + Math.tan((pitchDeg * Math.PI) / 180) * halfDepth;
314
- if (roofType === 'conical') {
315
- const roofHeight = Math.max(0.001, Math.tan((pitchDeg * Math.PI) / 180) * halfWidth);
316
- const geometry = new THREE.ConeGeometry(halfWidth, roofHeight, 48);
317
- geometry.translate(0, wallHeight + roofHeight / 2, 0);
318
- return geometry;
319
- }
320
- const vertices = [
321
- // Front slope
322
- -halfWidth,
323
- wallHeight,
324
- -halfDepth,
325
- halfWidth,
326
- wallHeight,
327
- -halfDepth,
328
- halfWidth,
329
- ridgeHeight,
330
- 0,
331
- -halfWidth,
332
- wallHeight,
333
- -halfDepth,
334
- halfWidth,
335
- ridgeHeight,
336
- 0,
337
- -halfWidth,
338
- ridgeHeight,
339
- 0,
340
- // Back slope
341
- -halfWidth,
342
- ridgeHeight,
343
- 0,
344
- halfWidth,
345
- ridgeHeight,
346
- 0,
347
- halfWidth,
348
- wallHeight,
349
- halfDepth,
350
- -halfWidth,
351
- ridgeHeight,
352
- 0,
353
- halfWidth,
354
- wallHeight,
355
- halfDepth,
356
- -halfWidth,
357
- wallHeight,
358
- halfDepth,
359
- // Left gable
360
- -halfWidth,
361
- wallHeight,
362
- -halfDepth,
363
- -halfWidth,
364
- ridgeHeight,
365
- 0,
366
- -halfWidth,
367
- wallHeight,
368
- halfDepth,
369
- // Right gable
370
- halfWidth,
371
- wallHeight,
372
- -halfDepth,
373
- halfWidth,
392
+ export function buildRoofGhostGeometry(width, depth, wallHeight, pitchDeg, roofType, defaults = {}) {
393
+ const node = RoofSegmentNode.parse({
394
+ ...defaults,
395
+ width: Math.max(width, 0.1),
396
+ depth: Math.max(depth, 0.1),
374
397
  wallHeight,
375
- halfDepth,
376
- halfWidth,
377
- ridgeHeight,
378
- 0,
379
- ];
380
- const geometry = new BufferGeometry();
381
- geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
382
- geometry.computeVertexNormals();
383
- return geometry;
384
- }
385
- function buildRoofGhostEdges(width, depth, wallHeight, pitchDeg, roofType) {
386
- const safeWidth = Math.max(width, 0.1);
387
- const safeDepth = Math.max(depth, 0.1);
388
- const halfWidth = safeWidth / 2;
389
- const halfDepth = safeDepth / 2;
390
- const ridgeHeight = wallHeight + Math.tan((pitchDeg * Math.PI) / 180) * halfDepth;
391
- if (roofType === 'conical') {
392
- const roofHeight = Math.max(0.001, Math.tan((pitchDeg * Math.PI) / 180) * halfWidth);
393
- const cone = new THREE.ConeGeometry(halfWidth, roofHeight, 48);
394
- cone.translate(0, wallHeight + roofHeight / 2, 0);
395
- const edges = new THREE.EdgesGeometry(cone, 10);
396
- cone.dispose();
397
- return edges;
398
+ pitch: pitchDeg,
399
+ roofType,
400
+ });
401
+ const { activeRh, tanTheta } = getSegmentSlopeFrame(node);
402
+ const faces = getRoofModuleFaces({
403
+ type: node.roofType,
404
+ w: node.width,
405
+ d: node.depth,
406
+ wh: node.wallHeight,
407
+ rh: activeRh,
408
+ baseY: 0,
409
+ baseW: node.width,
410
+ baseD: node.depth,
411
+ tanTheta,
412
+ insets: {},
413
+ shapeRatios: getRoofShapeRatios(node),
414
+ dutchTopRakeThickness: node.dutchTopRakeThickness,
415
+ conicalStartAngle: node.conicalFullCircle ? 0 : node.conicalStartAngle,
416
+ conicalSweepAngle: node.conicalFullCircle ? Math.PI * 2 : node.conicalSweepAngle,
417
+ });
418
+ const positions = [];
419
+ for (const face of faces) {
420
+ if (face.length < 3)
421
+ continue;
422
+ const origin = new THREE.Vector3(face[0].x, face[0].y, face[0].z);
423
+ const normal = new THREE.Vector3();
424
+ for (let i = 1; i + 1 < face.length && normal.lengthSq() < 1e-12; i++) {
425
+ normal.crossVectors(new THREE.Vector3(face[i].x, face[i].y, face[i].z).sub(origin), new THREE.Vector3(face[i + 1].x, face[i + 1].y, face[i + 1].z).sub(origin));
426
+ }
427
+ if (normal.lengthSq() < 1e-12)
428
+ continue;
429
+ const axis = Math.abs(normal.y) >= Math.max(Math.abs(normal.x), Math.abs(normal.z))
430
+ ? 'y'
431
+ : Math.abs(normal.x) > Math.abs(normal.z)
432
+ ? 'x'
433
+ : 'z';
434
+ const contour = face.map((v) => new THREE.Vector2(axis === 'x' ? v.y : v.x, axis === 'z' ? v.y : v.z));
435
+ for (const triangle of THREE.ShapeUtils.triangulateShape(contour, [])) {
436
+ for (const index of triangle) {
437
+ const vertex = face[index];
438
+ positions.push(vertex.x, vertex.y, vertex.z);
439
+ }
440
+ }
398
441
  }
399
- const vertices = [
400
- // Base rectangle
401
- -halfWidth,
402
- wallHeight,
403
- -halfDepth,
404
- halfWidth,
405
- wallHeight,
406
- -halfDepth,
407
- halfWidth,
408
- wallHeight,
409
- -halfDepth,
410
- halfWidth,
411
- wallHeight,
412
- halfDepth,
413
- halfWidth,
414
- wallHeight,
415
- halfDepth,
416
- -halfWidth,
417
- wallHeight,
418
- halfDepth,
419
- -halfWidth,
420
- wallHeight,
421
- halfDepth,
422
- -halfWidth,
423
- wallHeight,
424
- -halfDepth,
425
- // Ridge + gable edges
426
- -halfWidth,
427
- ridgeHeight,
428
- 0,
429
- halfWidth,
430
- ridgeHeight,
431
- 0,
432
- -halfWidth,
433
- wallHeight,
434
- -halfDepth,
435
- -halfWidth,
436
- ridgeHeight,
437
- 0,
438
- -halfWidth,
439
- ridgeHeight,
440
- 0,
441
- -halfWidth,
442
- wallHeight,
443
- halfDepth,
444
- halfWidth,
445
- wallHeight,
446
- -halfDepth,
447
- halfWidth,
448
- ridgeHeight,
449
- 0,
450
- halfWidth,
451
- ridgeHeight,
452
- 0,
453
- halfWidth,
454
- wallHeight,
455
- halfDepth,
456
- ];
457
442
  const geometry = new BufferGeometry();
458
- geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
443
+ geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
444
+ geometry.computeVertexNormals();
459
445
  return geometry;
460
446
  }
461
447
  export const RoofTool = () => {
@@ -472,16 +458,16 @@ export const RoofTool = () => {
472
458
  const roofType = parsedRoofType.success ? parsedRoofType.data : 'gable';
473
459
  const footprintSourceChoice = useRoofFootprintSource((state) => state.source);
474
460
  const footprintSource = parseRoofFootprintSource(footprintSourceChoice, roofType);
475
- const previewWallHeight = typeof roofDefaults?.wallHeight === 'number' ? roofDefaults.wallHeight : DEFAULT_WALL_HEIGHT;
461
+ const previewWallHeight = typeof roofDefaults?.wallHeight === 'number'
462
+ ? roofDefaults.wallHeight
463
+ : roofType === 'conical'
464
+ ? DEFAULT_CONICAL_CURB_HEIGHT
465
+ : DEFAULT_HEEL_HEIGHT;
476
466
  const previewPitch = typeof roofDefaults?.pitch === 'number' ? roofDefaults.pitch : DEFAULT_PITCH_DEG;
477
467
  const selectedIdsRef = useRef(selectedIds);
478
468
  useEffect(() => {
479
469
  selectedIdsRef.current = selectedIds;
480
470
  }, [selectedIds]);
481
- useEffect(() => {
482
- useRoofPlacementMode.getState().setConical(roofType === 'conical');
483
- return () => useRoofPlacementMode.getState().setConical(false);
484
- }, [roofType]);
485
471
  useEffect(() => {
486
472
  if (!currentLevelId)
487
473
  return;
@@ -505,13 +491,11 @@ export const RoofTool = () => {
505
491
  .endIf((scope) => scope.kind === 'placing' && scope.nodeId === draft.id);
506
492
  };
507
493
  }, [currentLevelId]);
508
- // Clear preset-seeded defaults on deactivation so a later manual roof draw
509
- // isn't built with a stale preset's parameters. Unmount-only.
510
- useEffect(() => () => useEditor.getState().setToolDefaults('roof', null), []);
494
+ // Each arming starts with the ridge along the long side. Unmount-only.
495
+ useEffect(() => () => useRoofRidgeMode.getState().reset(), []);
511
496
  const corner1Ref = useRef(null);
512
497
  const previousGridPosRef = useRef(null);
513
- const quarterTurnRef = useRef(false);
514
- const [quarterTurn, setQuarterTurn] = useState(false);
498
+ const ridgeMode = useRoofRidgeMode((state) => state.mode);
515
499
  const [footprintTarget, setFootprintTarget] = useState(null);
516
500
  const previewTargetIdRef = useRef(null);
517
501
  const [previewedConicalWallId, setPreviewedConicalWallId] = useState(null);
@@ -531,41 +515,23 @@ export const RoofTool = () => {
531
515
  if (!currentLevelId)
532
516
  return;
533
517
  outlineRef.current.geometry = new BufferGeometry();
534
- useFloorplanDraftPreview.getState().setRoofDraftQuarterTurn(quarterTurnRef.current);
518
+ // The 2D draft's ridge line follows the drawn rectangle and the ridge mode.
519
+ const syncDraftRidge = (corner1, corner2) => useFloorplanDraftPreview
520
+ .getState()
521
+ .setRoofDraftQuarterTurn(ridgeQuarterTurn(Math.abs(corner2[0] - corner1[0]), Math.abs(corner2[2] - corner1[2]), useRoofRidgeMode.getState().mode));
522
+ let lastCursor = null;
535
523
  // Alignment candidates — anchors of every alignable object on the active
536
524
  // level plus the wall corners of the floor directly below, so a roof drawn
537
525
  // on the upper floor aligns to the walls beneath it. Refreshed after each
538
526
  // roof commits. Both corners of the rectangle align.
539
527
  let alignmentCandidates = collectRoofAlignmentAnchors(sceneApi.nodes(), currentLevelId, roofType);
540
- // Resolve a grid:move/click into the drafted corner via the shared surface
541
- // snap pipeline: magnetic lock onto wall corners / midpoints / crossings /
542
- // bodies on the active level + floor below (raising the green beacon),
543
- // falling back to alignment guides, then to the world-grid snap. The same
544
- // path the slab/ceiling tools use, so the beacon and coloring match. The
545
- // pipeline reads the active snapping mode (grid / lines / angles / off),
546
- // so this tool never inspects the flags. `levelId` is intentionally omitted
547
- // so the explicit floor-below `walls` aren't filtered back out.
548
- const resolveDraftPoint = (event) => {
549
- const rawPoint = [event.localPosition[0], event.localPosition[2]];
550
- const gridFallback = isGridSnapActive()
551
- ? snapWorldXZForActiveBuilding(event.position[0], event.position[2], useEditor.getState().gridSnapStep).local
552
- : rawPoint;
553
- const nodes = sceneApi.nodes();
554
- return resolveSurfacePlanPointSnap({
555
- rawPoint,
556
- fallbackPoint: gridFallback,
557
- walls: getRoofSnapWalls(currentLevelId, nodes, roofType),
558
- candidates: alignmentCandidates,
559
- movingId: '__roof-draft__',
560
- highlightWalls: true,
561
- }).point;
562
- };
528
+ const resolveDraftPoint = (event) => resolveRoofDraftPoint(event, currentLevelId, sceneApi.nodes(), roofType, alignmentCandidates);
563
529
  const updateFootprintPreview = (target) => {
564
530
  setFootprintTarget((previous) => (previous?.id === target?.id ? previous : target));
565
531
  if (previewTargetIdRef.current === (target?.id ?? null))
566
532
  return;
567
533
  previewTargetIdRef.current = target?.id ?? null;
568
- setPreviewSelectedIds(target?.wallIds ?? []);
534
+ setPreviewSelectedIds(roofFootprintPreviewIds(target));
569
535
  };
570
536
  const updateOutline = (corner1, corner2) => {
571
537
  let gridY = corner1[1] + GRID_OFFSET;
@@ -574,7 +540,9 @@ export const RoofTool = () => {
574
540
  const centerZ = (corner1[2] + corner2[2]) / 2;
575
541
  const diameter = Math.max(Math.abs(corner2[0] - corner1[0]), Math.abs(corner2[2] - corner1[2]));
576
542
  const defaults = useEditor.getState().toolDefaults.roof;
577
- const curbHeight = typeof defaults?.wallHeight === 'number' ? defaults.wallHeight : DEFAULT_WALL_HEIGHT;
543
+ const curbHeight = typeof defaults?.wallHeight === 'number'
544
+ ? defaults.wallHeight
545
+ : DEFAULT_CONICAL_CURB_HEIGHT;
578
546
  const target = drawnRoofLevelTarget(sceneApi.nodes(), currentLevelId, 0, {
579
547
  center: [centerX, centerZ],
580
548
  width: diameter,
@@ -619,16 +587,20 @@ export const RoofTool = () => {
619
587
  outlineRef.current.geometry = new BufferGeometry().setFromPoints(groundPoints);
620
588
  outlineRef.current.visible = true;
621
589
  };
590
+ // In 2D-only view the plan's own roof tool owns the input (`floorplan-tool.tsx`); this tool,
591
+ // mounted behind the hidden canvas from an earlier visit, still hears the plan's grid events,
592
+ // so it must not also draft or commit (every roof would be made twice).
593
+ const planOwnsInput = () => visibleScene(useEditor.getState()) === '2d';
622
594
  const onGridMove = (event) => {
623
- if (!cursorRef.current)
595
+ if (!cursorRef.current || planOwnsInput())
624
596
  return;
625
597
  if (footprintSource !== 'draw') {
626
598
  const [snappedX, snappedZ] = resolveDraftPoint(event);
627
599
  let target = null;
628
600
  if (footprintSource === 'room') {
629
- target = resolveRoomRoofFootprint(currentLevelId, sceneApi.nodes(), [snappedX, snappedZ], {
630
- rectangularOnly: true,
631
- });
601
+ const room = pickRoofRoom(currentLevelId, sceneApi.nodes(), [snappedX, snappedZ]);
602
+ target = room.target;
603
+ useRoofFootprintSource.getState().setRoomPick(room.pick);
632
604
  updateFootprintPreview(target);
633
605
  }
634
606
  cursorRef.current.position.set(snappedX, target
@@ -658,20 +630,26 @@ export const RoofTool = () => {
658
630
  const draftPreview = useFloorplanDraftPreview.getState();
659
631
  draftPreview.setRoofDraftStart([corner1Ref.current[0], corner1Ref.current[2]]);
660
632
  draftPreview.setRoofDraftEnd([gridX, gridZ]);
633
+ syncDraftRidge(corner1Ref.current, cursorPosition);
661
634
  updateOutline(corner1Ref.current, cursorPosition);
662
635
  }
636
+ lastCursor = cursorPosition;
663
637
  };
664
638
  const onGridClick = (event) => {
665
- if (!currentLevelId)
639
+ if (!currentLevelId || planOwnsInput())
666
640
  return;
667
641
  if (footprintSource !== 'draw') {
668
642
  if (footprintSource !== 'room')
669
643
  return;
670
644
  const [snappedX, snappedZ] = resolveDraftPoint(event);
671
- const target = resolveRoomRoofFootprint(currentLevelId, sceneApi.nodes(), [snappedX, snappedZ], { rectangularOnly: true });
645
+ const { target, pick } = pickRoofRoom(currentLevelId, sceneApi.nodes(), [
646
+ snappedX,
647
+ snappedZ,
648
+ ]);
649
+ useRoofFootprintSource.getState().setRoomPick(pick);
672
650
  if (!target)
673
651
  return;
674
- const roofId = commitRoofFootprint(sceneApi, currentLevelId, target, quarterTurnRef.current);
652
+ const roofId = commitRoofFootprint(sceneApi, currentLevelId, target, useRoofRidgeMode.getState().mode);
675
653
  if (roofId)
676
654
  selectNode(roofId);
677
655
  return;
@@ -679,7 +657,7 @@ export const RoofTool = () => {
679
657
  const [gridX, gridZ] = resolveDraftPoint(event);
680
658
  const y = event.localPosition[1];
681
659
  if (corner1Ref.current) {
682
- const roofId = commitRoofPlacement(sceneApi, currentLevelId, corner1Ref.current, [gridX, y, gridZ], selectedIdsRef.current, quarterTurnRef.current, useRoofPlacementMode.getState().mode);
660
+ const roofId = commitRoofPlacement(sceneApi, currentLevelId, corner1Ref.current, [gridX, y, gridZ], selectedIdsRef.current, useRoofRidgeMode.getState().mode, useRoofPlacementMode.getState().mode);
683
661
  if (!roofId)
684
662
  return;
685
663
  selectNode(roofId);
@@ -703,21 +681,32 @@ export const RoofTool = () => {
703
681
  }));
704
682
  }
705
683
  };
684
+ const dropCorner = () => {
685
+ corner1Ref.current = null;
686
+ outlineRef.current.visible = false;
687
+ setPreview((prev) => ({ ...prev, corner1: null }));
688
+ };
689
+ // A corner opened before the view went 2D-only would end the next rectangle drawn back in
690
+ // split view. The plan's tool clears the shared draft as it takes over.
691
+ const unsubscribeView = useEditor.subscribe((state) => {
692
+ if (corner1Ref.current && visibleScene(state) === '2d')
693
+ dropCorner();
694
+ });
706
695
  const onCancel = () => {
707
696
  if (corner1Ref.current) {
708
697
  markToolCancelConsumed();
709
- corner1Ref.current = null;
698
+ dropCorner();
710
699
  const draftPreview = useFloorplanDraftPreview.getState();
711
700
  draftPreview.setRoofDraftStart(null);
712
701
  draftPreview.setRoofDraftEnd(null);
713
- outlineRef.current.visible = false;
714
- setPreview((prev) => ({ ...prev, corner1: null }));
715
702
  }
716
703
  clearSurfacePlanSnapFeedback();
717
704
  previewTargetIdRef.current = null;
718
705
  setPreviewSelectedIds([]);
719
706
  };
720
707
  const onKeyDown = (event) => {
708
+ if (planOwnsInput())
709
+ return;
721
710
  if (event.target instanceof HTMLInputElement ||
722
711
  event.target instanceof HTMLTextAreaElement ||
723
712
  (event.target instanceof HTMLElement && event.target.isContentEditable)) {
@@ -743,12 +732,14 @@ export const RoofTool = () => {
743
732
  return;
744
733
  }
745
734
  event.preventDefault();
746
- const nextQuarterTurn = !quarterTurnRef.current;
747
- quarterTurnRef.current = nextQuarterTurn;
748
- setQuarterTurn(nextQuarterTurn);
749
- useFloorplanDraftPreview.getState().setRoofDraftQuarterTurn(nextQuarterTurn);
735
+ useRoofRidgeMode.getState().toggle();
750
736
  triggerSFX('sfx:item-rotate');
751
737
  };
738
+ // The HUD chip flips the mode too; either way the 2D draft follows.
739
+ const unsubscribeRidgeMode = useRoofRidgeMode.subscribe(() => {
740
+ if (corner1Ref.current && lastCursor)
741
+ syncDraftRidge(corner1Ref.current, lastCursor);
742
+ });
752
743
  emitter.on('grid:move', onGridMove);
753
744
  emitter.on('grid:click', onGridClick);
754
745
  emitter.on('tool:cancel', onCancel);
@@ -788,11 +779,14 @@ export const RoofTool = () => {
788
779
  emitter.off('wall:leave', onWallLeave);
789
780
  unsubscribeConicalRoofWallClicks();
790
781
  window.removeEventListener('keydown', onKeyDown);
782
+ unsubscribeRidgeMode();
783
+ unsubscribeView();
791
784
  clearSurfacePlanSnapFeedback();
792
785
  previewTargetIdRef.current = null;
793
786
  setPreviewedConicalWallId(null);
794
787
  setInvalidStandardWallHover(false);
795
788
  setPreviewSelectedIds([]);
789
+ useRoofFootprintSource.getState().setRoomPick(null);
796
790
  corner1Ref.current = null;
797
791
  const draftPreview = useFloorplanDraftPreview.getState();
798
792
  draftPreview.setRoofDraftStart(null);
@@ -869,7 +863,8 @@ export const RoofTool = () => {
869
863
  arc.center.x,
870
864
  currentLevelId
871
865
  ? resolveRoofWallTopWorldElevation(currentLevelId, wall, nodes)
872
- : getWallBaseElevationForNodes(wall, nodes) + getWallEffectiveHeightForNodes(wall, nodes),
866
+ : getWallBaseElevationForNodes(wall, nodes) +
867
+ getWallEffectiveHeightForNodes(wall, nodes, 0),
873
868
  arc.center.y,
874
869
  ],
875
870
  };
@@ -899,33 +894,19 @@ export const RoofTool = () => {
899
894
  !resolvedPreviewDimensions ||
900
895
  (roofType === 'conical' && footprintSource !== 'draw'))
901
896
  return null;
902
- const placement = resolveRoofDraftPlacement(resolvedPreviewDimensions.length, resolvedPreviewDimensions.width, quarterTurn, 0, roofType);
903
- return buildRoofGhostGeometry(placement.width, placement.depth, ghostWallHeight, previewPitch, roofType);
904
- }, [
905
- footprintSource,
906
- ghostWallHeight,
907
- invalidStandardWallHover,
908
- previewPitch,
909
- quarterTurn,
910
- resolvedPreviewDimensions,
911
- roofType,
912
- ]);
913
- const roofGhostEdges = useMemo(() => {
914
- if (invalidStandardWallHover ||
915
- !resolvedPreviewDimensions ||
916
- (roofType === 'conical' && footprintSource !== 'draw'))
917
- return null;
918
- const placement = resolveRoofDraftPlacement(resolvedPreviewDimensions.length, resolvedPreviewDimensions.width, quarterTurn, 0, roofType);
919
- return buildRoofGhostEdges(placement.width, placement.depth, ghostWallHeight, previewPitch, roofType);
897
+ const placement = resolveRoofDraftPlacement(resolvedPreviewDimensions.length, resolvedPreviewDimensions.width, ridgeMode, 0, roofType);
898
+ return buildRoofGhostGeometry(placement.width, placement.depth, ghostWallHeight, previewPitch, roofType, roofDefaults);
920
899
  }, [
921
900
  footprintSource,
922
901
  ghostWallHeight,
923
902
  invalidStandardWallHover,
924
903
  previewPitch,
925
- quarterTurn,
904
+ ridgeMode,
926
905
  resolvedPreviewDimensions,
927
906
  roofType,
907
+ roofDefaults,
928
908
  ]);
909
+ const roofGhostEdges = useMemo(() => (roofGhostGeometry ? new THREE.EdgesGeometry(roofGhostGeometry, 10) : null), [roofGhostGeometry]);
929
910
  useEffect(() => {
930
911
  if (invalidStandardWallHover)
931
912
  outlineRef.current.visible = false;
@@ -954,7 +935,10 @@ export const RoofTool = () => {
954
935
  ], rotation: [
955
936
  0,
956
937
  (footprintSource !== 'draw' ? (footprintTarget?.rotation ?? 0) : 0) +
957
- (roofType === 'conical' ? 0 : quarterTurn ? Math.PI / 2 : 0),
938
+ (roofType !== 'conical' &&
939
+ ridgeQuarterTurn(resolvedPreviewDimensions.length, resolvedPreviewDimensions.width, ridgeMode)
940
+ ? Math.PI / 2
941
+ : 0),
958
942
  0,
959
943
  ], children: [roofGhostGeometry && (_jsx("mesh", { geometry: roofGhostGeometry, layers: EDITOR_LAYER, renderOrder: 1, children: _jsx("meshBasicMaterial", { color: ghostColor, depthTest: false, depthWrite: false, opacity: 0.16, side: DoubleSide, transparent: true }) })), roofGhostEdges && (_jsx("lineSegments", { geometry: roofGhostEdges, layers: EDITOR_LAYER, renderOrder: 2, children: _jsx("lineBasicMaterial", { color: ghostColor, depthTest: false, depthWrite: false, opacity: 0.5, transparent: true }) }))] }))] }));
960
944
  };