@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
@@ -1 +1 @@
1
- {"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,WAAW,EAGhB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAUzB;;qFAEqF;AACrF,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjE,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAmBf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,MAAM,GAAG,IAAI,CAoBhB;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,IAAI,CAmFP;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAcD;yEACyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,EACD,eAAe,EAAE,OAAO,GACvB,IAAI,CAeN"}
1
+ {"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,kBAAkB,CAAA;AAMvF,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,WAAW,EAGhB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAUzB;;qFAEqF;AACrF,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjE,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAqBf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,MAAM,GAAG,IAAI,CAoBhB;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,IAAI,CAmFP;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAcD;yEACyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CACT,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC,CAC/F,EACD,eAAe,EAAE,OAAO,GACvB,IAAI,CAgBN"}
@@ -1,3 +1,4 @@
1
+ import { getDoorOpeningSize, openingHostFacing } from '@pascal-app/core';
1
2
  // Runtime glue between the pure `computeOpeningGuides` geometry (core) and the
2
3
  // editor's 3D guide store, used by the door/window move + placement tools. Lives
3
4
  // in `nodes` (not core) because it talks to the editor store; kept thin so each
@@ -20,14 +21,16 @@ export function collectOpeningSiblings(wall, movingId, nodes) {
20
21
  const node = nodes[childId];
21
22
  if (!node || (node.type !== 'door' && node.type !== 'window'))
22
23
  continue;
24
+ const size = getDoorOpeningSize(node);
23
25
  out.push({
24
26
  id: node.id,
25
- centerS: node.position[0],
26
- width: node.width,
27
+ centerS: node.position[0] - size.leafOffsetX * openingHostFacing(node),
28
+ width: size.width,
27
29
  centerY: node.position[1] +
30
+ (size.height - node.height) / 2 +
28
31
  getOpeningFloorDatum(wall, node, nodes) -
29
32
  wallSupportForNodes(wall, nodes).elevation,
30
- height: node.height,
33
+ height: size.height,
31
34
  });
32
35
  }
33
36
  return out;
@@ -172,13 +175,14 @@ export function publishOpeningResizeGuides(node, includeVertical) {
172
175
  const wall = node.parentId ? nodes[node.parentId] : undefined;
173
176
  if (wall?.type !== 'wall')
174
177
  return;
178
+ const size = getDoorOpeningSize(node);
175
179
  publishOpeningGuides3D({
176
180
  wall,
177
181
  movingId: node.id,
178
- centerS: node.position[0],
179
- centerY: node.position[1],
180
- width: node.width,
181
- height: node.height,
182
+ centerS: node.position[0] - size.leafOffsetX * openingHostFacing(node),
183
+ centerY: node.position[1] + (size.height - node.height) / 2,
184
+ width: size.width,
185
+ height: size.height,
182
186
  includeVertical,
183
187
  nodes,
184
188
  toWorld: wallToWorld(wall),
@@ -0,0 +1,11 @@
1
+ import type { MessageDescriptor, WindowNode } from '@pascal-app/core';
2
+ import type { DoorStyle, WindowStyle } from '@pascal-app/core/building';
3
+ /**
4
+ * The door and window panels' card names. Core's `DOOR_STYLE_LABELS`,
5
+ * `WINDOW_STYLE_LABELS` and the placement options stay English: the tool
6
+ * chips and agents read them.
7
+ */
8
+ export declare const DOOR_STYLE_MESSAGES: Record<DoorStyle, MessageDescriptor>;
9
+ export declare const WINDOW_STYLE_MESSAGES: Record<WindowStyle, MessageDescriptor>;
10
+ export declare const WINDOW_TYPE_MESSAGES: Record<WindowNode['windowType'], MessageDescriptor>;
11
+ //# sourceMappingURL=opening-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-labels.d.ts","sourceRoot":"","sources":["../../src/shared/opening-labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAWpE,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAexE,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAYpF,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The door and window panels' card names. Core's `DOOR_STYLE_LABELS`,
3
+ * `WINDOW_STYLE_LABELS` and the placement options stay English: the tool
4
+ * chips and agents read them.
5
+ */
6
+ export const DOOR_STYLE_MESSAGES = {
7
+ panel: /* i18n */ { id: 'node.door.style.panel', message: 'Panel' },
8
+ glass: /* i18n */ { id: 'node.door.style.glass', message: 'Glass' },
9
+ modern: /* i18n */ { id: 'node.door.style.modern', message: 'Modern' },
10
+ 'paneled-glass': /* i18n */ { id: 'node.door.style.paneledGlass', message: 'Paneled glass' },
11
+ french: /* i18n */ { id: 'node.door.style.french', message: 'French' },
12
+ shaker: /* i18n */ { id: 'node.door.style.shaker', message: 'Shaker' },
13
+ 'six-panel': /* i18n */ { id: 'node.door.style.sixPanel', message: 'Six-panel' },
14
+ craftsman: /* i18n */ { id: 'node.door.style.craftsman', message: 'Craftsman' },
15
+ 'half-louvered': /* i18n */ { id: 'node.door.style.halfLouvered', message: 'Half-louvered' },
16
+ barn: /* i18n */ { id: 'node.door.style.barn', message: 'Barn' },
17
+ };
18
+ export const WINDOW_STYLE_MESSAGES = {
19
+ single: /* i18n */ { id: 'node.window.style.single', message: 'Single' },
20
+ 'double-hung': /* i18n */ { id: 'node.window.style.doubleHung', message: 'Double-hung' },
21
+ 'triple-hung': /* i18n */ { id: 'node.window.style.tripleHung', message: 'Triple-hung' },
22
+ casement: /* i18n */ { id: 'node.window.style.casement', message: 'Casement' },
23
+ sliding: /* i18n */ { id: 'node.window.style.sliding', message: 'Sliding' },
24
+ grid: /* i18n */ { id: 'node.window.style.grid', message: 'Grid' },
25
+ 'tall-grid': /* i18n */ { id: 'node.window.style.tallGrid', message: 'Tall grid' },
26
+ 'wide-grid': /* i18n */ { id: 'node.window.style.wideGrid', message: 'Wide grid' },
27
+ 'horizontal-bands': /* i18n */ {
28
+ id: 'node.window.style.horizontalBands',
29
+ message: 'Horizontal bands',
30
+ },
31
+ transom: /* i18n */ { id: 'node.window.style.transom', message: 'Transom' },
32
+ picture: /* i18n */ { id: 'node.window.style.picture', message: 'Picture' },
33
+ };
34
+ export const WINDOW_TYPE_MESSAGES = {
35
+ fixed: /* i18n */ { id: 'node.window.type.fixed', message: 'Fixed' },
36
+ sliding: /* i18n */ { id: 'node.window.type.sliding', message: 'Sliding' },
37
+ casement: /* i18n */ { id: 'node.window.type.casement', message: 'Casement' },
38
+ awning: /* i18n */ { id: 'node.window.type.awning', message: 'Awning' },
39
+ hopper: /* i18n */ { id: 'node.window.type.hopper', message: 'Hopper' },
40
+ 'tilt-turn': /* i18n */ { id: 'node.window.type.tiltTurn', message: 'Tilt and turn' },
41
+ 'single-hung': /* i18n */ { id: 'node.window.type.singleHung', message: 'Single-hung' },
42
+ 'double-hung': /* i18n */ { id: 'node.window.type.doubleHung', message: 'Double-hung' },
43
+ bay: /* i18n */ { id: 'node.window.type.bay', message: 'Bay' },
44
+ bow: /* i18n */ { id: 'node.window.type.bow', message: 'Bow' },
45
+ louvered: /* i18n */ { id: 'node.window.type.louvered', message: 'Louvered' },
46
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAMpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CA6GrB"}
1
+ {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAQpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CA+GrB"}
@@ -1,4 +1,4 @@
1
- import { computeOpeningGuides, getWallFaceOffsets, isCurvedWall, useScene, } from '@pascal-app/core';
1
+ import { computeOpeningGuides, getDoorOpeningSize, getWallFaceOffsets, isCurvedWall, openingHostFacing, useScene, } from '@pascal-app/core';
2
2
  import { readFloorplanContext } from '@pascal-app/editor';
3
3
  import { formatConstructionLength } from './construction-length.js';
4
4
  import { resolveWallOpeningCeiling } from './wall-opening-ceiling.js';
@@ -63,21 +63,23 @@ export function buildOpeningPlacementDimensions(opening, ctx) {
63
63
  if (!sibling || (sibling.type !== 'door' && sibling.type !== 'window'))
64
64
  continue;
65
65
  const sib = sibling;
66
+ const size = getDoorOpeningSize(sib);
66
67
  siblings.push({
67
68
  id: sib.id,
68
- centerS: sib.position[0],
69
- width: sib.width,
70
- centerY: sib.position[1],
71
- height: sib.height,
69
+ centerS: sib.position[0] - size.leafOffsetX * openingHostFacing(sib),
70
+ width: size.width,
71
+ centerY: sib.position[1] + (size.height - sib.height) / 2,
72
+ height: size.height,
72
73
  });
73
74
  }
75
+ const size = getDoorOpeningSize(opening);
74
76
  const guides = computeOpeningGuides({
75
77
  moving: {
76
78
  id: opening.id,
77
- centerS: opening.position[0],
78
- width: opening.width,
79
- centerY: opening.position[1],
80
- height: opening.height,
79
+ centerS: opening.position[0] - size.leafOffsetX * openingHostFacing(opening),
80
+ width: size.width,
81
+ centerY: opening.position[1] + (size.height - opening.height) / 2,
82
+ height: size.height,
81
83
  },
82
84
  siblings,
83
85
  wall: {
@@ -1,4 +1,4 @@
1
- import type { DoorNode, WindowNode } from '@pascal-app/core';
1
+ import { type DoorNode, type WindowNode } from '@pascal-app/core';
2
2
  type PlanarOpening = Pick<DoorNode | WindowNode, 'position' | 'wallId' | 'parentId'>;
3
3
  /**
4
4
  * The wall-local plane offset (`position[2]`) a moved door / window keeps on
@@ -12,8 +12,9 @@ export declare function openingPlaneOffsetOnWall(opening: PlanarOpening, targetW
12
12
  * Where an opening's plan symbol sits across its wall. A centred opening keeps
13
13
  * the long-standing symbol: centred in the cutout, as deep as the wall. An
14
14
  * opening offset from the centre plane draws its frame at that offset with its
15
- * own `frameDepth`, like the 3D renderer; the builder then also draws the
16
- * cutout, because the wall is still cut through its whole thickness.
15
+ * resolved frame depth, like the 3D
16
+ * renderer; the builder then also draws the cutout, because the wall is still
17
+ * cut through its whole thickness.
17
18
  */
18
19
  export declare function resolveOpeningPlanPlane(opening: Pick<DoorNode | WindowNode, 'position' | 'frameDepth'>, wallThickness: number): {
19
20
  offset: number;
@@ -1 +1 @@
1
- {"version":3,"file":"opening-plane-offset.d.ts","sourceRoot":"","sources":["../../src/shared/opening-plane-offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE5D,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAInC"}
1
+ {"version":3,"file":"opening-plane-offset.d.ts","sourceRoot":"","sources":["../../src/shared/opening-plane-offset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAA4B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE3F,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKnC"}
@@ -1,3 +1,4 @@
1
+ import { resolveOpeningFrameDepth } from '@pascal-app/core';
1
2
  /**
2
3
  * The wall-local plane offset (`position[2]`) a moved door / window keeps on
3
4
  * `targetWallId`. The offset is measured from the centre plane of the wall the
@@ -13,12 +14,14 @@ export function openingPlaneOffsetOnWall(opening, targetWallId) {
13
14
  * Where an opening's plan symbol sits across its wall. A centred opening keeps
14
15
  * the long-standing symbol: centred in the cutout, as deep as the wall. An
15
16
  * opening offset from the centre plane draws its frame at that offset with its
16
- * own `frameDepth`, like the 3D renderer; the builder then also draws the
17
- * cutout, because the wall is still cut through its whole thickness.
17
+ * resolved frame depth, like the 3D
18
+ * renderer; the builder then also draws the cutout, because the wall is still
19
+ * cut through its whole thickness.
18
20
  */
19
21
  export function resolveOpeningPlanPlane(opening, wallThickness) {
20
22
  const offset = opening.position[2] ?? 0;
21
- if (offset === 0 || !(opening.frameDepth > 0))
23
+ const frameDepth = resolveOpeningFrameDepth(opening, wallThickness);
24
+ if (offset === 0 || !(frameDepth > 0))
22
25
  return { offset: 0, depth: wallThickness };
23
- return { offset, depth: opening.frameDepth };
26
+ return { offset, depth: frameDepth };
24
27
  }
@@ -0,0 +1,8 @@
1
+ import { type DoorNode, type MechanismCapability, type WindowNode } from '@pascal-app/core';
2
+ /**
3
+ * Commits a hinge or swing swap of a door or window as one undo step, then opens it through its
4
+ * kind's mechanism when it is closed, so the new side is visible. The opening is the mechanism's
5
+ * preview (the action menu's Open): it leaves the saved open state and the undo history alone.
6
+ */
7
+ export declare function applyOpeningSwap<N extends DoorNode | WindowNode>(node: N, patch: Partial<N>, mechanism: MechanismCapability): void;
8
+ //# sourceMappingURL=opening-swap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-swap.d.ts","sourceRoot":"","sources":["../../src/shared/opening-swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAGxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAGzB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,EAC9D,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,SAAS,EAAE,mBAAmB,QAS/B"}
@@ -0,0 +1,18 @@
1
+ import { useInteractive, useScene, } from '@pascal-app/core';
2
+ import { triggerSFX } from '@pascal-app/editor';
3
+ /**
4
+ * Commits a hinge or swing swap of a door or window as one undo step, then opens it through its
5
+ * kind's mechanism when it is closed, so the new side is visible. The opening is the mechanism's
6
+ * preview (the action menu's Open): it leaves the saved open state and the undo history alone.
7
+ */
8
+ export function applyOpeningSwap(node, patch, mechanism) {
9
+ const scene = useScene.getState();
10
+ scene.updateNode(node.id, patch);
11
+ scene.dirtyNodes.add(node.id);
12
+ if (node.parentId)
13
+ scene.dirtyNodes.add(node.parentId);
14
+ triggerSFX('sfx:item-rotate');
15
+ const swapped = useScene.getState().nodes[node.id];
16
+ if (swapped && !mechanism.isOn(swapped, useInteractive.getState()))
17
+ mechanism.set(swapped, true);
18
+ }
@@ -44,6 +44,12 @@ export type PolygonAffordanceSnapContext<N extends PolygonShape & {
44
44
  modifiers: FloorplanAffordanceModifiers;
45
45
  holeIndex?: number;
46
46
  mode: PolygonAffordanceMode;
47
+ /**
48
+ * `move-vertex` / `add-vertex`: the ring as the drag found it (the new vertex inserted) and the
49
+ * dragged vertex's index in it, so a resolver can square the vertex to its neighbours.
50
+ */
51
+ ring?: ReadonlyArray<readonly [number, number]>;
52
+ vertexIndex?: number;
47
53
  };
48
54
  export type PolygonEdgeSnapContext<N extends PolygonShape & {
49
55
  id: AnyNodeId;
@@ -70,6 +76,13 @@ export type PolygonAffordanceOptions<N extends PolygonShape & {
70
76
  * translated edge, or `null` to keep the candidate.
71
77
  */
72
78
  snapEdge?: (context: PolygonEdgeSnapContext<N>) => [[number, number], [number, number]] | null;
79
+ /**
80
+ * `move-edge`: the sides beside the dragged one keep their own angle, running on to meet it
81
+ * where it goes; a side in line with it (a side split in two) gets a square jog instead, so
82
+ * pulling out part of a side makes a bump-out. Off, both ends of the side translate square to
83
+ * it and its neighbours pivot on their far ends.
84
+ */
85
+ keepNeighbourAngles?: boolean;
73
86
  };
74
87
  type PolygonShape = {
75
88
  polygon: ReadonlyArray<readonly [number, number]>;
@@ -92,6 +105,12 @@ export declare function createPolygonAddVertexAffordance<N extends PolygonShape
92
105
  export declare function createPolygonDeleteVertexAffordance<N extends PolygonShape & {
93
106
  id: AnyNodeId;
94
107
  }>(kind: string, options?: PolygonAffordanceOptions<N>): FloorplanAffordance<N>;
108
+ /**
109
+ * `ring` with edge `edgeIndex` moved `distance` along `normal`, its neighbours keeping their angles
110
+ * (`keepNeighbourAngles`): each end goes where the neighbouring side's line meets the moved edge's,
111
+ * and a neighbour in line with the edge keeps its vertex, a square jog joining it to the moved end.
112
+ */
113
+ export declare function movedEdgeKeepingNeighbours(ring: ReadonlyArray<readonly [number, number]>, edgeIndex: number, normal: readonly [number, number], distance: number): [number, number][];
95
114
  /**
96
115
  * Edge-drag: move a whole edge perpendicular to itself. Both endpoints
97
116
  * translate by `edgeNormal * projectedDelta`. The other vertices of
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,8 @@ export function createPolygonVertexAffordance(kind, options) {
71
71
  modifiers,
72
72
  holeIndex,
73
73
  mode: 'move-vertex',
74
+ ring: originalRing,
75
+ vertexIndex,
74
76
  });
75
77
  const nextRing = originalRing.map((p, i) => i === vertexIndex ? [snapped[0], snapped[1]] : p);
76
78
  const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
@@ -148,6 +150,8 @@ export function createPolygonAddVertexAffordance(kind, options) {
148
150
  modifiers,
149
151
  holeIndex,
150
152
  mode: 'add-vertex',
153
+ ring: initialRing,
154
+ vertexIndex: newVertexIndex,
151
155
  });
152
156
  const nextRing = initialRing.map((p, i) => i === newVertexIndex ? [snapped[0], snapped[1]] : p);
153
157
  const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
@@ -203,6 +207,59 @@ export function createPolygonDeleteVertexAffordance(kind, options) {
203
207
  },
204
208
  };
205
209
  }
210
+ /** A neighbouring side within this sine of the dragged one's line is in line with it (a split side). */
211
+ const IN_LINE_SINE = 0.05;
212
+ /**
213
+ * `ring` with edge `edgeIndex` moved `distance` along `normal`, its neighbours keeping their angles
214
+ * (`keepNeighbourAngles`): each end goes where the neighbouring side's line meets the moved edge's,
215
+ * and a neighbour in line with the edge keeps its vertex, a square jog joining it to the moved end.
216
+ */
217
+ export function movedEdgeKeepingNeighbours(ring, edgeIndex, normal, distance) {
218
+ const copy = ring.map(([x, y]) => [x, y]);
219
+ const count = ring.length;
220
+ // Under a millimetre the side has not moved: no jog a hair long.
221
+ if (count < 3 || Math.abs(distance) < 1e-3)
222
+ return copy;
223
+ const startIndex = edgeIndex;
224
+ const endIndex = (edgeIndex + 1) % count;
225
+ const start = ring[startIndex];
226
+ const end = ring[endIndex];
227
+ const moved = (p) => [
228
+ p[0] + normal[0] * distance,
229
+ p[1] + normal[1] * distance,
230
+ ];
231
+ /** Where the side from `neighbour` to `vertex` meets the moved edge; `null` in line with it. */
232
+ const meet = (vertex, neighbour) => {
233
+ const dx = vertex[0] - neighbour[0];
234
+ const dy = vertex[1] - neighbour[1];
235
+ const length = Math.hypot(dx, dy);
236
+ if (length < 1e-9)
237
+ return null;
238
+ const along = (dx * normal[0] + dy * normal[1]) / length;
239
+ if (Math.abs(along) < IN_LINE_SINE)
240
+ return null;
241
+ const target = moved(start);
242
+ const t = ((target[0] - neighbour[0]) * normal[0] + (target[1] - neighbour[1]) * normal[1]) /
243
+ (along * length);
244
+ return [neighbour[0] + dx * t, neighbour[1] + dy * t];
245
+ };
246
+ const startMeet = meet(start, ring[(startIndex - 1 + count) % count]);
247
+ const endMeet = meet(end, ring[(endIndex + 1) % count]);
248
+ const startPoints = startMeet
249
+ ? [startMeet]
250
+ : [[start[0], start[1]], moved(start)];
251
+ const endPoints = endMeet ? [endMeet] : [moved(end), [end[0], end[1]]];
252
+ const out = [];
253
+ for (let i = 0; i < count; i++) {
254
+ if (i === startIndex)
255
+ out.push(...startPoints);
256
+ else if (i === endIndex)
257
+ out.push(...endPoints);
258
+ else
259
+ out.push(copy[i]);
260
+ }
261
+ return out;
262
+ }
206
263
  /**
207
264
  * Edge-drag: move a whole edge perpendicular to itself. Both endpoints
208
265
  * translate by `edgeNormal * projectedDelta`. The other vertices of
@@ -307,12 +364,14 @@ export function createPolygonMoveEdgeAffordance(kind, options) {
307
364
  (snappedEdge[0][1] - startVertex[1]) * normalY;
308
365
  }
309
366
  }
310
- const nextRing = originalRing.map((p, i) => {
311
- if (i === edgeStartIndex || i === edgeEndIndex) {
312
- return [p[0] + normalX * normalDistance, p[1] + normalY * normalDistance];
313
- }
314
- return [p[0], p[1]];
315
- });
367
+ const nextRing = options?.keepNeighbourAngles
368
+ ? movedEdgeKeepingNeighbours(originalRing, edgeIndex, [normalX, normalY], normalDistance)
369
+ : originalRing.map((p, i) => {
370
+ if (i === edgeStartIndex || i === edgeEndIndex) {
371
+ return [p[0] + normalX * normalDistance, p[1] + normalY * normalDistance];
372
+ }
373
+ return [p[0], p[1]];
374
+ });
316
375
  const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
317
376
  commitRingPatch(node.id, holeIndex, patch);
318
377
  },
@@ -1,4 +1,5 @@
1
1
  import type { AnyNode, AnyNodeId, RoofWallFaceId } from '@pascal-app/core';
2
+ import { type DoorNode } from '@pascal-app/core';
2
3
  /**
3
4
  * Host-side helpers for openings (door / window) hosted on a roof-segment
4
5
  * wall face: resize-handle limits derived from the face profile, and the
@@ -12,7 +13,7 @@ type RoofHostedOpening = {
12
13
  position: [number, number, number];
13
14
  width: number;
14
15
  height: number;
15
- };
16
+ } & Partial<Pick<DoorNode, 'rotation' | 'doorType' | 'sidelightLeft' | 'sidelightRight' | 'transomHeight'>>;
16
17
  type SceneReader = {
17
18
  get: (id: AnyNodeId) => unknown;
18
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"roof-opening-host.d.ts","sourceRoot":"","sources":["../../src/shared/roof-opening-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAGT,cAAc,EACf,MAAM,kBAAkB,CAAA;AAQzB;;;;;GAKG;AAEH,KAAK,iBAAiB,GAAG;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,WAAW,GAAG;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAA;CAAE,CAAA;AAStD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAKf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAKf;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAMlB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC,EACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAqBzB"}
1
+ {"version":3,"file":"roof-opening-host.d.ts","sourceRoot":"","sources":["../../src/shared/roof-opening-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAGT,cAAc,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,kBAAkB,CAAA;AAEzB;;;;;GAKG;AAEH,KAAK,iBAAiB,GAAG;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CACT,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC,CAC/F,CAAA;AAED,KAAK,WAAW,GAAG;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAA;CAAE,CAAA;AAStD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAYf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAWf;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAMlB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC,EACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAqBzB"}
@@ -1,4 +1,4 @@
1
- import { getMaxRoofRectHeightFromAnchor, getMaxRoofRectWidthFromAnchor, getRoofSegmentWallFace, roofFacePointToSegment, } from '@pascal-app/core';
1
+ import { getDoorOpeningSize, getMaxRoofRectHeightFromAnchor, getMaxRoofRectWidthFromAnchor, getRoofSegmentWallFace, openingHostFacing, roofFacePointToSegment, } from '@pascal-app/core';
2
2
  function resolveHostFace(node, scene) {
3
3
  if (!(node.roofSegmentId && node.roofFace))
4
4
  return null;
@@ -16,8 +16,13 @@ export function readRoofFaceWidthMax(node, scene, growSign) {
16
16
  const host = resolveHostFace(node, scene);
17
17
  if (!host)
18
18
  return null;
19
- const anchorU = node.position[0] - (growSign * node.width) / 2;
20
- return getMaxRoofRectWidthFromAnchor(host.face, anchorU, growSign, node.position[1], node.height);
19
+ const size = getDoorOpeningSize(node);
20
+ const centerX = node.position[0] - size.leafOffsetX * openingHostFacing(node);
21
+ const centerY = node.position[1] + (size.height - node.height) / 2;
22
+ const direction = growSign * openingHostFacing(node);
23
+ const anchorU = centerX - (direction * size.width) / 2;
24
+ return (getMaxRoofRectWidthFromAnchor(host.face, anchorU, direction, centerY, size.height) -
25
+ (size.width - node.width));
21
26
  }
22
27
  /**
23
28
  * Resize-handle height limit for a roof-hosted opening. `growSign` +1 =
@@ -28,8 +33,12 @@ export function readRoofFaceHeightMax(node, scene, growSign) {
28
33
  const host = resolveHostFace(node, scene);
29
34
  if (!host)
30
35
  return null;
31
- const anchorV = node.position[1] - (growSign * node.height) / 2;
32
- return getMaxRoofRectHeightFromAnchor(host.face, node.position[0], node.width, anchorV, growSign);
36
+ const size = getDoorOpeningSize(node);
37
+ const centerX = node.position[0] - size.leafOffsetX * openingHostFacing(node);
38
+ const centerY = node.position[1] + (size.height - node.height) / 2;
39
+ const anchorV = centerY - (growSign * size.height) / 2;
40
+ return (getMaxRoofRectHeightFromAnchor(host.face, centerX, size.width, anchorV, growSign) -
41
+ (size.height - node.height));
33
42
  }
34
43
  /**
35
44
  * Level hosting a roof-hosted opening's roof (opening → segment → roof →
@@ -1 +1 @@
1
- {"version":3,"file":"roof-wall-opening-cut.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-cut.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,WAAW,EAAE,eAAe,GAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CA0B7B"}
1
+ {"version":3,"file":"roof-wall-opening-cut.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-cut.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQ7E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,WAAW,EAAE,eAAe,GAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CA0B7B"}
@@ -1,4 +1,4 @@
1
- import { getRoofWallFaceFrame, roofFacePointToSegment } from '@pascal-app/core';
1
+ import { getDoorOpeningSize, getRoofWallFaceFrame, openingHostFacing, roofFacePointToSegment, } from '@pascal-app/core';
2
2
  import { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding } from '@pascal-app/viewer';
3
3
  import * as THREE from 'three';
4
4
  /**
@@ -38,15 +38,23 @@ export function buildRoofWallOpeningCut(node, hostSegment) {
38
38
  return geo;
39
39
  }
40
40
  function buildCutGeometry(node, wallThickness, depth, bottomPad) {
41
+ const size = getDoorOpeningSize(node);
42
+ const offsetX = -size.leafOffsetX * openingHostFacing(node);
43
+ const offsetY = (size.height - node.height) / 2;
41
44
  const shaped = node.openingKind === 'opening' ||
42
45
  node.openingShape === 'arch' ||
43
46
  node.openingShape === 'rounded';
44
47
  if (!shaped) {
45
- const geo = new THREE.BoxGeometry(node.width, node.height + bottomPad, depth);
46
- geo.translate(0, -bottomPad / 2, 0);
48
+ const geo = new THREE.BoxGeometry(size.width, size.height + bottomPad, depth);
49
+ geo.translate(offsetX, offsetY - bottomPad / 2, 0);
47
50
  return geo;
48
51
  }
49
- const halfWidth = node.width / 2;
50
- const halfHeight = node.height / 2;
51
- return buildOpeningCutoutGeometry(node, { left: -halfWidth, right: halfWidth, bottom: -halfHeight - bottomPad, top: halfHeight }, depth, wallThickness);
52
+ const halfWidth = size.width / 2;
53
+ const halfHeight = size.height / 2;
54
+ return buildOpeningCutoutGeometry(node, {
55
+ left: offsetX - halfWidth,
56
+ right: offsetX + halfWidth,
57
+ bottom: offsetY - halfHeight - bottomPad,
58
+ top: offsetY + halfHeight,
59
+ }, depth, wallThickness);
52
60
  }
@@ -1,4 +1,4 @@
1
- import { type RoofEvent, type RoofNode, type RoofSegmentNode, type RoofSegmentWallFace } from '@pascal-app/core';
1
+ import { type DoorNode, type RoofEvent, type RoofNode, type RoofSegmentNode, type RoofSegmentWallFace } from '@pascal-app/core';
2
2
  import { Vector3 } from 'three';
3
3
  /**
4
4
  * Stateless target/cursor math shared by the door and window placement
@@ -35,6 +35,7 @@ export declare function resolveRoofWallOpeningTarget(args: {
35
35
  width: number;
36
36
  height: number;
37
37
  ignoreId?: string;
38
+ opening?: Partial<DoorNode>;
38
39
  vertical: RoofWallOpeningVertical;
39
40
  }): RoofWallOpeningTarget | null;
40
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"roof-wall-opening-placement.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B;;;;;GAKG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,mBAAmB,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,uBAAuB;AACjC,0DAA0D;AACxD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE;AAC3B,sEAAsE;GACpE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,uBAAuB,CAAA;CAClC,GAAG,qBAAqB,GAAG,IAAI,CA+B/B;AAID;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQrF;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,QAAQ,GACb;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWlE"}
1
+ {"version":3,"file":"roof-wall-opening-placement.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B;;;;;GAKG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,mBAAmB,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,uBAAuB;AACjC,0DAA0D;AACxD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE;AAC3B,sEAAsE;GACpE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3B,QAAQ,EAAE,uBAAuB,CAAA;CAClC,GAAG,qBAAqB,GAAG,IAAI,CAiC/B;AAID;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQrF;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,QAAQ,GACb;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWlE"}
@@ -1,4 +1,4 @@
1
- import { clampRectToRoofWallFace, roofFacePointToSegment, sceneRegistry, } from '@pascal-app/core';
1
+ import { clampRectToRoofWallFace, getDoorOpeningSize, roofFacePointToSegment, sceneRegistry, } from '@pascal-app/core';
2
2
  import { hasRoofFaceChildOverlap, resolveRoofWallHit } from '@pascal-app/editor';
3
3
  import { useViewer } from '@pascal-app/viewer';
4
4
  import { Vector3 } from 'three';
@@ -9,19 +9,21 @@ import { Vector3 } from 'three';
9
9
  * fit at that spot.
10
10
  */
11
11
  export function resolveRoofWallOpeningTarget(args) {
12
- const { event, width, height, ignoreId, vertical } = args;
12
+ const { event, ignoreId, vertical } = args;
13
+ const size = getDoorOpeningSize({ ...args.opening, width: args.width, height: args.height });
14
+ const { width, height } = size;
13
15
  const hit = resolveRoofWallHit(event.node, event.position, event.normal, event.object);
14
16
  if (!hit)
15
17
  return null;
16
18
  const centerV = vertical.kind === 'bottom-locked' ? height / 2 : (vertical.snap?.(hit.v) ?? hit.v);
17
- const clamped = clampRectToRoofWallFace(hit.face, hit.u, centerV, width, height, vertical.kind === 'bottom-locked' ? { lockV: true } : undefined);
19
+ const clamped = clampRectToRoofWallFace(hit.face, hit.u - size.leafOffsetX, centerV, width, height, vertical.kind === 'bottom-locked' ? { lockV: true } : undefined);
18
20
  if (!clamped)
19
21
  return null;
20
22
  const valid = !hasRoofFaceChildOverlap(hit.segment, hit.face.id, clamped.u, clamped.v, width, height, ignoreId);
21
23
  return {
22
24
  segment: hit.segment,
23
25
  face: hit.face,
24
- position: [clamped.u, clamped.v, 0],
26
+ position: [clamped.u + size.leafOffsetX, clamped.v - (height - args.height) / 2, 0],
25
27
  valid,
26
28
  };
27
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-hanger-inspector.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-inspector.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,+BAkH1E"}
1
+ {"version":3,"file":"run-hanger-inspector.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-inspector.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,+BA0J1E"}