@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 +1 @@
1
- {"version":3,"file":"corner-mitre.d.ts","sourceRoot":"","sources":["../../src/gutter/corner-mitre.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,YAAoC,CAAA;AAQ5D,eAAO,MAAM,iBAAiB,QAAkC,CAAA;AAYhE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;CACxD,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,2FAA2F;IAC3F,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,gFAAgF;IAChF,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC,CAAA;AA6BD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,UAAU,EACb,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,GACtD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CA4BrC;AAUD,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAIR;AA2CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,EAC9D,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GACrC,YAAY,CAqCd"}
1
+ {"version":3,"file":"corner-mitre.d.ts","sourceRoot":"","sources":["../../src/gutter/corner-mitre.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,YAAoC,CAAA;AAoB5D,eAAO,MAAM,iBAAiB,QAAkC,CAAA;AAYhE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;CACxD,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,2FAA2F;IAC3F,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,gFAAgF;IAChF,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC,CAAA;AAsDD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,UAAU,EACb,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,GACtD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CA4BrC;AAUD,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAIR;AA2CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,CAAC,EAC9D,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GACrC,YAAY,CAsCd"}
@@ -1,4 +1,17 @@
1
1
  export const NO_MITRES = { left: 0, right: 0 };
2
+ function prescribedLeanToMitres(gutter) {
3
+ const metadata = gutter.metadata;
4
+ if (!(metadata && typeof metadata === 'object' && !Array.isArray(metadata)))
5
+ return NO_MITRES;
6
+ const value = metadata.leanToGutterMitres;
7
+ if (!(value && typeof value === 'object' && !Array.isArray(value)))
8
+ return NO_MITRES;
9
+ const mitres = value;
10
+ return {
11
+ left: typeof mitres.left === 'number' && Number.isFinite(mitres.left) ? mitres.left : 0,
12
+ right: typeof mitres.right === 'number' && Number.isFinite(mitres.right) ? mitres.right : 0,
13
+ };
14
+ }
2
15
  // Match the length-snap's 10 cm catch radius (`length-snap.ts`): any two
3
16
  // endpoints close enough for the corner snap to bind are close enough to
4
17
  // read as "they meant to meet". The corner snap pulls them to the exact
@@ -25,15 +38,41 @@ function gutterEndpoints(g) {
25
38
  const outX = Math.sin(r);
26
39
  const outZ = Math.cos(r);
27
40
  const half = g.length / 2;
41
+ const curvedEnd = (x, plus) => {
42
+ const arc = g.arc;
43
+ if (!arc || !Number.isFinite(arc.radius))
44
+ return null;
45
+ const signedRef = (Math.sign(arc.centerZ) || 1) * arc.radius;
46
+ const phi = (x - arc.centerX) / signedRef;
47
+ const radial = -arc.centerZ;
48
+ const bentX = arc.centerX - radial * Math.sin(phi);
49
+ const bentZ = arc.centerZ + radial * Math.cos(phi);
50
+ const tangentX = Math.cos(phi);
51
+ const tangentZ = Math.sin(phi);
52
+ const radialX = -Math.sin(phi);
53
+ const radialZ = Math.cos(phi);
54
+ const rotate = (xValue, zValue) => [
55
+ xValue * dirX + zValue * outX,
56
+ xValue * dirZ + zValue * outZ,
57
+ ];
58
+ const [worldX, worldZ] = rotate(bentX, bentZ);
59
+ const [tangentWorldX, tangentWorldZ] = rotate(tangentX, tangentZ);
60
+ const [outWorldX, outWorldZ] = rotate(radialX, radialZ);
61
+ return {
62
+ pos: [px + worldX, py, pz + worldZ],
63
+ awayDir: plus ? [-tangentWorldX, -tangentWorldZ] : [tangentWorldX, tangentWorldZ],
64
+ outDir: [outWorldX, outWorldZ],
65
+ };
66
+ };
28
67
  return {
29
- plus: {
68
+ plus: curvedEnd(half, true) ?? {
30
69
  pos: [px + dirX * half, py, pz + dirZ * half],
31
70
  // From the +X endpoint, the rest of the gutter extends back
32
71
  // toward the −X end — so "away from this end" is −dir.
33
72
  awayDir: [-dirX, -dirZ],
34
73
  outDir: [outX, outZ],
35
74
  },
36
- minus: {
75
+ minus: curvedEnd(-half, false) ?? {
37
76
  pos: [px - dirX * half, py, pz - dirZ * half],
38
77
  awayDir: [dirX, dirZ],
39
78
  outDir: [outX, outZ],
@@ -143,11 +182,12 @@ function axisIntersectionXZ(aPos, aDir, bPos, bDir) {
143
182
  * result is deterministic.
144
183
  */
145
184
  export function computeGutterMitres(subject, subjectSegment, siblings) {
185
+ const prescribed = prescribedLeanToMitres(subject);
146
186
  if (siblings.length === 0)
147
- return NO_MITRES;
187
+ return prescribed;
148
188
  const subj = gutterEndpointsInFrame(subject, subjectSegment);
149
- let leftMitre = 0;
150
- let rightMitre = 0;
189
+ let leftMitre = prescribed.left;
190
+ let rightMitre = prescribed.right;
151
191
  for (const sib of siblings) {
152
192
  if (sib.gutter.id === subject.id)
153
193
  continue;
@@ -163,10 +203,10 @@ export function computeGutterMitres(subject, subjectSegment, siblings) {
163
203
  if (!otherPlusAtCorner && !otherMinusAtCorner)
164
204
  continue;
165
205
  const otherEnd = otherPlusAtCorner ? other.plus : other.minus;
166
- if (leftMitre === 0 && planDistSq(subj.minus.pos, corner) <= CORNER_EPSILON_SQ) {
206
+ if (planDistSq(subj.minus.pos, corner) <= CORNER_EPSILON_SQ) {
167
207
  leftMitre = mitreBetween(subj.minus, otherEnd);
168
208
  }
169
- if (rightMitre === 0 && planDistSq(subj.plus.pos, corner) <= CORNER_EPSILON_SQ) {
209
+ if (planDistSq(subj.plus.pos, corner) <= CORNER_EPSILON_SQ) {
170
210
  rightMitre = mitreBetween(subj.plus, otherEnd);
171
211
  }
172
212
  if (leftMitre !== 0 && rightMitre !== 0)
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/gutter/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AA8GrC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CA2D9D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/gutter/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAoHrC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CA8D9D,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { GutterNode as GutterNodeSchema, } from '@pascal-app/core';
2
2
  import { buildGutterFloorplan } from './floorplan';
3
3
  import { snapLengthToCorner } from './length-snap';
4
+ import { gutterPaint } from './paint';
4
5
  import { gutterParametrics } from './parametrics';
5
6
  import { GutterNode } from './schema';
6
7
  // Edge-to-arrow-center offset, matching the box-vent / ridge-vent
@@ -33,9 +34,9 @@ function getRimZ(n) {
33
34
  //
34
35
  // Corner snap: when the dragged endpoint nears the geometric corner it
35
36
  // would form with another gutter (the crossing of their length axes),
36
- // `snapLengthToCorner` overrides the raw newLength so the endpoint lands
37
- // EXACTLY on that corner — the corner-mitre detector then fires reliably
38
- // without pixel-perfect dragging. Only this gutter's length changes.
37
+ // `snapLengthToCorner` is the handle's magnetic snap, so Lines mode lands the
38
+ // endpoint exactly on that corner, Grid mode uses the chosen step, and Off
39
+ // leaves the cursor raw. Only this gutter's length changes.
39
40
  function gutterLengthHandle(side) {
40
41
  const sign = side === 'right' ? 1 : -1;
41
42
  return {
@@ -43,21 +44,26 @@ function gutterLengthHandle(side) {
43
44
  axis: 'x',
44
45
  anchor: side === 'right' ? 'min' : 'max',
45
46
  min: MIN_LENGTH,
47
+ gridSnap: true,
46
48
  currentValue: (n) => n.length,
47
- apply: (initial, newLength, sceneApi) => {
49
+ magneticSnap: (initial, newLength, sceneApi) => {
48
50
  const rotY = initial.rotation ?? 0;
49
51
  const armX = Math.cos(rotY);
50
52
  const armZ = -Math.sin(rotY);
51
53
  const anchorX = initial.position[0] - sign * (initial.length / 2) * armX;
52
54
  const anchorZ = initial.position[2] - sign * (initial.length / 2) * armZ;
53
- const snap = snapLengthToCorner(initial, newLength, sign, anchorX, anchorZ, armX, armZ, MIN_LENGTH, sceneApi);
54
- // Only the dragged gutter's own length is snapped — `snapLengthToCorner`
55
- // never moves the corner-mate, so dragging one gutter can't reset
56
- // another the user placed deliberately.
57
- const newCenterX = anchorX + sign * (snap.length / 2) * armX;
58
- const newCenterZ = anchorZ + sign * (snap.length / 2) * armZ;
55
+ return snapLengthToCorner(initial, newLength, sign, anchorX, anchorZ, armX, armZ, MIN_LENGTH, sceneApi).length;
56
+ },
57
+ apply: (initial, newLength) => {
58
+ const rotY = initial.rotation ?? 0;
59
+ const armX = Math.cos(rotY);
60
+ const armZ = -Math.sin(rotY);
61
+ const anchorX = initial.position[0] - sign * (initial.length / 2) * armX;
62
+ const anchorZ = initial.position[2] - sign * (initial.length / 2) * armZ;
63
+ const newCenterX = anchorX + sign * (newLength / 2) * armX;
64
+ const newCenterZ = anchorZ + sign * (newLength / 2) * armZ;
59
65
  return {
60
- length: snap.length,
66
+ length: newLength,
61
67
  position: [newCenterX, initial.position[1], newCenterZ],
62
68
  };
63
69
  },
@@ -81,6 +87,7 @@ function gutterSizeHandle() {
81
87
  // downward grows the value 1:1.
82
88
  anchor: 'max',
83
89
  min: MIN_SIZE,
90
+ gridSnap: true,
84
91
  currentValue: (n) => n.size,
85
92
  apply: (_n, newValue) => ({ size: Math.max(MIN_SIZE, newValue) }),
86
93
  placement: {
@@ -112,10 +119,11 @@ const gutterHandles = [
112
119
  */
113
120
  export const gutterDefinition = {
114
121
  kind: 'gutter',
115
- schemaVersion: 1,
122
+ schemaVersion: 4,
116
123
  schema: GutterNode,
117
124
  category: 'structure',
118
125
  surfaceRole: 'roof',
126
+ snapProfile: 'item',
119
127
  defaults: () => {
120
128
  const stub = GutterNodeSchema.parse({
121
129
  id: 'gutter_default',
@@ -125,9 +133,11 @@ export const gutterDefinition = {
125
133
  return rest;
126
134
  },
127
135
  capabilities: {
136
+ slots: () => [{ slotId: 'gutter', label: 'Gutter', default: 'library:preset-softwhite' }],
128
137
  selectable: { hitVolume: 'bbox' },
129
138
  duplicable: true,
130
139
  deletable: true,
140
+ paint: gutterPaint,
131
141
  // Mounts on a roof segment via `roofSegmentId`. Sits ON TOP of the
132
142
  // eave fascia — no `buildCut`, just the dirty cascade so the
133
143
  // parent roof's merged shell rebuilds when the gutter moves /
@@ -154,7 +164,7 @@ export const gutterDefinition = {
154
164
  presentation: {
155
165
  label: 'Gutter',
156
166
  description: 'Rain-water channel running along the eave of a roof segment.',
157
- icon: { kind: 'url', src: '/icons/roof.webp' },
167
+ icon: { kind: 'url', src: '/icons/gutter.webp' },
158
168
  paletteSection: 'structure',
159
169
  paletteOrder: 122,
160
170
  },
@@ -1 +1 @@
1
- {"version":3,"file":"eave-align.d.ts","sourceRoot":"","sources":["../../src/gutter/eave-align.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAInE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,eAAe,CAAA;CACzB,CAAA;AA2BD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,eAAe,EAC/B,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GACrC,MAAM,CA+BR"}
1
+ {"version":3,"file":"eave-align.d.ts","sourceRoot":"","sources":["../../src/gutter/eave-align.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAInE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,eAAe,CAAA;CACzB,CAAA;AAkCD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,eAAe,EAC/B,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GACrC,MAAM,CAiCR"}
@@ -1,5 +1,12 @@
1
1
  import { CORNER_EPSILON_SQ, gutterEndpointsInFrame, planDistSq } from './corner-mitre';
2
2
  import { computeEaveY } from './eave-snap';
3
+ function prescribedLeanToEaveY(gutter) {
4
+ const metadata = gutter.metadata;
5
+ if (!(metadata && typeof metadata === 'object' && !Array.isArray(metadata)))
6
+ return null;
7
+ const value = metadata.leanToGutterEaveY;
8
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
9
+ }
3
10
  function guttersMeet(a, aSeg, b, bSeg) {
4
11
  const ea = gutterEndpointsInFrame(a, aSeg);
5
12
  const eb = gutterEndpointsInFrame(b, bSeg);
@@ -17,6 +24,9 @@ function worldEaveY(segment) {
17
24
  return (segment.position?.[1] ?? 0) + computeEaveY(segment);
18
25
  }
19
26
  export function computeSharedEaveY(subject, subjectSegment, siblings) {
27
+ const prescribed = prescribedLeanToEaveY(subject);
28
+ if (prescribed !== null)
29
+ return prescribed;
20
30
  const subjectBaseY = subjectSegment.position?.[1] ?? 0;
21
31
  if (siblings.length === 0)
22
32
  return computeEaveY(subjectSegment);
@@ -1,4 +1,4 @@
1
- import type { RoofSegmentNode } from '@pascal-app/core';
1
+ import { type RoofSegmentNode } from '@pascal-app/core';
2
2
  /**
3
3
  * Shared eave-snap math for the gutter's placement + move tools.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"eave-snap.d.ts","sourceRoot":"","sources":["../../src/gutter/eave-snap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,kBAAkB,CAAA;AAEjE;;;;;;;;;;;;;;GAcG;AAOH,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,YAAY,OAAO,CAAA;AAEhC,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACrB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC,GAC/E,MAAM,CAYR;AA2CD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,QAAQ,CAqDV"}
1
+ {"version":3,"file":"eave-snap.d.ts","sourceRoot":"","sources":["../../src/gutter/eave-snap.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,kBAAkB,CAAA;AAEzB;;;;;;;;;;;;;;GAcG;AAOH,eAAO,MAAM,gBAAgB,OAA0B,CAAA;AACvD,eAAO,MAAM,YAAY,OAAsB,CAAA;AAE/C,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACrB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC,GAC/E,MAAM,CAER;AAwCD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,QAAQ,CAqDV"}
@@ -1,3 +1,4 @@
1
+ import { computeGutterEaveY, GUTTER_EAVE_TUCK_INWARD, GUTTER_EAVE_TUCK_UP, getRoofShapeEaveSides, } from '@pascal-app/core';
1
2
  /**
2
3
  * Shared eave-snap math for the gutter's placement + move tools.
3
4
  *
@@ -18,8 +19,8 @@
18
19
  // drip-edge. These tuck the snap so the gutter reads as "attached to
19
20
  // the fascia" rather than "floating at the very tip of the overhang".
20
21
  // Tuned by feel — bump them up if the gutter looks too low / outboard.
21
- export const EAVE_TUCK_INWARD = 0.04;
22
- export const EAVE_TUCK_UP = 0.04;
22
+ export const EAVE_TUCK_INWARD = GUTTER_EAVE_TUCK_INWARD;
23
+ export const EAVE_TUCK_UP = GUTTER_EAVE_TUCK_UP;
23
24
  /**
24
25
  * Live eave Y from a segment's wallHeight + overhang + pitch. Pulled
25
26
  * out as a shared helper because the renderer derives Y from this same
@@ -28,18 +29,7 @@ export const EAVE_TUCK_UP = 0.04;
28
29
  * `resolveEaveSnap` uses the same formula at placement.
29
30
  */
30
31
  export function computeEaveY(segment) {
31
- const wallHeight = segment.wallHeight ?? 0;
32
- // Flat roofs have no slope drop and no slope-surface-vs-deck-top
33
- // offset — the deck top IS the eave line. EAVE_TUCK_UP is a
34
- // correction that lifts a SLOPED gutter from the slope-surface up to
35
- // the deck-top line; applying it to a flat deck floats the gutter
36
- // above the roof and leaves a visible gap between the edge and the
37
- // gutter. So mount flat gutters right at the deck top.
38
- if ((segment.roofType ?? 'gable') === 'flat')
39
- return wallHeight;
40
- const overhang = segment.overhang ?? 0;
41
- const pitchRad = ((segment.pitch ?? 0) * Math.PI) / 180;
42
- return wallHeight - overhang * Math.tan(pitchRad) + EAVE_TUCK_UP;
32
+ return computeGutterEaveY(segment);
43
33
  }
44
34
  /**
45
35
  * Pick which of the segment's eaves is closest to the cursor.
@@ -49,7 +39,7 @@ export function computeEaveY(segment) {
49
39
  * regardless of which side the cursor is on — clicking on the high
50
40
  * side still rolls the gutter down to the low eave.
51
41
  *
52
- * - `hip` / `flat` / `dutch`: 4-way. The slope the user is standing
42
+ * - Four-eave roofs: the slope the user is standing
53
43
  * on is determined by whichever of `|lx|/halfW` or `|lz|/halfD` is
54
44
  * larger — same `max(fx, fz)` discriminator the segment-hit's
55
45
  * `analyticalSurfaceY` uses for hip. Sign of the dominant axis
@@ -57,16 +47,13 @@ export function computeEaveY(segment) {
57
47
  * lower run has all four eaves at the eave line — it gets the same
58
48
  * 4-way snap as hip.
59
49
  *
60
- * - `gable` / `gambrel` / `mansard`: 2-way `±Z`. Mansard has real
61
- * 4-side eaves in plan, but the segment-hit formula approximates it
62
- * as 2-slope (depth-only), so we stay consistent here — the user
63
- * can re-place the gutter manually on a side eave if mansard
64
- * becomes important.
50
+ * - `gable` / `gambrel`: 2-way `±Z`.
65
51
  */
66
52
  function pickEaveSide(roofType, localX, localZ, halfW, halfD) {
67
- if (roofType === 'shed')
68
- return '+Z';
69
- if (roofType === 'hip' || roofType === 'flat' || roofType === 'dutch') {
53
+ const sides = getRoofShapeEaveSides(roofType);
54
+ if (sides.length === 1)
55
+ return sides[0];
56
+ if (sides.includes('+X')) {
70
57
  const fx = halfW > 0 ? Math.abs(localX) / halfW : 0;
71
58
  const fz = halfD > 0 ? Math.abs(localZ) / halfD : 0;
72
59
  if (fx > fz)
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/gutter/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQlD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,gBAAgB,CAAA;AAW7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,YAAwB,GAC/B,KAAK,CAAC,cAAc,CAsLtB"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/gutter/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQlD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,gBAAgB,CAAA;AAW7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,YAAwB,GAC/B,KAAK,CAAC,cAAc,CA8LtB"}
@@ -1,6 +1,7 @@
1
1
  import { Brush, csgEvaluator, csgGeometry, prepareBrushForCSG, SUBTRACTION, } from '@pascal-app/viewer';
2
2
  import * as THREE from 'three';
3
3
  import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
4
+ import { applyCylinderWorldUvs, applyPlanarWorldUvs, copyUvToSecondaryChannel, } from '../shared/primitive-uv';
4
5
  import { NO_MITRES } from './corner-mitre';
5
6
  import { OUTLET_STUB_LENGTH, OUTLET_WALL_THICKNESS, outletDims, outletShapeForProfile, profileFloorMidZ, } from './profile-geometry';
6
7
  /**
@@ -78,7 +79,7 @@ export function buildGutterGeometry(node, mitres = NO_MITRES) {
78
79
  depth: channelLen,
79
80
  bevelEnabled: false,
80
81
  curveSegments: 16,
81
- steps: 1,
82
+ steps: gutterArcSteps(node, channelLen),
82
83
  });
83
84
  // Apply the corner-mitre skew while we're still in the source frame.
84
85
  // Source axes (pre-rotation): X_cs = outward, Y_cs = vertical,
@@ -135,7 +136,7 @@ export function buildGutterGeometry(node, mitres = NO_MITRES) {
135
136
  depth: capLeftLen,
136
137
  bevelEnabled: false,
137
138
  curveSegments: 16,
138
- steps: 1,
139
+ steps: gutterArcSteps(node, capLeftLen),
139
140
  });
140
141
  leftCap.rotateY(-Math.PI / 2);
141
142
  // Left cap spans [-len/2, -len/2 + capLeftLen]: translate by
@@ -149,7 +150,7 @@ export function buildGutterGeometry(node, mitres = NO_MITRES) {
149
150
  depth: capRightLen,
150
151
  bevelEnabled: false,
151
152
  curveSegments: 16,
152
- steps: 1,
153
+ steps: gutterArcSteps(node, capRightLen),
153
154
  });
154
155
  rightCap.rotateY(-Math.PI / 2);
155
156
  // Right cap spans [+len/2 - capRightLen, +len/2].
@@ -190,7 +191,11 @@ export function buildGutterGeometry(node, mitres = NO_MITRES) {
190
191
  // CSG drill — punches each bore through the merged geometry. Runs
191
192
  // last so the floor + collars are already in one mesh; each drill
192
193
  // cuts both at once, subtracted sequentially.
193
- if (placements.length > 0) {
194
+ // Subtracting a near-end outlet from an already subdivided curved run makes
195
+ // three-bvh-csg discard the complete cross-section around the drill, leaving
196
+ // a visible break in the fascia. Keep the curved trough watertight; its collar
197
+ // and connected downspout still conceal the floor where the bore would sit.
198
+ if (placements.length > 0 && !node.arc) {
194
199
  let workingBrush = new Brush(merged);
195
200
  prepareBrushForCSG(workingBrush);
196
201
  for (const p of placements) {
@@ -208,9 +213,115 @@ export function buildGutterGeometry(node, mitres = NO_MITRES) {
208
213
  }
209
214
  const cutGeometry = csgGeometry(workingBrush);
210
215
  merged.dispose();
211
- return cutGeometry;
216
+ const finished = bendGutterGeometryAlongArc(cutGeometry, node, mitres);
217
+ copyUvToSecondaryChannel(finished);
218
+ return finished;
212
219
  }
213
- return merged;
220
+ const finished = bendGutterGeometryAlongArc(merged, node, mitres);
221
+ copyUvToSecondaryChannel(finished);
222
+ return finished;
223
+ }
224
+ function gutterArcSteps(node, length) {
225
+ if (!node.arc || !Number.isFinite(node.arc.radius))
226
+ return 1;
227
+ return Math.max(1, Math.min(32, Math.ceil(length / 0.4)));
228
+ }
229
+ // Bend the finished straight gutter (length along mesh-+X, outward along mesh-+Z)
230
+ // onto its stored concentric arc. Each vertex keeps its vertical Y; its (x, z) rotate
231
+ // about the arc center by the angle its along-length coordinate subtends, so the trough
232
+ // hugs the same circle as the deck's eave. Absent `arc` is a straight no-op.
233
+ function bendGutterGeometryAlongArc(geometry, node, mitres) {
234
+ const arc = node.arc;
235
+ if (!arc || !Number.isFinite(arc.radius))
236
+ return geometry;
237
+ const signedRef = (Math.sign(arc.centerZ) || 1) * arc.radius;
238
+ const position = geometry.attributes.position;
239
+ const metadata = node.metadata && typeof node.metadata === 'object' && !Array.isArray(node.metadata)
240
+ ? node.metadata
241
+ : {};
242
+ const rawStraightEnds = metadata.leanToGutterArcStraightEnds;
243
+ const straightEnds = rawStraightEnds && typeof rawStraightEnds === 'object' && !Array.isArray(rawStraightEnds)
244
+ ? rawStraightEnds
245
+ : {};
246
+ const straightEnd = (side) => {
247
+ const raw = straightEnds[side];
248
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
249
+ return null;
250
+ const value = raw;
251
+ return typeof value.startX === 'number' && typeof value.endX === 'number'
252
+ ? { startX: value.startX, endX: value.endX }
253
+ : null;
254
+ };
255
+ const leftStraight = straightEnd('left');
256
+ const rightStraight = straightEnd('right');
257
+ const bendPoint = (x, z, phi) => {
258
+ const radial = z - arc.centerZ;
259
+ return {
260
+ x: arc.centerX - radial * Math.sin(phi),
261
+ z: arc.centerZ + radial * Math.cos(phi),
262
+ };
263
+ };
264
+ const bendMitredEnd = (x, z, endX) => {
265
+ const phi = (endX - arc.centerX) / signedRef;
266
+ const base = bendPoint(endX, z, phi);
267
+ const extension = x - endX;
268
+ return {
269
+ x: base.x + extension * Math.cos(phi),
270
+ z: base.z + extension * Math.sin(phi),
271
+ };
272
+ };
273
+ const bendStraightEnd = (x, z, transition) => {
274
+ const startPhi = (transition.startX - arc.centerX) / signedRef;
275
+ const endPhi = (transition.endX - arc.centerX) / signedRef;
276
+ const start = bendPoint(transition.startX, 0, startPhi);
277
+ const end = bendPoint(transition.endX, 0, endPhi);
278
+ const spanX = transition.endX - transition.startX;
279
+ const direction = Math.sign(spanX) || 1;
280
+ const beyondEnd = Math.max(0, (x - transition.endX) * direction);
281
+ const pathX = x - beyondEnd * direction;
282
+ const ratio = Math.abs(spanX) > 1e-6 ? (pathX - transition.startX) / spanX : 0;
283
+ let centerX = start.x + (end.x - start.x) * ratio;
284
+ let centerZ = start.z + (end.z - start.z) * ratio;
285
+ const chordLength = Math.hypot(end.x - start.x, end.z - start.z);
286
+ const tangentX = chordLength > 1e-6 ? (end.x - start.x) / chordLength : Math.cos(startPhi);
287
+ const tangentZ = chordLength > 1e-6 ? (end.z - start.z) / chordLength : Math.sin(startPhi);
288
+ centerX += beyondEnd * tangentX;
289
+ centerZ += beyondEnd * tangentZ;
290
+ let normalX = -tangentZ;
291
+ let normalZ = tangentX;
292
+ const midPhi = (startPhi + endPhi) / 2;
293
+ if (normalX * -Math.sin(midPhi) + normalZ * Math.cos(midPhi) < 0) {
294
+ normalX = -normalX;
295
+ normalZ = -normalZ;
296
+ }
297
+ return { x: centerX + z * normalX, z: centerZ + z * normalZ };
298
+ };
299
+ const rightTan = Math.tan(mitres.right);
300
+ const leftTan = Math.tan(mitres.left);
301
+ const halfLength = Math.max(0.05, node.length) / 2;
302
+ const endEpsilon = 1e-4;
303
+ for (let index = 0; index < position.count; index++) {
304
+ const x = position.getX(index);
305
+ const z = position.getZ(index);
306
+ const onRightMitre = mitres.right !== 0 && Math.abs(x - (halfLength + z * rightTan)) < endEpsilon;
307
+ const onLeftMitre = mitres.left !== 0 && Math.abs(x - (-halfLength - z * leftTan)) < endEpsilon;
308
+ const onRightStraight = rightStraight && x >= rightStraight.startX - endEpsilon;
309
+ const onLeftStraight = leftStraight && x <= leftStraight.startX + endEpsilon;
310
+ const bent = onRightStraight
311
+ ? bendStraightEnd(x, z, rightStraight)
312
+ : onLeftStraight
313
+ ? bendStraightEnd(x, z, leftStraight)
314
+ : onRightMitre
315
+ ? bendMitredEnd(x, z, halfLength)
316
+ : onLeftMitre
317
+ ? bendMitredEnd(x, z, -halfLength)
318
+ : bendPoint(x, z, (x - arc.centerX) / signedRef);
319
+ position.setX(index, bent.x);
320
+ position.setZ(index, bent.z);
321
+ }
322
+ position.needsUpdate = true;
323
+ geometry.computeVertexNormals();
324
+ return geometry;
214
325
  }
215
326
  // Remove the extrude's cross-section CAP triangles at a mitred end so two
216
327
  // gutters meeting at a corner don't leave coincident, z-fighting end
@@ -431,6 +542,7 @@ function buildHangers(node, len, size, capLeftLen, capRightLen, mitres) {
431
542
  // not. `mergeGeometries` rejects mixed-index sets, so flatten the
432
543
  // box to non-indexed before pushing.
433
544
  const bar = new THREE.BoxGeometry(HANGER_BAR_LEN, HANGER_BAR_THICKNESS, strapDepth).toNonIndexed();
545
+ applyPlanarWorldUvs(bar);
434
546
  // Center the bar at X = position, Y just above the rim line, Z
435
547
  // straddling 0 so the strap covers the full back-to-front span.
436
548
  bar.translate(x, HANGER_BAR_THICKNESS / 2 + 0.001, rimWidth / 2);
@@ -485,9 +597,13 @@ function resolveOutletPlacements(node, len, size, capLeftLen, capRightLen) {
485
597
  /** Cylinder (round) or box (rect) sized to `dims`, height `h` along Y. */
486
598
  function outletSolid(dims, h) {
487
599
  if (dims.shape === 'round') {
488
- return new THREE.CylinderGeometry(dims.halfX, dims.halfX, h, OUTLET_RADIAL_SEGMENTS).toNonIndexed();
600
+ const geometry = new THREE.CylinderGeometry(dims.halfX, dims.halfX, h, OUTLET_RADIAL_SEGMENTS).toNonIndexed();
601
+ applyCylinderWorldUvs(geometry, dims.halfX, h);
602
+ return geometry;
489
603
  }
490
- return new THREE.BoxGeometry(2 * dims.halfX, h, 2 * dims.halfZ).toNonIndexed();
604
+ const geometry = new THREE.BoxGeometry(2 * dims.halfX, h, 2 * dims.halfZ).toNonIndexed();
605
+ applyPlanarWorldUvs(geometry);
606
+ return geometry;
491
607
  }
492
608
  /**
493
609
  * Solid collar at the OUTER cross-section; the CSG drill hollows out the
@@ -509,9 +625,11 @@ function buildOutletFunnel(p, size) {
509
625
  let funnel;
510
626
  if (p.shape === 'round') {
511
627
  funnel = new THREE.CylinderGeometry(p.outer.halfX * OUTLET_FLARE_SCALE, p.outer.halfX, OUTLET_FLARE_HEIGHT, OUTLET_RADIAL_SEGMENTS).toNonIndexed();
628
+ applyCylinderWorldUvs(funnel, p.outer.halfX * OUTLET_FLARE_SCALE, OUTLET_FLARE_HEIGHT);
512
629
  }
513
630
  else {
514
631
  funnel = new THREE.BoxGeometry(2 * p.outer.halfX * OUTLET_FLARE_SCALE, OUTLET_FLARE_HEIGHT, 2 * p.outer.halfZ * OUTLET_FLARE_SCALE).toNonIndexed();
632
+ applyPlanarWorldUvs(funnel);
515
633
  }
516
634
  funnel.translate(p.x, centerY, p.z);
517
635
  return funnel;
@@ -1 +1 @@
1
- {"version":3,"file":"outlet-lookup.d.ts","sourceRoot":"","sources":["../../src/gutter/outlet-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAEL,KAAK,WAAW,EAIjB,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,uEAAuE;IACvE,CAAC,EAAE,MAAM,CAAA;IACT,uDAAuD;IACvD,CAAC,EAAE,MAAM,CAAA;IACT,8DAA8D;IAC9D,CAAC,EAAE,MAAM,CAAA;IACT,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAA;IAClB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAwCD,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,qBAAqB,GAAG,IAAI,CAM9B;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,GACjB,KAAK,CAAC,qBAAqB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C"}
1
+ {"version":3,"file":"outlet-lookup.d.ts","sourceRoot":"","sources":["../../src/gutter/outlet-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAEL,KAAK,WAAW,EAIjB,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,uEAAuE;IACvE,CAAC,EAAE,MAAM,CAAA;IACT,uDAAuD;IACvD,CAAC,EAAE,MAAM,CAAA;IACT,8DAA8D;IAC9D,CAAC,EAAE,MAAM,CAAA;IACT,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAA;IAClB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AA8DD,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,qBAAqB,GAAG,IAAI,CAM9B;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,GACjB,KAAK,CAAC,qBAAqB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C"}
@@ -11,10 +11,31 @@ function placeOutlet(gutter, outlet, len, size, t) {
11
11
  if (maxX <= minX)
12
12
  return null;
13
13
  const x = Math.max(minX, Math.min(maxX, outlet.offset ?? 0));
14
+ const z = profileFloorMidZ(gutter.profile ?? 'k-style', size);
15
+ // Straight run: the along-length X and outward Z are already the
16
+ // mesh-local center. A managed lean-to gutter following a curved wall
17
+ // carries a concentric arc, so the trough floor bends along its length —
18
+ // remap (x, z) onto the same arc the geometry uses so the drop tube mounts
19
+ // on the actual bent floor rather than the straight chord.
20
+ const arc = gutter.arc;
21
+ if (arc && Number.isFinite(arc.radius)) {
22
+ const signedRef = (Math.sign(arc.centerZ) || 1) * arc.radius;
23
+ const phi = (x - arc.centerX) / signedRef;
24
+ const radial = z - arc.centerZ;
25
+ return {
26
+ x: arc.centerX - radial * Math.sin(phi),
27
+ y: -size,
28
+ z: arc.centerZ + radial * Math.cos(phi),
29
+ bore: inner.halfX,
30
+ shape,
31
+ innerHalfX: inner.halfX,
32
+ innerHalfZ: inner.halfZ,
33
+ };
34
+ }
14
35
  return {
15
36
  x,
16
37
  y: -size,
17
- z: profileFloorMidZ(gutter.profile ?? 'k-style', size),
38
+ z,
18
39
  bore: inner.halfX,
19
40
  shape,
20
41
  innerHalfX: inner.halfX,
@@ -0,0 +1,3 @@
1
+ import type { PaintCapability } from '@pascal-app/core';
2
+ export declare const gutterPaint: PaintCapability;
3
+ //# sourceMappingURL=paint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/gutter/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,eAAO,MAAM,WAAW,EAAE,eAIzB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { surfacePaintCapability } from '../shared/surface-paint';
2
+ export const gutterPaint = {
3
+ ...surfacePaintCapability,
4
+ materialTarget: 'gutter',
5
+ resolveRole: () => 'gutter',
6
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"parametrics.d.ts","sourceRoot":"","sources":["../../src/gutter/parametrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,iBAAiB,EAAE,oBAAoB,CAAC,UAAU,CA6D9D,CAAA"}
1
+ {"version":3,"file":"parametrics.d.ts","sourceRoot":"","sources":["../../src/gutter/parametrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,iBAAiB,EAAE,oBAAoB,CAAC,UAAU,CAiE9D,CAAA"}
@@ -14,7 +14,7 @@ export const gutterParametrics = {
14
14
  {
15
15
  label: 'Dimensions',
16
16
  fields: [
17
- { key: 'length', kind: 'number', unit: 'm', min: 0.2, max: 12, step: 0.05 },
17
+ { key: 'length', kind: 'number', unit: 'm', min: 0.2, max: 1000, step: 0.05 },
18
18
  { key: 'size', kind: 'number', unit: 'm', min: 0.05, max: 0.3, step: 0.005 },
19
19
  {
20
20
  key: 'thickness',
@@ -54,6 +54,9 @@ export const gutterParametrics = {
54
54
  ],
55
55
  },
56
56
  ],
57
+ onDeleteCascade: (node, nodes) => Object.values(nodes)
58
+ .filter((candidate) => candidate.type === 'downspout' && candidate.gutterId === node.id)
59
+ .map((candidate) => candidate.id),
57
60
  // Lazy-loaded section that lists every downspout attached to this
58
61
  // gutter and offers an Add button at the bottom. Outlets are created
59
62
  // and removed through this panel (and the downspout placement tool) —
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/gutter/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,kBAAkB,CAAA;AAwBzB;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,cAAc,GAAI,qBAAqB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,uCAmNhE,CAAA;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/gutter/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,kBAAkB,CAAA;AAwCzB;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,cAAc,GAAI,qBAAqB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,uCA8PhE,CAAA;AAED,eAAe,cAAc,CAAA"}