@pascal-app/nodes 1.0.0-beta.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +1 -1
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  102. package/dist/cabinet/compartment-card.js +11 -3
  103. package/dist/cabinet/continuous-placement.d.ts +3 -0
  104. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  105. package/dist/cabinet/continuous-placement.js +6 -0
  106. package/dist/cabinet/definition.d.ts.map +1 -1
  107. package/dist/cabinet/definition.js +400 -54
  108. package/dist/cabinet/flame-index.d.ts +3 -0
  109. package/dist/cabinet/flame-index.d.ts.map +1 -0
  110. package/dist/cabinet/flame-index.js +13 -0
  111. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  112. package/dist/cabinet/floorplan-move.js +91 -22
  113. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  114. package/dist/cabinet/geometry/fridge.js +25 -1
  115. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  116. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  117. package/dist/cabinet/geometry/fronts.js +1 -1
  118. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  119. package/dist/cabinet/geometry/run.js +19 -1
  120. package/dist/cabinet/geometry.d.ts.map +1 -1
  121. package/dist/cabinet/geometry.js +63 -1
  122. package/dist/cabinet/index.d.ts +1 -0
  123. package/dist/cabinet/index.d.ts.map +1 -1
  124. package/dist/cabinet/index.js +1 -0
  125. package/dist/cabinet/insertion.d.ts +19 -0
  126. package/dist/cabinet/insertion.d.ts.map +1 -0
  127. package/dist/cabinet/insertion.js +49 -0
  128. package/dist/cabinet/move-frame.d.ts.map +1 -1
  129. package/dist/cabinet/move-frame.js +68 -2
  130. package/dist/cabinet/panel-context.d.ts +7 -0
  131. package/dist/cabinet/panel-context.d.ts.map +1 -0
  132. package/dist/cabinet/panel-context.js +16 -0
  133. package/dist/cabinet/panel-visibility.d.ts +9 -0
  134. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  135. package/dist/cabinet/panel-visibility.js +26 -0
  136. package/dist/cabinet/panel.d.ts.map +1 -1
  137. package/dist/cabinet/panel.js +221 -37
  138. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  139. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  140. package/dist/cabinet/placement-dimensions.js +227 -0
  141. package/dist/cabinet/placement-snap.d.ts +21 -1
  142. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  143. package/dist/cabinet/placement-snap.js +48 -6
  144. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  145. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  146. package/dist/cabinet/preset-width-debt.js +45 -0
  147. package/dist/cabinet/presets.d.ts.map +1 -1
  148. package/dist/cabinet/presets.js +14 -13
  149. package/dist/cabinet/profiles.d.ts +14 -0
  150. package/dist/cabinet/profiles.d.ts.map +1 -0
  151. package/dist/cabinet/profiles.js +30 -0
  152. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  153. package/dist/cabinet/quick-actions.js +8 -24
  154. package/dist/cabinet/reveals.d.ts +37 -0
  155. package/dist/cabinet/reveals.d.ts.map +1 -0
  156. package/dist/cabinet/reveals.js +13 -0
  157. package/dist/cabinet/run-layout.d.ts +90 -4
  158. package/dist/cabinet/run-layout.d.ts.map +1 -1
  159. package/dist/cabinet/run-layout.js +408 -23
  160. package/dist/cabinet/run-ops.d.ts +202 -10
  161. package/dist/cabinet/run-ops.d.ts.map +1 -1
  162. package/dist/cabinet/run-ops.js +520 -33
  163. package/dist/cabinet/run-panel.d.ts +6 -2
  164. package/dist/cabinet/run-panel.d.ts.map +1 -1
  165. package/dist/cabinet/run-panel.js +285 -108
  166. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  167. package/dist/cabinet/stack-transitions.js +35 -24
  168. package/dist/cabinet/stack.d.ts +169 -1
  169. package/dist/cabinet/stack.d.ts.map +1 -1
  170. package/dist/cabinet/stack.js +57 -18
  171. package/dist/cabinet/system.d.ts +2 -0
  172. package/dist/cabinet/system.d.ts.map +1 -1
  173. package/dist/cabinet/system.js +28 -8
  174. package/dist/cabinet/tool.d.ts.map +1 -1
  175. package/dist/cabinet/tool.js +616 -91
  176. package/dist/cabinet/validation.d.ts +27 -0
  177. package/dist/cabinet/validation.d.ts.map +1 -0
  178. package/dist/cabinet/validation.js +56 -0
  179. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  180. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  181. package/dist/cabinet/wall-height-presets.js +15 -0
  182. package/dist/cabinet/wall-snap.d.ts +27 -3
  183. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  184. package/dist/cabinet/wall-snap.js +278 -62
  185. package/dist/cabinet/widths.d.ts +10 -0
  186. package/dist/cabinet/widths.d.ts.map +1 -0
  187. package/dist/cabinet/widths.js +13 -0
  188. package/dist/ceiling/definition.d.ts.map +1 -1
  189. package/dist/ceiling/definition.js +7 -1
  190. package/dist/ceiling/floorplan-affordances.d.ts +8 -8
  191. package/dist/ceiling/materials.d.ts.map +1 -1
  192. package/dist/ceiling/materials.js +0 -1
  193. package/dist/ceiling/panel.d.ts.map +1 -1
  194. package/dist/ceiling/panel.js +8 -2
  195. package/dist/ceiling/parametrics.js +1 -1
  196. package/dist/chimney/definition.js +1 -1
  197. package/dist/chimney/panel.js +1 -1
  198. package/dist/chimney/parametrics.js +3 -3
  199. package/dist/column/definition.d.ts.map +1 -1
  200. package/dist/column/definition.js +22 -4
  201. package/dist/column/panel.d.ts.map +1 -1
  202. package/dist/column/panel.js +37 -7
  203. package/dist/column/parametrics.d.ts.map +1 -1
  204. package/dist/column/parametrics.js +5 -3
  205. package/dist/column/tool.d.ts.map +1 -1
  206. package/dist/column/tool.js +50 -14
  207. package/dist/cupola/definition.d.ts.map +1 -1
  208. package/dist/cupola/definition.js +15 -6
  209. package/dist/cupola/geometry.d.ts +6 -0
  210. package/dist/cupola/geometry.d.ts.map +1 -1
  211. package/dist/cupola/geometry.js +60 -13
  212. package/dist/cupola/paint.d.ts +4 -0
  213. package/dist/cupola/paint.d.ts.map +1 -0
  214. package/dist/cupola/paint.js +39 -0
  215. package/dist/cupola/panel.js +1 -1
  216. package/dist/cupola/parametrics.js +3 -3
  217. package/dist/cupola/renderer.d.ts.map +1 -1
  218. package/dist/cupola/renderer.js +27 -8
  219. package/dist/door/floorplan-move.d.ts.map +1 -1
  220. package/dist/door/floorplan-move.js +1 -1
  221. package/dist/door/move-tool.d.ts.map +1 -1
  222. package/dist/door/move-tool.js +86 -32
  223. package/dist/door/panel.d.ts.map +1 -1
  224. package/dist/door/panel.js +1 -1
  225. package/dist/door/parametrics.js +2 -2
  226. package/dist/door/tool.d.ts.map +1 -1
  227. package/dist/door/tool.js +16 -4
  228. package/dist/dormer/csg-geometry.d.ts +6 -42
  229. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  230. package/dist/dormer/csg-geometry.js +38 -209
  231. package/dist/dormer/definition.d.ts +4 -12
  232. package/dist/dormer/definition.d.ts.map +1 -1
  233. package/dist/dormer/definition.js +18 -193
  234. package/dist/dormer/floorplan.d.ts +3 -3
  235. package/dist/dormer/floorplan.d.ts.map +1 -1
  236. package/dist/dormer/floorplan.js +6 -17
  237. package/dist/dormer/geometry.d.ts +5 -24
  238. package/dist/dormer/geometry.d.ts.map +1 -1
  239. package/dist/dormer/geometry.js +64 -41
  240. package/dist/dormer/index.d.ts +1 -1
  241. package/dist/dormer/index.d.ts.map +1 -1
  242. package/dist/dormer/index.js +1 -1
  243. package/dist/dormer/move-tool.d.ts.map +1 -1
  244. package/dist/dormer/move-tool.js +31 -3
  245. package/dist/dormer/panel-windows-section.d.ts +9 -0
  246. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  247. package/dist/dormer/panel-windows-section.js +7 -0
  248. package/dist/dormer/panel.d.ts.map +1 -1
  249. package/dist/dormer/panel.js +100 -18
  250. package/dist/dormer/parametrics.d.ts.map +1 -1
  251. package/dist/dormer/parametrics.js +8 -77
  252. package/dist/dormer/placement-guides.d.ts.map +1 -1
  253. package/dist/dormer/placement-guides.js +5 -4
  254. package/dist/dormer/preview.d.ts.map +1 -1
  255. package/dist/dormer/preview.js +9 -1
  256. package/dist/dormer/renderer.d.ts.map +1 -1
  257. package/dist/dormer/renderer.js +24 -26
  258. package/dist/dormer/tool.d.ts.map +1 -1
  259. package/dist/dormer/tool.js +3 -1
  260. package/dist/dormer/window-layout.d.ts +15 -0
  261. package/dist/dormer/window-layout.d.ts.map +1 -0
  262. package/dist/dormer/window-layout.js +59 -0
  263. package/dist/downspout/definition.d.ts.map +1 -1
  264. package/dist/downspout/definition.js +17 -4
  265. package/dist/downspout/geometry.d.ts.map +1 -1
  266. package/dist/downspout/geometry.js +10 -0
  267. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  268. package/dist/downspout/inspector-editors.js +9 -1
  269. package/dist/downspout/parametrics.d.ts.map +1 -1
  270. package/dist/downspout/parametrics.js +2 -1
  271. package/dist/downspout/renderer.d.ts.map +1 -1
  272. package/dist/downspout/renderer.js +19 -3
  273. package/dist/downspout/system.d.ts +7 -0
  274. package/dist/downspout/system.d.ts.map +1 -0
  275. package/dist/downspout/system.js +114 -0
  276. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  277. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  278. package/dist/duct-fitting/accessory-geometry.js +47 -0
  279. package/dist/duct-fitting/definition.d.ts.map +1 -1
  280. package/dist/duct-fitting/definition.js +11 -1
  281. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  282. package/dist/duct-fitting/floorplan.js +8 -0
  283. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  284. package/dist/duct-fitting/geometry.js +52 -38
  285. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  286. package/dist/duct-fitting/parametrics.js +78 -15
  287. package/dist/duct-fitting/ports.d.ts +1 -0
  288. package/dist/duct-fitting/ports.d.ts.map +1 -1
  289. package/dist/duct-fitting/ports.js +46 -0
  290. package/dist/duct-fitting/tool.d.ts +19 -0
  291. package/dist/duct-fitting/tool.d.ts.map +1 -1
  292. package/dist/duct-fitting/tool.js +126 -34
  293. package/dist/duct-segment/continuation.d.ts +21 -0
  294. package/dist/duct-segment/continuation.d.ts.map +1 -0
  295. package/dist/duct-segment/continuation.js +167 -0
  296. package/dist/duct-segment/definition.d.ts.map +1 -1
  297. package/dist/duct-segment/definition.js +19 -18
  298. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  299. package/dist/duct-segment/floorplan.js +43 -0
  300. package/dist/duct-segment/geometry.d.ts.map +1 -1
  301. package/dist/duct-segment/geometry.js +3 -0
  302. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  303. package/dist/duct-segment/move-tool.js +33 -6
  304. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  305. package/dist/duct-segment/parametrics.js +45 -1
  306. package/dist/duct-segment/selection.d.ts +3 -4
  307. package/dist/duct-segment/selection.d.ts.map +1 -1
  308. package/dist/duct-segment/selection.js +186 -158
  309. package/dist/duct-segment/tool.d.ts +37 -0
  310. package/dist/duct-segment/tool.d.ts.map +1 -1
  311. package/dist/duct-segment/tool.js +305 -678
  312. package/dist/duct-terminal/parametrics.js +2 -2
  313. package/dist/duct-terminal/tool.d.ts.map +1 -1
  314. package/dist/duct-terminal/tool.js +37 -7
  315. package/dist/elevator/definition.d.ts.map +1 -1
  316. package/dist/elevator/definition.js +2 -0
  317. package/dist/elevator/panel.d.ts.map +1 -1
  318. package/dist/elevator/panel.js +7 -7
  319. package/dist/elevator/system.d.ts.map +1 -1
  320. package/dist/elevator/system.js +10 -1
  321. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  322. package/dist/eyebrow-vent/definition.js +8 -5
  323. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  324. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  325. package/dist/eyebrow-vent/geometry.js +60 -15
  326. package/dist/eyebrow-vent/paint.d.ts +4 -0
  327. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  328. package/dist/eyebrow-vent/paint.js +33 -0
  329. package/dist/eyebrow-vent/panel.js +1 -1
  330. package/dist/eyebrow-vent/parametrics.js +3 -3
  331. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  332. package/dist/eyebrow-vent/renderer.js +27 -8
  333. package/dist/fence/curve-tool.d.ts.map +1 -1
  334. package/dist/fence/curve-tool.js +14 -9
  335. package/dist/fence/definition.d.ts.map +1 -1
  336. package/dist/fence/definition.js +2 -1
  337. package/dist/fence/floorplan-affordances.d.ts +1 -0
  338. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  339. package/dist/fence/floorplan-affordances.js +30 -1
  340. package/dist/fence/floorplan.d.ts.map +1 -1
  341. package/dist/fence/floorplan.js +14 -0
  342. package/dist/fence/move-control-point-tool.d.ts.map +1 -1
  343. package/dist/fence/move-control-point-tool.js +13 -8
  344. package/dist/fence/move-tangent-tool.d.ts.map +1 -1
  345. package/dist/fence/move-tangent-tool.js +13 -8
  346. package/dist/fence/parametrics.js +3 -3
  347. package/dist/fence/tool.d.ts.map +1 -1
  348. package/dist/fence/tool.js +55 -31
  349. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  350. package/dist/gutter/corner-mitre.js +47 -7
  351. package/dist/gutter/definition.d.ts.map +1 -1
  352. package/dist/gutter/definition.js +23 -13
  353. package/dist/gutter/eave-align.d.ts.map +1 -1
  354. package/dist/gutter/eave-align.js +10 -0
  355. package/dist/gutter/eave-snap.d.ts +1 -1
  356. package/dist/gutter/eave-snap.d.ts.map +1 -1
  357. package/dist/gutter/eave-snap.js +10 -23
  358. package/dist/gutter/geometry.d.ts.map +1 -1
  359. package/dist/gutter/geometry.js +126 -8
  360. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  361. package/dist/gutter/outlet-lookup.js +22 -1
  362. package/dist/gutter/paint.d.ts +3 -0
  363. package/dist/gutter/paint.d.ts.map +1 -0
  364. package/dist/gutter/paint.js +6 -0
  365. package/dist/gutter/parametrics.d.ts.map +1 -1
  366. package/dist/gutter/parametrics.js +4 -1
  367. package/dist/gutter/renderer.d.ts.map +1 -1
  368. package/dist/gutter/renderer.js +63 -7
  369. package/dist/gutter/trim-clip.d.ts +3 -0
  370. package/dist/gutter/trim-clip.d.ts.map +1 -0
  371. package/dist/gutter/trim-clip.js +5 -0
  372. package/dist/hvac-equipment/parametrics.js +3 -3
  373. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  374. package/dist/hvac-equipment/tool.js +12 -2
  375. package/dist/index.d.ts +5 -2
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +9 -2
  378. package/dist/item/definition.d.ts.map +1 -1
  379. package/dist/item/definition.js +10 -2
  380. package/dist/item/floorplan-move.d.ts.map +1 -1
  381. package/dist/item/floorplan-move.js +20 -1
  382. package/dist/item/floorplan.d.ts.map +1 -1
  383. package/dist/item/floorplan.js +22 -1
  384. package/dist/item/move-tool.d.ts +28 -1
  385. package/dist/item/move-tool.d.ts.map +1 -1
  386. package/dist/item/move-tool.js +14 -2
  387. package/dist/item/renderer.d.ts.map +1 -1
  388. package/dist/item/renderer.js +16 -6
  389. package/dist/item/system.d.ts +5 -0
  390. package/dist/item/system.d.ts.map +1 -1
  391. package/dist/item/system.js +7 -1
  392. package/dist/lean-to-extension/arc.d.ts +14 -0
  393. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  394. package/dist/lean-to-extension/arc.js +56 -0
  395. package/dist/lean-to-extension/assembly.d.ts +61 -0
  396. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  397. package/dist/lean-to-extension/assembly.js +761 -0
  398. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  399. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  400. package/dist/lean-to-extension/canopy-joint.js +234 -0
  401. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  402. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  403. package/dist/lean-to-extension/conical-host.js +113 -0
  404. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  405. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  406. package/dist/lean-to-extension/corner-joint.js +1202 -0
  407. package/dist/lean-to-extension/definition.d.ts +4 -0
  408. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  409. package/dist/lean-to-extension/definition.js +433 -0
  410. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  411. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  412. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  413. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  414. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  415. package/dist/lean-to-extension/floorplan-move.js +157 -0
  416. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  417. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  418. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  419. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  420. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  421. package/dist/lean-to-extension/floorplan.js +373 -0
  422. package/dist/lean-to-extension/geometry.d.ts +7 -0
  423. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  424. package/dist/lean-to-extension/geometry.js +662 -0
  425. package/dist/lean-to-extension/index.d.ts +8 -0
  426. package/dist/lean-to-extension/index.d.ts.map +1 -0
  427. package/dist/lean-to-extension/index.js +7 -0
  428. package/dist/lean-to-extension/layout.d.ts +108 -0
  429. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  430. package/dist/lean-to-extension/layout.js +477 -0
  431. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  432. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  433. package/dist/lean-to-extension/managed-preview.js +93 -0
  434. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  435. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  436. package/dist/lean-to-extension/move-tool.js +202 -0
  437. package/dist/lean-to-extension/paint.d.ts +2 -0
  438. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  439. package/dist/lean-to-extension/paint.js +16 -0
  440. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  441. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  442. package/dist/lean-to-extension/parametrics.js +570 -0
  443. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  444. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  445. package/dist/lean-to-extension/placement-scope.js +4 -0
  446. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  447. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  448. package/dist/lean-to-extension/placement-validation.js +324 -0
  449. package/dist/lean-to-extension/placement.d.ts +59 -0
  450. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  451. package/dist/lean-to-extension/placement.js +331 -0
  452. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  453. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  454. package/dist/lean-to-extension/plan-footprint.js +27 -0
  455. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  456. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  457. package/dist/lean-to-extension/preview-geometry.js +40 -0
  458. package/dist/lean-to-extension/preview.d.ts +7 -0
  459. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  460. package/dist/lean-to-extension/preview.js +20 -0
  461. package/dist/lean-to-extension/renderer.d.ts +6 -0
  462. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  463. package/dist/lean-to-extension/renderer.js +34 -0
  464. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  465. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  466. package/dist/lean-to-extension/roof-attachment.js +376 -0
  467. package/dist/lean-to-extension/schema.d.ts +2 -0
  468. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  469. package/dist/lean-to-extension/schema.js +1 -0
  470. package/dist/lean-to-extension/slots.d.ts +5 -0
  471. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  472. package/dist/lean-to-extension/slots.js +15 -0
  473. package/dist/lean-to-extension/system.d.ts +7 -0
  474. package/dist/lean-to-extension/system.d.ts.map +1 -0
  475. package/dist/lean-to-extension/system.js +726 -0
  476. package/dist/lean-to-extension/tool.d.ts +3 -0
  477. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  478. package/dist/lean-to-extension/tool.js +580 -0
  479. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  480. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  481. package/dist/lean-to-extension/wall-target.js +29 -0
  482. package/dist/lineset/definition.d.ts.map +1 -1
  483. package/dist/lineset/definition.js +1 -0
  484. package/dist/liquid-line/definition.d.ts.map +1 -1
  485. package/dist/liquid-line/definition.js +1 -0
  486. package/dist/measurement/renderer.d.ts.map +1 -1
  487. package/dist/measurement/renderer.js +6 -5
  488. package/dist/measurement/surface-query.js +5 -5
  489. package/dist/measurement/tool.d.ts.map +1 -1
  490. package/dist/measurement/tool.js +7 -5
  491. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  492. package/dist/pipe-fitting/definition.js +16 -2
  493. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  494. package/dist/pipe-fitting/floorplan.js +4 -0
  495. package/dist/pipe-fitting/geometry.d.ts +3 -5
  496. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  497. package/dist/pipe-fitting/geometry.js +154 -21
  498. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  499. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  500. package/dist/pipe-fitting/inline-insertion.js +96 -0
  501. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  502. package/dist/pipe-fitting/parametrics.js +17 -3
  503. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  504. package/dist/pipe-fitting/ports.js +8 -1
  505. package/dist/pipe-fitting/tool.d.ts +26 -0
  506. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  507. package/dist/pipe-fitting/tool.js +182 -37
  508. package/dist/pipe-segment/continuation.d.ts +22 -0
  509. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  510. package/dist/pipe-segment/continuation.js +146 -0
  511. package/dist/pipe-segment/definition.d.ts.map +1 -1
  512. package/dist/pipe-segment/definition.js +23 -7
  513. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  514. package/dist/pipe-segment/floorplan.js +42 -0
  515. package/dist/pipe-segment/geometry.d.ts +2 -1
  516. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  517. package/dist/pipe-segment/geometry.js +4 -1
  518. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  519. package/dist/pipe-segment/move-tool.js +25 -5
  520. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  521. package/dist/pipe-segment/parametrics.js +45 -0
  522. package/dist/pipe-segment/selection.d.ts +3 -4
  523. package/dist/pipe-segment/selection.d.ts.map +1 -1
  524. package/dist/pipe-segment/selection.js +169 -105
  525. package/dist/pipe-segment/slope.d.ts +5 -0
  526. package/dist/pipe-segment/slope.d.ts.map +1 -0
  527. package/dist/pipe-segment/slope.js +10 -0
  528. package/dist/pipe-segment/tool.d.ts.map +1 -1
  529. package/dist/pipe-segment/tool.js +325 -545
  530. package/dist/pipe-trap/tool.d.ts.map +1 -1
  531. package/dist/pipe-trap/tool.js +15 -2
  532. package/dist/ridge-vent/definition.js +1 -1
  533. package/dist/ridge-vent/panel.d.ts.map +1 -1
  534. package/dist/ridge-vent/panel.js +2 -2
  535. package/dist/ridge-vent/parametrics.js +1 -1
  536. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  537. package/dist/ridge-vent/renderer.js +2 -2
  538. package/dist/roof/conical-roof-placement.d.ts +36 -0
  539. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  540. package/dist/roof/conical-roof-placement.js +134 -0
  541. package/dist/roof/conical-roof.d.ts +3 -0
  542. package/dist/roof/conical-roof.d.ts.map +1 -0
  543. package/dist/roof/conical-roof.js +53 -0
  544. package/dist/roof/definition.d.ts +3 -10
  545. package/dist/roof/definition.d.ts.map +1 -1
  546. package/dist/roof/definition.js +83 -13
  547. package/dist/roof/floorplan.d.ts +3 -10
  548. package/dist/roof/floorplan.d.ts.map +1 -1
  549. package/dist/roof/floorplan.js +139 -165
  550. package/dist/roof/index.d.ts +1 -0
  551. package/dist/roof/index.d.ts.map +1 -1
  552. package/dist/roof/index.js +1 -0
  553. package/dist/roof/panel.d.ts.map +1 -1
  554. package/dist/roof/panel.js +22 -23
  555. package/dist/roof/renderer.d.ts.map +1 -1
  556. package/dist/roof/roof-footprint-source.d.ts +16 -0
  557. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  558. package/dist/roof/roof-footprint-source.js +14 -0
  559. package/dist/roof/roof-footprint.d.ts +25 -0
  560. package/dist/roof/roof-footprint.d.ts.map +1 -0
  561. package/dist/roof/roof-footprint.js +94 -0
  562. package/dist/roof/roof-placement-mode.d.ts +18 -0
  563. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  564. package/dist/roof/roof-placement-mode.js +24 -0
  565. package/dist/roof/tool.d.ts +10 -0
  566. package/dist/roof/tool.d.ts.map +1 -0
  567. package/dist/roof/tool.js +922 -0
  568. package/dist/roof-segment/definition.d.ts.map +1 -1
  569. package/dist/roof-segment/definition.js +52 -8
  570. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  571. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  572. package/dist/roof-segment/floorplan-affordances.js +64 -18
  573. package/dist/roof-segment/floorplan.d.ts +3 -2
  574. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  575. package/dist/roof-segment/floorplan.js +95 -46
  576. package/dist/roof-segment/panel.d.ts.map +1 -1
  577. package/dist/roof-segment/panel.js +122 -27
  578. package/dist/scan/definition.d.ts +2 -3
  579. package/dist/scan/definition.d.ts.map +1 -1
  580. package/dist/scan/definition.js +9 -7
  581. package/dist/scan/parametrics.d.ts.map +1 -1
  582. package/dist/scan/parametrics.js +13 -1
  583. package/dist/scan/renderer.d.ts.map +1 -1
  584. package/dist/scan/renderer.js +8 -2
  585. package/dist/shared/accessory-cursor.d.ts +7 -0
  586. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  587. package/dist/shared/accessory-cursor.js +83 -0
  588. package/dist/shared/accessory-floorplan.d.ts +4 -0
  589. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  590. package/dist/shared/accessory-floorplan.js +51 -0
  591. package/dist/shared/accessory-geometry.d.ts +7 -0
  592. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  593. package/dist/shared/accessory-geometry.js +79 -0
  594. package/dist/shared/accessory-placement.d.ts +10 -0
  595. package/dist/shared/accessory-placement.d.ts.map +1 -0
  596. package/dist/shared/accessory-placement.js +126 -0
  597. package/dist/shared/accessory-snapping.d.ts +5 -0
  598. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  599. package/dist/shared/accessory-snapping.js +40 -0
  600. package/dist/shared/automatic-run-end-cap.d.ts +11 -0
  601. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  602. package/dist/shared/automatic-run-end-cap.js +159 -0
  603. package/dist/shared/block-face-host.d.ts +15 -0
  604. package/dist/shared/block-face-host.d.ts.map +1 -0
  605. package/dist/shared/block-face-host.js +36 -0
  606. package/dist/shared/connection-compatibility.d.ts +8 -0
  607. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  608. package/dist/shared/connection-compatibility.js +28 -0
  609. package/dist/shared/connection-feedback.d.ts +10 -0
  610. package/dist/shared/connection-feedback.d.ts.map +1 -0
  611. package/dist/shared/connection-feedback.js +17 -0
  612. package/dist/shared/distribution-run-contract.d.ts +49 -0
  613. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  614. package/dist/shared/distribution-run-contract.js +30 -0
  615. package/dist/shared/distribution-run-tool.d.ts +107 -0
  616. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  617. package/dist/shared/distribution-run-tool.js +941 -0
  618. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  619. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  620. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  621. package/dist/shared/duct-adapter.d.ts +10 -0
  622. package/dist/shared/duct-adapter.d.ts.map +1 -0
  623. package/dist/shared/duct-adapter.js +43 -0
  624. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  625. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  626. package/dist/shared/elbow-branch-continuation.js +200 -0
  627. package/dist/shared/fitting-clearance.d.ts +5 -0
  628. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  629. package/dist/shared/fitting-clearance.js +11 -0
  630. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  631. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  632. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  633. package/dist/shared/fitting-surface-support.d.ts +5 -0
  634. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  635. package/dist/shared/fitting-surface-support.js +42 -0
  636. package/dist/shared/fitting-tool-options.d.ts +4 -0
  637. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  638. package/dist/shared/fitting-tool-options.js +175 -0
  639. package/dist/shared/floor-placement.d.ts +1 -1
  640. package/dist/shared/floor-placement.d.ts.map +1 -1
  641. package/dist/shared/floor-placement.js +13 -33
  642. package/dist/shared/ghost-materials.d.ts.map +1 -1
  643. package/dist/shared/ghost-materials.js +2 -1
  644. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  645. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  646. package/dist/shared/lean-to-post-omissions.js +51 -0
  647. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  648. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  649. package/dist/shared/mep-fitting-actions.js +16 -0
  650. package/dist/shared/mep-ghost.d.ts.map +1 -1
  651. package/dist/shared/mep-ghost.js +19 -1
  652. package/dist/shared/mep-presets.d.ts +11 -0
  653. package/dist/shared/mep-presets.d.ts.map +1 -0
  654. package/dist/shared/mep-presets.js +34 -0
  655. package/dist/shared/node-batch/candidates.d.ts +29 -0
  656. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  657. package/dist/shared/node-batch/candidates.js +260 -0
  658. package/dist/shared/node-batch/store.d.ts +26 -0
  659. package/dist/shared/node-batch/store.d.ts.map +1 -0
  660. package/dist/shared/node-batch/store.js +319 -0
  661. package/dist/shared/node-batch/system.d.ts +8 -0
  662. package/dist/shared/node-batch/system.d.ts.map +1 -0
  663. package/dist/shared/node-batch/system.js +569 -0
  664. package/dist/shared/node-batch/types.d.ts +99 -0
  665. package/dist/shared/node-batch/types.d.ts.map +1 -0
  666. package/dist/shared/node-batch/types.js +4 -0
  667. package/dist/shared/opening-move-history.d.ts +47 -0
  668. package/dist/shared/opening-move-history.d.ts.map +1 -0
  669. package/dist/shared/opening-move-history.js +18 -0
  670. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  671. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  672. package/dist/shared/opening-move-wall-gate.js +44 -0
  673. package/dist/shared/path-point-affordance.d.ts +2 -2
  674. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  675. package/dist/shared/path-point-affordance.js +30 -6
  676. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  677. package/dist/shared/placeholder-geometry.js +4 -0
  678. package/dist/shared/ports.d.ts +20 -3
  679. package/dist/shared/ports.d.ts.map +1 -1
  680. package/dist/shared/ports.js +148 -7
  681. package/dist/shared/primitive-uv.d.ts +17 -0
  682. package/dist/shared/primitive-uv.d.ts.map +1 -0
  683. package/dist/shared/primitive-uv.js +107 -0
  684. package/dist/shared/reducer-size.d.ts +2 -0
  685. package/dist/shared/reducer-size.d.ts.map +1 -0
  686. package/dist/shared/reducer-size.js +12 -0
  687. package/dist/shared/ridge-snap.js +1 -1
  688. package/dist/shared/roof-surface.d.ts.map +1 -1
  689. package/dist/shared/roof-surface.js +17 -2
  690. package/dist/shared/run-cursor.d.ts +22 -0
  691. package/dist/shared/run-cursor.d.ts.map +1 -0
  692. package/dist/shared/run-cursor.js +19 -0
  693. package/dist/shared/run-direction-feedback.d.ts +20 -0
  694. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  695. package/dist/shared/run-direction-feedback.js +139 -0
  696. package/dist/shared/run-hanger-controls.d.ts +7 -0
  697. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  698. package/dist/shared/run-hanger-controls.js +44 -0
  699. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  700. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  701. package/dist/shared/run-hanger-inspector.js +43 -0
  702. package/dist/shared/run-hanger-mode.d.ts +11 -0
  703. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  704. package/dist/shared/run-hanger-mode.js +32 -0
  705. package/dist/shared/run-hanger-system.d.ts +3 -0
  706. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  707. package/dist/shared/run-hanger-system.js +39 -0
  708. package/dist/shared/run-hangers.d.ts +25 -0
  709. package/dist/shared/run-hangers.d.ts.map +1 -0
  710. package/dist/shared/run-hangers.js +261 -0
  711. package/dist/shared/run-port-snap.d.ts +11 -0
  712. package/dist/shared/run-port-snap.d.ts.map +1 -0
  713. package/dist/shared/run-port-snap.js +19 -0
  714. package/dist/shared/run-screen-direction.d.ts +5 -0
  715. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  716. package/dist/shared/run-screen-direction.js +24 -0
  717. package/dist/shared/selection-handles.d.ts +4 -0
  718. package/dist/shared/selection-handles.d.ts.map +1 -1
  719. package/dist/shared/selection-handles.js +10 -0
  720. package/dist/shared/slot-paint.d.ts +8 -1
  721. package/dist/shared/slot-paint.d.ts.map +1 -1
  722. package/dist/shared/slot-paint.js +120 -27
  723. package/dist/shared/surface-paint.d.ts +1 -2
  724. package/dist/shared/surface-paint.d.ts.map +1 -1
  725. package/dist/shared/surface-paint.js +9 -20
  726. package/dist/shared/system-check-panel.d.ts +6 -0
  727. package/dist/shared/system-check-panel.d.ts.map +1 -0
  728. package/dist/shared/system-check-panel.js +62 -0
  729. package/dist/shared/system-checks.d.ts +9 -0
  730. package/dist/shared/system-checks.d.ts.map +1 -0
  731. package/dist/shared/system-checks.js +131 -0
  732. package/dist/shared/wall-attach-target.d.ts +14 -2
  733. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  734. package/dist/shared/wall-attach-target.js +108 -4
  735. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  736. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  737. package/dist/shared/wall-opening-clearance.js +28 -0
  738. package/dist/shared/wall-run-move.d.ts +17 -0
  739. package/dist/shared/wall-run-move.d.ts.map +1 -0
  740. package/dist/shared/wall-run-move.js +56 -0
  741. package/dist/shelf/parametrics.js +4 -4
  742. package/dist/site/renderer.d.ts.map +1 -1
  743. package/dist/site/renderer.js +40 -28
  744. package/dist/site/terrain-geometry.d.ts +1 -1
  745. package/dist/site/terrain-geometry.d.ts.map +1 -1
  746. package/dist/site/terrain-geometry.js +35 -9
  747. package/dist/site/terrain-mesh.d.ts +5 -0
  748. package/dist/site/terrain-mesh.d.ts.map +1 -1
  749. package/dist/site/terrain-mesh.js +63 -34
  750. package/dist/skylight/definition.js +1 -1
  751. package/dist/skylight/panel.js +1 -1
  752. package/dist/skylight/parametrics.js +2 -2
  753. package/dist/slab/definition.d.ts.map +1 -1
  754. package/dist/slab/definition.js +6 -1
  755. package/dist/slab/dependency-tracker.d.ts +3 -0
  756. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  757. package/dist/slab/dependency-tracker.js +104 -0
  758. package/dist/slab/floorplan-affordances.d.ts +8 -8
  759. package/dist/slab/geometry.d.ts.map +1 -1
  760. package/dist/slab/geometry.js +16 -2
  761. package/dist/slab/panel.d.ts.map +1 -1
  762. package/dist/slab/panel.js +1 -1
  763. package/dist/slab/parametrics.js +1 -1
  764. package/dist/slab/system.d.ts.map +1 -1
  765. package/dist/slab/system.js +8 -64
  766. package/dist/solar-panel/definition.js +1 -1
  767. package/dist/solar-panel/panel.js +1 -1
  768. package/dist/solar-panel/parametrics.js +2 -2
  769. package/dist/stair/panel.d.ts.map +1 -1
  770. package/dist/stair/panel.js +18 -13
  771. package/dist/stair/stair-type.d.ts +18 -0
  772. package/dist/stair/stair-type.d.ts.map +1 -0
  773. package/dist/stair/stair-type.js +25 -0
  774. package/dist/stair-segment/panel.d.ts.map +1 -1
  775. package/dist/stair-segment/panel.js +44 -5
  776. package/dist/turbine-vent/definition.d.ts.map +1 -1
  777. package/dist/turbine-vent/definition.js +8 -5
  778. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  779. package/dist/turbine-vent/geometry.js +48 -18
  780. package/dist/turbine-vent/paint.d.ts +4 -0
  781. package/dist/turbine-vent/paint.d.ts.map +1 -0
  782. package/dist/turbine-vent/paint.js +35 -0
  783. package/dist/turbine-vent/panel.js +1 -1
  784. package/dist/turbine-vent/parametrics.js +2 -2
  785. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  786. package/dist/turbine-vent/renderer.js +31 -9
  787. package/dist/wall/curve-eligibility.d.ts +3 -0
  788. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  789. package/dist/wall/curve-eligibility.js +10 -0
  790. package/dist/wall/curve-tool.d.ts +3 -4
  791. package/dist/wall/curve-tool.d.ts.map +1 -1
  792. package/dist/wall/curve-tool.js +24 -23
  793. package/dist/wall/definition.d.ts +1 -1
  794. package/dist/wall/definition.d.ts.map +1 -1
  795. package/dist/wall/definition.js +36 -13
  796. package/dist/wall/floorplan-affordances.d.ts +1 -0
  797. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  798. package/dist/wall/floorplan-affordances.js +46 -7
  799. package/dist/wall/floorplan-move.d.ts +3 -4
  800. package/dist/wall/floorplan-move.d.ts.map +1 -1
  801. package/dist/wall/floorplan-move.js +122 -9
  802. package/dist/wall/floorplan.d.ts.map +1 -1
  803. package/dist/wall/floorplan.js +19 -23
  804. package/dist/wall/move-shared.d.ts.map +1 -1
  805. package/dist/wall/move-shared.js +10 -7
  806. package/dist/wall/paint.d.ts.map +1 -1
  807. package/dist/wall/paint.js +2 -0
  808. package/dist/wall/panel.d.ts.map +1 -1
  809. package/dist/wall/panel.js +62 -27
  810. package/dist/wall/parametrics.js +2 -2
  811. package/dist/wall/pointer-transparency.d.ts +128 -0
  812. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  813. package/dist/wall/pointer-transparency.js +147 -0
  814. package/dist/wall/renderer.d.ts.map +1 -1
  815. package/dist/wall/renderer.js +65 -8
  816. package/dist/wall/selection-hit-owner.d.ts +53 -0
  817. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  818. package/dist/wall/selection-hit-owner.js +79 -0
  819. package/dist/wall/system.d.ts +5 -0
  820. package/dist/wall/system.d.ts.map +1 -1
  821. package/dist/wall/system.js +71 -26
  822. package/dist/wall/tool.d.ts.map +1 -1
  823. package/dist/wall/tool.js +29 -27
  824. package/dist/wall/treatment-level-data.d.ts +6 -1
  825. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  826. package/dist/wall/treatment-level-data.js +82 -5
  827. package/dist/wall/treatments.d.ts +1 -0
  828. package/dist/wall/treatments.d.ts.map +1 -1
  829. package/dist/wall/treatments.js +5 -0
  830. package/dist/wall/wall-batch-system.d.ts +55 -0
  831. package/dist/wall/wall-batch-system.d.ts.map +1 -0
  832. package/dist/wall/wall-batch-system.js +486 -0
  833. package/dist/wall/wall-batch.d.ts +66 -0
  834. package/dist/wall/wall-batch.d.ts.map +1 -0
  835. package/dist/wall/wall-batch.js +169 -0
  836. package/dist/window/definition.d.ts +2 -1
  837. package/dist/window/definition.d.ts.map +1 -1
  838. package/dist/window/definition.js +51 -24
  839. package/dist/window/floorplan-move.d.ts.map +1 -1
  840. package/dist/window/floorplan-move.js +1 -1
  841. package/dist/window/move-tool.d.ts +7 -5
  842. package/dist/window/move-tool.d.ts.map +1 -1
  843. package/dist/window/move-tool.js +344 -58
  844. package/dist/window/panel.d.ts.map +1 -1
  845. package/dist/window/panel.js +2 -0
  846. package/dist/window/parametrics.js +2 -2
  847. package/dist/window/renderer.d.ts.map +1 -1
  848. package/dist/window/renderer.js +5 -7
  849. package/dist/window/tool.d.ts.map +1 -1
  850. package/dist/window/tool.js +227 -13
  851. package/dist/zone/floorplan-affordances.d.ts +12 -12
  852. package/dist/zone/quantities-panel.d.ts.map +1 -1
  853. package/dist/zone/quantities-panel.js +4 -3
  854. package/package.json +11 -9
  855. package/dist/dormer/panel-window-section.d.ts +0 -14
  856. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  857. package/dist/dormer/panel-window-section.js +0 -59
  858. package/dist/dormer/window-assembly.d.ts +0 -22
  859. package/dist/dormer/window-assembly.d.ts.map +0 -1
  860. package/dist/dormer/window-assembly.js +0 -111
  861. package/dist/dormer/window-frame.d.ts +0 -24
  862. package/dist/dormer/window-frame.d.ts.map +0 -1
  863. package/dist/dormer/window-frame.js +0 -100
@@ -1,7 +1,7 @@
1
- import { getPitchFromActiveRoofHeight, getRoofSegmentSurfaceY, ROOF_SHAPE_DEFAULTS, } from '@pascal-app/core';
2
- import { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, prepareBrushForCSG, remapRoofShellFaces, roofCsgDummyMats, SUBTRACTION, } from '@pascal-app/viewer';
1
+ import { dormerWallFacePointToDormer, getDormerWallFaceFrame, getPitchFromActiveRoofHeight, ROOF_SHAPE_DEFAULTS, } from '@pascal-app/core';
2
+ import { ADDITION, Brush, buildOpeningCutoutGeometry, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, prepareBrushForCSG, remapRoofShellFaces, roofCsgDummyMats, SUBTRACTION, } from '@pascal-app/viewer';
3
3
  import * as THREE from 'three';
4
- import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
4
+ import { buildDormerShellGeometry, getDormerBodyYaw } from './geometry';
5
5
  // Legacy default for the hung-wall (skirt) height. Used as a fallback
6
6
  // when `dormer.wallSkirtHeight` is undefined (e.g. old saved scenes).
7
7
  const DORMER_DROP_BELOW = 2;
@@ -17,194 +17,20 @@ const _scale = new THREE.Vector3(1, 1, 1);
17
17
  * the live preview during slider drags so we don't re-run CSG on every
18
18
  * pointer move. Also used by the placement / move-tool ghost.
19
19
  *
20
- * Builds a rectangular body + simple roof in dormer-mesh-local. For
21
- * `flat` dormers the roof triangle is skipped. Other roof types use
22
- * the gable approximation — it's a rough silhouette by design.
23
- *
24
20
  * The wall sits at material slot 0 and the roof at slot 3 so it picks
25
21
  * up the same material array the renderer passes for the CSG output.
26
22
  */
27
23
  export function buildDormerFallbackGeometry(dormer) {
28
- const w = Math.max(0.05, dormer.width);
29
- const d = Math.max(0.05, dormer.depth);
30
- const wallH = Math.max(0.05, dormer.height);
31
- const roofH = Math.max(0, dormer.roofHeight);
32
- const skirt = dormerSkirtHeight(dormer);
33
- const isFlat = dormer.roofType === 'flat' || roofH === 0;
34
- // Body box: foot at y = -skirt, top at y = wallH.
35
- // BoxGeometry is indexed; ExtrudeGeometry below is not. mergeGeometries
36
- // refuses mixed input ("index attribute exists among all geometries,
37
- // or in none of them") — drop the body's index so both inputs match.
38
- const indexedBody = new THREE.BoxGeometry(w, wallH + skirt, d);
39
- indexedBody.translate(0, (wallH - skirt) / 2, 0);
40
- const body = indexedBody.toNonIndexed();
41
- indexedBody.dispose();
42
- const bVtx = body.getAttribute('position').count;
43
- body.clearGroups();
44
- body.addGroup(0, bVtx, 0);
45
- if (isFlat) {
46
- if (!body.getAttribute('normal'))
47
- body.computeVertexNormals();
48
- return body;
49
- }
50
- // Roof: extruded triangle from eave (y = wallH) to peak (y = wallH + roofH).
51
- // Apex points along +Y, base spans the width. Extrude along Z (depth).
52
- const roofShape = new THREE.Shape();
53
- roofShape.moveTo(-w / 2, 0);
54
- roofShape.lineTo(w / 2, 0);
55
- roofShape.lineTo(0, roofH);
56
- roofShape.lineTo(-w / 2, 0);
57
- const roof = new THREE.ExtrudeGeometry(roofShape, { depth: d, bevelEnabled: false });
58
- roof.translate(0, wallH, -d / 2);
59
- const rVtx = roof.getAttribute('position').count;
60
- roof.clearGroups();
61
- roof.addGroup(0, rVtx, 3);
62
- const merged = mergeGeometries([body, roof], true) ?? body;
63
- body.dispose();
64
- roof.dispose();
65
- if (!merged.getAttribute('normal'))
66
- merged.computeVertexNormals();
67
- return merged;
68
- }
69
- export function createDormerArchShape(w, h, archHeight) {
70
- const hw = w / 2;
71
- const hh = h / 2;
72
- const clampedArch = Math.min(Math.max(archHeight, 0.01), Math.max(h, 0.01));
73
- const springY = hh - clampedArch;
74
- const segments = 32;
75
- const shape = new THREE.Shape();
76
- shape.moveTo(-hw, -hh);
77
- shape.lineTo(hw, -hh);
78
- shape.lineTo(hw, springY);
79
- for (let i = 1; i <= segments; i++) {
80
- const x = hw + (-hw - hw) * (i / segments);
81
- const t = Math.min(Math.abs(x) / hw, 1);
82
- const y = springY + clampedArch * Math.sqrt(Math.max(1 - t * t, 0));
83
- shape.lineTo(x, y);
84
- }
85
- shape.lineTo(-hw, -hh);
86
- shape.closePath();
87
- return shape;
88
- }
89
- export function normalizeDormerCornerRadii(radii, w, h) {
90
- const r = radii.map((v) => Math.max(v, 0));
91
- const scale = Math.min(1, Math.max(w, 0) / Math.max(r[0] + r[1], 1e-6), Math.max(w, 0) / Math.max(r[3] + r[2], 1e-6), Math.max(h, 0) / Math.max(r[0] + r[3], 1e-6), Math.max(h, 0) / Math.max(r[1] + r[2], 1e-6));
92
- if (scale >= 1)
93
- return r;
94
- return r.map((v) => v * scale);
95
- }
96
- export function createDormerRoundedShape(w, h, radii) {
97
- const hw = w / 2;
98
- const hh = h / 2;
99
- const [tl, tr, br, bl] = normalizeDormerCornerRadii(radii, w, h);
100
- const shape = new THREE.Shape();
101
- shape.moveTo(-hw + bl, -hh);
102
- shape.lineTo(hw - br, -hh);
103
- if (br > 0)
104
- shape.absarc(hw - br, -hh + br, br, -Math.PI / 2, 0, false);
105
- else
106
- shape.lineTo(hw, -hh);
107
- shape.lineTo(hw, hh - tr);
108
- if (tr > 0)
109
- shape.absarc(hw - tr, hh - tr, tr, 0, Math.PI / 2, false);
110
- else
111
- shape.lineTo(hw, hh);
112
- shape.lineTo(-hw + tl, hh);
113
- if (tl > 0)
114
- shape.absarc(-hw + tl, hh - tl, tl, Math.PI / 2, Math.PI, false);
115
- else
116
- shape.lineTo(-hw, hh);
117
- shape.lineTo(-hw, -hh + bl);
118
- if (bl > 0)
119
- shape.absarc(-hw + bl, -hh + bl, bl, Math.PI, (3 * Math.PI) / 2, false);
120
- else
121
- shape.lineTo(-hw, -hh);
122
- shape.closePath();
123
- return shape;
24
+ return buildDormerShellGeometry(dormer);
124
25
  }
125
- function resolveDormerRadii(dormer, w, h) {
126
- return normalizeDormerCornerRadii(dormer.windowCornerRadii, w, h);
127
- }
128
- function createDormerWindowCutGeometry(dormer, w, h, depth) {
129
- const shape = dormer.windowShape ?? 'rectangle';
130
- if (shape === 'arch') {
131
- const s = createDormerArchShape(w, h, dormer.windowArchHeight ?? 0.35);
132
- const geo = new THREE.ExtrudeGeometry(s, { depth, bevelEnabled: false, curveSegments: 24 });
133
- geo.translate(0, 0, -depth / 2);
134
- return geo;
135
- }
136
- if (shape === 'rounded') {
137
- const radii = resolveDormerRadii(dormer, w, h);
138
- const s = createDormerRoundedShape(w, h, radii);
139
- const geo = new THREE.ExtrudeGeometry(s, { depth, bevelEnabled: false, curveSegments: 24 });
140
- geo.translate(0, 0, -depth / 2);
141
- return geo;
142
- }
143
- return new THREE.BoxGeometry(w, h, depth);
144
- }
145
- // Exposure datum: a face shows its window when the window CENTER clears
146
- // the host's structural surface line (≥ half the window visible).
147
- // Gating on the window BOTTOM suppressed the default window on the
148
- // default 40° roof (break-even ≈ 36.7° pitch) and across the whole
149
- // lower-slope/overhang band. A partially buried window reads as a
150
- // window meeting the roof line: the host shingle shell occludes the
151
- // buried frame from outside (the dormer roof cut only clears the inner
152
- // cavity, 5cm short of the gable face), and the glass panes span the
153
- // full opening so the wall cut never reads as a see-through hole. The
154
- // margin only absorbs float noise at the grazing boundary — suppress
155
- // only when the window is truly unplaceable.
156
- const WINDOW_CENTER_MIN_CLEARANCE = 0.01;
157
- /**
158
- * Which gable faces of a dormer have a visible window opening.
159
- * "front" = mesh-local +Z, "back" = mesh-local −Z (after the +π/2 yaw
160
- * bake for non-shed roofs).
161
- *
162
- * Each face centre is lifted into segment-local X *and* Z (the yaw
163
- * matters, and on hip hosts the end slopes fall along X) and compared
164
- * against the host's canonical per-type surface line via
165
- * `getRoofSegmentSurfaceY`, which extrapolates past the structural
166
- * eave instead of plateauing at the wall top — a face hanging in free
167
- * air past the eave keeps dropping. Gates both the CSG window-cut
168
- * decision (`generateDormerGeometry`) and the live render
169
- * (window-assembly.tsx).
170
- */
171
- export function getDormerExposedFaces(dormer, hostSegment) {
172
- const halfDepth = dormer.depth / 2;
173
- const dormerX = dormer.position[0] ?? 0;
174
- const dormerY = dormer.position[1] ?? 0;
175
- const dormerZ = dormer.position[2] ?? 0;
176
- const rot = dormer.rotation ?? 0;
177
- // Gable-face centres in segment-local X/Z (accounts for dormer yaw).
178
- const faceDX = halfDepth * Math.sin(rot);
179
- const faceDZ = halfDepth * Math.cos(rot);
180
- // Window centre in segment-local Y. Mirrors `getDormerSkirtWindowDims`
181
- // so both functions read the same window position: dormer-local Y=0
182
- // sits at `dormer.position[1]` and the window centre sits in the
183
- // skirt at -(skirtH / 2) + windowOffsetY.
184
- const skirtH = dormerSkirtHeight(dormer);
185
- const windowCenterSegY = dormerY - skirtH / 2 + (dormer.windowOffsetY ?? 0);
186
- const clears = (faceX, faceZ) => windowCenterSegY - getRoofSegmentSurfaceY(hostSegment, faceX, faceZ) >
187
- WINDOW_CENTER_MIN_CLEARANCE;
188
- return {
189
- front: clears(dormerX + faceDX, dormerZ + faceDZ),
190
- back: clears(dormerX - faceDX, dormerZ - faceDZ),
191
- };
192
- }
193
- /**
194
- * Computed dimensions for the window opening on a dormer's gable face.
195
- * The skirt (the wall extension below the eave used for CSG-trim) is
196
- * `DORMER_DROP_BELOW` tall, so the window sits within that band.
197
- */
198
- export function getDormerSkirtWindowDims(dormer) {
199
- const skirtH = dormerSkirtHeight(dormer);
200
- const maxW = Math.max(dormer.width - 0.1, 0.1);
201
- const maxH = Math.max(skirtH - 0.1, 0.1);
202
- const width = Math.min(Math.max(dormer.windowWidth ?? 1.2, 0.1), maxW);
203
- const height = Math.min(Math.max(dormer.windowHeight ?? 1.2, 0.1), maxH);
204
- const offsetX = dormer.windowOffsetX ?? 0;
205
- const offsetY = dormer.windowOffsetY ?? 0;
206
- const centerY = -(skirtH / 2) + offsetY;
207
- return { width, height, centerY, offsetX };
26
+ function createHostedWindowCutGeometry(window) {
27
+ const depth = 0.4;
28
+ return buildOpeningCutoutGeometry(window, {
29
+ left: -window.width / 2,
30
+ right: window.width / 2,
31
+ bottom: -window.height / 2,
32
+ top: window.height / 2,
33
+ }, depth, 0.05);
208
34
  }
209
35
  /**
210
36
  * Build the trimmed dormer geometry hosted on a roof segment. The
@@ -213,9 +39,9 @@ export function getDormerSkirtWindowDims(dormer) {
213
39
  * CSG-subtracted in dormer-mesh-local space. Window openings are then
214
40
  * subtracted on each exposed gable face.
215
41
  */
216
- export function generateDormerGeometry(dormer, hostSegment) {
42
+ export function generateDormerGeometry(dormer, hostSegment, hostedWindows = []) {
217
43
  const isShed = dormer.roofType === 'shed';
218
- const yawBake = isShed ? 0 : Math.PI / 2;
44
+ const yawBake = getDormerBodyYaw(dormer);
219
45
  const segWidth = isShed ? dormer.width : dormer.depth;
220
46
  const segDepth = isShed ? dormer.depth : dormer.width;
221
47
  const skirt = dormerSkirtHeight(dormer);
@@ -228,7 +54,7 @@ export function generateDormerGeometry(dormer, hostSegment) {
228
54
  type: 'roof-segment',
229
55
  parentId: null,
230
56
  visible: true,
231
- metadata: null,
57
+ metadata: {},
232
58
  children: [],
233
59
  position: [0, 0, 0],
234
60
  rotation: 0,
@@ -270,6 +96,9 @@ export function generateDormerGeometry(dormer, hostSegment) {
270
96
  deckThickness: 0.04,
271
97
  overhang: 0.08,
272
98
  shingleThickness: 0.02,
99
+ managedByParent: false,
100
+ wallShell: 'auto',
101
+ shedInsetEndPanels: false,
273
102
  };
274
103
  const dormerBrushes = getRoofSegmentBrushes(virtualSegment);
275
104
  if (!dormerBrushes) {
@@ -332,14 +161,14 @@ export function generateDormerGeometry(dormer, hostSegment) {
332
161
  hostSolid = null;
333
162
  dormerSolid = trimmed;
334
163
  }
335
- // Cut window openings on exposed gable faces.
336
- const exposed = getDormerExposedFaces(dormer, hostSegment);
337
- const skirtWin = getDormerSkirtWindowDims(dormer);
338
- const gableHalfZ = dormer.depth / 2;
339
- const cutDepth = 0.4;
340
- const cutFace = (zSign) => {
341
- const cutGeo = createDormerWindowCutGeometry(dormer, skirtWin.width, skirtWin.height, cutDepth);
342
- cutGeo.translate(skirtWin.offsetX, skirtWin.centerY, zSign * gableHalfZ);
164
+ // Cut hosted window openings in dormer-local face coordinates.
165
+ const cutWindow = (window) => {
166
+ const face = window.dormerFace ?? 'front';
167
+ const frame = getDormerWallFaceFrame(dormer, face);
168
+ const center = dormerWallFacePointToDormer(dormer, face, window.position);
169
+ const cutGeo = createHostedWindowCutGeometry(window);
170
+ cutGeo.rotateY(frame.yaw);
171
+ cutGeo.translate(center[0], center[1], center[2]);
343
172
  if (!cutGeo.getIndex()) {
344
173
  const posCount = cutGeo.getAttribute('position').count;
345
174
  const idx = new Uint32Array(posCount);
@@ -359,10 +188,8 @@ export function generateDormerGeometry(dormer, hostSegment) {
359
188
  brush.geometry.dispose();
360
189
  dormerSolid = result;
361
190
  };
362
- if (exposed.front)
363
- cutFace(+1);
364
- if (exposed.back)
365
- cutFace(-1);
191
+ for (const window of hostedWindows)
192
+ cutWindow(window);
366
193
  resultGeo = csgGeometry(dormerSolid);
367
194
  const resultMaterials = csgMaterials(dormerSolid);
368
195
  const matToIndex = new Map([
@@ -414,10 +241,10 @@ export function generateDormerGeometry(dormer, hostSegment) {
414
241
  * Shapes per roof type:
415
242
  * - **flat**: a plain box (top flush with the eave; the
416
243
  * dormer body has no roof above wallH).
417
- * - **shed**: trapezoid in YZ, extruded along X. Eave
418
- * at z=+d/2 (y=wallH), peak at z=-d/2
419
- * (y=wallH+roofH) — matches the slope
420
- * direction the dormer body uses.
244
+ * - **shed**: trapezoid in YZ, extruded along X. The
245
+ * base shape is high at z=-d/2; the caller
246
+ * flips it when the configured high side is
247
+ * the front.
421
248
  * - **gable / gambrel**: pentagon (rectangle + symmetric triangle)
422
249
  * in XY, extruded along Z. Ridge runs
423
250
  * along Z (mesh-Z = virtualSegment-X after
@@ -675,10 +502,12 @@ export function buildDormerRoofCut(dormer) {
675
502
  // - hip / dutch / mansard: pyramid (narrows on all 4 sides)
676
503
  // - gable / gambrel: pentagon (narrows along width axis)
677
504
  const geo = buildDormerCutShape(dormer.roofType, innerW, innerD, skirt, wallH, roofH);
678
- // Yaw in the geometry's own (un-translated) frame so the cut aligns
679
- // with the dormer's footprint after rotation.
680
- if (Math.abs(dormer.rotation) > 1e-4) {
681
- geo.rotateY(dormer.rotation);
505
+ // Yaw in the geometry's own (un-translated) frame so the cut follows
506
+ // both the shed pitch direction and the dormer's footprint rotation.
507
+ const shedDirectionYaw = dormer.roofType === 'shed' && dormer.shedHighSide === 'front' ? Math.PI : 0;
508
+ const cutYaw = shedDirectionYaw + dormer.rotation;
509
+ if (Math.abs(cutYaw) > 1e-4) {
510
+ geo.rotateY(cutYaw);
682
511
  }
683
512
  // Translate into segment-local. position[1] becomes the dormer's
684
513
  // local Y = 0 (the wall foot / eave line); the shape's foot at
@@ -2,19 +2,11 @@ import { type NodeDefinition } from '@pascal-app/core';
2
2
  import { DormerNode } from './schema';
3
3
  /**
4
4
  * Dormer — a small house-shaped protrusion sitting on top of a roof
5
- * segment. The window opening is inlined into the dormer's schema
6
- * (window* fields drive parametric geometry on the front face), not
7
- * a hosted child node — so `relations.hosts` stays unset.
5
+ * segment. Windows are hosted child nodes; the legacy window* fields remain
6
+ * in the schema only so scene migration can preserve older dormers.
8
7
  *
9
- * **Scope of this port — stub.** Schema is complete (every field from
10
- * the archive, including the four per-surface material slots and the
11
- * full window-opening field set). Geometry renders a simple house
12
- * silhouette (box body + triangular gable roof) for all `roofType`
13
- * variants — the archive's variant-specific dormer roof shapes,
14
- * window opening + frame, sill, and the CSG trim where the dormer
15
- * meets the host roof are deferred. Per-surface paints (`topMaterial`,
16
- * `sideMaterial`, `wallMaterial`) resolve via the shared helper from
17
- * core but only roof / wall surfaces are emitted by the stub geometry.
8
+ * The renderer cuts each hosted window from the dormer shell and mounts
9
+ * the regular WindowNode renderer in the selected wall-face frame.
18
10
  */
19
11
  export declare const dormerDefinition: NodeDefinition<typeof DormerNode>;
20
12
  //# sourceMappingURL=definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/dormer/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmarC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAwE9D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/dormer/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAqPrC;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CA8E9D,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { DormerNode as DormerNodeSchema, } from '@pascal-app/core';
2
- import { buildDormerRoofCut, getDormerExposedFaces } from './csg-geometry';
2
+ import { buildDormerRoofCut } from './csg-geometry';
3
3
  import { buildDormerFloorplan } from './floorplan';
4
4
  import { dormerPaint } from './paint';
5
5
  import { dormerParametrics } from './parametrics';
@@ -16,21 +16,6 @@ const MIN_ROOF_HEIGHT = 0;
16
16
  const MAX_ROOF_HEIGHT = 2;
17
17
  const MIN_SKIRT = 0.2;
18
18
  const MAX_SKIRT = 6;
19
- // Window-handle constants. The window opening is parametric geometry
20
- // on the dormer's +Z gable face; chevrons sit just outside its rim
21
- // with a small forward Z offset so they pop in front of the wall plane
22
- // instead of z-fighting with the frame bars.
23
- const WINDOW_SIDE_HANDLE_OFFSET = 0.15;
24
- const WINDOW_HEIGHT_HANDLE_OFFSET = 0.15;
25
- const WINDOW_FACE_Z_OFFSET = 0.05;
26
- // The four window-edge arrows latch behind a cube at the window center;
27
- // they stay hidden until the user clicks that cube to open the group.
28
- const WINDOW_LATCH_GROUP = 'dormer-window';
29
- // Lower clamp for window dims matches the geometry's internal clamp
30
- // in `getDormerSkirtWindowDims` (0.1m). Upper clamps depend on the
31
- // dormer dimensions and are resolved per-handle via the function form
32
- // of `max`.
33
- const MIN_WINDOW_DIM = 0.1;
34
19
  // Clamp used for handle Y placement so side chevrons stay reachable on
35
20
  // dormers whose wall is flat (`height ≈ 0`). The dormer body is
36
21
  // `height + roofHeight` tall; if that collapses too, the side arrows
@@ -73,8 +58,7 @@ function dormerWidthHandle(side) {
73
58
  // arrows become visible during selection without us reaching for
74
59
  // `portal: 'grandparent'` — which trips the same "Color target has
75
60
  // no corresponding fragment stage output" WebGPU pipeline error
76
- // chimney already documents (likely an MRT interaction with the
77
- // window-assembly's transparent glazing meshes).
61
+ // chimney already documents.
78
62
  min: MIN_DIM,
79
63
  currentValue: (n) => n.width,
80
64
  apply: (initial, newWidth) => {
@@ -234,158 +218,6 @@ function dormerRotateHandle() {
234
218
  },
235
219
  };
236
220
  }
237
- // Window-center Y in dormer-local frame. The schema stores
238
- // `windowOffsetY` as the bottom-relative offset of the window center
239
- // from the bottom of the skirt; the geometry then maps it to
240
- // `centerY = -(skirtH / 2) + offsetY`. We mirror that here so handle
241
- // placements line up with what the inspector + window-assembly use.
242
- function getWindowCenterY(n) {
243
- return -(n.wallSkirtHeight / 2) + n.windowOffsetY;
244
- }
245
- // Sign of the dormer-local Z direction where the visible window face
246
- // sits. The dormer renders the window on both +Z (front) and -Z (back)
247
- // gable faces, but only whichever face actually pokes above the host
248
- // roof slope is exposed — `getDormerExposedFaces` is the source of
249
- // truth there. The in-world handles need to attach to that exposed
250
- // face so the user is editing the window they can see; as the dormer
251
- // drags across the ridge, the exposed face flips and the chevrons
252
- // follow.
253
- //
254
- // Preference order when both faces are exposed (e.g. a tall gable that
255
- // pokes above the roof on both ends): keep handles on +Z so the
256
- // affordance stays put visually instead of flipping when the slope
257
- // math grazes the threshold from the other side. When neither face is
258
- // exposed (degenerate — wall buried on both sides), fall back to +Z so
259
- // the placement still produces a valid vector; the chevrons are just
260
- // not useful there.
261
- function getExposedFaceZSign(n, sceneApi) {
262
- if (!n.roofSegmentId)
263
- return 1;
264
- const segment = sceneApi.get(n.roofSegmentId);
265
- if (!segment)
266
- return 1;
267
- const exposed = getDormerExposedFaces(n, segment);
268
- if (exposed.front)
269
- return 1;
270
- if (exposed.back)
271
- return -1;
272
- return 1;
273
- }
274
- // Window-width chevron on the +X (right) or -X (left) edge of the
275
- // opening. Asymmetric: dragging one arrow grows the window outward
276
- // from its own edge while the opposite edge stays put. The framework
277
- // only knows about the scalar `windowWidth`; we re-emit `windowOffsetX`
278
- // in `apply` so the anchored edge stays at the same X in dormer-local.
279
- // Placement sits on the dormer's +Z gable face, where the window opens.
280
- function dormerWindowWidthHandle(side) {
281
- const sign = side === 'right' ? 1 : -1;
282
- return {
283
- kind: 'linear-resize',
284
- axis: 'x',
285
- // Stand the blade up into the gable face so it reads flat-on like the
286
- // top/bottom window-height arrows instead of edge-on.
287
- faceNormal: true,
288
- // Hidden until the user clicks the window-center latch cube.
289
- latchGroup: WINDOW_LATCH_GROUP,
290
- anchor: side === 'right' ? 'min' : 'max',
291
- min: MIN_WINDOW_DIM,
292
- // Cap at the dormer's window field — keep a 0.1m gap on each side
293
- // to match the geometry's interior clamp (`maxW = width - 0.1`).
294
- max: (n) => Math.max(MIN_WINDOW_DIM, n.width - 0.1),
295
- currentValue: (n) => n.windowWidth,
296
- apply: (initial, newWidth) => {
297
- // Anchored edge stays fixed: anchor X = initial.windowOffsetX -
298
- // sign * initial.windowWidth/2. New center = anchor + sign *
299
- // newWidth/2 → new windowOffsetX.
300
- const anchorX = initial.windowOffsetX - sign * (initial.windowWidth / 2);
301
- const newOffsetX = anchorX + sign * (newWidth / 2);
302
- return {
303
- windowWidth: newWidth,
304
- windowOffsetX: newOffsetX,
305
- };
306
- },
307
- placement: {
308
- position: (n, sceneApi) => {
309
- const faceSign = getExposedFaceZSign(n, sceneApi);
310
- return [
311
- n.windowOffsetX + sign * (n.windowWidth / 2 + WINDOW_SIDE_HANDLE_OFFSET),
312
- getWindowCenterY(n),
313
- faceSign * (n.depth / 2 + WINDOW_FACE_Z_OFFSET),
314
- ];
315
- },
316
- // Left chevron points -X; right points +X. LinearArrow doesn't
317
- // auto-orient axis 'x' — descriptor handles the flip.
318
- rotationY: () => (side === 'right' ? 0 : Math.PI),
319
- },
320
- };
321
- }
322
- // Window-height chevron on the +Y (top) or -Y (bottom) edge of the
323
- // opening. Same asymmetric pattern as the width handle, projected onto
324
- // the Y axis. The schema stores the window's vertical position as
325
- // `windowOffsetY` (distance from the BOTTOM of the skirt to the window
326
- // CENTER), not as a centerY in dormer-local — so `apply` translates
327
- // back through that mapping when it re-emits the offset.
328
- function dormerWindowHeightHandle(side) {
329
- const sign = side === 'top' ? 1 : -1;
330
- return {
331
- kind: 'linear-resize',
332
- axis: 'y',
333
- // Hidden until the user clicks the window-center latch cube.
334
- latchGroup: WINDOW_LATCH_GROUP,
335
- // 'min' = bottom edge anchored (top arrow grows the top edge up).
336
- // 'max' = top edge anchored (bottom arrow drops the bottom edge).
337
- anchor: side === 'top' ? 'min' : 'max',
338
- min: MIN_WINDOW_DIM,
339
- // Cap at the skirt with a 0.1m interior margin — matches
340
- // `maxH = skirtH - 0.1` from `getDormerSkirtWindowDims`.
341
- max: (n) => Math.max(MIN_WINDOW_DIM, n.wallSkirtHeight - 0.1),
342
- currentValue: (n) => n.windowHeight,
343
- apply: (initial, newHeight) => {
344
- // Compute the anchored edge in dormer-local Y, derive the new
345
- // centerY, then map back to schema-form `windowOffsetY`.
346
- const initialCenterY = -(initial.wallSkirtHeight / 2) + initial.windowOffsetY;
347
- const anchorY = initialCenterY - sign * (initial.windowHeight / 2);
348
- const newCenterY = anchorY + sign * (newHeight / 2);
349
- const newOffsetY = newCenterY + initial.wallSkirtHeight / 2;
350
- return {
351
- windowHeight: newHeight,
352
- windowOffsetY: newOffsetY,
353
- };
354
- },
355
- placement: {
356
- position: (n, sceneApi) => {
357
- const faceSign = getExposedFaceZSign(n, sceneApi);
358
- return [
359
- n.windowOffsetX,
360
- getWindowCenterY(n) + sign * (n.windowHeight / 2 + WINDOW_HEIGHT_HANDLE_OFFSET),
361
- faceSign * (n.depth / 2 + WINDOW_FACE_Z_OFFSET),
362
- ];
363
- },
364
- },
365
- };
366
- }
367
- // Window-center latch cube. Sits at the window center on the exposed
368
- // gable face; clicking it reveals / hides the four window edge arrows
369
- // (width L/R + height top/bottom) tagged with `WINDOW_LATCH_GROUP`.
370
- // Mirrors the duct-fitting selection cube but driven by the shared
371
- // latch descriptor so the dense window cluster stays collapsed behind
372
- // one grip until the user opts in.
373
- function dormerWindowLatchHandle() {
374
- return {
375
- kind: 'latch',
376
- group: WINDOW_LATCH_GROUP,
377
- placement: {
378
- position: (n, sceneApi) => {
379
- const faceSign = getExposedFaceZSign(n, sceneApi);
380
- return [
381
- n.windowOffsetX,
382
- getWindowCenterY(n),
383
- faceSign * (n.depth / 2 + WINDOW_FACE_Z_OFFSET),
384
- ];
385
- },
386
- },
387
- };
388
- }
389
221
  const dormerHandles = [
390
222
  dormerWidthHandle('right'),
391
223
  dormerWidthHandle('left'),
@@ -393,11 +225,6 @@ const dormerHandles = [
393
225
  dormerDepthHandle('back'),
394
226
  dormerWallHeightHandle(),
395
227
  dormerRotateHandle(),
396
- dormerWindowLatchHandle(),
397
- dormerWindowWidthHandle('right'),
398
- dormerWindowWidthHandle('left'),
399
- dormerWindowHeightHandle('top'),
400
- dormerWindowHeightHandle('bottom'),
401
228
  // The wall-skirt (downward chevron), roof-height (peak chevron), and
402
229
  // the asymmetric front/back depth split stay out for now. Re-adding
403
230
  // any of them previously fired the "Color target has no
@@ -406,30 +233,22 @@ const dormerHandles = [
406
233
  // extras — only reproducible while `portal: 'grandparent'` was set,
407
234
  // which we no longer rely on (RoofEditSystem reveals the wrapper
408
235
  // instead). The shapes themselves are valid; if the count budget
409
- // turns out to also be sensitive without grandparent portal, drop
410
- // the window handles first since the inspector covers them too.
236
+ // turns out to also be sensitive without grandparent portal, keep
237
+ // the current compact set.
411
238
  // dormerWallSkirtHandle(),
412
239
  // dormerRoofHeightHandle(),
413
240
  ];
414
241
  /**
415
242
  * Dormer — a small house-shaped protrusion sitting on top of a roof
416
- * segment. The window opening is inlined into the dormer's schema
417
- * (window* fields drive parametric geometry on the front face), not
418
- * a hosted child node — so `relations.hosts` stays unset.
243
+ * segment. Windows are hosted child nodes; the legacy window* fields remain
244
+ * in the schema only so scene migration can preserve older dormers.
419
245
  *
420
- * **Scope of this port — stub.** Schema is complete (every field from
421
- * the archive, including the four per-surface material slots and the
422
- * full window-opening field set). Geometry renders a simple house
423
- * silhouette (box body + triangular gable roof) for all `roofType`
424
- * variants — the archive's variant-specific dormer roof shapes,
425
- * window opening + frame, sill, and the CSG trim where the dormer
426
- * meets the host roof are deferred. Per-surface paints (`topMaterial`,
427
- * `sideMaterial`, `wallMaterial`) resolve via the shared helper from
428
- * core but only roof / wall surfaces are emitted by the stub geometry.
246
+ * The renderer cuts each hosted window from the dormer shell and mounts
247
+ * the regular WindowNode renderer in the selected wall-face frame.
429
248
  */
430
249
  export const dormerDefinition = {
431
250
  kind: 'dormer',
432
- schemaVersion: 1,
251
+ schemaVersion: 4,
433
252
  schema: DormerNode,
434
253
  category: 'structure',
435
254
  surfaceRole: 'roof',
@@ -443,7 +262,9 @@ export const dormerDefinition = {
443
262
  },
444
263
  capabilities: {
445
264
  selectable: { hitVolume: 'bbox' },
446
- duplicable: true,
265
+ // Dormers own their WindowNode children. Duplicate the complete subtree
266
+ // so the copied dormer never aliases windows from the source dormer.
267
+ duplicable: { subtree: true },
447
268
  deletable: true,
448
269
  // Mounts on a roof segment via `roofSegmentId`. Dirty marks
449
270
  // cascade to the host segment's parent roof so its merged shell
@@ -458,6 +279,10 @@ export const dormerDefinition = {
458
279
  // arm.
459
280
  paint: dormerPaint,
460
281
  },
282
+ relations: {
283
+ hosts: ['window'],
284
+ cascadeDelete: 'descendants',
285
+ },
461
286
  affordanceTools: {
462
287
  // Drag-to-place tool for duplicate + move. Reuses the placement
463
288
  // ghost preview but seeds it from the moving (cloned) node so the
@@ -482,11 +307,11 @@ export const dormerDefinition = {
482
307
  presentation: {
483
308
  label: 'Dormer',
484
309
  description: 'House-shaped protrusion on a roof segment.',
485
- icon: { kind: 'url', src: '/icons/roof.webp' },
310
+ icon: { kind: 'url', src: '/icons/dormer.webp' },
486
311
  paletteSection: 'structure',
487
312
  paletteOrder: 125,
488
313
  },
489
314
  mcp: {
490
- description: 'A dormer on a roof segment. Box body + gable roof + inlined window opening. Geometry beyond the stub silhouette coming later.',
315
+ description: 'A dormer on a roof segment. Its windows are hosted WindowNode children.',
491
316
  },
492
317
  };
@@ -15,9 +15,9 @@ import type { DormerNode, FloorplanGeometry, GeometryContext } from '@pascal-app
15
15
  *
16
16
  * Per-type roof linework follows the dormer's own roof geometry
17
17
  * (`buildDormerCutShape` in csg-geometry.ts): gable ridge runs along Z,
18
- * shed slopes high-at-back (−Z) to low-at-front (+Z), hip ridges along the
19
- * longer axis. Gambrel falls back to gable; dutch/mansard to hip — the
20
- * same fallbacks the 3D cut uses.
18
+ * shed arrows follow the configured high-to-low direction, and hip ridges
19
+ * run along the longer axis. Gambrel falls back to gable; dutch/mansard to
20
+ * hip — the same fallbacks the 3D cut uses.
21
21
  */
22
22
  export declare function buildDormerFloorplan(node: DormerNode, ctx: GeometryContext): FloorplanGeometry | null;
23
23
  //# sourceMappingURL=floorplan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/dormer/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,UAAU,EACV,iBAAiB,EAEjB,eAAe,EAGhB,MAAM,kBAAkB,CAAA;AAEzB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAmL1B"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/dormer/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,UAAU,EACV,iBAAiB,EAEjB,eAAe,EAGhB,MAAM,kBAAkB,CAAA;AAEzB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAuK1B"}