@pascal-app/nodes 1.0.6 → 1.0.7

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 (566) hide show
  1. package/README.md +1 -0
  2. package/dist/beam/actions/move-endpoint.d.ts +24 -0
  3. package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
  4. package/dist/beam/actions/move-endpoint.js +54 -0
  5. package/dist/beam/definition.d.ts +14 -0
  6. package/dist/beam/definition.d.ts.map +1 -0
  7. package/dist/beam/definition.js +173 -0
  8. package/dist/beam/draft-settings.d.ts +17 -0
  9. package/dist/beam/draft-settings.d.ts.map +1 -0
  10. package/dist/beam/draft-settings.js +81 -0
  11. package/dist/beam/drafting.d.ts +35 -0
  12. package/dist/beam/drafting.d.ts.map +1 -0
  13. package/dist/beam/drafting.js +103 -0
  14. package/dist/beam/floorplan-affordances.d.ts +8 -0
  15. package/dist/beam/floorplan-affordances.d.ts.map +1 -0
  16. package/dist/beam/floorplan-affordances.js +40 -0
  17. package/dist/beam/floorplan-move.d.ts +11 -0
  18. package/dist/beam/floorplan-move.d.ts.map +1 -0
  19. package/dist/beam/floorplan-move.js +54 -0
  20. package/dist/beam/floorplan.d.ts +11 -0
  21. package/dist/beam/floorplan.d.ts.map +1 -0
  22. package/dist/beam/floorplan.js +91 -0
  23. package/dist/beam/geometry.d.ts +19 -0
  24. package/dist/beam/geometry.d.ts.map +1 -0
  25. package/dist/beam/geometry.js +63 -0
  26. package/dist/beam/index.d.ts +3 -0
  27. package/dist/beam/index.d.ts.map +1 -0
  28. package/dist/beam/index.js +2 -0
  29. package/dist/beam/move-endpoint-tool.d.ts +21 -0
  30. package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
  31. package/dist/beam/move-endpoint-tool.js +49 -0
  32. package/dist/beam/move-tool.d.ts +12 -0
  33. package/dist/beam/move-tool.d.ts.map +1 -0
  34. package/dist/beam/move-tool.js +114 -0
  35. package/dist/beam/panel-model.d.ts +28 -0
  36. package/dist/beam/panel-model.d.ts.map +1 -0
  37. package/dist/beam/panel-model.js +123 -0
  38. package/dist/beam/panel.d.ts +13 -0
  39. package/dist/beam/panel.d.ts.map +1 -0
  40. package/dist/beam/panel.js +107 -0
  41. package/dist/beam/parametrics.d.ts +3 -0
  42. package/dist/beam/parametrics.d.ts.map +1 -0
  43. package/dist/beam/parametrics.js +4 -0
  44. package/dist/beam/renderer.d.ts +13 -0
  45. package/dist/beam/renderer.d.ts.map +1 -0
  46. package/dist/beam/renderer.js +36 -0
  47. package/dist/beam/schema.d.ts +2 -0
  48. package/dist/beam/schema.d.ts.map +1 -0
  49. package/dist/beam/schema.js +1 -0
  50. package/dist/beam/tool.d.ts +13 -0
  51. package/dist/beam/tool.d.ts.map +1 -0
  52. package/dist/beam/tool.js +152 -0
  53. package/dist/box-vent/panel.d.ts.map +1 -1
  54. package/dist/box-vent/panel.js +8 -7
  55. package/dist/cabinet/batchable.d.ts +10 -0
  56. package/dist/cabinet/batchable.d.ts.map +1 -0
  57. package/dist/cabinet/batchable.js +12 -0
  58. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  59. package/dist/cabinet/compartment-card.js +142 -46
  60. package/dist/cabinet/countertop-layout.d.ts +5 -0
  61. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  62. package/dist/cabinet/definition.d.ts.map +1 -1
  63. package/dist/cabinet/definition.js +3 -0
  64. package/dist/cabinet/dimension-input.d.ts +6 -0
  65. package/dist/cabinet/dimension-input.d.ts.map +1 -0
  66. package/dist/cabinet/dimension-input.js +8 -0
  67. package/dist/cabinet/essential-controls.d.ts.map +1 -1
  68. package/dist/cabinet/essential-controls.js +82 -17
  69. package/dist/cabinet/index.d.ts +1 -1
  70. package/dist/cabinet/index.d.ts.map +1 -1
  71. package/dist/cabinet/index.js +1 -1
  72. package/dist/cabinet/kitchen-catalog.d.ts +17 -4
  73. package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
  74. package/dist/cabinet/kitchen-catalog.js +45 -7
  75. package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
  76. package/dist/cabinet/kitchen-collection.js +21 -5
  77. package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
  78. package/dist/cabinet/kitchen-module-actions.js +107 -14
  79. package/dist/cabinet/neighbor-placement.d.ts +10 -0
  80. package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
  81. package/dist/cabinet/panel.d.ts.map +1 -1
  82. package/dist/cabinet/panel.js +127 -50
  83. package/dist/cabinet/run-finishing.d.ts +5 -0
  84. package/dist/cabinet/run-finishing.d.ts.map +1 -1
  85. package/dist/cabinet/run-ops.d.ts +5 -0
  86. package/dist/cabinet/run-ops.d.ts.map +1 -1
  87. package/dist/cabinet/run-panel.d.ts.map +1 -1
  88. package/dist/cabinet/run-panel.js +203 -52
  89. package/dist/cabinet/tool.d.ts.map +1 -1
  90. package/dist/cabinet/tool.js +8 -5
  91. package/dist/ceiling/build-up-section.d.ts +7 -0
  92. package/dist/ceiling/build-up-section.d.ts.map +1 -0
  93. package/dist/ceiling/build-up-section.js +57 -0
  94. package/dist/ceiling/definition.d.ts.map +1 -1
  95. package/dist/ceiling/definition.js +3 -1
  96. package/dist/ceiling/floorplan-affordances.d.ts +112 -0
  97. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  98. package/dist/ceiling/materials.d.ts +5 -0
  99. package/dist/ceiling/materials.d.ts.map +1 -1
  100. package/dist/ceiling/materials.js +17 -0
  101. package/dist/ceiling/panel-model.d.ts +13 -0
  102. package/dist/ceiling/panel-model.d.ts.map +1 -0
  103. package/dist/ceiling/panel-model.js +49 -0
  104. package/dist/ceiling/panel.d.ts.map +1 -1
  105. package/dist/ceiling/panel.js +82 -18
  106. package/dist/ceiling/renderer.d.ts.map +1 -1
  107. package/dist/ceiling/renderer.js +10 -4
  108. package/dist/ceiling/tool.d.ts.map +1 -1
  109. package/dist/ceiling/tool.js +24 -4
  110. package/dist/chimney/panel.d.ts.map +1 -1
  111. package/dist/chimney/panel.js +113 -41
  112. package/dist/column/definition.d.ts.map +1 -1
  113. package/dist/column/definition.js +3 -0
  114. package/dist/column/floorplan.d.ts.map +1 -1
  115. package/dist/column/floorplan.js +17 -0
  116. package/dist/column/hosted-resize.d.ts +28 -1
  117. package/dist/column/hosted-resize.d.ts.map +1 -1
  118. package/dist/column/panel.d.ts.map +1 -1
  119. package/dist/column/panel.js +125 -37
  120. package/dist/column/post-options.d.ts +10 -0
  121. package/dist/column/post-options.d.ts.map +1 -0
  122. package/dist/column/post-options.js +71 -0
  123. package/dist/column/post-placement.d.ts +78 -0
  124. package/dist/column/post-placement.d.ts.map +1 -0
  125. package/dist/column/post-placement.js +157 -0
  126. package/dist/column/post-section.d.ts +17 -0
  127. package/dist/column/post-section.d.ts.map +1 -0
  128. package/dist/column/post-section.js +95 -0
  129. package/dist/column/post-tool.d.ts +11 -0
  130. package/dist/column/post-tool.d.ts.map +1 -0
  131. package/dist/column/post-tool.js +94 -0
  132. package/dist/column/tool.d.ts +3 -10
  133. package/dist/column/tool.d.ts.map +1 -1
  134. package/dist/column/tool.js +13 -1
  135. package/dist/cupola/panel.d.ts.map +1 -1
  136. package/dist/cupola/panel.js +14 -7
  137. package/dist/door/actions.d.ts +7 -0
  138. package/dist/door/actions.d.ts.map +1 -0
  139. package/dist/door/actions.js +32 -0
  140. package/dist/door/contextual-dimensions.d.ts.map +1 -1
  141. package/dist/door/contextual-dimensions.js +11 -1
  142. package/dist/door/definition.d.ts.map +1 -1
  143. package/dist/door/definition.js +34 -7
  144. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  145. package/dist/door/floorplan-affordances.js +5 -2
  146. package/dist/door/floorplan-move.d.ts.map +1 -1
  147. package/dist/door/floorplan-move.js +28 -6
  148. package/dist/door/floorplan.d.ts +2 -0
  149. package/dist/door/floorplan.d.ts.map +1 -1
  150. package/dist/door/floorplan.js +89 -16
  151. package/dist/door/move-tool.d.ts.map +1 -1
  152. package/dist/door/move-tool.js +60 -16
  153. package/dist/door/paint.d.ts +2 -7
  154. package/dist/door/paint.d.ts.map +1 -1
  155. package/dist/door/paint.js +26 -2
  156. package/dist/door/panel.d.ts.map +1 -1
  157. package/dist/door/panel.js +242 -90
  158. package/dist/door/parametrics.js +1 -1
  159. package/dist/door/placement.d.ts.map +1 -1
  160. package/dist/door/placement.js +9 -2
  161. package/dist/door/swing.d.ts +22 -0
  162. package/dist/door/swing.d.ts.map +1 -0
  163. package/dist/door/swing.js +36 -0
  164. package/dist/door/tool.d.ts.map +1 -1
  165. package/dist/door/tool.js +76 -29
  166. package/dist/dormer/panel-actions-section.d.ts.map +1 -1
  167. package/dist/dormer/panel-actions-section.js +3 -1
  168. package/dist/dormer/panel-position-section.d.ts.map +1 -1
  169. package/dist/dormer/panel-position-section.js +4 -3
  170. package/dist/dormer/panel-windows-section.d.ts.map +1 -1
  171. package/dist/dormer/panel-windows-section.js +38 -1
  172. package/dist/dormer/panel.d.ts.map +1 -1
  173. package/dist/dormer/panel.js +24 -18
  174. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  175. package/dist/downspout/inspector-editors.js +3 -2
  176. package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
  177. package/dist/duct-fitting/inspector-editors.js +6 -1
  178. package/dist/duct-fitting/tool.d.ts.map +1 -1
  179. package/dist/duct-fitting/tool.js +11 -2
  180. package/dist/duct-terminal/tool.d.ts.map +1 -1
  181. package/dist/duct-terminal/tool.js +11 -2
  182. package/dist/elevator/panel.d.ts.map +1 -1
  183. package/dist/elevator/panel.js +41 -18
  184. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  185. package/dist/eyebrow-vent/panel.js +16 -6
  186. package/dist/fence/drafting.d.ts +2 -3
  187. package/dist/fence/drafting.d.ts.map +1 -1
  188. package/dist/fence/drafting.js +2 -3
  189. package/dist/fence/inspector-editors.d.ts.map +1 -1
  190. package/dist/fence/inspector-editors.js +64 -21
  191. package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
  192. package/dist/fence/move-endpoint-tool.js +11 -2
  193. package/dist/fence/system.d.ts.map +1 -1
  194. package/dist/fence/system.js +13 -0
  195. package/dist/fence-feature/actions.d.ts.map +1 -1
  196. package/dist/fence-feature/actions.js +5 -2
  197. package/dist/fence-feature/inspector.d.ts.map +1 -1
  198. package/dist/fence-feature/inspector.js +150 -34
  199. package/dist/fence-feature/move-session.d.ts +1 -1
  200. package/dist/floor-opening/floorplan.d.ts +29 -6
  201. package/dist/floor-opening/floorplan.d.ts.map +1 -1
  202. package/dist/floor-opening/floorplan.js +172 -14
  203. package/dist/gutter/downspouts-panel.d.ts.map +1 -1
  204. package/dist/gutter/downspouts-panel.js +14 -2
  205. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  206. package/dist/hvac-equipment/tool.js +3 -2
  207. package/dist/i18n/definition-messages.d.ts +5 -0
  208. package/dist/i18n/definition-messages.d.ts.map +1 -0
  209. package/dist/i18n/definition-messages.js +771 -0
  210. package/dist/index.d.ts +4 -1
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +6 -1
  213. package/dist/item/authored-params.d.ts.map +1 -1
  214. package/dist/item/authored-params.js +19 -4
  215. package/dist/item/floorplan.d.ts +1 -1
  216. package/dist/item/floorplan.d.ts.map +1 -1
  217. package/dist/item/panel.d.ts.map +1 -1
  218. package/dist/item/panel.js +9 -7
  219. package/dist/liquid-line/tool.d.ts.map +1 -1
  220. package/dist/liquid-line/tool.js +10 -3
  221. package/dist/measurement/tool.d.ts +1 -1
  222. package/dist/measurement/tool.d.ts.map +1 -1
  223. package/dist/measurement/tool.js +8 -8
  224. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  225. package/dist/pipe-fitting/tool.js +3 -2
  226. package/dist/pipe-trap/tool.d.ts.map +1 -1
  227. package/dist/pipe-trap/tool.js +7 -2
  228. package/dist/procedural-item/renderer.d.ts.map +1 -1
  229. package/dist/procedural-item/renderer.js +8 -1
  230. package/dist/ridge-vent/panel.d.ts.map +1 -1
  231. package/dist/ridge-vent/panel.js +22 -9
  232. package/dist/roof/barrel-panel.d.ts.map +1 -1
  233. package/dist/roof/barrel-panel.js +7 -3
  234. package/dist/roof/definition.d.ts.map +1 -1
  235. package/dist/roof/definition.js +33 -3
  236. package/dist/roof/floorplan-overrides.d.ts +22 -0
  237. package/dist/roof/floorplan-overrides.d.ts.map +1 -0
  238. package/dist/roof/floorplan-overrides.js +46 -0
  239. package/dist/roof/floorplan-tool.d.ts +9 -0
  240. package/dist/roof/floorplan-tool.d.ts.map +1 -0
  241. package/dist/roof/floorplan-tool.js +168 -0
  242. package/dist/roof/floorplan.d.ts.map +1 -1
  243. package/dist/roof/floorplan.js +131 -41
  244. package/dist/roof/glazing-controls.d.ts +2 -1
  245. package/dist/roof/glazing-controls.d.ts.map +1 -1
  246. package/dist/roof/glazing-controls.js +51 -13
  247. package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
  248. package/dist/roof/glazing-panel-editor.js +40 -13
  249. package/dist/roof/glazing-panel.d.ts.map +1 -1
  250. package/dist/roof/glazing-panel.js +73 -9
  251. package/dist/roof/paint.d.ts +19 -0
  252. package/dist/roof/paint.d.ts.map +1 -0
  253. package/dist/roof/paint.js +158 -0
  254. package/dist/roof/panel.d.ts.map +1 -1
  255. package/dist/roof/panel.js +90 -22
  256. package/dist/roof/renderer.d.ts.map +1 -1
  257. package/dist/roof/renderer.js +13 -2
  258. package/dist/roof/roof-footprint-source.d.ts +17 -0
  259. package/dist/roof/roof-footprint-source.d.ts.map +1 -1
  260. package/dist/roof/roof-footprint-source.js +14 -0
  261. package/dist/roof/roof-footprint.d.ts +36 -2
  262. package/dist/roof/roof-footprint.d.ts.map +1 -1
  263. package/dist/roof/roof-footprint.js +124 -2
  264. package/dist/roof/roof-materials.d.ts.map +1 -1
  265. package/dist/roof/roof-materials.js +10 -1
  266. package/dist/roof/roof-placement-mode.d.ts +0 -2
  267. package/dist/roof/roof-placement-mode.d.ts.map +1 -1
  268. package/dist/roof/roof-placement-mode.js +8 -6
  269. package/dist/roof/roof-plan-creases.d.ts +50 -0
  270. package/dist/roof/roof-plan-creases.d.ts.map +1 -0
  271. package/dist/roof/roof-plan-creases.js +194 -0
  272. package/dist/roof/roof-ridge-mode.d.ts +20 -0
  273. package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
  274. package/dist/roof/roof-ridge-mode.js +16 -0
  275. package/dist/roof/tool.d.ts +17 -4
  276. package/dist/roof/tool.d.ts.map +1 -1
  277. package/dist/roof/tool.js +211 -113
  278. package/dist/roof/wall-catch.d.ts +106 -0
  279. package/dist/roof/wall-catch.d.ts.map +1 -0
  280. package/dist/roof/wall-catch.js +267 -0
  281. package/dist/roof-segment/build-up-section.d.ts +9 -0
  282. package/dist/roof-segment/build-up-section.d.ts.map +1 -0
  283. package/dist/roof-segment/build-up-section.js +191 -0
  284. package/dist/roof-segment/definition.d.ts.map +1 -1
  285. package/dist/roof-segment/definition.js +50 -5
  286. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  287. package/dist/roof-segment/floorplan-affordances.js +68 -19
  288. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  289. package/dist/roof-segment/floorplan.js +16 -12
  290. package/dist/roof-segment/paint.d.ts +3 -1
  291. package/dist/roof-segment/paint.d.ts.map +1 -1
  292. package/dist/roof-segment/paint.js +43 -2
  293. package/dist/roof-segment/panel-model.d.ts +23 -0
  294. package/dist/roof-segment/panel-model.d.ts.map +1 -0
  295. package/dist/roof-segment/panel-model.js +64 -0
  296. package/dist/roof-segment/panel.d.ts.map +1 -1
  297. package/dist/roof-segment/panel.js +96 -14
  298. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  299. package/dist/roof-segment/parametrics.js +4 -0
  300. package/dist/roof-segment/renderer.d.ts.map +1 -1
  301. package/dist/roof-segment/renderer.js +26 -5
  302. package/dist/separator/definition.d.ts.map +1 -1
  303. package/dist/separator/definition.js +10 -12
  304. package/dist/separator/floorplan-affordances.d.ts +9 -0
  305. package/dist/separator/floorplan-affordances.d.ts.map +1 -0
  306. package/dist/separator/floorplan-affordances.js +23 -0
  307. package/dist/separator/floorplan.d.ts +9 -0
  308. package/dist/separator/floorplan.d.ts.map +1 -0
  309. package/dist/separator/floorplan.js +54 -0
  310. package/dist/separator/renderer.d.ts +4 -0
  311. package/dist/separator/renderer.d.ts.map +1 -1
  312. package/dist/separator/renderer.js +21 -6
  313. package/dist/separator/selection.d.ts +10 -0
  314. package/dist/separator/selection.d.ts.map +1 -0
  315. package/dist/separator/selection.js +35 -0
  316. package/dist/shared/build-up-controls.d.ts +88 -0
  317. package/dist/shared/build-up-controls.d.ts.map +1 -0
  318. package/dist/shared/build-up-controls.js +139 -0
  319. package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
  320. package/dist/shared/curtain-opening-limits.js +44 -14
  321. package/dist/shared/item-interaction-actions.d.ts.map +1 -1
  322. package/dist/shared/item-interaction-actions.js +11 -2
  323. package/dist/shared/layer-thickness.d.ts +2 -0
  324. package/dist/shared/layer-thickness.d.ts.map +1 -0
  325. package/dist/shared/layer-thickness.js +3 -0
  326. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  327. package/dist/shared/move-roof-tool.js +100 -5
  328. package/dist/shared/node-batch/batchable.d.ts +2 -0
  329. package/dist/shared/node-batch/batchable.d.ts.map +1 -1
  330. package/dist/shared/node-batch/batchable.js +4 -0
  331. package/dist/shared/node-batch/candidates.d.ts +21 -5
  332. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  333. package/dist/shared/node-batch/candidates.js +85 -50
  334. package/dist/shared/node-batch/system.d.ts.map +1 -1
  335. package/dist/shared/node-batch/system.js +24 -15
  336. package/dist/shared/opening-casing-move.d.ts +16 -0
  337. package/dist/shared/opening-casing-move.d.ts.map +1 -0
  338. package/dist/shared/opening-casing-move.js +33 -0
  339. package/dist/shared/opening-casing-section.d.ts +15 -0
  340. package/dist/shared/opening-casing-section.d.ts.map +1 -0
  341. package/dist/shared/opening-casing-section.js +38 -0
  342. package/dist/shared/opening-casing.d.ts +26 -0
  343. package/dist/shared/opening-casing.d.ts.map +1 -0
  344. package/dist/shared/opening-casing.js +80 -0
  345. package/dist/shared/opening-depth-position.d.ts +13 -0
  346. package/dist/shared/opening-depth-position.d.ts.map +1 -0
  347. package/dist/shared/opening-depth-position.js +34 -0
  348. package/dist/shared/opening-documentation.d.ts.map +1 -1
  349. package/dist/shared/opening-documentation.js +17 -8
  350. package/dist/shared/opening-guides-runtime.d.ts +2 -1
  351. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  352. package/dist/shared/opening-guides-runtime.js +11 -7
  353. package/dist/shared/opening-labels.d.ts +11 -0
  354. package/dist/shared/opening-labels.d.ts.map +1 -0
  355. package/dist/shared/opening-labels.js +46 -0
  356. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  357. package/dist/shared/opening-placement-dimensions.js +11 -9
  358. package/dist/shared/opening-plane-offset.d.ts +4 -3
  359. package/dist/shared/opening-plane-offset.d.ts.map +1 -1
  360. package/dist/shared/opening-plane-offset.js +7 -4
  361. package/dist/shared/opening-swap.d.ts +8 -0
  362. package/dist/shared/opening-swap.d.ts.map +1 -0
  363. package/dist/shared/opening-swap.js +18 -0
  364. package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
  365. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  366. package/dist/shared/polygon-vertex-affordance.js +65 -6
  367. package/dist/shared/roof-opening-host.d.ts +2 -1
  368. package/dist/shared/roof-opening-host.d.ts.map +1 -1
  369. package/dist/shared/roof-opening-host.js +14 -5
  370. package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
  371. package/dist/shared/roof-wall-opening-cut.js +14 -6
  372. package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
  373. package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
  374. package/dist/shared/roof-wall-opening-placement.js +6 -4
  375. package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
  376. package/dist/shared/run-hanger-inspector.js +39 -5
  377. package/dist/shared/system-check-panel.d.ts.map +1 -1
  378. package/dist/shared/system-check-panel.js +94 -15
  379. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  380. package/dist/shared/wall-attach-target.js +6 -3
  381. package/dist/shelf/definition.d.ts.map +1 -1
  382. package/dist/shelf/definition.js +2 -0
  383. package/dist/site/ground-hole.d.ts +3 -3
  384. package/dist/site/ground-hole.js +3 -3
  385. package/dist/site/ground-veil.d.ts +5 -12
  386. package/dist/site/ground-veil.d.ts.map +1 -1
  387. package/dist/site/ground-veil.js +9 -33
  388. package/dist/site/panel.d.ts.map +1 -1
  389. package/dist/site/panel.js +52 -12
  390. package/dist/site/renderer.d.ts.map +1 -1
  391. package/dist/site/renderer.js +52 -23
  392. package/dist/skylight/panel.d.ts.map +1 -1
  393. package/dist/skylight/panel.js +49 -19
  394. package/dist/slab/deck-geometry.d.ts +28 -0
  395. package/dist/slab/deck-geometry.d.ts.map +1 -0
  396. package/dist/slab/deck-geometry.js +320 -0
  397. package/dist/slab/definition.d.ts +2 -1
  398. package/dist/slab/definition.d.ts.map +1 -1
  399. package/dist/slab/definition.js +6 -1
  400. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  401. package/dist/slab/dependency-tracker.js +3 -0
  402. package/dist/slab/floorplan-affordances.d.ts +500 -0
  403. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  404. package/dist/slab/geometry.d.ts.map +1 -1
  405. package/dist/slab/geometry.js +46 -9
  406. package/dist/slab/panel.d.ts.map +1 -1
  407. package/dist/slab/panel.js +97 -21
  408. package/dist/slab/renderer.d.ts +11 -0
  409. package/dist/slab/renderer.d.ts.map +1 -0
  410. package/dist/slab/renderer.js +19 -0
  411. package/dist/slab/system.d.ts.map +1 -1
  412. package/dist/slab/system.js +12 -1
  413. package/dist/solar-panel/panel.d.ts.map +1 -1
  414. package/dist/solar-panel/panel.js +49 -14
  415. package/dist/stair/construction-controls.d.ts +3 -1
  416. package/dist/stair/construction-controls.d.ts.map +1 -1
  417. package/dist/stair/construction-controls.js +75 -12
  418. package/dist/stair/paint.d.ts +6 -0
  419. package/dist/stair/paint.d.ts.map +1 -1
  420. package/dist/stair/panel.d.ts.map +1 -1
  421. package/dist/stair/panel.js +243 -51
  422. package/dist/stair/parametrics.d.ts.map +1 -1
  423. package/dist/stair/parametrics.js +7 -0
  424. package/dist/stair/placement-defaults.d.ts +18 -0
  425. package/dist/stair/placement-defaults.d.ts.map +1 -0
  426. package/dist/stair/placement-defaults.js +27 -0
  427. package/dist/stair/railing-controls.d.ts.map +1 -1
  428. package/dist/stair/railing-controls.js +78 -18
  429. package/dist/stair/renderer.d.ts.map +1 -1
  430. package/dist/stair/renderer.js +16 -10
  431. package/dist/stair/structure-controls.d.ts +18 -0
  432. package/dist/stair/structure-controls.d.ts.map +1 -0
  433. package/dist/stair/structure-controls.js +275 -0
  434. package/dist/stair/tool.d.ts.map +1 -1
  435. package/dist/stair/tool.js +13 -9
  436. package/dist/stair/use-stair-render-data.d.ts +41 -0
  437. package/dist/stair/use-stair-render-data.d.ts.map +1 -1
  438. package/dist/stair-segment/panel.d.ts.map +1 -1
  439. package/dist/stair-segment/panel.js +65 -18
  440. package/dist/turbine-vent/panel.d.ts.map +1 -1
  441. package/dist/turbine-vent/panel.js +14 -5
  442. package/dist/unit/unit-panel.d.ts.map +1 -1
  443. package/dist/unit/unit-panel.js +28 -12
  444. package/dist/wall/actions.d.ts +1 -1
  445. package/dist/wall/actions.d.ts.map +1 -1
  446. package/dist/wall/actions.js +17 -13
  447. package/dist/wall/construction-dimensions.d.ts +6 -0
  448. package/dist/wall/construction-dimensions.d.ts.map +1 -1
  449. package/dist/wall/construction-dimensions.js +8 -0
  450. package/dist/wall/contextual-dimensions.d.ts +6 -0
  451. package/dist/wall/contextual-dimensions.d.ts.map +1 -1
  452. package/dist/wall/contextual-dimensions.js +104 -17
  453. package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
  454. package/dist/wall/curtain-opening-frame.js +6 -4
  455. package/dist/wall/curtain-wall-layout.d.ts +1 -1
  456. package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
  457. package/dist/wall/curtain-wall-layout.js +6 -4
  458. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  459. package/dist/wall/curtain-wall-materials.js +8 -3
  460. package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
  461. package/dist/wall/curtain-wall-panel.js +241 -37
  462. package/dist/wall/curve-tool.d.ts.map +1 -1
  463. package/dist/wall/curve-tool.js +2 -3
  464. package/dist/wall/definition.d.ts.map +1 -1
  465. package/dist/wall/definition.js +20 -5
  466. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  467. package/dist/wall/floorplan-affordances.js +9 -6
  468. package/dist/wall/floorplan-move.d.ts.map +1 -1
  469. package/dist/wall/floorplan-move.js +66 -16
  470. package/dist/wall/floorplan.d.ts +4 -5
  471. package/dist/wall/floorplan.d.ts.map +1 -1
  472. package/dist/wall/floorplan.js +62 -46
  473. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  474. package/dist/wall/move-endpoint-tool.js +1 -0
  475. package/dist/wall/move-tool.d.ts.map +1 -1
  476. package/dist/wall/move-tool.js +77 -12
  477. package/dist/wall/paint.d.ts +2 -2
  478. package/dist/wall/paint.d.ts.map +1 -1
  479. package/dist/wall/paint.js +11 -4
  480. package/dist/wall/panel-model.d.ts +17 -2
  481. package/dist/wall/panel-model.d.ts.map +1 -1
  482. package/dist/wall/panel-model.js +158 -18
  483. package/dist/wall/panel.d.ts +8 -0
  484. package/dist/wall/panel.d.ts.map +1 -1
  485. package/dist/wall/panel.js +228 -156
  486. package/dist/wall/parametrics.d.ts +1 -1
  487. package/dist/wall/parametrics.d.ts.map +1 -1
  488. package/dist/wall/parametrics.js +14 -1
  489. package/dist/wall/railing-wall-adapter.d.ts +7 -0
  490. package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
  491. package/dist/wall/railing-wall-adapter.js +38 -0
  492. package/dist/wall/railing-wall-floorplan.d.ts +8 -0
  493. package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
  494. package/dist/wall/railing-wall-floorplan.js +27 -0
  495. package/dist/wall/railing-wall-geometry.d.ts +12 -0
  496. package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
  497. package/dist/wall/railing-wall-geometry.js +51 -0
  498. package/dist/wall/railing-wall-guard.d.ts +81 -0
  499. package/dist/wall/railing-wall-guard.d.ts.map +1 -0
  500. package/dist/wall/railing-wall-guard.js +435 -0
  501. package/dist/wall/railing-wall-materials.d.ts +11 -0
  502. package/dist/wall/railing-wall-materials.d.ts.map +1 -0
  503. package/dist/wall/railing-wall-materials.js +31 -0
  504. package/dist/wall/railing-wall-panel-model.d.ts +30 -0
  505. package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
  506. package/dist/wall/railing-wall-panel-model.js +117 -0
  507. package/dist/wall/railing-wall-panel.d.ts +17 -0
  508. package/dist/wall/railing-wall-panel.d.ts.map +1 -0
  509. package/dist/wall/railing-wall-panel.js +42 -0
  510. package/dist/wall/rectangle-command.d.ts +79 -1
  511. package/dist/wall/rectangle-command.d.ts.map +1 -1
  512. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  513. package/dist/wall/rectangle-tool.js +2 -0
  514. package/dist/wall/renderer.d.ts.map +1 -1
  515. package/dist/wall/renderer.js +3 -1
  516. package/dist/wall/skirting-floor-gaps.d.ts +8 -0
  517. package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
  518. package/dist/wall/skirting-floor-gaps.js +36 -0
  519. package/dist/wall/system.d.ts +0 -14
  520. package/dist/wall/system.d.ts.map +1 -1
  521. package/dist/wall/system.js +6 -1
  522. package/dist/wall/tool.d.ts +16 -0
  523. package/dist/wall/tool.d.ts.map +1 -1
  524. package/dist/wall/tool.js +160 -47
  525. package/dist/wall/treatments.d.ts +3 -0
  526. package/dist/wall/treatments.d.ts.map +1 -1
  527. package/dist/wall/treatments.js +30 -7
  528. package/dist/window/actions.d.ts +7 -0
  529. package/dist/window/actions.d.ts.map +1 -0
  530. package/dist/window/actions.js +29 -0
  531. package/dist/window/definition.d.ts.map +1 -1
  532. package/dist/window/definition.js +11 -2
  533. package/dist/window/floorplan-move.d.ts.map +1 -1
  534. package/dist/window/floorplan-move.js +5 -0
  535. package/dist/window/floorplan.d.ts +2 -0
  536. package/dist/window/floorplan.d.ts.map +1 -1
  537. package/dist/window/floorplan.js +58 -1
  538. package/dist/window/mechanism.d.ts.map +1 -1
  539. package/dist/window/mechanism.js +21 -1
  540. package/dist/window/move-tool.d.ts.map +1 -1
  541. package/dist/window/move-tool.js +10 -3
  542. package/dist/window/paint.d.ts +2 -7
  543. package/dist/window/paint.d.ts.map +1 -1
  544. package/dist/window/paint.js +31 -3
  545. package/dist/window/panel.d.ts.map +1 -1
  546. package/dist/window/panel.js +311 -69
  547. package/dist/window/placement.d.ts.map +1 -1
  548. package/dist/window/placement.js +5 -1
  549. package/dist/window/swing.d.ts +13 -0
  550. package/dist/window/swing.d.ts.map +1 -0
  551. package/dist/window/swing.js +16 -0
  552. package/dist/window/tool.d.ts.map +1 -1
  553. package/dist/window/tool.js +19 -14
  554. package/dist/zone/floorplan-affordances.d.ts +136 -0
  555. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  556. package/dist/zone/quantities-panel.d.ts.map +1 -1
  557. package/dist/zone/quantities-panel.js +34 -9
  558. package/dist/zone/renderer.d.ts.map +1 -1
  559. package/dist/zone/renderer.js +9 -5
  560. package/package.json +14 -14
  561. package/dist/site/generic-foundation-geometry.d.ts +0 -16
  562. package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
  563. package/dist/site/generic-foundation-geometry.js +0 -75
  564. package/dist/site/generic-foundation.d.ts +0 -4
  565. package/dist/site/generic-foundation.d.ts.map +0 -1
  566. package/dist/site/generic-foundation.js +0 -91
package/README.md CHANGED
@@ -39,6 +39,7 @@ The built-in plugin exports `builtinAgentTools` from `@pascal-app/nodes/agent-to
39
39
  (zod-only contracts) and `builtinAgentOperations` from
40
40
  `@pascal-app/nodes/agent-operations` (headless planners). Both the inspector and
41
41
  agents execute the same finishing planner, including hosted-item support checks.
42
+
42
43
  - `kitchen_finish_run({ runId, action: 'align' | 'fill' })` aligns a run or closes
43
44
  50–150 mm wall gaps. Results apply in one undo step. Missing runs and unsupported
44
45
  hosted items return `cabinet_run_not_found` and `hosted_items_unsupported`.
@@ -0,0 +1,24 @@
1
+ import { type AnyNodeId, type DragAction } from '@pascal-app/core';
2
+ import { type WallPlanPoint } from '@pascal-app/editor';
3
+ export type MoveBeamEndpointCtx = {
4
+ beamId: AnyNodeId;
5
+ endpoint: 'start' | 'end';
6
+ levelId: string | null;
7
+ /** The end that stays put. */
8
+ fixed: WallPlanPoint;
9
+ };
10
+ export type MoveBeamEndpointDraft = {
11
+ start: WallPlanPoint;
12
+ end: WallPlanPoint;
13
+ };
14
+ /**
15
+ * A beam's end dragged in 3D, as a pure drag action:
16
+ * - **preview**: the pointer snapped as the beam tool snaps (wall faces and ends, other beams,
17
+ * post centres, the grid), angle-stepped off the end that stays; Alt places it freely.
18
+ * - **apply**: writes the ends into the scene while history is paused.
19
+ * - **commit**: refuses a beam too short to draw; otherwise reverts, resumes history and writes
20
+ * the final ends once, so the drag is one undo step.
21
+ * - **cancel**: `createDragSession` restores the beam it touched.
22
+ */
23
+ export declare const moveBeamEndpointDragAction: DragAction<MoveBeamEndpointCtx, MoveBeamEndpointDraft>;
24
+ //# sourceMappingURL=move-endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-endpoint.d.ts","sourceRoot":"","sources":["../../../src/beam/actions/move-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,UAAU,EAEhB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG5E,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,8BAA8B;IAC9B,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,aAAa,CAAA;CAAE,CAAA;AAEhF;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,UAAU,CAAC,mBAAmB,EAAE,qBAAqB,CA2C7F,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { useScene, } from '@pascal-app/core';
2
+ import { isSegmentLongEnough } from '@pascal-app/editor';
3
+ import { snapBeamPoint } from '../drafting.js';
4
+ /**
5
+ * A beam's end dragged in 3D, as a pure drag action:
6
+ * - **preview**: the pointer snapped as the beam tool snaps (wall faces and ends, other beams,
7
+ * post centres, the grid), angle-stepped off the end that stays; Alt places it freely.
8
+ * - **apply**: writes the ends into the scene while history is paused.
9
+ * - **commit**: refuses a beam too short to draw; otherwise reverts, resumes history and writes
10
+ * the final ends once, so the drag is one undo step.
11
+ * - **cancel**: `createDragSession` restores the beam it touched.
12
+ */
13
+ export const moveBeamEndpointDragAction = {
14
+ begin: (input) => {
15
+ const beam = input.node;
16
+ if (beam?.type !== 'beam')
17
+ throw new Error('[moveBeamEndpointDragAction] begin requires a beam');
18
+ const endpoint = input.handleId === 'start' ? 'start' : 'end';
19
+ return {
20
+ beamId: beam.id,
21
+ endpoint,
22
+ levelId: beam.parentId ?? null,
23
+ fixed: endpoint === 'start' ? [beam.end[0], beam.end[1]] : [beam.start[0], beam.start[1]],
24
+ };
25
+ },
26
+ preview: (ctx, point, modifiers) => {
27
+ const moved = ctx.levelId
28
+ ? snapBeamPoint({
29
+ point: [point[0], point[1]],
30
+ nodes: useScene.getState().nodes,
31
+ levelId: ctx.levelId,
32
+ start: ctx.fixed,
33
+ ignoreIds: [ctx.beamId],
34
+ free: modifiers.alt,
35
+ }).point
36
+ : [point[0], point[1]];
37
+ return ctx.endpoint === 'start'
38
+ ? { start: moved, end: ctx.fixed }
39
+ : { start: ctx.fixed, end: moved };
40
+ },
41
+ apply: (draft, ctx, scene) => {
42
+ scene.update(ctx.beamId, { start: draft.start, end: draft.end });
43
+ return [ctx.beamId];
44
+ },
45
+ commit: (draft, ctx, scene) => {
46
+ if (!(draft && isSegmentLongEnough(draft.start, draft.end)))
47
+ return false;
48
+ scene.restoreAll();
49
+ scene.resumeHistory();
50
+ scene.update(ctx.beamId, { start: draft.start, end: draft.end });
51
+ return true;
52
+ },
53
+ cancel: () => { },
54
+ };
@@ -0,0 +1,14 @@
1
+ import { type NodeDefinition } from '@pascal-app/core';
2
+ import { BeamNode } from './schema.js';
3
+ /**
4
+ * Beam — a horizontal framing member drawn by hand, end to end like a wall: a porch's header on
5
+ * its posts, a deck's beam, a girder, a beam across an open span. A box of its actual section
6
+ * along the centreline, its top stored or following the ceiling plane over it (`beamTopElevation`
7
+ * in core); the plan draws it dashed with its size, as a framing plan does. `createBeam` in core
8
+ * makes one from code.
9
+ *
10
+ * No `movable`: a beam has no `position`; it moves by both ends, through `affordanceTools.move` in
11
+ * 3D and `floorplanMoveTarget` in the plan.
12
+ */
13
+ export declare const beamDefinition: NodeDefinition<typeof BeamNode>;
14
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/beam/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AAgBzB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAwGnC;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CAkE1D,CAAA"}
@@ -0,0 +1,173 @@
1
+ import { beamPlan, beamTopElevation, } from '@pascal-app/core';
2
+ import { clearStructuralElevationGuide, FLOORPLAN_NODE_EXTENSION_KEY, PANEL_MODEL_EXTENSION, publishStructuralElevationGuide, resolveStructuralElevationSnap, } from '@pascal-app/editor';
3
+ import { useViewer } from '@pascal-app/viewer';
4
+ import { beamToolOptions } from './draft-settings.js';
5
+ import { buildBeamFloorplan } from './floorplan.js';
6
+ import { beamEndpointAffordance } from './floorplan-affordances.js';
7
+ import { beamFloorplanMoveTarget } from './floorplan-move.js';
8
+ import { beamPanelModel } from './panel-model.js';
9
+ import { beamParametrics } from './parametrics.js';
10
+ import { BeamNode } from './schema.js';
11
+ const SIDE_HANDLE_OFFSET = 0.22;
12
+ const INCH = 0.0254;
13
+ /** Where a beam's top is in the live scene (a descriptor may run before the scene has a level). */
14
+ function topOf(beam, sceneApi) {
15
+ return beamTopElevation(sceneApi?.nodes() ?? {}, beam);
16
+ }
17
+ function midFrame(beam) {
18
+ const plan = beamPlan(beam);
19
+ return {
20
+ mid: [(plan.start[0] + plan.end[0]) / 2, (plan.start[1] + plan.end[1]) / 2],
21
+ normal: plan.normal,
22
+ };
23
+ }
24
+ /** The beam's top, as the elevation guides read a structural datum. */
25
+ function guideSource(beam) {
26
+ const { mid } = midFrame(beam);
27
+ return { nodeId: beam.id, levelId: beam.parentId, anchor: mid };
28
+ }
29
+ // Side arrows: a tap hands the beam to its move tool, either side of its middle at mid-depth.
30
+ function beamSideMoveHandle(side) {
31
+ return {
32
+ kind: 'tap-action',
33
+ onActivate: (node, _scene, editor) => editor.engageMove(node),
34
+ placement: {
35
+ position: (n, sceneApi) => {
36
+ const { mid, normal } = midFrame(n);
37
+ const offset = (n.width / 2 + SIDE_HANDLE_OFFSET) * side;
38
+ return [
39
+ mid[0] + normal[0] * offset,
40
+ topOf(n, sceneApi) - n.depth / 2,
41
+ mid[1] + normal[1] * offset,
42
+ ];
43
+ },
44
+ rotationY: (n) => {
45
+ const { normal } = midFrame(n);
46
+ return Math.atan2(-normal[1] * side, normal[0] * side);
47
+ },
48
+ },
49
+ cursor: 'ew-resize',
50
+ };
51
+ }
52
+ // End pickers: a dashed leader down the beam's depth and a disc at its end; a tap drags the end.
53
+ function beamEndPicker(endpoint) {
54
+ return {
55
+ kind: 'tap-action',
56
+ shape: 'corner-picker',
57
+ cursor: 'move',
58
+ nodeHeight: (n) => n.depth,
59
+ onActivate: (node, _scene, editor) => editor.engageEndpointMove(node, endpoint),
60
+ placement: {
61
+ position: (n, sceneApi) => {
62
+ const point = n[endpoint];
63
+ return [point[0], topOf(n, sceneApi) - n.depth, point[1]];
64
+ },
65
+ },
66
+ };
67
+ }
68
+ /**
69
+ * The beam's top, dragged up and down: it stores the top it lands on, caught by the levels'
70
+ * structural heights (a ceiling plane, a slab top) and otherwise to the half inch (the centimetre
71
+ * on a metric plan).
72
+ */
73
+ function beamTopHandle(current) {
74
+ return {
75
+ kind: 'linear-resize',
76
+ axis: 'y',
77
+ anchor: 'min',
78
+ shape: 'tracker',
79
+ currentValue: () => current,
80
+ magneticSnap: (n, value, sceneApi) => {
81
+ const snapped = resolveStructuralElevationSnap(guideSource(n), value, sceneApi.nodes());
82
+ if (snapped !== value)
83
+ return snapped;
84
+ const step = useViewer.getState().unit === 'imperial' ? INCH / 2 : 0.01;
85
+ return Math.round(value / step) * step;
86
+ },
87
+ onDrag: (n, sceneApi) => publishStructuralElevationGuide(guideSource(n), topOf(n, sceneApi), sceneApi.nodes()),
88
+ onDragEnd: (n) => clearStructuralElevationGuide(n.id),
89
+ apply: (_n, top) => ({ topElevation: top }),
90
+ placement: {
91
+ position: (n, sceneApi) => {
92
+ const { mid } = midFrame(n);
93
+ return [mid[0], topOf(n, sceneApi), mid[1]];
94
+ },
95
+ },
96
+ };
97
+ }
98
+ const beamHandles = (node, sceneApi) => [
99
+ beamSideMoveHandle(1),
100
+ beamSideMoveHandle(-1),
101
+ beamEndPicker('start'),
102
+ beamEndPicker('end'),
103
+ beamTopHandle(topOf(node, sceneApi)),
104
+ ];
105
+ /**
106
+ * Beam — a horizontal framing member drawn by hand, end to end like a wall: a porch's header on
107
+ * its posts, a deck's beam, a girder, a beam across an open span. A box of its actual section
108
+ * along the centreline, its top stored or following the ceiling plane over it (`beamTopElevation`
109
+ * in core); the plan draws it dashed with its size, as a framing plan does. `createBeam` in core
110
+ * makes one from code.
111
+ *
112
+ * No `movable`: a beam has no `position`; it moves by both ends, through `affordanceTools.move` in
113
+ * 3D and `floorplanMoveTarget` in the plan.
114
+ */
115
+ export const beamDefinition = {
116
+ kind: 'beam',
117
+ snapProfile: 'structural',
118
+ schemaVersion: 1,
119
+ schema: BeamNode,
120
+ category: 'structure',
121
+ extensions: {
122
+ [FLOORPLAN_NODE_EXTENSION_KEY]: {
123
+ // In 2D-only view the 3D tool never mounts: the plan drafts beams itself.
124
+ tool: () => import('./tool.js').then((module) => ({ default: module.BeamFloorplanTool })),
125
+ // A beam crosses rooms: a plan click on it picks the beam, not the room.
126
+ planHitSelectsNode: true,
127
+ },
128
+ [PANEL_MODEL_EXTENSION]: beamPanelModel,
129
+ },
130
+ defaults: () => {
131
+ const { id: _id, type: _type, ...rest } = BeamNode.parse({ start: [0, 0], end: [3, 0] });
132
+ return rest;
133
+ },
134
+ capabilities: {
135
+ selectable: { hitVolume: 'bbox' },
136
+ surfaces: { hosting: false },
137
+ duplicable: true,
138
+ deletable: true,
139
+ drawTool: true,
140
+ },
141
+ // The renderer reads the scene and live overrides itself; nothing consumes a dirty mark.
142
+ dirtyTracking: false,
143
+ rendersChildren: false,
144
+ renderer: { kind: 'parametric', module: () => import('./renderer.js') },
145
+ parametrics: beamParametrics,
146
+ handles: beamHandles,
147
+ tool: () => import('./tool.js'),
148
+ toolOptions: beamToolOptions,
149
+ toolHints: [
150
+ { key: 'Left click', label: 'Set beam start / end; the next beam starts there' },
151
+ { key: 'Alt', label: 'Free place' },
152
+ { key: 'Esc', label: 'End the run' },
153
+ ],
154
+ floorplan: buildBeamFloorplan,
155
+ floorplanMoveTarget: beamFloorplanMoveTarget,
156
+ floorplanAffordances: {
157
+ 'move-endpoint': beamEndpointAffordance,
158
+ },
159
+ affordanceTools: {
160
+ move: () => import('./move-tool.js'),
161
+ 'move-endpoint': () => import('./move-endpoint-tool.js'),
162
+ },
163
+ presentation: {
164
+ label: 'Beam',
165
+ description: 'A framing beam drawn end to end: a porch header, a deck beam, a girder.',
166
+ icon: { kind: 'url', src: '/icons/beam.svg' },
167
+ paletteSection: 'structure',
168
+ paletteOrder: 72,
169
+ },
170
+ mcp: {
171
+ description: 'A horizontal framing beam: start/end centreline (level-local), actual width/depth, nominal size and plies, material, dropped or flush placement, and a top elevation (absent = under the ceiling plane).',
172
+ },
173
+ };
@@ -0,0 +1,17 @@
1
+ import { type BeamMaterial, type BeamTopReference, type ToolOption } from '@pascal-app/core';
2
+ /** What the beam tool draws with: its size, material and where its top goes. */
3
+ export type BeamDraftChoices = {
4
+ preset: string;
5
+ material: BeamMaterial;
6
+ top: BeamTopReference;
7
+ };
8
+ /**
9
+ * The beam tool's choices, kept apart from the editor's tool defaults: a host clears those when it
10
+ * arms a tool from its tile, which would forget the size just picked.
11
+ */
12
+ export declare const useBeamDraft: import("zustand").UseBoundStore<import("zustand").StoreApi<BeamDraftChoices & {
13
+ set: (patch: Partial<BeamDraftChoices>) => void;
14
+ }>>;
15
+ /** The Beam tool's rows in the Build panel: material, size, top. */
16
+ export declare const beamToolOptions: readonly ToolOption[];
17
+ //# sourceMappingURL=draft-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-settings.d.ts","sourceRoot":"","sources":["../../src/beam/draft-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAGrB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAGzB,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,GAAG,EAAE,gBAAgB,CAAA;CACtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY;SACG,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI;GAMnE,CAAA;AAsFH,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,SAAS,UAAU,EAAgD,CAAA"}
@@ -0,0 +1,81 @@
1
+ import { BEAM_MATERIAL_LABELS, BEAM_SIZE_PRESETS, BEAM_TOP_REFERENCE_LABELS, BEAM_TOP_REFERENCES, beamSizePreset, DEFAULT_BEAM_SIZE_PRESET_ID, } from '@pascal-app/core';
2
+ import { create } from 'zustand';
3
+ /**
4
+ * The beam tool's choices, kept apart from the editor's tool defaults: a host clears those when it
5
+ * arms a tool from its tile, which would forget the size just picked.
6
+ */
7
+ export const useBeamDraft = create((set) => ({
8
+ preset: DEFAULT_BEAM_SIZE_PRESET_ID,
9
+ material: 'sawn',
10
+ top: 'ceiling-dropped',
11
+ set: (patch) => set(patch),
12
+ }));
13
+ const familyOf = (material) => material === 'pressure-treated' ? 'sawn' : material;
14
+ /** The size a family starts at when its material is picked. */
15
+ const FAMILY_SIZE = {
16
+ sawn: DEFAULT_BEAM_SIZE_PRESET_ID,
17
+ lvl: '(2)lvl-1-3/4x11-7/8',
18
+ glulam: 'glulam-5-1/8x12',
19
+ steel: 'W8x10',
20
+ };
21
+ const MATERIAL_DESCRIPTIONS = {
22
+ sawn: 'A solid timber or 2x plies nailed up, inside where it stays dry',
23
+ 'pressure-treated': 'Treated sawn lumber, for a porch, a deck or anything in the weather',
24
+ lvl: 'Laminated veneer lumber: a stiff beam for a long span inside',
25
+ glulam: 'Glued-laminated timber: long spans, often left exposed',
26
+ steel: 'A steel W shape, for the longest spans',
27
+ };
28
+ const TOP_DESCRIPTIONS = {
29
+ 'ceiling-dropped': 'Hangs under the ceiling plane, the top of the walls: the joists or rafters bear on it',
30
+ 'ceiling-flush': 'In the ceiling framing, its underside on the ceiling plane: the joists hang from its sides',
31
+ 'floor-flush': 'Its top flush with the floor over it, in the floor framing',
32
+ 'floor-under': "Under the floor's framing: a girder in a crawl space, or a deck's beam under its joists",
33
+ };
34
+ const subscribe = (onChange) => useBeamDraft.subscribe(() => onChange());
35
+ /** The material row: picking another family brings its usual size along. */
36
+ const materialOption = {
37
+ id: 'beam-material',
38
+ label: 'Material',
39
+ choices: Object.keys(BEAM_MATERIAL_LABELS).map((material) => ({
40
+ value: material,
41
+ label: BEAM_MATERIAL_LABELS[material],
42
+ description: MATERIAL_DESCRIPTIONS[material],
43
+ })),
44
+ subscribe,
45
+ value: () => useBeamDraft.getState().material,
46
+ set: (value) => {
47
+ const material = value;
48
+ const preset = beamSizePreset(useBeamDraft.getState().preset);
49
+ const keeps = preset && familyOf(preset.material) === familyOf(material);
50
+ useBeamDraft
51
+ .getState()
52
+ .set({ material, ...(keeps ? {} : { preset: FAMILY_SIZE[familyOf(material)] }) });
53
+ },
54
+ };
55
+ /** One Size row per family, shown while its material is the one picked. */
56
+ const sizeOptions = ['sawn', 'lvl', 'glulam', 'steel'].map((family) => ({
57
+ id: `beam-size-${family}`,
58
+ label: 'Size',
59
+ choices: BEAM_SIZE_PRESETS.filter((preset) => familyOf(preset.material) === family).map((preset) => ({ value: preset.id, label: preset.label.replace(/ (LVL|GLB)$/, '') })),
60
+ subscribe,
61
+ value: () => useBeamDraft.getState().preset,
62
+ set: (value) => useBeamDraft.getState().set({ preset: value }),
63
+ visible: {
64
+ subscribe,
65
+ value: () => familyOf(useBeamDraft.getState().material) === family,
66
+ },
67
+ }));
68
+ const topOption = {
69
+ id: 'beam-top',
70
+ label: 'Top',
71
+ choices: BEAM_TOP_REFERENCES.map((top) => ({
72
+ value: top,
73
+ label: BEAM_TOP_REFERENCE_LABELS[top],
74
+ description: TOP_DESCRIPTIONS[top],
75
+ })),
76
+ subscribe,
77
+ value: () => useBeamDraft.getState().top,
78
+ set: (value) => useBeamDraft.getState().set({ top: value }),
79
+ };
80
+ /** The Beam tool's rows in the Build panel: material, size, top. */
81
+ export const beamToolOptions = [materialOption, ...sizeOptions, topOption];
@@ -0,0 +1,35 @@
1
+ import { type AnyNode, type AnyNodeId, BeamNode, type WallNode } from '@pascal-app/core';
2
+ import { type WallDraftSnapKind, type WallPlanPoint } from '@pascal-app/editor';
3
+ import { type BeamDraftChoices } from './draft-settings.js';
4
+ type Nodes = Readonly<Record<AnyNodeId, AnyNode>>;
5
+ /**
6
+ * What a beam drawn on `levelId` snaps to, through the wall snap (`snapWallDraftPoint`): the
7
+ * level's wall centrelines and both faces of each straight wall (so a beam end lands on a wall's
8
+ * face or its corner), other beams' centrelines (their ends, middles and runs), and every post
9
+ * and column centre (a segment of no length). Kept per scene, so a pointer move asks once.
10
+ */
11
+ export declare function beamSnapTargets(nodes: Nodes, levelId: string, ignoreIds?: readonly string[]): WallNode[];
12
+ /** A snapped plan point and what caught it (null: the grid, an angle step, or nothing). */
13
+ export type BeamPlanSnap = {
14
+ point: WallPlanPoint;
15
+ snap: WallDraftSnapKind | null;
16
+ };
17
+ /**
18
+ * A beam point snapped as the beam tool snaps: wall and beam ends, faces, middles and crossings,
19
+ * post centres, the grid, and from `start` the angle steps. `free` (Alt) places it as it is.
20
+ */
21
+ export declare function snapBeamPoint(args: {
22
+ point: WallPlanPoint;
23
+ nodes: Nodes;
24
+ levelId: string;
25
+ start?: WallPlanPoint | null;
26
+ ignoreIds?: readonly string[];
27
+ free?: boolean;
28
+ }): BeamPlanSnap;
29
+ /**
30
+ * The beam a draft makes from `start` to `end` on `levelId` with the tool's choices, its top set
31
+ * from the chosen reference; `seed` (a preset the host armed the tool with) overrides them.
32
+ */
33
+ export declare function draftBeam(start: WallPlanPoint, end: WallPlanPoint, levelId: string, nodes: Nodes, choices?: BeamDraftChoices, seed?: Readonly<Record<string, unknown>> | null, fields?: Partial<BeamNode>): BeamNode;
34
+ export {};
35
+ //# sourceMappingURL=drafting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafting.d.ts","sourceRoot":"","sources":["../../src/beam/drafting.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,QAAQ,EAIR,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,kBAAkB,CAAA;AAEtE,KAAK,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;AA0BjD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,SAAS,MAAM,EAAO,GAChC,QAAQ,EAAE,CAmCZ;AAED,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE,CAAA;AAEnF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,aAAa,CAAA;IACpB,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,GAAG,YAAY,CAaf;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,gBAA0C,EACnD,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,EAC/C,MAAM,GAAE,OAAO,CAAC,QAAQ,CAAM,GAC7B,QAAQ,CAmBV"}
@@ -0,0 +1,103 @@
1
+ import { BeamNode, beamTopReferencePatch, createBeam, getWallFaceLine, } from '@pascal-app/core';
2
+ import { getSegmentGridStep, isAngleSnapActive, isMagneticSnapActive, snapBuildingLocalToWorldGrid, snapWallDraftPointDetailed, } from '@pascal-app/editor';
3
+ import { useBeamDraft } from './draft-settings.js';
4
+ /** A segment as the wall snap reads a wall: its ends, its middle and its body catch a point. */
5
+ function reference(id, parentId, start, end) {
6
+ return {
7
+ object: 'node',
8
+ id: id,
9
+ type: 'wall',
10
+ parentId,
11
+ visible: true,
12
+ metadata: {},
13
+ children: [],
14
+ start,
15
+ end,
16
+ frontSide: 'unknown',
17
+ backSide: 'unknown',
18
+ };
19
+ }
20
+ const targetsMemo = new WeakMap();
21
+ /**
22
+ * What a beam drawn on `levelId` snaps to, through the wall snap (`snapWallDraftPoint`): the
23
+ * level's wall centrelines and both faces of each straight wall (so a beam end lands on a wall's
24
+ * face or its corner), other beams' centrelines (their ends, middles and runs), and every post
25
+ * and column centre (a segment of no length). Kept per scene, so a pointer move asks once.
26
+ */
27
+ export function beamSnapTargets(nodes, levelId, ignoreIds = []) {
28
+ const key = `${levelId}|${ignoreIds.join(',')}`;
29
+ let byKey = targetsMemo.get(nodes);
30
+ if (!byKey) {
31
+ byKey = new Map();
32
+ targetsMemo.set(nodes, byKey);
33
+ }
34
+ const cached = byKey.get(key);
35
+ if (cached)
36
+ return cached;
37
+ const targets = [];
38
+ for (const node of Object.values(nodes)) {
39
+ if (node.parentId !== levelId || node.visible === false || ignoreIds.includes(node.id))
40
+ continue;
41
+ if (node.type === 'wall') {
42
+ targets.push(node);
43
+ if (Math.abs(node.curveOffset ?? 0) > 1e-6)
44
+ continue;
45
+ for (const face of ['a', 'b']) {
46
+ const line = getWallFaceLine(node, face);
47
+ targets.push(reference(`${node.id}:${face}`, node.parentId, [line.start.x, line.start.y], [line.end.x, line.end.y]));
48
+ }
49
+ }
50
+ else if (node.type === 'beam') {
51
+ targets.push(reference(node.id, node.parentId, node.start, node.end));
52
+ }
53
+ else if (node.type === 'column') {
54
+ const centre = [node.position[0], node.position[2]];
55
+ targets.push(reference(node.id, node.parentId, centre, centre));
56
+ }
57
+ }
58
+ byKey.set(key, targets);
59
+ return targets;
60
+ }
61
+ /**
62
+ * A beam point snapped as the beam tool snaps: wall and beam ends, faces, middles and crossings,
63
+ * post centres, the grid, and from `start` the angle steps. `free` (Alt) places it as it is.
64
+ */
65
+ export function snapBeamPoint(args) {
66
+ if (args.free)
67
+ return { point: args.point, snap: null };
68
+ const step = getSegmentGridStep();
69
+ const angleSnap = !!args.start && isAngleSnapActive();
70
+ const result = snapWallDraftPointDetailed({
71
+ point: args.point,
72
+ walls: beamSnapTargets(args.nodes, args.levelId, args.ignoreIds),
73
+ start: args.start ?? undefined,
74
+ angleSnap,
75
+ magnetic: isMagneticSnapActive(),
76
+ gridSnap: (point) => snapBuildingLocalToWorldGrid(point, step),
77
+ });
78
+ return { point: result.point, snap: result.snap };
79
+ }
80
+ /**
81
+ * The beam a draft makes from `start` to `end` on `levelId` with the tool's choices, its top set
82
+ * from the chosen reference; `seed` (a preset the host armed the tool with) overrides them.
83
+ */
84
+ export function draftBeam(start, end, levelId, nodes, choices = useBeamDraft.getState(), seed, fields = {}) {
85
+ const base = createBeam({
86
+ start,
87
+ end,
88
+ preset: choices.preset,
89
+ material: choices.material,
90
+ levelId,
91
+ });
92
+ const placed = { ...base, ...beamTopReferencePatch(nodes, base, choices.top) };
93
+ return BeamNode.parse({
94
+ ...placed,
95
+ ...(seed ?? {}),
96
+ ...fields,
97
+ id: base.id,
98
+ type: 'beam',
99
+ start,
100
+ end,
101
+ parentId: levelId,
102
+ });
103
+ }
@@ -0,0 +1,8 @@
1
+ import { type BeamNode, type FloorplanAffordance } from '@pascal-app/core';
2
+ /**
3
+ * A beam's end, dragged in the plan: snapped as the beam tool snaps, angle-stepped off the other
4
+ * end. Previews through live overrides, writes the last end on release, and refuses an end that
5
+ * would leave the beam too short to draw.
6
+ */
7
+ export declare const beamEndpointAffordance: FloorplanAffordance<BeamNode>;
8
+ //# sourceMappingURL=floorplan-affordances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/beam/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAKzB;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,CAAC,QAAQ,CA8BhE,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
+ import { isSegmentLongEnough } from '@pascal-app/editor';
3
+ import { snapBeamPoint } from './drafting.js';
4
+ /**
5
+ * A beam's end, dragged in the plan: snapped as the beam tool snaps, angle-stepped off the other
6
+ * end. Previews through live overrides, writes the last end on release, and refuses an end that
7
+ * would leave the beam too short to draw.
8
+ */
9
+ export const beamEndpointAffordance = {
10
+ start({ node, payload, nodes }) {
11
+ const { endpoint } = payload;
12
+ const id = node.id;
13
+ const fixed = endpoint === 'start' ? node.end : node.start;
14
+ let last = null;
15
+ return {
16
+ affectedIds: [id],
17
+ apply({ planPoint, modifiers }) {
18
+ last = node.parentId
19
+ ? snapBeamPoint({
20
+ point: [planPoint[0], planPoint[1]],
21
+ nodes,
22
+ levelId: node.parentId,
23
+ start: fixed,
24
+ ignoreIds: [node.id],
25
+ free: modifiers.altKey,
26
+ }).point
27
+ : [planPoint[0], planPoint[1]];
28
+ useLiveNodeOverrides.getState().set(id, { [endpoint]: last });
29
+ },
30
+ canCommit() {
31
+ return last !== null && isSegmentLongEnough(fixed, last);
32
+ },
33
+ commit() {
34
+ if (last)
35
+ useScene.getState().updateNodes([{ id, data: { [endpoint]: last } }]);
36
+ useLiveNodeOverrides.getState().clear(id);
37
+ },
38
+ };
39
+ },
40
+ };
@@ -0,0 +1,11 @@
1
+ import { type BeamNode, type FloorplanMoveTarget } from '@pascal-app/core';
2
+ import { type WallPlanPoint } from '@pascal-app/editor';
3
+ /** A beam translated by `delta`, both ends together. */
4
+ export declare function movedBeamEnds(beam: Pick<BeamNode, 'start' | 'end'>, delta: WallPlanPoint): Pick<BeamNode, 'start' | 'end'>;
5
+ /**
6
+ * A beam moved in the plan: its start follows the pointer and snaps as the beam tool snaps (wall
7
+ * faces and ends, other beams, post centres, the grid); its end travels with it. Previews through
8
+ * live overrides, writes once on release.
9
+ */
10
+ export declare const beamFloorplanMoveTarget: FloorplanMoveTarget<BeamNode>;
11
+ //# sourceMappingURL=floorplan-move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/beam/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAInE,wDAAwD;AACxD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,KAAK,EAAE,aAAa,GACnB,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,CAKjC;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,QAAQ,CAqCjE,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
+ import { triggerSFX } from '@pascal-app/editor';
3
+ import { useViewer } from '@pascal-app/viewer';
4
+ import { snapBeamPoint } from './drafting.js';
5
+ /** A beam translated by `delta`, both ends together. */
6
+ export function movedBeamEnds(beam, delta) {
7
+ return {
8
+ start: [beam.start[0] + delta[0], beam.start[1] + delta[1]],
9
+ end: [beam.end[0] + delta[0], beam.end[1] + delta[1]],
10
+ };
11
+ }
12
+ /**
13
+ * A beam moved in the plan: its start follows the pointer and snaps as the beam tool snaps (wall
14
+ * faces and ends, other beams, post centres, the grid); its end travels with it. Previews through
15
+ * live overrides, writes once on release.
16
+ */
17
+ export const beamFloorplanMoveTarget = ({ node, nodes }) => {
18
+ const id = node.id;
19
+ const origin = [node.start[0], node.start[1]];
20
+ let anchor = null;
21
+ let delta = [0, 0];
22
+ return {
23
+ affectedIds: [id],
24
+ apply({ planPoint, modifiers }) {
25
+ if (!anchor) {
26
+ anchor = [planPoint[0], planPoint[1]];
27
+ return;
28
+ }
29
+ const at = node.parentId
30
+ ? snapBeamPoint({
31
+ point: [origin[0] + planPoint[0] - anchor[0], origin[1] + planPoint[1] - anchor[1]],
32
+ nodes,
33
+ levelId: node.parentId,
34
+ ignoreIds: [node.id],
35
+ free: modifiers.altKey,
36
+ }).point
37
+ : origin;
38
+ const next = [at[0] - origin[0], at[1] - origin[1]];
39
+ if (next[0] === delta[0] && next[1] === delta[1])
40
+ return;
41
+ delta = next;
42
+ triggerSFX('sfx:grid-snap');
43
+ useLiveNodeOverrides.getState().set(id, movedBeamEnds(node, delta));
44
+ },
45
+ canCommit() {
46
+ return delta[0] !== 0 || delta[1] !== 0;
47
+ },
48
+ commit() {
49
+ useScene.getState().updateNodes([{ id, data: movedBeamEnds(node, delta) }]);
50
+ useLiveNodeOverrides.getState().clear(id);
51
+ useViewer.getState().setSelection({ selectedIds: [id] });
52
+ },
53
+ };
54
+ };