@pascal-app/nodes 1.0.0-beta.5 → 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 (831) 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/floorplan-move.d.ts.map +1 -1
  109. package/dist/cabinet/floorplan-move.js +91 -22
  110. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  111. package/dist/cabinet/geometry/fridge.js +25 -1
  112. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  113. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  114. package/dist/cabinet/geometry/fronts.js +1 -1
  115. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  116. package/dist/cabinet/geometry/run.js +19 -1
  117. package/dist/cabinet/geometry.d.ts.map +1 -1
  118. package/dist/cabinet/geometry.js +63 -1
  119. package/dist/cabinet/index.d.ts +1 -0
  120. package/dist/cabinet/index.d.ts.map +1 -1
  121. package/dist/cabinet/index.js +1 -0
  122. package/dist/cabinet/insertion.d.ts +19 -0
  123. package/dist/cabinet/insertion.d.ts.map +1 -0
  124. package/dist/cabinet/insertion.js +49 -0
  125. package/dist/cabinet/move-frame.d.ts.map +1 -1
  126. package/dist/cabinet/move-frame.js +68 -2
  127. package/dist/cabinet/panel-context.d.ts +7 -0
  128. package/dist/cabinet/panel-context.d.ts.map +1 -0
  129. package/dist/cabinet/panel-context.js +16 -0
  130. package/dist/cabinet/panel-visibility.d.ts +9 -0
  131. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  132. package/dist/cabinet/panel-visibility.js +26 -0
  133. package/dist/cabinet/panel.d.ts.map +1 -1
  134. package/dist/cabinet/panel.js +221 -37
  135. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  136. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  137. package/dist/cabinet/placement-dimensions.js +227 -0
  138. package/dist/cabinet/placement-snap.d.ts +21 -1
  139. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  140. package/dist/cabinet/placement-snap.js +48 -6
  141. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  142. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  143. package/dist/cabinet/preset-width-debt.js +45 -0
  144. package/dist/cabinet/presets.d.ts.map +1 -1
  145. package/dist/cabinet/presets.js +14 -13
  146. package/dist/cabinet/profiles.d.ts +14 -0
  147. package/dist/cabinet/profiles.d.ts.map +1 -0
  148. package/dist/cabinet/profiles.js +30 -0
  149. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  150. package/dist/cabinet/quick-actions.js +8 -24
  151. package/dist/cabinet/reveals.d.ts +37 -0
  152. package/dist/cabinet/reveals.d.ts.map +1 -0
  153. package/dist/cabinet/reveals.js +13 -0
  154. package/dist/cabinet/run-layout.d.ts +90 -4
  155. package/dist/cabinet/run-layout.d.ts.map +1 -1
  156. package/dist/cabinet/run-layout.js +408 -23
  157. package/dist/cabinet/run-ops.d.ts +202 -10
  158. package/dist/cabinet/run-ops.d.ts.map +1 -1
  159. package/dist/cabinet/run-ops.js +520 -33
  160. package/dist/cabinet/run-panel.d.ts +6 -2
  161. package/dist/cabinet/run-panel.d.ts.map +1 -1
  162. package/dist/cabinet/run-panel.js +285 -108
  163. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  164. package/dist/cabinet/stack-transitions.js +35 -24
  165. package/dist/cabinet/stack.d.ts +169 -1
  166. package/dist/cabinet/stack.d.ts.map +1 -1
  167. package/dist/cabinet/stack.js +57 -18
  168. package/dist/cabinet/tool.d.ts.map +1 -1
  169. package/dist/cabinet/tool.js +615 -91
  170. package/dist/cabinet/validation.d.ts +27 -0
  171. package/dist/cabinet/validation.d.ts.map +1 -0
  172. package/dist/cabinet/validation.js +56 -0
  173. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  174. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  175. package/dist/cabinet/wall-height-presets.js +15 -0
  176. package/dist/cabinet/wall-snap.d.ts +27 -3
  177. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  178. package/dist/cabinet/wall-snap.js +278 -62
  179. package/dist/cabinet/widths.d.ts +10 -0
  180. package/dist/cabinet/widths.d.ts.map +1 -0
  181. package/dist/cabinet/widths.js +13 -0
  182. package/dist/ceiling/definition.d.ts.map +1 -1
  183. package/dist/ceiling/definition.js +7 -1
  184. package/dist/ceiling/floorplan-affordances.d.ts +8 -8
  185. package/dist/ceiling/materials.d.ts.map +1 -1
  186. package/dist/ceiling/materials.js +0 -1
  187. package/dist/ceiling/panel.js +1 -1
  188. package/dist/ceiling/parametrics.js +1 -1
  189. package/dist/chimney/definition.js +1 -1
  190. package/dist/chimney/panel.js +1 -1
  191. package/dist/chimney/parametrics.js +3 -3
  192. package/dist/column/definition.d.ts.map +1 -1
  193. package/dist/column/definition.js +22 -4
  194. package/dist/column/panel.d.ts.map +1 -1
  195. package/dist/column/panel.js +37 -7
  196. package/dist/column/parametrics.d.ts.map +1 -1
  197. package/dist/column/parametrics.js +5 -3
  198. package/dist/column/tool.d.ts.map +1 -1
  199. package/dist/column/tool.js +50 -14
  200. package/dist/cupola/definition.d.ts.map +1 -1
  201. package/dist/cupola/definition.js +15 -6
  202. package/dist/cupola/geometry.d.ts +6 -0
  203. package/dist/cupola/geometry.d.ts.map +1 -1
  204. package/dist/cupola/geometry.js +60 -13
  205. package/dist/cupola/paint.d.ts +4 -0
  206. package/dist/cupola/paint.d.ts.map +1 -0
  207. package/dist/cupola/paint.js +39 -0
  208. package/dist/cupola/panel.js +1 -1
  209. package/dist/cupola/parametrics.js +3 -3
  210. package/dist/cupola/renderer.d.ts.map +1 -1
  211. package/dist/cupola/renderer.js +27 -8
  212. package/dist/door/floorplan-move.d.ts.map +1 -1
  213. package/dist/door/floorplan-move.js +1 -1
  214. package/dist/door/move-tool.d.ts.map +1 -1
  215. package/dist/door/move-tool.js +86 -32
  216. package/dist/door/panel.d.ts.map +1 -1
  217. package/dist/door/panel.js +1 -1
  218. package/dist/door/parametrics.js +2 -2
  219. package/dist/door/tool.d.ts.map +1 -1
  220. package/dist/door/tool.js +16 -4
  221. package/dist/dormer/csg-geometry.d.ts +6 -42
  222. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  223. package/dist/dormer/csg-geometry.js +38 -209
  224. package/dist/dormer/definition.d.ts +4 -12
  225. package/dist/dormer/definition.d.ts.map +1 -1
  226. package/dist/dormer/definition.js +18 -193
  227. package/dist/dormer/floorplan.d.ts +3 -3
  228. package/dist/dormer/floorplan.d.ts.map +1 -1
  229. package/dist/dormer/floorplan.js +6 -17
  230. package/dist/dormer/geometry.d.ts +5 -24
  231. package/dist/dormer/geometry.d.ts.map +1 -1
  232. package/dist/dormer/geometry.js +64 -41
  233. package/dist/dormer/index.d.ts +1 -1
  234. package/dist/dormer/index.d.ts.map +1 -1
  235. package/dist/dormer/index.js +1 -1
  236. package/dist/dormer/move-tool.d.ts.map +1 -1
  237. package/dist/dormer/move-tool.js +31 -3
  238. package/dist/dormer/panel-windows-section.d.ts +9 -0
  239. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  240. package/dist/dormer/panel-windows-section.js +7 -0
  241. package/dist/dormer/panel.d.ts.map +1 -1
  242. package/dist/dormer/panel.js +100 -18
  243. package/dist/dormer/parametrics.d.ts.map +1 -1
  244. package/dist/dormer/parametrics.js +8 -77
  245. package/dist/dormer/preview.d.ts.map +1 -1
  246. package/dist/dormer/preview.js +9 -1
  247. package/dist/dormer/renderer.d.ts.map +1 -1
  248. package/dist/dormer/renderer.js +24 -26
  249. package/dist/dormer/tool.d.ts.map +1 -1
  250. package/dist/dormer/tool.js +3 -1
  251. package/dist/dormer/window-layout.d.ts +15 -0
  252. package/dist/dormer/window-layout.d.ts.map +1 -0
  253. package/dist/dormer/window-layout.js +59 -0
  254. package/dist/downspout/definition.d.ts.map +1 -1
  255. package/dist/downspout/definition.js +17 -4
  256. package/dist/downspout/geometry.d.ts.map +1 -1
  257. package/dist/downspout/geometry.js +10 -0
  258. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  259. package/dist/downspout/inspector-editors.js +9 -1
  260. package/dist/downspout/parametrics.d.ts.map +1 -1
  261. package/dist/downspout/parametrics.js +2 -1
  262. package/dist/downspout/renderer.d.ts.map +1 -1
  263. package/dist/downspout/renderer.js +19 -3
  264. package/dist/downspout/system.d.ts +7 -0
  265. package/dist/downspout/system.d.ts.map +1 -0
  266. package/dist/downspout/system.js +114 -0
  267. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  268. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  269. package/dist/duct-fitting/accessory-geometry.js +47 -0
  270. package/dist/duct-fitting/definition.d.ts.map +1 -1
  271. package/dist/duct-fitting/definition.js +11 -1
  272. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  273. package/dist/duct-fitting/floorplan.js +8 -0
  274. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  275. package/dist/duct-fitting/geometry.js +52 -38
  276. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  277. package/dist/duct-fitting/parametrics.js +78 -15
  278. package/dist/duct-fitting/ports.d.ts +1 -0
  279. package/dist/duct-fitting/ports.d.ts.map +1 -1
  280. package/dist/duct-fitting/ports.js +46 -0
  281. package/dist/duct-fitting/tool.d.ts +19 -0
  282. package/dist/duct-fitting/tool.d.ts.map +1 -1
  283. package/dist/duct-fitting/tool.js +126 -34
  284. package/dist/duct-segment/continuation.d.ts +21 -0
  285. package/dist/duct-segment/continuation.d.ts.map +1 -0
  286. package/dist/duct-segment/continuation.js +167 -0
  287. package/dist/duct-segment/definition.d.ts.map +1 -1
  288. package/dist/duct-segment/definition.js +19 -18
  289. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  290. package/dist/duct-segment/floorplan.js +43 -0
  291. package/dist/duct-segment/geometry.d.ts.map +1 -1
  292. package/dist/duct-segment/geometry.js +3 -0
  293. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  294. package/dist/duct-segment/move-tool.js +33 -6
  295. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  296. package/dist/duct-segment/parametrics.js +45 -1
  297. package/dist/duct-segment/selection.d.ts +3 -4
  298. package/dist/duct-segment/selection.d.ts.map +1 -1
  299. package/dist/duct-segment/selection.js +186 -158
  300. package/dist/duct-segment/tool.d.ts +37 -0
  301. package/dist/duct-segment/tool.d.ts.map +1 -1
  302. package/dist/duct-segment/tool.js +305 -678
  303. package/dist/duct-terminal/parametrics.js +2 -2
  304. package/dist/duct-terminal/tool.d.ts.map +1 -1
  305. package/dist/duct-terminal/tool.js +37 -7
  306. package/dist/elevator/panel.d.ts.map +1 -1
  307. package/dist/elevator/panel.js +7 -7
  308. package/dist/elevator/system.d.ts.map +1 -1
  309. package/dist/elevator/system.js +10 -1
  310. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  311. package/dist/eyebrow-vent/definition.js +8 -5
  312. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  313. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  314. package/dist/eyebrow-vent/geometry.js +60 -15
  315. package/dist/eyebrow-vent/paint.d.ts +4 -0
  316. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  317. package/dist/eyebrow-vent/paint.js +33 -0
  318. package/dist/eyebrow-vent/panel.js +1 -1
  319. package/dist/eyebrow-vent/parametrics.js +3 -3
  320. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  321. package/dist/eyebrow-vent/renderer.js +27 -8
  322. package/dist/fence/definition.d.ts.map +1 -1
  323. package/dist/fence/definition.js +2 -1
  324. package/dist/fence/floorplan-affordances.d.ts +1 -0
  325. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  326. package/dist/fence/floorplan-affordances.js +30 -1
  327. package/dist/fence/floorplan.d.ts.map +1 -1
  328. package/dist/fence/floorplan.js +14 -0
  329. package/dist/fence/parametrics.js +3 -3
  330. package/dist/fence/tool.d.ts.map +1 -1
  331. package/dist/fence/tool.js +47 -20
  332. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  333. package/dist/gutter/corner-mitre.js +47 -7
  334. package/dist/gutter/definition.d.ts.map +1 -1
  335. package/dist/gutter/definition.js +23 -13
  336. package/dist/gutter/eave-align.d.ts.map +1 -1
  337. package/dist/gutter/eave-align.js +10 -0
  338. package/dist/gutter/eave-snap.d.ts +1 -1
  339. package/dist/gutter/eave-snap.d.ts.map +1 -1
  340. package/dist/gutter/eave-snap.js +10 -23
  341. package/dist/gutter/geometry.d.ts.map +1 -1
  342. package/dist/gutter/geometry.js +126 -8
  343. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  344. package/dist/gutter/outlet-lookup.js +22 -1
  345. package/dist/gutter/paint.d.ts +3 -0
  346. package/dist/gutter/paint.d.ts.map +1 -0
  347. package/dist/gutter/paint.js +6 -0
  348. package/dist/gutter/parametrics.d.ts.map +1 -1
  349. package/dist/gutter/parametrics.js +4 -1
  350. package/dist/gutter/renderer.d.ts.map +1 -1
  351. package/dist/gutter/renderer.js +63 -7
  352. package/dist/gutter/trim-clip.d.ts +3 -0
  353. package/dist/gutter/trim-clip.d.ts.map +1 -0
  354. package/dist/gutter/trim-clip.js +5 -0
  355. package/dist/hvac-equipment/parametrics.js +3 -3
  356. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  357. package/dist/hvac-equipment/tool.js +12 -2
  358. package/dist/index.d.ts +5 -2
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +9 -2
  361. package/dist/item/definition.d.ts.map +1 -1
  362. package/dist/item/definition.js +10 -2
  363. package/dist/item/floorplan-move.d.ts.map +1 -1
  364. package/dist/item/floorplan-move.js +20 -1
  365. package/dist/item/floorplan.d.ts.map +1 -1
  366. package/dist/item/floorplan.js +22 -1
  367. package/dist/item/move-tool.d.ts +28 -1
  368. package/dist/item/move-tool.d.ts.map +1 -1
  369. package/dist/item/move-tool.js +14 -2
  370. package/dist/item/renderer.d.ts.map +1 -1
  371. package/dist/item/renderer.js +16 -6
  372. package/dist/item/system.d.ts +5 -0
  373. package/dist/item/system.d.ts.map +1 -1
  374. package/dist/item/system.js +7 -1
  375. package/dist/lean-to-extension/arc.d.ts +14 -0
  376. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  377. package/dist/lean-to-extension/arc.js +56 -0
  378. package/dist/lean-to-extension/assembly.d.ts +61 -0
  379. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  380. package/dist/lean-to-extension/assembly.js +761 -0
  381. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  382. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  383. package/dist/lean-to-extension/canopy-joint.js +234 -0
  384. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  385. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  386. package/dist/lean-to-extension/conical-host.js +113 -0
  387. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  388. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  389. package/dist/lean-to-extension/corner-joint.js +1202 -0
  390. package/dist/lean-to-extension/definition.d.ts +4 -0
  391. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  392. package/dist/lean-to-extension/definition.js +433 -0
  393. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  394. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  395. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  396. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  397. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  398. package/dist/lean-to-extension/floorplan-move.js +157 -0
  399. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  400. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  401. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  402. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  403. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  404. package/dist/lean-to-extension/floorplan.js +373 -0
  405. package/dist/lean-to-extension/geometry.d.ts +7 -0
  406. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  407. package/dist/lean-to-extension/geometry.js +662 -0
  408. package/dist/lean-to-extension/index.d.ts +8 -0
  409. package/dist/lean-to-extension/index.d.ts.map +1 -0
  410. package/dist/lean-to-extension/index.js +7 -0
  411. package/dist/lean-to-extension/layout.d.ts +108 -0
  412. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  413. package/dist/lean-to-extension/layout.js +477 -0
  414. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  415. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  416. package/dist/lean-to-extension/managed-preview.js +93 -0
  417. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  418. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  419. package/dist/lean-to-extension/move-tool.js +202 -0
  420. package/dist/lean-to-extension/paint.d.ts +2 -0
  421. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  422. package/dist/lean-to-extension/paint.js +16 -0
  423. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  424. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  425. package/dist/lean-to-extension/parametrics.js +570 -0
  426. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  427. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  428. package/dist/lean-to-extension/placement-scope.js +4 -0
  429. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  430. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  431. package/dist/lean-to-extension/placement-validation.js +324 -0
  432. package/dist/lean-to-extension/placement.d.ts +59 -0
  433. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  434. package/dist/lean-to-extension/placement.js +331 -0
  435. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  436. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  437. package/dist/lean-to-extension/plan-footprint.js +27 -0
  438. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  439. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  440. package/dist/lean-to-extension/preview-geometry.js +40 -0
  441. package/dist/lean-to-extension/preview.d.ts +7 -0
  442. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  443. package/dist/lean-to-extension/preview.js +20 -0
  444. package/dist/lean-to-extension/renderer.d.ts +6 -0
  445. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  446. package/dist/lean-to-extension/renderer.js +34 -0
  447. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  448. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  449. package/dist/lean-to-extension/roof-attachment.js +376 -0
  450. package/dist/lean-to-extension/schema.d.ts +2 -0
  451. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  452. package/dist/lean-to-extension/schema.js +1 -0
  453. package/dist/lean-to-extension/slots.d.ts +5 -0
  454. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  455. package/dist/lean-to-extension/slots.js +15 -0
  456. package/dist/lean-to-extension/system.d.ts +7 -0
  457. package/dist/lean-to-extension/system.d.ts.map +1 -0
  458. package/dist/lean-to-extension/system.js +726 -0
  459. package/dist/lean-to-extension/tool.d.ts +3 -0
  460. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  461. package/dist/lean-to-extension/tool.js +580 -0
  462. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  463. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  464. package/dist/lean-to-extension/wall-target.js +29 -0
  465. package/dist/lineset/definition.d.ts.map +1 -1
  466. package/dist/lineset/definition.js +1 -0
  467. package/dist/liquid-line/definition.d.ts.map +1 -1
  468. package/dist/liquid-line/definition.js +1 -0
  469. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  470. package/dist/pipe-fitting/definition.js +16 -2
  471. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  472. package/dist/pipe-fitting/floorplan.js +4 -0
  473. package/dist/pipe-fitting/geometry.d.ts +3 -5
  474. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  475. package/dist/pipe-fitting/geometry.js +154 -21
  476. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  477. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  478. package/dist/pipe-fitting/inline-insertion.js +96 -0
  479. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  480. package/dist/pipe-fitting/parametrics.js +17 -3
  481. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  482. package/dist/pipe-fitting/ports.js +8 -1
  483. package/dist/pipe-fitting/tool.d.ts +26 -0
  484. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  485. package/dist/pipe-fitting/tool.js +182 -37
  486. package/dist/pipe-segment/continuation.d.ts +22 -0
  487. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  488. package/dist/pipe-segment/continuation.js +146 -0
  489. package/dist/pipe-segment/definition.d.ts.map +1 -1
  490. package/dist/pipe-segment/definition.js +23 -7
  491. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  492. package/dist/pipe-segment/floorplan.js +42 -0
  493. package/dist/pipe-segment/geometry.d.ts +2 -1
  494. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  495. package/dist/pipe-segment/geometry.js +4 -1
  496. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  497. package/dist/pipe-segment/move-tool.js +25 -5
  498. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  499. package/dist/pipe-segment/parametrics.js +45 -0
  500. package/dist/pipe-segment/selection.d.ts +3 -4
  501. package/dist/pipe-segment/selection.d.ts.map +1 -1
  502. package/dist/pipe-segment/selection.js +169 -105
  503. package/dist/pipe-segment/slope.d.ts +5 -0
  504. package/dist/pipe-segment/slope.d.ts.map +1 -0
  505. package/dist/pipe-segment/slope.js +10 -0
  506. package/dist/pipe-segment/tool.d.ts.map +1 -1
  507. package/dist/pipe-segment/tool.js +325 -545
  508. package/dist/pipe-trap/tool.d.ts.map +1 -1
  509. package/dist/pipe-trap/tool.js +15 -2
  510. package/dist/ridge-vent/definition.js +1 -1
  511. package/dist/ridge-vent/panel.d.ts.map +1 -1
  512. package/dist/ridge-vent/panel.js +2 -2
  513. package/dist/ridge-vent/parametrics.js +1 -1
  514. package/dist/roof/conical-roof-placement.d.ts +36 -0
  515. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  516. package/dist/roof/conical-roof-placement.js +134 -0
  517. package/dist/roof/conical-roof.d.ts +3 -0
  518. package/dist/roof/conical-roof.d.ts.map +1 -0
  519. package/dist/roof/conical-roof.js +53 -0
  520. package/dist/roof/definition.d.ts +3 -10
  521. package/dist/roof/definition.d.ts.map +1 -1
  522. package/dist/roof/definition.js +83 -13
  523. package/dist/roof/floorplan.d.ts +3 -10
  524. package/dist/roof/floorplan.d.ts.map +1 -1
  525. package/dist/roof/floorplan.js +139 -165
  526. package/dist/roof/index.d.ts +1 -0
  527. package/dist/roof/index.d.ts.map +1 -1
  528. package/dist/roof/index.js +1 -0
  529. package/dist/roof/panel.d.ts.map +1 -1
  530. package/dist/roof/panel.js +22 -23
  531. package/dist/roof/renderer.d.ts.map +1 -1
  532. package/dist/roof/roof-footprint-source.d.ts +16 -0
  533. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  534. package/dist/roof/roof-footprint-source.js +14 -0
  535. package/dist/roof/roof-footprint.d.ts +25 -0
  536. package/dist/roof/roof-footprint.d.ts.map +1 -0
  537. package/dist/roof/roof-footprint.js +94 -0
  538. package/dist/roof/roof-placement-mode.d.ts +18 -0
  539. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  540. package/dist/roof/roof-placement-mode.js +24 -0
  541. package/dist/roof/tool.d.ts +10 -0
  542. package/dist/roof/tool.d.ts.map +1 -0
  543. package/dist/roof/tool.js +922 -0
  544. package/dist/roof-segment/definition.d.ts.map +1 -1
  545. package/dist/roof-segment/definition.js +52 -8
  546. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  547. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  548. package/dist/roof-segment/floorplan-affordances.js +64 -18
  549. package/dist/roof-segment/floorplan.d.ts +3 -2
  550. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  551. package/dist/roof-segment/floorplan.js +95 -46
  552. package/dist/roof-segment/panel.d.ts.map +1 -1
  553. package/dist/roof-segment/panel.js +122 -27
  554. package/dist/scan/definition.d.ts +2 -3
  555. package/dist/scan/definition.d.ts.map +1 -1
  556. package/dist/scan/definition.js +9 -7
  557. package/dist/scan/parametrics.d.ts.map +1 -1
  558. package/dist/scan/parametrics.js +13 -1
  559. package/dist/scan/renderer.d.ts.map +1 -1
  560. package/dist/scan/renderer.js +8 -2
  561. package/dist/shared/accessory-cursor.d.ts +7 -0
  562. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  563. package/dist/shared/accessory-cursor.js +83 -0
  564. package/dist/shared/accessory-floorplan.d.ts +4 -0
  565. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  566. package/dist/shared/accessory-floorplan.js +51 -0
  567. package/dist/shared/accessory-geometry.d.ts +7 -0
  568. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  569. package/dist/shared/accessory-geometry.js +79 -0
  570. package/dist/shared/accessory-placement.d.ts +10 -0
  571. package/dist/shared/accessory-placement.d.ts.map +1 -0
  572. package/dist/shared/accessory-placement.js +126 -0
  573. package/dist/shared/accessory-snapping.d.ts +5 -0
  574. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  575. package/dist/shared/accessory-snapping.js +40 -0
  576. package/dist/shared/automatic-run-end-cap.d.ts +11 -0
  577. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  578. package/dist/shared/automatic-run-end-cap.js +159 -0
  579. package/dist/shared/block-face-host.d.ts +15 -0
  580. package/dist/shared/block-face-host.d.ts.map +1 -0
  581. package/dist/shared/block-face-host.js +36 -0
  582. package/dist/shared/connection-compatibility.d.ts +8 -0
  583. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  584. package/dist/shared/connection-compatibility.js +28 -0
  585. package/dist/shared/connection-feedback.d.ts +10 -0
  586. package/dist/shared/connection-feedback.d.ts.map +1 -0
  587. package/dist/shared/connection-feedback.js +17 -0
  588. package/dist/shared/distribution-run-contract.d.ts +49 -0
  589. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  590. package/dist/shared/distribution-run-contract.js +30 -0
  591. package/dist/shared/distribution-run-tool.d.ts +107 -0
  592. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  593. package/dist/shared/distribution-run-tool.js +941 -0
  594. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  595. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  596. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  597. package/dist/shared/duct-adapter.d.ts +10 -0
  598. package/dist/shared/duct-adapter.d.ts.map +1 -0
  599. package/dist/shared/duct-adapter.js +43 -0
  600. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  601. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  602. package/dist/shared/elbow-branch-continuation.js +200 -0
  603. package/dist/shared/fitting-clearance.d.ts +5 -0
  604. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  605. package/dist/shared/fitting-clearance.js +11 -0
  606. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  607. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  608. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  609. package/dist/shared/fitting-surface-support.d.ts +5 -0
  610. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  611. package/dist/shared/fitting-surface-support.js +42 -0
  612. package/dist/shared/fitting-tool-options.d.ts +4 -0
  613. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  614. package/dist/shared/fitting-tool-options.js +175 -0
  615. package/dist/shared/floor-placement.d.ts +1 -1
  616. package/dist/shared/floor-placement.d.ts.map +1 -1
  617. package/dist/shared/floor-placement.js +13 -33
  618. package/dist/shared/ghost-materials.d.ts.map +1 -1
  619. package/dist/shared/ghost-materials.js +2 -1
  620. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  621. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  622. package/dist/shared/lean-to-post-omissions.js +51 -0
  623. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  624. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  625. package/dist/shared/mep-fitting-actions.js +16 -0
  626. package/dist/shared/mep-presets.d.ts +11 -0
  627. package/dist/shared/mep-presets.d.ts.map +1 -0
  628. package/dist/shared/mep-presets.js +34 -0
  629. package/dist/shared/node-batch/candidates.d.ts +29 -0
  630. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  631. package/dist/shared/node-batch/candidates.js +260 -0
  632. package/dist/shared/node-batch/store.d.ts +26 -0
  633. package/dist/shared/node-batch/store.d.ts.map +1 -0
  634. package/dist/shared/node-batch/store.js +319 -0
  635. package/dist/shared/node-batch/system.d.ts +8 -0
  636. package/dist/shared/node-batch/system.d.ts.map +1 -0
  637. package/dist/shared/node-batch/system.js +569 -0
  638. package/dist/shared/node-batch/types.d.ts +99 -0
  639. package/dist/shared/node-batch/types.d.ts.map +1 -0
  640. package/dist/shared/node-batch/types.js +4 -0
  641. package/dist/shared/opening-move-history.d.ts +47 -0
  642. package/dist/shared/opening-move-history.d.ts.map +1 -0
  643. package/dist/shared/opening-move-history.js +18 -0
  644. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  645. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  646. package/dist/shared/opening-move-wall-gate.js +44 -0
  647. package/dist/shared/path-point-affordance.d.ts +2 -2
  648. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  649. package/dist/shared/path-point-affordance.js +30 -6
  650. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  651. package/dist/shared/placeholder-geometry.js +4 -0
  652. package/dist/shared/ports.d.ts +20 -3
  653. package/dist/shared/ports.d.ts.map +1 -1
  654. package/dist/shared/ports.js +148 -7
  655. package/dist/shared/primitive-uv.d.ts +17 -0
  656. package/dist/shared/primitive-uv.d.ts.map +1 -0
  657. package/dist/shared/primitive-uv.js +107 -0
  658. package/dist/shared/reducer-size.d.ts +2 -0
  659. package/dist/shared/reducer-size.d.ts.map +1 -0
  660. package/dist/shared/reducer-size.js +12 -0
  661. package/dist/shared/ridge-snap.js +1 -1
  662. package/dist/shared/roof-surface.d.ts.map +1 -1
  663. package/dist/shared/roof-surface.js +17 -2
  664. package/dist/shared/run-cursor.d.ts +22 -0
  665. package/dist/shared/run-cursor.d.ts.map +1 -0
  666. package/dist/shared/run-cursor.js +19 -0
  667. package/dist/shared/run-direction-feedback.d.ts +20 -0
  668. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  669. package/dist/shared/run-direction-feedback.js +139 -0
  670. package/dist/shared/run-hanger-controls.d.ts +7 -0
  671. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  672. package/dist/shared/run-hanger-controls.js +44 -0
  673. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  674. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  675. package/dist/shared/run-hanger-inspector.js +43 -0
  676. package/dist/shared/run-hanger-mode.d.ts +11 -0
  677. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  678. package/dist/shared/run-hanger-mode.js +32 -0
  679. package/dist/shared/run-hanger-system.d.ts +3 -0
  680. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  681. package/dist/shared/run-hanger-system.js +39 -0
  682. package/dist/shared/run-hangers.d.ts +25 -0
  683. package/dist/shared/run-hangers.d.ts.map +1 -0
  684. package/dist/shared/run-hangers.js +261 -0
  685. package/dist/shared/run-port-snap.d.ts +11 -0
  686. package/dist/shared/run-port-snap.d.ts.map +1 -0
  687. package/dist/shared/run-port-snap.js +19 -0
  688. package/dist/shared/run-screen-direction.d.ts +5 -0
  689. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  690. package/dist/shared/run-screen-direction.js +24 -0
  691. package/dist/shared/selection-handles.d.ts +4 -0
  692. package/dist/shared/selection-handles.d.ts.map +1 -1
  693. package/dist/shared/selection-handles.js +10 -0
  694. package/dist/shared/slot-paint.d.ts +8 -1
  695. package/dist/shared/slot-paint.d.ts.map +1 -1
  696. package/dist/shared/slot-paint.js +120 -27
  697. package/dist/shared/surface-paint.d.ts +1 -2
  698. package/dist/shared/surface-paint.d.ts.map +1 -1
  699. package/dist/shared/surface-paint.js +9 -20
  700. package/dist/shared/system-check-panel.d.ts +6 -0
  701. package/dist/shared/system-check-panel.d.ts.map +1 -0
  702. package/dist/shared/system-check-panel.js +62 -0
  703. package/dist/shared/system-checks.d.ts +9 -0
  704. package/dist/shared/system-checks.d.ts.map +1 -0
  705. package/dist/shared/system-checks.js +131 -0
  706. package/dist/shared/wall-attach-target.d.ts +14 -2
  707. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  708. package/dist/shared/wall-attach-target.js +108 -4
  709. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  710. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  711. package/dist/shared/wall-opening-clearance.js +28 -0
  712. package/dist/shared/wall-run-move.d.ts +17 -0
  713. package/dist/shared/wall-run-move.d.ts.map +1 -0
  714. package/dist/shared/wall-run-move.js +56 -0
  715. package/dist/shelf/parametrics.js +4 -4
  716. package/dist/site/renderer.d.ts.map +1 -1
  717. package/dist/site/renderer.js +40 -28
  718. package/dist/site/terrain-geometry.d.ts +1 -1
  719. package/dist/site/terrain-geometry.d.ts.map +1 -1
  720. package/dist/site/terrain-geometry.js +35 -9
  721. package/dist/site/terrain-mesh.d.ts +5 -0
  722. package/dist/site/terrain-mesh.d.ts.map +1 -1
  723. package/dist/site/terrain-mesh.js +63 -34
  724. package/dist/skylight/definition.js +1 -1
  725. package/dist/skylight/panel.js +1 -1
  726. package/dist/skylight/parametrics.js +2 -2
  727. package/dist/slab/definition.d.ts.map +1 -1
  728. package/dist/slab/definition.js +6 -1
  729. package/dist/slab/dependency-tracker.d.ts +3 -0
  730. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  731. package/dist/slab/dependency-tracker.js +104 -0
  732. package/dist/slab/floorplan-affordances.d.ts +8 -8
  733. package/dist/slab/geometry.d.ts.map +1 -1
  734. package/dist/slab/geometry.js +16 -2
  735. package/dist/slab/panel.js +1 -1
  736. package/dist/slab/parametrics.js +1 -1
  737. package/dist/slab/system.d.ts.map +1 -1
  738. package/dist/slab/system.js +8 -64
  739. package/dist/solar-panel/definition.js +1 -1
  740. package/dist/solar-panel/panel.js +1 -1
  741. package/dist/solar-panel/parametrics.js +2 -2
  742. package/dist/stair/panel.d.ts.map +1 -1
  743. package/dist/stair/panel.js +18 -13
  744. package/dist/stair/stair-type.d.ts +18 -0
  745. package/dist/stair/stair-type.d.ts.map +1 -0
  746. package/dist/stair/stair-type.js +25 -0
  747. package/dist/stair-segment/panel.d.ts.map +1 -1
  748. package/dist/stair-segment/panel.js +44 -5
  749. package/dist/turbine-vent/definition.d.ts.map +1 -1
  750. package/dist/turbine-vent/definition.js +8 -5
  751. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  752. package/dist/turbine-vent/geometry.js +48 -18
  753. package/dist/turbine-vent/paint.d.ts +4 -0
  754. package/dist/turbine-vent/paint.d.ts.map +1 -0
  755. package/dist/turbine-vent/paint.js +35 -0
  756. package/dist/turbine-vent/panel.js +1 -1
  757. package/dist/turbine-vent/parametrics.js +2 -2
  758. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  759. package/dist/turbine-vent/renderer.js +31 -9
  760. package/dist/wall/curve-eligibility.d.ts +3 -0
  761. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  762. package/dist/wall/curve-eligibility.js +10 -0
  763. package/dist/wall/curve-tool.d.ts.map +1 -1
  764. package/dist/wall/curve-tool.js +8 -11
  765. package/dist/wall/definition.d.ts +1 -1
  766. package/dist/wall/definition.d.ts.map +1 -1
  767. package/dist/wall/definition.js +36 -13
  768. package/dist/wall/floorplan-affordances.d.ts +1 -0
  769. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  770. package/dist/wall/floorplan-affordances.js +46 -7
  771. package/dist/wall/floorplan-move.d.ts +3 -4
  772. package/dist/wall/floorplan-move.d.ts.map +1 -1
  773. package/dist/wall/floorplan-move.js +122 -9
  774. package/dist/wall/floorplan.d.ts.map +1 -1
  775. package/dist/wall/floorplan.js +19 -23
  776. package/dist/wall/move-shared.d.ts.map +1 -1
  777. package/dist/wall/move-shared.js +10 -7
  778. package/dist/wall/paint.d.ts.map +1 -1
  779. package/dist/wall/paint.js +2 -0
  780. package/dist/wall/panel.d.ts.map +1 -1
  781. package/dist/wall/panel.js +10 -17
  782. package/dist/wall/parametrics.js +2 -2
  783. package/dist/wall/pointer-transparency.d.ts +128 -0
  784. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  785. package/dist/wall/pointer-transparency.js +147 -0
  786. package/dist/wall/renderer.d.ts.map +1 -1
  787. package/dist/wall/renderer.js +65 -8
  788. package/dist/wall/selection-hit-owner.d.ts +53 -0
  789. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  790. package/dist/wall/selection-hit-owner.js +79 -0
  791. package/dist/wall/system.d.ts +2 -0
  792. package/dist/wall/system.d.ts.map +1 -1
  793. package/dist/wall/system.js +66 -25
  794. package/dist/wall/tool.d.ts.map +1 -1
  795. package/dist/wall/tool.js +5 -0
  796. package/dist/wall/treatment-level-data.d.ts +6 -1
  797. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  798. package/dist/wall/treatment-level-data.js +82 -5
  799. package/dist/wall/treatments.d.ts +1 -0
  800. package/dist/wall/treatments.d.ts.map +1 -1
  801. package/dist/wall/treatments.js +5 -0
  802. package/dist/wall/wall-batch-system.d.ts +38 -6
  803. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  804. package/dist/wall/wall-batch-system.js +122 -25
  805. package/dist/wall/wall-batch.js +2 -2
  806. package/dist/window/definition.d.ts +2 -1
  807. package/dist/window/definition.d.ts.map +1 -1
  808. package/dist/window/definition.js +51 -24
  809. package/dist/window/floorplan-move.d.ts.map +1 -1
  810. package/dist/window/floorplan-move.js +1 -1
  811. package/dist/window/move-tool.d.ts +7 -5
  812. package/dist/window/move-tool.d.ts.map +1 -1
  813. package/dist/window/move-tool.js +344 -58
  814. package/dist/window/panel.d.ts.map +1 -1
  815. package/dist/window/panel.js +2 -0
  816. package/dist/window/parametrics.js +2 -2
  817. package/dist/window/renderer.d.ts.map +1 -1
  818. package/dist/window/renderer.js +5 -7
  819. package/dist/window/tool.d.ts.map +1 -1
  820. package/dist/window/tool.js +227 -13
  821. package/dist/zone/floorplan-affordances.d.ts +12 -12
  822. package/package.json +11 -9
  823. package/dist/dormer/panel-window-section.d.ts +0 -14
  824. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  825. package/dist/dormer/panel-window-section.js +0 -59
  826. package/dist/dormer/window-assembly.d.ts +0 -22
  827. package/dist/dormer/window-assembly.d.ts.map +0 -1
  828. package/dist/dormer/window-assembly.js +0 -111
  829. package/dist/dormer/window-frame.d.ts +0 -24
  830. package/dist/dormer/window-frame.d.ts.map +0 -1
  831. package/dist/dormer/window-frame.js +0 -100
@@ -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"}
@@ -14,9 +14,9 @@
14
14
  *
15
15
  * Per-type roof linework follows the dormer's own roof geometry
16
16
  * (`buildDormerCutShape` in csg-geometry.ts): gable ridge runs along Z,
17
- * shed slopes high-at-back (−Z) to low-at-front (+Z), hip ridges along the
18
- * longer axis. Gambrel falls back to gable; dutch/mansard to hip — the
19
- * same fallbacks the 3D cut uses.
17
+ * shed arrows follow the configured high-to-low direction, and hip ridges
18
+ * run along the longer axis. Gambrel falls back to gable; dutch/mansard to
19
+ * hip — the same fallbacks the 3D cut uses.
20
20
  */
21
21
  export function buildDormerFloorplan(node, ctx) {
22
22
  const segment = ctx.parent;
@@ -112,10 +112,9 @@ export function buildDormerFloorplan(node, ctx) {
112
112
  const type = node.roofType;
113
113
  if (node.roofHeight > 0 && type !== 'flat') {
114
114
  if (type === 'shed') {
115
- // Slopes from the high back (−Z) down to the low front (+Z); show a
116
- // downslope arrow pointing toward the front.
117
- const tail = toPlan(0, -hd * 0.55);
118
- const head = toPlan(0, hd * 0.55);
115
+ const highZ = node.shedHighSide === 'front' ? hd * 0.55 : -hd * 0.55;
116
+ const tail = toPlan(0, highZ);
117
+ const head = toPlan(0, -highZ);
119
118
  const dx = head[0] - tail[0];
120
119
  const dy = head[1] - tail[1];
121
120
  const len = Math.hypot(dx, dy) || 1;
@@ -179,15 +178,5 @@ export function buildDormerFloorplan(node, ctx) {
179
178
  line([0, -hd], [0, hd], ridgeWidth);
180
179
  }
181
180
  }
182
- // Window on the +Z (front) face — a line just inside the front edge,
183
- // spanning the window width centred at its X offset. Marks the glazing
184
- // and which way the dormer faces.
185
- const ww = node.windowWidth ?? 0;
186
- if (ww > 0.01) {
187
- const halfWin = Math.min(ww, node.width) / 2;
188
- const center = Math.max(-hw + halfWin, Math.min(hw - halfWin, node.windowOffsetX ?? 0));
189
- const inset = Math.min(hd * 0.2, 0.08);
190
- line([center - halfWin, hd - inset], [center + halfWin, hd - inset], lineWidth);
191
- }
192
181
  return { kind: 'group', children };
193
182
  }
@@ -1,4 +1,4 @@
1
- import type { DormerNode } from '@pascal-app/core';
1
+ import { type DormerNode } from '@pascal-app/core';
2
2
  import * as THREE from 'three';
3
3
  /**
4
4
  * Grid-snap step (metres) applied to the world cursor position while a
@@ -13,30 +13,11 @@ export declare const DORMER_PLACEMENT_SNAP_M = 0.05;
13
13
  * diagonals in three.
14
14
  */
15
15
  export declare const DORMER_PLACEMENT_ROTATION_STEP: number;
16
+ export declare function getDormerBodyYaw(node: Pick<DormerNode, 'roofType' | 'shedHighSide'>): number;
16
17
  /**
17
- * Lightweight silhouette geometry used by the placement / move-tool
18
- * ghost preview only. Renders the dormer as an extruded pentagon
19
- * (rectangle body + triangular gable) dropped by `wallSkirtHeight` below
20
- * the anchor so the cursor sits at the floor of the dormer the way the
21
- * committed CSG geometry does.
22
- *
23
- * For `roofType === 'flat'` (or `roofHeight === 0`) the gable apex is
24
- * skipped and the shape collapses to a rectangle. Other roof types use
25
- * the gable approximation — exact per-type silhouettes are a future
26
- * improvement.
27
- *
28
- * Kept self-contained (no `@pascal-app/viewer` imports) so the geometry
29
- * test doesn't drag in the CSG / BVH module graph, which fails to load
30
- * outside of a browser/WebGL context. The viewer has its own
31
- * `buildDormerFallbackGeometry` that mirrors this shape — used both as
32
- * the CSG fallback when boolean ops fail and as the live-drag preview
33
- * in the dormer renderer.
18
+ * Builds the lightweight placement and live-edit shell from the same
19
+ * per-type face generator used by committed roof geometry.
34
20
  */
21
+ export declare function buildDormerShellGeometry(node: DormerNode): THREE.BufferGeometry;
35
22
  export declare function buildDormerGhostGeometry(node: DormerNode): THREE.BufferGeometry;
36
- /**
37
- * Inspector helper: which window-shape sub-controls to surface for the
38
- * current dormer.
39
- */
40
- export declare function dormerSupportsArch(node: DormerNode): boolean;
41
- export declare function dormerSupportsCornerRadii(node: DormerNode): boolean;
42
23
  //# sourceMappingURL=geometry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/dormer/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAAuB,CAAA;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC,cAAc,CAoB/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAE5D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEnE"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/dormer/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EAKhB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAAuB,CAAA;AAElE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,CAAC,GAAG,MAAM,CAG5F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC,cAAc,CA0D/E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC,cAAc,CAE/E"}
@@ -1,3 +1,4 @@
1
+ import { getPitchFromActiveRoofHeight, getRoofModuleFaces, getRoofShapeRatios, ROOF_SHAPE_DEFAULTS, } from '@pascal-app/core';
1
2
  import * as THREE from 'three';
2
3
  /**
3
4
  * Grid-snap step (metres) applied to the world cursor position while a
@@ -12,52 +13,74 @@ export const DORMER_PLACEMENT_SNAP_M = 0.05;
12
13
  * diagonals in three.
13
14
  */
14
15
  export const DORMER_PLACEMENT_ROTATION_STEP = (15 * Math.PI) / 180;
16
+ export function getDormerBodyYaw(node) {
17
+ if (node.roofType !== 'shed')
18
+ return Math.PI / 2;
19
+ return node.shedHighSide === 'front' ? Math.PI : 0;
20
+ }
15
21
  /**
16
- * Lightweight silhouette geometry used by the placement / move-tool
17
- * ghost preview only. Renders the dormer as an extruded pentagon
18
- * (rectangle body + triangular gable) dropped by `wallSkirtHeight` below
19
- * the anchor so the cursor sits at the floor of the dormer the way the
20
- * committed CSG geometry does.
21
- *
22
- * For `roofType === 'flat'` (or `roofHeight === 0`) the gable apex is
23
- * skipped and the shape collapses to a rectangle. Other roof types use
24
- * the gable approximation — exact per-type silhouettes are a future
25
- * improvement.
26
- *
27
- * Kept self-contained (no `@pascal-app/viewer` imports) so the geometry
28
- * test doesn't drag in the CSG / BVH module graph, which fails to load
29
- * outside of a browser/WebGL context. The viewer has its own
30
- * `buildDormerFallbackGeometry` that mirrors this shape — used both as
31
- * the CSG fallback when boolean ops fail and as the live-drag preview
32
- * in the dormer renderer.
22
+ * Builds the lightweight placement and live-edit shell from the same
23
+ * per-type face generator used by committed roof geometry.
33
24
  */
34
- export function buildDormerGhostGeometry(node) {
25
+ export function buildDormerShellGeometry(node) {
35
26
  const w = Math.max(0.05, node.width);
36
27
  const wallH = Math.max(0.05, node.height);
37
28
  const roofH = Math.max(0, node.roofHeight);
38
29
  const d = Math.max(0.05, node.depth);
39
- const skirt = Math.max(0.05, node.wallSkirtHeight);
40
- const hw = w / 2;
41
- const isFlat = node.roofType === 'flat' || roofH === 0;
42
- const shape = new THREE.Shape();
43
- shape.moveTo(-hw, -skirt);
44
- shape.lineTo(hw, -skirt);
45
- shape.lineTo(hw, wallH);
46
- if (!isFlat)
47
- shape.lineTo(0, wallH + roofH);
48
- shape.lineTo(-hw, wallH);
49
- shape.closePath();
50
- const geo = new THREE.ExtrudeGeometry(shape, { depth: d, bevelEnabled: false });
51
- geo.translate(0, 0, -d / 2);
52
- return geo;
53
- }
54
- /**
55
- * Inspector helper: which window-shape sub-controls to surface for the
56
- * current dormer.
57
- */
58
- export function dormerSupportsArch(node) {
59
- return node.windowShape === 'arch';
30
+ const skirt = Math.max(0.05, node.wallSkirtHeight ?? 2);
31
+ const isShed = node.roofType === 'shed';
32
+ const segW = isShed ? w : d;
33
+ const segD = isShed ? d : w;
34
+ const pitch = getPitchFromActiveRoofHeight({
35
+ roofType: node.roofType,
36
+ width: segW,
37
+ depth: segD,
38
+ roofHeight: roofH,
39
+ });
40
+ const faces = getRoofModuleFaces({
41
+ type: node.roofType,
42
+ w: segW,
43
+ d: segD,
44
+ wh: wallH,
45
+ rh: roofH,
46
+ baseY: -skirt,
47
+ insets: {},
48
+ baseW: segW,
49
+ baseD: segD,
50
+ tanTheta: Math.tan((pitch * Math.PI) / 180),
51
+ shapeRatios: getRoofShapeRatios(ROOF_SHAPE_DEFAULTS),
52
+ });
53
+ const positions = [];
54
+ const materialGroups = [];
55
+ for (const face of faces) {
56
+ if (face.length < 3)
57
+ continue;
58
+ const a = new THREE.Vector3(face[0].x, face[0].y, face[0].z);
59
+ const b = new THREE.Vector3(face[1].x, face[1].y, face[1].z);
60
+ const c = new THREE.Vector3(face[2].x, face[2].y, face[2].z);
61
+ const normal = b.clone().sub(a).cross(c.clone().sub(a)).normalize();
62
+ const start = positions.length / 3;
63
+ for (let index = 1; index < face.length - 1; index++) {
64
+ for (const point of [face[0], face[index], face[index + 1]]) {
65
+ positions.push(point.x, point.y, point.z);
66
+ }
67
+ }
68
+ materialGroups.push({
69
+ start,
70
+ count: positions.length / 3 - start,
71
+ materialIndex: normal.y > 0.01 ? 3 : 0,
72
+ });
73
+ }
74
+ const geometry = new THREE.BufferGeometry();
75
+ geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
76
+ for (const group of materialGroups)
77
+ geometry.addGroup(group.start, group.count, group.materialIndex);
78
+ const bodyYaw = getDormerBodyYaw(node);
79
+ if (bodyYaw !== 0)
80
+ geometry.rotateY(bodyYaw);
81
+ geometry.computeVertexNormals();
82
+ return geometry;
60
83
  }
61
- export function dormerSupportsCornerRadii(node) {
62
- return node.windowShape === 'rounded';
84
+ export function buildDormerGhostGeometry(node) {
85
+ return buildDormerShellGeometry(node);
63
86
  }
@@ -1,5 +1,5 @@
1
1
  export { dormerDefinition } from './definition';
2
- export { buildDormerGhostGeometry, dormerSupportsArch, dormerSupportsCornerRadii, } from './geometry';
2
+ export { buildDormerGhostGeometry } from './geometry';
3
3
  export type { DormerSurfaceMaterialRole, DormerSurfaceMaterialSpec, } from './schema';
4
4
  export { DormerNode, getEffectiveDormerSurfaceMaterial } from './schema';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dormer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,UAAU,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dormer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrD,YAAY,EACV,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,UAAU,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAA"}
@@ -1,3 +1,3 @@
1
1
  export { dormerDefinition } from './definition';
2
- export { buildDormerGhostGeometry, dormerSupportsArch, dormerSupportsCornerRadii, } from './geometry';
2
+ export { buildDormerGhostGeometry } from './geometry';
3
3
  export { DormerNode, getEffectiveDormerSurfaceMaterial } from './schema';
@@ -1 +1 @@
1
- {"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/dormer/move-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;GASG;AACH,QAAA,MAAM,cAAc,GAAI,UAAU;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,uCAkJrD,CAAA;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/dormer/move-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;GASG;AACH,QAAA,MAAM,cAAc,GAAI,UAAU;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,uCA2KrD,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DormerNode as DormerNodeSchema, sceneRegistry, useScene, } from '@pascal-app/core';
4
- import { useEditor } from '@pascal-app/editor';
4
+ import { commitFreshPlacementSubtree, useEditor } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { useEffect, useMemo } from 'react';
7
7
  import { DormerPlacementGuides } from './placement-guides';
@@ -56,7 +56,13 @@ const MoveDormerTool = ({ node }) => {
56
56
  const obj = sceneRegistry.nodes.get(node.id);
57
57
  if (obj)
58
58
  obj.visible = prevVisible ?? true;
59
- if (!isNew) {
59
+ if (isNew) {
60
+ if (node.id && useScene.getState().nodes[node.id]) {
61
+ useScene.getState().deleteNode(node.id);
62
+ }
63
+ useScene.temporal.getState().resume();
64
+ }
65
+ else {
60
66
  useScene.getState().updateNode(node.id, {
61
67
  metadata: originalMetadata,
62
68
  });
@@ -80,7 +86,29 @@ const MoveDormerTool = ({ node }) => {
80
86
  const { isNew: _isNew, isTransient: _isTransient, ...rest } = m;
81
87
  return Object.keys(rest).length > 0 ? rest : undefined;
82
88
  })();
83
- if (isNew || !node.id) {
89
+ if (isNew && node.id) {
90
+ const committedId = commitFreshPlacementSubtree(node.id, {
91
+ roofSegmentId: hit.segment.id,
92
+ parentId: hit.segment.id,
93
+ position: [hit.localX, hit.localY, hit.localZ],
94
+ rotation,
95
+ metadata: cleanedMeta,
96
+ visible: true,
97
+ });
98
+ if (!committedId)
99
+ return;
100
+ const committedNode = useScene.getState().nodes[committedId];
101
+ for (const childId of committedNode?.children ?? []) {
102
+ const child = useScene.getState().nodes[childId];
103
+ if (child?.type === 'window') {
104
+ useScene.getState().updateNode(childId, { dormerId: committedId });
105
+ }
106
+ }
107
+ state.dirtyNodes.add(hit.segment.id);
108
+ state.dirtyNodes.add(committedId);
109
+ setSelection({ selectedIds: [committedId] });
110
+ }
111
+ else if (!node.id) {
84
112
  const { id: _id, ...rest } = node;
85
113
  const committed = DormerNodeSchema.parse({
86
114
  ...rest,
@@ -0,0 +1,9 @@
1
+ import type { WindowNode } from '@pascal-app/core';
2
+ export declare function DormerWindowsSection({ windows, canAdd, onAdd, onEdit, onMove, }: {
3
+ windows: WindowNode[];
4
+ canAdd: boolean;
5
+ onAdd: () => void;
6
+ onEdit: (window: WindowNode) => void;
7
+ onMove: (window: WindowNode) => void;
8
+ }): import("react").JSX.Element;
9
+ //# sourceMappingURL=panel-windows-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-windows-section.d.ts","sourceRoot":"","sources":["../../src/dormer/panel-windows-section.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,GACP,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;CACrC,+BAiEA"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ActionButton, PanelSection } from '@pascal-app/editor';
4
+ import { Move, Pencil, Plus } from 'lucide-react';
5
+ export function DormerWindowsSection({ windows, canAdd, onAdd, onEdit, onMove, }) {
6
+ return (_jsxs(PanelSection, { title: `Windows (${windows.length})`, children: [windows.length > 0 ? (_jsx("div", { className: "flex flex-col gap-1", children: windows.map((window, index) => (_jsxs("div", { className: "flex items-center gap-1 rounded-lg border border-border/50 bg-[#2C2C2E] p-1", children: [_jsxs("button", { className: "min-w-0 flex-1 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-[#3e3e3e]", onClick: () => onEdit(window), type: "button", children: [_jsx("span", { className: "block truncate font-medium text-foreground text-xs", children: window.name || `Window ${index + 1}` }), _jsxs("span", { className: "block truncate text-[10px] text-muted-foreground capitalize", children: [window.dormerFace ?? 'front', " \u00B7 ", window.width.toFixed(2), " \u00D7", ' ', window.height.toFixed(2), " m"] })] }), _jsx("button", { "aria-label": `Edit ${window.name || `Window ${index + 1}`}`, className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-[#3e3e3e] hover:text-foreground", onClick: () => onEdit(window), title: "Edit window", type: "button", children: _jsx(Pencil, { className: "h-3.5 w-3.5" }) }), _jsxs("button", { "aria-label": `Move ${window.name || `Window ${index + 1}`}`, className: "flex h-8 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-muted-foreground text-xs transition-colors hover:bg-[#3e3e3e] hover:text-foreground", onClick: () => onMove(window), title: "Move window", type: "button", children: [_jsx(Move, { className: "h-3.5 w-3.5" }), "Move"] })] }, window.id))) })) : (_jsx("div", { className: "px-2 py-3 text-center text-muted-foreground text-xs", children: "No windows" })), _jsxs("div", { className: "px-1 pt-2 pb-1", children: [_jsx(ActionButton, { className: "w-full", disabled: !canAdd, icon: _jsx(Plus, { className: "h-3.5 w-3.5" }), label: "Add Window", onClick: onAdd }), !canAdd && (_jsx("p", { className: "px-1 pt-2 text-center text-[10px] text-muted-foreground", children: "Increase the dormer width to add another window." }))] })] }));
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/dormer/panel.tsx"],"names":[],"mappings":"AA2CA,MAAM,CAAC,OAAO,UAAU,WAAW,uCA0PlC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/dormer/panel.tsx"],"names":[],"mappings":"AAuDA,MAAM,CAAC,OAAO,UAAU,WAAW,uCAoWlC"}