@pascal-app/nodes 1.0.5 → 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
@@ -0,0 +1,11 @@
1
+ import { type BeamNode, type FloorplanGeometry, type GeometryContext } from '@pascal-app/core';
2
+ export type BeamEndpointPayload = {
3
+ endpoint: 'start' | 'end';
4
+ };
5
+ /**
6
+ * A beam in the plan, the way a framing plan draws one: its width as a dashed double outline and
7
+ * its size beside it ("6x8", "(2) 2x10"), over a clear hit area. Selected, it gets its end handles,
8
+ * a move arrow either side and its length.
9
+ */
10
+ export declare function buildBeamFloorplan(node: BeamNode, ctx: GeometryContext): FloorplanGeometry | null;
11
+ //# sourceMappingURL=floorplan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/beam/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAIb,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA;AAazB,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;CAAE,CAAA;AAE/D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAoFjG"}
@@ -0,0 +1,91 @@
1
+ import { beamOutline, beamPlan, beamSizeLabel, } from '@pascal-app/core';
2
+ import { floorplanGeometryMetadata, formatLinearMeasurement, readFloorplanMetricNotationOverride, } from '@pascal-app/editor';
3
+ /** Hidden work: a beam is over the plan's cut, so it is drawn dashed, as a framing plan draws it. */
4
+ const HIDDEN_DASH = '8 4';
5
+ const MOVE_ARROW_OFFSET = 0.17;
6
+ /** Screen pixels between the beam's line and its size label (and, selected, its length). */
7
+ const LABEL_OFFSET_PX = 11;
8
+ /**
9
+ * A beam in the plan, the way a framing plan draws one: its width as a dashed double outline and
10
+ * its size beside it ("6x8", "(2) 2x10"), over a clear hit area. Selected, it gets its end handles,
11
+ * a move arrow either side and its length.
12
+ */
13
+ export function buildBeamFloorplan(node, ctx) {
14
+ const plan = beamPlan(node);
15
+ if (plan.length < 1e-6)
16
+ return null;
17
+ const view = ctx.viewState;
18
+ const selected = view?.selected ?? false;
19
+ const chrome = selected || (view?.highlighted ?? false);
20
+ const stroke = chrome && view?.palette
21
+ ? view.palette.selectedStroke
22
+ : view?.hovered && view.palette
23
+ ? view.palette.wallHoverStroke
24
+ : '#374151';
25
+ const mid = [
26
+ (plan.start[0] + plan.end[0]) / 2,
27
+ (plan.start[1] + plan.end[1]) / 2,
28
+ ];
29
+ const angle = Math.atan2(plan.direction[1], plan.direction[0]);
30
+ const children = [
31
+ {
32
+ kind: 'polygon',
33
+ points: beamOutline(node),
34
+ fill: chrome ? '#fed7aa' : 'transparent',
35
+ fillOpacity: chrome ? 0.35 : undefined,
36
+ stroke,
37
+ strokeWidth: chrome ? 1.75 : 1.25,
38
+ strokeDasharray: HIDDEN_DASH,
39
+ vectorEffect: 'non-scaling-stroke',
40
+ // A room's name and area move off a beam rather than hide it.
41
+ metadata: floorplanGeometryMetadata({ annotationObstacle: 'outline' }),
42
+ },
43
+ // A beam is a few inches wide: a click near its line picks it at any zoom.
44
+ {
45
+ kind: 'hit-line',
46
+ x1: plan.start[0],
47
+ y1: plan.start[1],
48
+ x2: plan.end[0],
49
+ y2: plan.end[1],
50
+ strokeWidthPx: 12,
51
+ },
52
+ {
53
+ kind: 'dimension-label',
54
+ cx: mid[0],
55
+ cy: mid[1],
56
+ text: beamSizeLabel(node),
57
+ angle,
58
+ offsetPx: LABEL_OFFSET_PX,
59
+ appearance: 'outlined',
60
+ },
61
+ ];
62
+ if (selected) {
63
+ for (const endpoint of ['start', 'end'])
64
+ children.push({
65
+ kind: 'endpoint-handle',
66
+ point: plan[endpoint],
67
+ state: 'idle',
68
+ affordance: 'move-endpoint',
69
+ payload: { endpoint },
70
+ });
71
+ for (const side of [1, -1]) {
72
+ // No affordance: the layer hands the beam to `floorplanMoveTarget`.
73
+ const offset = (plan.width / 2 + MOVE_ARROW_OFFSET) * side;
74
+ children.push({
75
+ kind: 'move-arrow',
76
+ point: [mid[0] + plan.normal[0] * offset, mid[1] + plan.normal[1] * offset],
77
+ angle: Math.atan2(plan.normal[1] * side, plan.normal[0] * side),
78
+ });
79
+ }
80
+ if (plan.length >= 0.1)
81
+ children.push({
82
+ kind: 'dimension-label',
83
+ cx: mid[0],
84
+ cy: mid[1],
85
+ text: formatLinearMeasurement(plan.length, view?.unit ?? 'metric', readFloorplanMetricNotationOverride(ctx) ?? 'meters'),
86
+ angle,
87
+ offsetPx: -LABEL_OFFSET_PX - 4,
88
+ });
89
+ }
90
+ return { kind: 'group', children };
91
+ }
@@ -0,0 +1,19 @@
1
+ import { type BeamNode } from '@pascal-app/core';
2
+ import { type BufferGeometry } from 'three';
3
+ /**
4
+ * Where a beam's box sits in its level, level-local: its centre, its turn about Y (local X runs
5
+ * start → end) and its size along, up and across. Null for a beam of no length.
6
+ */
7
+ export type BeamBox = {
8
+ position: [number, number, number];
9
+ rotationY: number;
10
+ size: [number, number, number];
11
+ };
12
+ export declare function beamBox(beam: Pick<BeamNode, 'start' | 'end' | 'width' | 'depth'>, top: number): BeamBox | null;
13
+ /**
14
+ * The beam's solid about its own centre, local X along it: one block for a solid timber, glulam
15
+ * or a single LVL; its plies side by side with a hairline between for a built-up beam; a W shape's
16
+ * two flanges and web for steel. UVs run a metre to the texture repeat, the grain along the beam.
17
+ */
18
+ export declare function buildBeamGeometry(beam: Pick<BeamNode, 'width' | 'depth' | 'plies' | 'material'>, length: number): BufferGeometry;
19
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/beam/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,OAAO,CAAA;AAOxD;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAAA;AAED,wBAAgB,OAAO,CACrB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,EACzD,GAAG,EAAE,MAAM,GACV,OAAO,GAAG,IAAI,CAahB;AAQD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,cAAc,CA6BhB"}
@@ -0,0 +1,63 @@
1
+ import { beamPlan } from '@pascal-app/core';
2
+ import { BoxGeometry } from 'three';
3
+ import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
4
+ import { applyPlanarWorldUvs, copyUvToSecondaryChannel } from '../shared/primitive-uv.js';
5
+ /** The seam left between the plies of a built-up beam, so a (2) 2x10 reads as two boards. */
6
+ const PLY_SEAM = 0.0015;
7
+ export function beamBox(beam, top) {
8
+ const plan = beamPlan(beam);
9
+ if (plan.length < 1e-6)
10
+ return null;
11
+ return {
12
+ position: [
13
+ (plan.start[0] + plan.end[0]) / 2,
14
+ top - beam.depth / 2,
15
+ (plan.start[1] + plan.end[1]) / 2,
16
+ ],
17
+ // Three.js turns local +X to (cos θ, 0, −sin θ): θ = −atan2(dz, dx) runs it along the beam.
18
+ rotationY: -Math.atan2(plan.direction[1], plan.direction[0]),
19
+ size: [plan.length, beam.depth, beam.width],
20
+ };
21
+ }
22
+ function box(length, height, across, y, z) {
23
+ const geometry = new BoxGeometry(length, height, across).toNonIndexed();
24
+ geometry.translate(0, y, z);
25
+ return geometry;
26
+ }
27
+ /**
28
+ * The beam's solid about its own centre, local X along it: one block for a solid timber, glulam
29
+ * or a single LVL; its plies side by side with a hairline between for a built-up beam; a W shape's
30
+ * two flanges and web for steel. UVs run a metre to the texture repeat, the grain along the beam.
31
+ */
32
+ export function buildBeamGeometry(beam, length) {
33
+ const { width, depth } = beam;
34
+ let parts;
35
+ if (beam.material === 'steel') {
36
+ // A W8x10's flanges are 0.205 in, its web 0.17 in: the same proportions at any size.
37
+ const flange = Math.max(0.004, depth * 0.026);
38
+ const web = Math.max(0.003, width * 0.043);
39
+ parts = [
40
+ box(length, flange, width, depth / 2 - flange / 2, 0),
41
+ box(length, flange, width, -depth / 2 + flange / 2, 0),
42
+ box(length, depth - flange * 2, web, 0, 0),
43
+ ];
44
+ }
45
+ else if (beam.plies > 1) {
46
+ // The seams fall between the plies; the outer faces stay the beam's.
47
+ const seam = Math.min(PLY_SEAM, width / beam.plies / 2);
48
+ const ply = (width - seam * (beam.plies - 1)) / beam.plies;
49
+ parts = Array.from({ length: beam.plies }, (_, index) => box(length, depth, ply, 0, -width / 2 + ply / 2 + index * (ply + seam)));
50
+ }
51
+ else {
52
+ parts = [box(length, depth, width, 0, 0)];
53
+ }
54
+ const merged = parts.length === 1 ? parts[0] : (mergeGeometries(parts) ?? parts[0]);
55
+ if (merged !== parts[0])
56
+ for (const part of parts)
57
+ part.dispose();
58
+ applyPlanarWorldUvs(merged);
59
+ copyUvToSecondaryChannel(merged);
60
+ merged.computeBoundingBox();
61
+ merged.computeBoundingSphere();
62
+ return merged;
63
+ }
@@ -0,0 +1,3 @@
1
+ export { BeamNode } from '@pascal-app/core';
2
+ export { beamDefinition } from './definition.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/beam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { BeamNode } from '@pascal-app/core';
2
+ export { beamDefinition } from './definition.js';
@@ -0,0 +1,21 @@
1
+ import { type AnyNode } from '@pascal-app/core';
2
+ /**
3
+ * The reshaped node and which end: the tool manager builds it from the endpoint scope, naming a
4
+ * kind it has no slot for under `wall`.
5
+ */
6
+ export type MovingBeamEndpoint = {
7
+ wall?: AnyNode;
8
+ fence?: AnyNode;
9
+ beam?: AnyNode;
10
+ endpoint: 'start' | 'end';
11
+ };
12
+ /**
13
+ * A beam's end dragged in 3D: the thin wrapper around `moveBeamEndpointDragAction`, which owns
14
+ * the snapping and the single undo step. Shows the cursor at the moving end and the beam's height,
15
+ * length and width while it runs. Mounted by the tool manager from `move-endpoint`.
16
+ */
17
+ export declare const MoveBeamEndpointTool: React.FC<{
18
+ target: MovingBeamEndpoint;
19
+ }>;
20
+ export default MoveBeamEndpointTool;
21
+ //# sourceMappingURL=move-endpoint-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-endpoint-tool.d.ts","sourceRoot":"","sources":["../../src/beam/move-endpoint-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EAKb,MAAM,kBAAkB,CAAA;AAazB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;CAC1B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAqDzE,CAAA;eAEc,oBAAoB"}
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { beamTopElevation, sceneRegistry, useScene, } from '@pascal-app/core';
4
+ import { CursorSphere, MeasurementPill, triggerSFX, useDragAction, useInteractionScope, } from '@pascal-app/editor';
5
+ import { useViewer } from '@pascal-app/viewer';
6
+ import { Html } from '@react-three/drei';
7
+ import { createPortal } from '@react-three/fiber';
8
+ import { moveBeamEndpointDragAction } from './actions/move-endpoint.js';
9
+ /**
10
+ * A beam's end dragged in 3D: the thin wrapper around `moveBeamEndpointDragAction`, which owns
11
+ * the snapping and the single undo step. Shows the cursor at the moving end and the beam's height,
12
+ * length and width while it runs. Mounted by the tool manager from `move-endpoint`.
13
+ */
14
+ export const MoveBeamEndpointTool = ({ target }) => {
15
+ const initial = (target.beam ?? target.wall ?? target.fence);
16
+ const unit = useViewer((state) => state.unit);
17
+ const beamId = initial?.id;
18
+ const live = useScene((state) => (beamId ? state.nodes[beamId] : undefined));
19
+ const beam = live?.type === 'beam' ? live : initial;
20
+ const top = useScene((state) => (beam ? beamTopElevation(state.nodes, beam) : 0));
21
+ const exit = (committed) => {
22
+ if (committed)
23
+ triggerSFX('sfx:item-place');
24
+ if (beamId)
25
+ useViewer.getState().setSelection({ selectedIds: [beamId] });
26
+ useInteractionScope
27
+ .getState()
28
+ .endIf((scope) => scope.kind === 'reshaping' && scope.reshape === 'endpoint');
29
+ };
30
+ useDragAction({
31
+ active: initial?.type === 'beam',
32
+ action: moveBeamEndpointDragAction,
33
+ initial: {
34
+ node: initial,
35
+ handleId: target.endpoint,
36
+ point: initial ? initial[target.endpoint] : [0, 0],
37
+ },
38
+ onCommit: () => exit(true),
39
+ onCancel: () => exit(false),
40
+ });
41
+ const level = beam?.parentId ? sceneRegistry.nodes.get(beam.parentId) : undefined;
42
+ if (!(beam?.type === 'beam' && level))
43
+ return null;
44
+ const moving = beam[target.endpoint];
45
+ const length = Math.hypot(beam.end[0] - beam.start[0], beam.end[1] - beam.start[1]);
46
+ // In the beam's level, where its top is measured.
47
+ return createPortal(_jsxs("group", { children: [_jsx(CursorSphere, { position: [moving[0], top, moving[1]], showTooltip: false }), _jsx(Html, { center: true, position: [(beam.start[0] + beam.end[0]) / 2, top + 0.3, (beam.start[1] + beam.end[1]) / 2], style: { pointerEvents: 'none', touchAction: 'none' }, zIndexRange: [100, 0], children: _jsx(MeasurementPill, { height: beam.depth, length: length, primary: "length", thickness: beam.width, unit: unit }) })] }), level);
48
+ };
49
+ export default MoveBeamEndpointTool;
@@ -0,0 +1,12 @@
1
+ import { type BeamNode } from '@pascal-app/core';
2
+ /**
3
+ * A beam moved in 3D, both ends together: its start follows the pointer, snapped as the beam tool
4
+ * snaps (wall faces and ends, other beams, post centres, the grid; Alt free), the run keeping its
5
+ * length and angle. Previews through live overrides and writes once on the click, one undo step;
6
+ * Esc puts it back. Mounted by the move dispatcher from `affordanceTools.move`.
7
+ */
8
+ export declare const MoveBeamTool: React.FC<{
9
+ node: BeamNode;
10
+ }>;
11
+ export default MoveBeamTool;
12
+ //# sourceMappingURL=move-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/beam/move-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAOd,MAAM,kBAAkB,CAAA;AAiBzB;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAuGrD,CAAA;eAEc,YAAY"}
@@ -0,0 +1,114 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { beamTopElevation, emitter, sceneRegistry, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
4
+ import { CursorSphere, consumePlacementDragRelease, isFreshPlacementMetadata, markToolCancelConsumed, stripPlacementMetadataFlags, triggerSFX, useEditor, } from '@pascal-app/editor';
5
+ import { useViewer } from '@pascal-app/viewer';
6
+ import { createPortal } from '@react-three/fiber';
7
+ import { useEffect, useRef, useState } from 'react';
8
+ import { snapBeamPoint } from './drafting.js';
9
+ import { movedBeamEnds } from './floorplan-move.js';
10
+ /**
11
+ * A beam moved in 3D, both ends together: its start follows the pointer, snapped as the beam tool
12
+ * snaps (wall faces and ends, other beams, post centres, the grid; Alt free), the run keeping its
13
+ * length and angle. Previews through live overrides and writes once on the click, one undo step;
14
+ * Esc puts it back. Mounted by the move dispatcher from `affordanceTools.move`.
15
+ */
16
+ export const MoveBeamTool = ({ node }) => {
17
+ const activatedAt = useRef(Date.now());
18
+ const [cursor, setCursor] = useState(null);
19
+ const top = useScene((state) => beamTopElevation(state.nodes, node));
20
+ useEffect(() => {
21
+ const id = node.id;
22
+ const origin = [node.start[0], node.start[1]];
23
+ const fresh = isFreshPlacementMetadata(node.metadata);
24
+ let anchor = null;
25
+ let delta = [0, 0];
26
+ let committed = false;
27
+ const exit = () => useEditor.getState().setMovingNode(null);
28
+ const preview = () => {
29
+ useLiveNodeOverrides.getState().set(id, movedBeamEnds(node, delta));
30
+ useScene.getState().markDirty(id);
31
+ };
32
+ const onGridMove = (event) => {
33
+ const raw = [event.localPosition[0], event.localPosition[2]];
34
+ anchor ??= raw;
35
+ const at = node.parentId
36
+ ? snapBeamPoint({
37
+ point: [origin[0] + raw[0] - anchor[0], origin[1] + raw[1] - anchor[1]],
38
+ nodes: useScene.getState().nodes,
39
+ levelId: node.parentId,
40
+ ignoreIds: [node.id],
41
+ free: event.nativeEvent?.altKey === true,
42
+ }).point
43
+ : origin;
44
+ const next = [at[0] - origin[0], at[1] - origin[1]];
45
+ if (next[0] === delta[0] && next[1] === delta[1])
46
+ return;
47
+ delta = next;
48
+ triggerSFX('sfx:grid-snap');
49
+ const moved = movedBeamEnds(node, delta);
50
+ setCursor([(moved.start[0] + moved.end[0]) / 2, 0, (moved.start[1] + moved.end[1]) / 2]);
51
+ preview();
52
+ };
53
+ const onGridClick = (event) => {
54
+ if (committed)
55
+ return;
56
+ if (Date.now() - activatedAt.current < 150) {
57
+ event.nativeEvent?.stopPropagation?.();
58
+ return;
59
+ }
60
+ committed = true;
61
+ const moved = movedBeamEnds(node, delta);
62
+ useScene.getState().updateNodes([
63
+ {
64
+ id,
65
+ data: fresh
66
+ ? {
67
+ ...moved,
68
+ metadata: stripPlacementMetadataFlags(node.metadata),
69
+ }
70
+ : moved,
71
+ },
72
+ ]);
73
+ useLiveNodeOverrides.getState().clear(id);
74
+ triggerSFX('sfx:item-place');
75
+ useViewer.getState().setSelection({ selectedIds: [id] });
76
+ exit();
77
+ event.nativeEvent?.stopPropagation?.();
78
+ };
79
+ const onPlacementDragPointerUp = (event) => {
80
+ if (!consumePlacementDragRelease(event))
81
+ return;
82
+ activatedAt.current = 0;
83
+ onGridClick({ nativeEvent: event });
84
+ };
85
+ const onCancel = () => {
86
+ useLiveNodeOverrides.getState().clear(id);
87
+ useScene.getState().markDirty(id);
88
+ useViewer.getState().setSelection({ selectedIds: [id] });
89
+ markToolCancelConsumed();
90
+ // This tool owns the teardown: the 2D overlay leaves the beam to it.
91
+ useEditor.getState().setMovingNodeOrigin('3d');
92
+ exit();
93
+ };
94
+ emitter.on('grid:move', onGridMove);
95
+ emitter.on('grid:click', onGridClick);
96
+ emitter.on('tool:cancel', onCancel);
97
+ window.addEventListener('pointerup', onPlacementDragPointerUp);
98
+ return () => {
99
+ // Only the live preview is ever undone here: a move the 2D overlay committed is in the
100
+ // scene already, and an override is never the scene.
101
+ if (!committed)
102
+ useLiveNodeOverrides.getState().clear(id);
103
+ emitter.off('grid:move', onGridMove);
104
+ emitter.off('grid:click', onGridClick);
105
+ emitter.off('tool:cancel', onCancel);
106
+ window.removeEventListener('pointerup', onPlacementDragPointerUp);
107
+ };
108
+ }, [node]);
109
+ const level = node.parentId ? sceneRegistry.nodes.get(node.parentId) : undefined;
110
+ if (!(cursor && level))
111
+ return null;
112
+ return createPortal(_jsx(CursorSphere, { position: [cursor[0], top, cursor[2]], showTooltip: false }), level);
113
+ };
114
+ export default MoveBeamTool;
@@ -0,0 +1,28 @@
1
+ import { type AnyNode, type AnyNodeId, type BeamNode } from '@pascal-app/core';
2
+ import type { NodePanelModel } from '@pascal-app/editor';
3
+ type Nodes = Record<AnyNodeId, AnyNode>;
4
+ /** The Size choices: every stock size, and Custom while the beam is no stock size. */
5
+ export declare function beamSizeOptions(current: string | null): {
6
+ label: string;
7
+ value: string;
8
+ }[];
9
+ /** Which Size choice a beam is: its stock size, or Custom. */
10
+ export declare function beamSizeValue(beam: BeamNode): string;
11
+ export declare const BEAM_MATERIAL_OPTIONS: {
12
+ label: string;
13
+ value: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
14
+ }[];
15
+ /** The Top choices: the references, and Custom while the top is typed in. */
16
+ export declare function beamTopOptions(current: string | null): {
17
+ label: string;
18
+ value: string;
19
+ }[];
20
+ export declare function beamTopValue(nodes: Nodes, beam: BeamNode): string;
21
+ /**
22
+ * The beam's settings as panel rows (the XR wand's panel) and as controls the multi-selection
23
+ * inspector applies to every selected beam at once: size, material, top. A porch's beams take a
24
+ * new size together.
25
+ */
26
+ export declare const beamPanelModel: NodePanelModel<BeamNode>;
27
+ export {};
28
+ //# sourceMappingURL=panel-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-model.d.ts","sourceRoot":"","sources":["../../src/beam/panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAMd,KAAK,QAAQ,EAQd,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,KAAK,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAIvC,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;;;IAKrD;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEpD;AAED,eAAO,MAAM,qBAAqB;;;GAEjC,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;;;IAKpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEjE;AAsBD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,QAAQ,CA+EnD,CAAA"}
@@ -0,0 +1,123 @@
1
+ import { BEAM_MATERIAL_LABELS, BEAM_SIZE_PRESETS, BEAM_TOP_REFERENCE_LABELS, BEAM_TOP_REFERENCES, beamSizePresetPatch, beamTopReferenceOf, beamTopReferencePatch, matchBeamSizePreset, runAsSingleSceneHistoryStep, useScene, } from '@pascal-app/core';
2
+ const CUSTOM = 'custom';
3
+ /** The Size choices: every stock size, and Custom while the beam is no stock size. */
4
+ export function beamSizeOptions(current) {
5
+ return [
6
+ ...(current === CUSTOM ? [{ label: 'Custom', value: CUSTOM }] : []),
7
+ ...BEAM_SIZE_PRESETS.map((preset) => ({ label: preset.label, value: preset.id })),
8
+ ];
9
+ }
10
+ /** Which Size choice a beam is: its stock size, or Custom. */
11
+ export function beamSizeValue(beam) {
12
+ return matchBeamSizePreset(beam)?.id ?? CUSTOM;
13
+ }
14
+ export const BEAM_MATERIAL_OPTIONS = Object.keys(BEAM_MATERIAL_LABELS).map((material) => ({ label: BEAM_MATERIAL_LABELS[material], value: material }));
15
+ /** The Top choices: the references, and Custom while the top is typed in. */
16
+ export function beamTopOptions(current) {
17
+ return [
18
+ ...BEAM_TOP_REFERENCES.map((top) => ({ label: BEAM_TOP_REFERENCE_LABELS[top], value: top })),
19
+ ...(current === CUSTOM ? [{ label: 'Custom', value: CUSTOM }] : []),
20
+ ];
21
+ }
22
+ export function beamTopValue(nodes, beam) {
23
+ return beamTopReferenceOf(nodes, beam) ?? CUSTOM;
24
+ }
25
+ /** The one value every beam shares, or null for a mixed selection. */
26
+ function shared(values) {
27
+ return values.every((value) => value === values[0]) ? (values[0] ?? null) : null;
28
+ }
29
+ /** Writes one patch per beam in a single undo step. */
30
+ function updateAll(beams, patch) {
31
+ runAsSingleSceneHistoryStep(useScene, () => useScene
32
+ .getState()
33
+ .updateNodes(beams.map((beam) => ({ id: beam.id, data: patch(beam) }))));
34
+ }
35
+ /** Steps through a list of choices, wrapping round. */
36
+ function cycle(list, current, step) {
37
+ const index = list.indexOf(current);
38
+ return list[(index + step + list.length) % list.length];
39
+ }
40
+ /**
41
+ * The beam's settings as panel rows (the XR wand's panel) and as controls the multi-selection
42
+ * inspector applies to every selected beam at once: size, material, top. A porch's beams take a
43
+ * new size together.
44
+ */
45
+ export const beamPanelModel = {
46
+ rows: ({ node, nodes, update }) => {
47
+ const sizes = BEAM_SIZE_PRESETS.map((preset) => preset.id);
48
+ const materials = BEAM_MATERIAL_OPTIONS.map((option) => option.value);
49
+ const size = beamSizeValue(node);
50
+ const top = beamTopValue(nodes, node);
51
+ return [
52
+ {
53
+ id: 'beam-size',
54
+ kind: 'cycle',
55
+ section: 'Beam',
56
+ label: 'Size',
57
+ value: BEAM_SIZE_PRESETS.find((preset) => preset.id === size)?.label ?? 'Custom',
58
+ next: () => update(beamSizePresetPatch(node, cycle(sizes, size, 1))),
59
+ previous: () => update(beamSizePresetPatch(node, cycle(sizes, size, -1))),
60
+ },
61
+ {
62
+ id: 'beam-material',
63
+ kind: 'cycle',
64
+ section: 'Beam',
65
+ label: 'Material',
66
+ value: BEAM_MATERIAL_LABELS[node.material],
67
+ next: () => update({ material: cycle(materials, node.material, 1) }),
68
+ previous: () => update({ material: cycle(materials, node.material, -1) }),
69
+ },
70
+ {
71
+ id: 'beam-top',
72
+ kind: 'cycle',
73
+ section: 'Beam',
74
+ label: 'Top',
75
+ value: top === CUSTOM ? 'Custom' : BEAM_TOP_REFERENCE_LABELS[top],
76
+ next: () => update(beamTopReferencePatch(nodes, node, cycle(BEAM_TOP_REFERENCES, top, 1))),
77
+ previous: () => update(beamTopReferencePatch(nodes, node, cycle(BEAM_TOP_REFERENCES, top, -1))),
78
+ },
79
+ ];
80
+ },
81
+ multiControls: ({ selection, nodes }) => {
82
+ if (selection.length === 0)
83
+ return [];
84
+ const size = shared(selection.map(beamSizeValue));
85
+ const top = shared(selection.map((beam) => beamTopValue(nodes, beam)));
86
+ return [
87
+ {
88
+ id: 'beam-size',
89
+ kind: 'select',
90
+ section: 'Beam',
91
+ label: 'Size',
92
+ options: beamSizeOptions(size),
93
+ value: size,
94
+ onChange: (id) => {
95
+ if (id !== CUSTOM)
96
+ updateAll(selection, (beam) => beamSizePresetPatch(beam, id));
97
+ },
98
+ },
99
+ {
100
+ id: 'beam-material',
101
+ kind: 'select',
102
+ section: 'Beam',
103
+ label: 'Material',
104
+ options: BEAM_MATERIAL_OPTIONS,
105
+ value: shared(selection.map((beam) => beam.material)),
106
+ onChange: (material) => updateAll(selection, () => ({ material: material })),
107
+ },
108
+ {
109
+ id: 'beam-top',
110
+ kind: 'select',
111
+ section: 'Beam',
112
+ label: 'Top',
113
+ options: beamTopOptions(top),
114
+ value: top,
115
+ onChange: (reference) => {
116
+ if (reference === CUSTOM)
117
+ return;
118
+ updateAll(selection, (beam) => beamTopReferencePatch(nodes, beam, reference));
119
+ },
120
+ },
121
+ ];
122
+ },
123
+ };
@@ -0,0 +1,13 @@
1
+ import { type BeamNode } from '@pascal-app/core';
2
+ /** The fields a ply count writes: as many plies of the same board, the width growing with them. */
3
+ export declare function beamPliesPatch(beam: Pick<BeamNode, 'width' | 'plies'>, plies: number): {
4
+ plies: number;
5
+ width: number;
6
+ };
7
+ /**
8
+ * A beam's panel: its size (a stock size, or a width, depth and plies of its own), what it is made
9
+ * of, how the joists meet it and where its top is, with its length and underside; Move, Delete,
10
+ * and posts under it at each end and every 8 ft.
11
+ */
12
+ export default function BeamPanel(): import("react").JSX.Element | null;
13
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/beam/panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,QAAQ,EAYd,MAAM,kBAAkB,CAAA;AA4DzB,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM;;;EAEpF;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,uCA4KhC"}