@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,63 +1,20 @@
1
- import { unionPolygons } from '@pascal-app/viewer';
2
- import { getRoofSegmentPlanLinework } from '../roof-segment/floorplan';
3
- function signedArea(ring) {
4
- let a = 0;
5
- const n = ring.length;
6
- for (let i = 0; i < n; i++) {
7
- const p = ring[i];
8
- const q = ring[(i + 1) % n];
9
- a += p[0] * q[1] - q[0] * p[1];
10
- }
11
- return a / 2;
12
- }
13
- /** Distance `t >= 0` from `V` along unit dir `(dx,dz)` to where the ray first
14
- * meets segment `A→B`, or null. (Used to terminate valleys at ridges.) */
15
- function rayHitT(vx, vz, dx, dz, ax, az, bx, bz) {
16
- const ex = bx - ax;
17
- const ez = bz - az;
18
- const denom = dx * ez - dz * ex;
19
- if (Math.abs(denom) < 1e-9)
20
- return null;
21
- const wx = ax - vx;
22
- const wz = az - vz;
23
- const t = (wx * ez - wz * ex) / denom;
24
- const s = (wx * dz - wz * dx) / denom;
25
- if (t < 0)
26
- return null;
27
- if (s < -1e-6 || s > 1 + 1e-6)
28
- return null;
29
- return t;
30
- }
31
- function pointInPolygon(px, pz, poly) {
32
- let inside = false;
33
- for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {
34
- const pi = poly[i];
35
- const pj = poly[j];
36
- if (pi[1] > pz !== pj[1] > pz &&
37
- px < ((pj[0] - pi[0]) * (pz - pi[1])) / (pj[1] - pi[1]) + pi[0]) {
38
- inside = !inside;
39
- }
40
- }
41
- return inside;
42
- }
43
- /** Parametric `t` in (0,1) along `p1→p2` where it crosses segment `a→b`, else null. */
44
- function segCrossT(p1, p2, a, b) {
45
- const rx = p2[0] - p1[0];
46
- const rz = p2[1] - p1[1];
47
- const ex = b[0] - a[0];
48
- const ez = b[1] - a[1];
49
- const denom = rx * ez - rz * ex;
50
- if (Math.abs(denom) < 1e-12)
51
- return null;
52
- const wx = a[0] - p1[0];
53
- const wz = a[1] - p1[1];
54
- const t = (wx * ez - wz * ex) / denom;
55
- const s = (wx * rz - wz * rx) / denom;
56
- if (t <= 1e-4 || t >= 1 - 1e-9)
57
- return null;
58
- if (s < -1e-6 || s > 1 + 1e-6)
59
- return null;
60
- return t;
1
+ import { roofPlanOverlapEntryOwns, subtractPolygonsFromPolygon, unionPolygons, } from '@pascal-app/core';
2
+ import { getConicalRoofPlanFootprint, getRoofSegmentPlanLinework } from '../roof-segment/floorplan';
3
+ function overlapEntry(entry, ctx) {
4
+ const supportSegment = entry.roof.support?.kind === 'roof'
5
+ ? ctx.resolve(entry.roof.support.roofSegmentId)
6
+ : undefined;
7
+ return {
8
+ roofId: String(entry.roof.id),
9
+ segmentId: String(entry.segment.id),
10
+ supportRoofId: supportSegment?.type === 'roof-segment' && supportSegment.parentId
11
+ ? String(supportSegment.parentId)
12
+ : undefined,
13
+ supportRoofSegmentId: entry.roof.support?.kind === 'roof' ? String(entry.roof.support.roofSegmentId) : undefined,
14
+ roofType: entry.segment.roofType,
15
+ width: entry.segment.width,
16
+ depth: entry.segment.depth,
17
+ };
61
18
  }
62
19
  /** A segment's footprint + ridge/hip/break/slope linework, in world plan coords. */
63
20
  function buildSegPlan(roof, seg) {
@@ -79,8 +36,11 @@ function buildSegPlan(roof, seg) {
79
36
  tp(s[0][0], s[0][1]),
80
37
  tp(s[1][0], s[1][1]),
81
38
  ];
39
+ const footprint = seg.roofType === 'conical'
40
+ ? getConicalRoofPlanFootprint(seg).map(([x, z]) => tp(x, z))
41
+ : [tp(-hw, -hd), tp(hw, -hd), tp(hw, hd), tp(-hw, hd)];
82
42
  return {
83
- footprint: [tp(-hw, -hd), tp(hw, -hd), tp(hw, hd), tp(-hw, hd)],
43
+ footprint,
84
44
  ridges: lw.ridges.map(mapSeg),
85
45
  hips: lw.hips.map(mapSeg),
86
46
  breaks: lw.breaks.map(mapSeg),
@@ -92,17 +52,69 @@ function buildSegPlan(roof, seg) {
92
52
  : null,
93
53
  };
94
54
  }
55
+ function pointInPolygon(point, polygon) {
56
+ let inside = false;
57
+ for (let index = 0, previous = polygon.length - 1; index < polygon.length; previous = index++) {
58
+ const [x, y] = polygon[index];
59
+ const [px, py] = polygon[previous];
60
+ if (y > point[1] === py > point[1])
61
+ continue;
62
+ const crossingX = ((px - x) * (point[1] - y)) / (py - y) + x;
63
+ if (point[0] < crossingX)
64
+ inside = !inside;
65
+ }
66
+ return inside;
67
+ }
68
+ function segmentIntersectionParameter(line, edge) {
69
+ const lineX = line[1][0] - line[0][0];
70
+ const lineY = line[1][1] - line[0][1];
71
+ const edgeX = edge[1][0] - edge[0][0];
72
+ const edgeY = edge[1][1] - edge[0][1];
73
+ const determinant = lineX * edgeY - lineY * edgeX;
74
+ if (Math.abs(determinant) <= 1e-9)
75
+ return null;
76
+ const offsetX = edge[0][0] - line[0][0];
77
+ const offsetY = edge[0][1] - line[0][1];
78
+ const lineT = (offsetX * edgeY - offsetY * edgeX) / determinant;
79
+ const edgeT = (offsetX * lineY - offsetY * lineX) / determinant;
80
+ return lineT > 1e-9 && lineT < 1 - 1e-9 && edgeT >= -1e-9 && edgeT <= 1 + 1e-9 ? lineT : null;
81
+ }
82
+ function clipLineByCutters(line, cutters) {
83
+ const parameters = [0, 1];
84
+ for (const cutter of cutters) {
85
+ for (let index = 0; index < cutter.length; index++) {
86
+ const parameter = segmentIntersectionParameter(line, [
87
+ cutter[index],
88
+ cutter[(index + 1) % cutter.length],
89
+ ]);
90
+ if (parameter !== null)
91
+ parameters.push(parameter);
92
+ }
93
+ }
94
+ parameters.sort((a, b) => a - b);
95
+ const dx = line[1][0] - line[0][0];
96
+ const dy = line[1][1] - line[0][1];
97
+ const result = [];
98
+ for (let index = 0; index < parameters.length - 1; index++) {
99
+ const startT = parameters[index];
100
+ const endT = parameters[index + 1];
101
+ if (endT - startT <= 1e-9)
102
+ continue;
103
+ const midT = (startT + endT) / 2;
104
+ const midpoint = [line[0][0] + dx * midT, line[0][1] + dy * midT];
105
+ if (cutters.some((cutter) => pointInPolygon(midpoint, cutter)))
106
+ continue;
107
+ result.push([
108
+ [line[0][0] + dx * startT, line[0][1] + dy * startT],
109
+ [line[0][0] + dx * endT, line[0][1] + dy * endT],
110
+ ]);
111
+ }
112
+ return result;
113
+ }
95
114
  /**
96
115
  * Roof-level floor-plan builder. Draws the whole merged-roof plan: the
97
- * unioned silhouette, the valley diagonals at concave junctions, and every
98
- * segment's ridge/hip/break linework — clipped so a line stops at the valley
99
- * where its segment overlaps a neighbour, instead of running on at the
100
- * segment's full length into the cut-away part.
101
- *
102
- * Drawing all the linework here (rather than per-segment) is what lets the
103
- * clip work: the valleys and the neighbouring footprints are all in hand, so
104
- * each line can be trimmed to the actual merged geometry. The segment
105
- * builder keeps only its hit-target / selection chrome.
116
+ * unioned silhouette and every segment's ridge/hip/break linework. The
117
+ * segment builder keeps only its hit-target / selection chrome.
106
118
  *
107
119
  * Composition uses the floor plan's negated-rotation convention
108
120
  * (segment-local → roof-local → plan). `unionPolygons` returns one ring per
@@ -114,53 +126,41 @@ export function buildRoofFloorplan(node, ctx) {
114
126
  const segments = ctx.children.filter((c) => c.type === 'roof-segment');
115
127
  if (segments.length === 0)
116
128
  return null;
117
- const plans = segments.map((s) => buildSegPlan(node, s));
118
- const rings = unionPolygons(plans.map((p) => p.footprint));
119
- if (rings.length === 0)
120
- return null;
121
- // Valleys at concave (reflex) corners of the merged outline. Each runs
122
- // along the interior angle bisector and terminates at the nearest segment
123
- // ridge — the diagonal where two merged slopes meet.
124
- const allRidges = plans.flatMap((p) => p.ridges);
125
- const valleys = [];
126
- for (const ring of rings) {
127
- const n = ring.length;
128
- if (n < 3)
129
+ const entries = segments.map((segment) => ({
130
+ roof: node,
131
+ segment,
132
+ plan: buildSegPlan(node, segment),
133
+ }));
134
+ for (const sibling of ctx.siblings) {
135
+ if (sibling.type !== 'roof')
129
136
  continue;
130
- const orient = signedArea(ring) > 0 ? 1 : -1;
131
- for (let i = 0; i < n; i++) {
132
- const prev = ring[(i - 1 + n) % n];
133
- const V = ring[i];
134
- const next = ring[(i + 1) % n];
135
- const ax = prev[0] - V[0];
136
- const az = prev[1] - V[1];
137
- const bx = next[0] - V[0];
138
- const bz = next[1] - V[1];
139
- if ((ax * bz - az * bx) * orient <= 0)
140
- continue; // not reflex
141
- const la = Math.hypot(ax, az) || 1;
142
- const lb = Math.hypot(bx, bz) || 1;
143
- let dx = -(ax / la + bx / lb);
144
- let dz = -(az / la + bz / lb);
145
- const dl = Math.hypot(dx, dz);
146
- if (dl < 1e-6)
137
+ for (const childId of sibling.children ?? []) {
138
+ const segment = ctx.resolve(childId);
139
+ if (segment?.type !== 'roof-segment')
147
140
  continue;
148
- dx /= dl;
149
- dz /= dl;
150
- let bestT = Number.POSITIVE_INFINITY;
151
- for (const [A, B] of allRidges) {
152
- const t = rayHitT(V[0], V[1], dx, dz, A[0], A[1], B[0], B[1]);
153
- if (t !== null && t > 1e-4 && t < bestT)
154
- bestT = t;
155
- }
156
- if (!Number.isFinite(bestT))
157
- continue;
158
- valleys.push([
159
- [V[0], V[1]],
160
- [V[0] + dx * bestT, V[1] + dz * bestT],
161
- ]);
141
+ entries.push({ roof: sibling, segment, plan: buildSegPlan(sibling, segment) });
162
142
  }
163
143
  }
144
+ const currentEntries = entries.filter((entry) => entry.roof.id === node.id);
145
+ const visiblePlans = currentEntries.map((entry) => {
146
+ const cutters = entries
147
+ .filter((candidate) => {
148
+ if (candidate.segment.id === entry.segment.id)
149
+ return false;
150
+ if (candidate.segment.roofType === 'shed')
151
+ return false;
152
+ return roofPlanOverlapEntryOwns(overlapEntry(candidate, ctx), overlapEntry(entry, ctx));
153
+ })
154
+ .map((candidate) => candidate.plan.footprint);
155
+ return {
156
+ plan: entry.plan,
157
+ cutters,
158
+ footprints: subtractPolygonsFromPolygon(entry.plan.footprint, cutters),
159
+ };
160
+ });
161
+ const rings = unionPolygons(visiblePlans.flatMap(({ footprints }) => footprints));
162
+ if (rings.length === 0)
163
+ return null;
164
164
  const view = ctx.viewState;
165
165
  const palette = view?.palette;
166
166
  const showSelectedChrome = (view?.selected ?? false) || (view?.highlighted ?? false);
@@ -196,68 +196,42 @@ export function buildRoofFloorplan(node, ctx) {
196
196
  pointerEvents: 'none',
197
197
  });
198
198
  }
199
- // Valley diagonals.
200
- for (const v of valleys)
201
- pushLine(v[0], v[1], hipWidth);
202
- // Per-segment ridge / hip / break linework, clipped to the merged geometry:
203
- // an endpoint that overshoots into another segment is pulled back to the
204
- // valley it crosses (the junction), so a ridge stops at the diagonal.
205
- const footprints = plans.map((p) => p.footprint);
206
- const clipEnd = (pt, other, ownIndex) => {
207
- let inOther = false;
208
- for (let i = 0; i < footprints.length; i++) {
209
- if (i === ownIndex)
210
- continue;
211
- if (pointInPolygon(pt[0], pt[1], footprints[i])) {
212
- inOther = true;
213
- break;
199
+ for (const { plan, cutters } of visiblePlans) {
200
+ for (const line of plan.breaks) {
201
+ for (const visible of clipLineByCutters(line, cutters)) {
202
+ pushLine(visible[0], visible[1], hipWidth);
214
203
  }
215
204
  }
216
- if (!inOther)
217
- return pt;
218
- let bestT = Number.POSITIVE_INFINITY; // nearest valley crossing to the overshoot
219
- for (const v of valleys) {
220
- const t = segCrossT(pt, other, v[0], v[1]);
221
- if (t !== null && t < bestT)
222
- bestT = t;
205
+ for (const line of plan.hips) {
206
+ for (const visible of clipLineByCutters(line, cutters)) {
207
+ pushLine(visible[0], visible[1], hipWidth);
208
+ }
223
209
  }
224
- if (!Number.isFinite(bestT))
225
- return pt; // overshoots but no valley to stop at
226
- return [pt[0] + (other[0] - pt[0]) * bestT, pt[1] + (other[1] - pt[1]) * bestT];
227
- };
228
- const clipPush = (line, width, ownIndex) => {
229
- const a = clipEnd(line[0], line[1], ownIndex);
230
- const b = clipEnd(line[1], a, ownIndex);
231
- const dx = a[0] - b[0];
232
- const dz = a[1] - b[1];
233
- if (dx * dx + dz * dz < 1e-8)
234
- return;
235
- pushLine(a, b, width);
236
- };
237
- plans.forEach((p, idx) => {
238
- for (const s of p.breaks)
239
- clipPush(s, hipWidth, idx);
240
- for (const s of p.hips)
241
- clipPush(s, hipWidth, idx);
242
- for (const s of p.ridges)
243
- clipPush(s, ridgeWidth, idx);
244
- // Shed downslope arrow (no overshoot to clip).
245
- if (p.slope) {
246
- const { tail, head } = p.slope;
247
- const dx = head[0] - tail[0];
248
- const dz = head[1] - tail[1];
210
+ for (const line of plan.ridges) {
211
+ for (const visible of clipLineByCutters(line, cutters)) {
212
+ pushLine(visible[0], visible[1], ridgeWidth);
213
+ }
214
+ }
215
+ if (plan.slope) {
216
+ const { tail, head } = plan.slope;
217
+ const visibleSlope = clipLineByCutters([tail, head], cutters).at(-1);
218
+ if (!visibleSlope)
219
+ continue;
220
+ const [visibleTail, visibleHead] = visibleSlope;
221
+ const dx = visibleHead[0] - visibleTail[0];
222
+ const dz = visibleHead[1] - visibleTail[1];
249
223
  const len = Math.hypot(dx, dz) || 1;
250
224
  const ux = dx / len;
251
225
  const uz = dz / len;
252
226
  const headLen = Math.min(0.22, len * 0.4);
253
227
  const wing = headLen * 0.6;
254
- pushLine(tail, head, hipWidth);
228
+ pushLine(visibleTail, visibleHead, hipWidth);
255
229
  children.push({
256
230
  kind: 'polyline',
257
231
  points: [
258
- [head[0] - headLen * ux - wing * uz, head[1] - headLen * uz + wing * ux],
259
- [head[0], head[1]],
260
- [head[0] - headLen * ux + wing * uz, head[1] - headLen * uz - wing * ux],
232
+ [visibleHead[0] - headLen * ux - wing * uz, visibleHead[1] - headLen * uz + wing * ux],
233
+ [visibleHead[0], visibleHead[1]],
234
+ [visibleHead[0] - headLen * ux + wing * uz, visibleHead[1] - headLen * uz - wing * ux],
261
235
  ],
262
236
  stroke: ink,
263
237
  strokeWidth: hipWidth,
@@ -266,6 +240,6 @@ export function buildRoofFloorplan(node, ctx) {
266
240
  pointerEvents: 'none',
267
241
  });
268
242
  }
269
- });
243
+ }
270
244
  return children.length > 0 ? { kind: 'group', children } : null;
271
245
  }
@@ -1,3 +1,4 @@
1
1
  export { type RoofSegmentHit, resolveRoofSegmentHit } from '../shared/roof-segment-hit';
2
2
  export { roofDefinition } from './definition';
3
+ export { default as useRoofFootprintSource, type RoofFootprintSourceChoice, } from './roof-footprint-source';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/roof/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/roof/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EACL,OAAO,IAAI,sBAAsB,EACjC,KAAK,yBAAyB,GAC/B,MAAM,yBAAyB,CAAA"}
@@ -1,2 +1,3 @@
1
1
  export { resolveRoofSegmentHit } from '../shared/roof-segment-hit';
2
2
  export { roofDefinition } from './definition';
3
+ export { default as useRoofFootprintSource, } from './roof-footprint-source';
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/roof/panel.tsx"],"names":[],"mappings":"AAmCA,MAAM,CAAC,OAAO,UAAU,SAAS,uCAmgBhC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/roof/panel.tsx"],"names":[],"mappings":"AAiCA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA0gBhC"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { createDefaultRidgeVentsForSegment, RoofSegmentNode as RoofSegmentNodeSchema, useScene, } from '@pascal-app/core';
3
+ import { useScene, } from '@pascal-app/core';
4
4
  import { ActionButton, ActionGroup, duplicateRoofSubtree, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Copy, Move, Plus, Trash2 } from 'lucide-react';
@@ -11,7 +11,6 @@ export default function RoofPanel() {
11
11
  const selectedId = useViewer((s) => s.selection.selectedIds[0]);
12
12
  const setSelection = useViewer((s) => s.setSelection);
13
13
  const updateNode = useScene((s) => s.updateNode);
14
- const createNodes = useScene((s) => s.createNodes);
15
14
  const setMovingNode = useEditor((s) => s.setMovingNode);
16
15
  const node = useScene((s) => selectedId ? s.nodes[selectedId] : undefined);
17
16
  // Shallow selector — only re-renders when the segment list content changes.
@@ -114,23 +113,12 @@ export default function RoofPanel() {
114
113
  const handleAddSegment = useCallback(() => {
115
114
  if (!node)
116
115
  return;
117
- const segment = RoofSegmentNodeSchema.parse({
118
- width: 6,
119
- depth: 6,
120
- wallHeight: 0.5,
121
- pitch: 40,
122
- roofType: 'gable',
123
- position: [2, 0, 2],
124
- });
125
- const ridgeVents = createDefaultRidgeVentsForSegment(segment);
126
- createNodes([
127
- { node: segment, parentId: node.id },
128
- ...ridgeVents.map((ridgeVent) => ({
129
- node: ridgeVent,
130
- parentId: segment.id,
131
- })),
132
- ]);
133
- }, [node, createNodes]);
116
+ triggerSFX('sfx:item-pick');
117
+ const editor = useEditor.getState();
118
+ editor.setTool('roof');
119
+ if (editor.mode !== 'build')
120
+ editor.setMode('build');
121
+ }, [node]);
134
122
  const handleSelectSegment = useCallback((segmentId) => {
135
123
  setSelection({ selectedIds: [segmentId] });
136
124
  }, [setSelection]);
@@ -177,15 +165,26 @@ export default function RoofPanel() {
177
165
  }, []);
178
166
  if (!(node && node.type === 'roof' && selectedId))
179
167
  return null;
180
- return (_jsxs(PanelWrapper, { icon: "/icons/roof.webp", onClose: handleClose, title: node.name || 'Roof', width: 300, children: [_jsxs(PanelSection, { title: "Segments", children: [_jsx("div", { className: "flex flex-col gap-1", children: segments.map((seg, i) => (_jsxs("button", { className: "flex items-center justify-between rounded-lg border border-border/50 bg-[#2C2C2E] px-3 py-2 text-foreground text-sm transition-colors hover:bg-[#3e3e3e]", onClick: () => handleSelectSegment(seg.id), type: "button", children: [_jsx("span", { className: "truncate", children: seg.name || `Segment ${i + 1}` }), _jsx("span", { className: "text-muted-foreground text-xs capitalize", children: seg.roofType })] }, seg.id))) }), _jsx(ActionGroup, { children: _jsx(ActionButton, { icon: _jsx(Plus, { className: "h-3.5 w-3.5" }), label: "Add Segment", onClick: handleAddSegment }) })] }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X", max: 50, min: -50, onChange: (v) => {
168
+ return (_jsxs(PanelWrapper, { icon: "/icons/roof.webp", onClose: handleClose, title: node.name || 'Roof', width: 300, children: [_jsxs(PanelSection, { title: "Segments", children: [_jsx("div", { className: "flex flex-col gap-1", children: segments.map((seg, i) => (_jsxs("button", { className: "flex items-center justify-between rounded-lg border border-border/50 bg-[#2C2C2E] px-3 py-2 text-foreground text-sm transition-colors hover:bg-[#3e3e3e]", onClick: () => handleSelectSegment(seg.id), type: "button", children: [_jsx("span", { className: "truncate", children: seg.name || `Segment ${i + 1}` }), _jsx("span", { className: "text-muted-foreground text-xs capitalize", children: seg.roofType })] }, seg.id))) }), _jsx(ActionGroup, { children: _jsx(ActionButton, { icon: _jsx(Plus, { className: "h-3.5 w-3.5" }), label: "Draw Segment", onClick: handleAddSegment }) })] }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X", onChange: (v) => {
181
169
  const pos = [...node.position];
182
170
  pos[0] = v;
183
171
  handleUpdate({ position: pos });
184
- }, precision: 2, step: 0.05, unit: "m", value: Math.round(node.position[0] * 100) / 100 }), _jsx(SliderControl, { label: "Y", max: 50, min: -50, onChange: (v) => {
172
+ }, precision: 2, step: 0.05, unit: "m", value: Math.round(node.position[0] * 100) / 100 }), node.support?.kind !== 'roof' && (_jsx(SegmentedControl, { onChange: (mode) => handleUpdate({ support: { kind: mode === 'walls' ? 'walls' : 'level' } }), options: [
173
+ { label: 'Follows walls', value: 'walls' },
174
+ { label: 'Custom', value: 'custom' },
175
+ ], value: node.support?.kind === 'walls' ? 'walls' : 'custom' })), node.support?.kind === 'walls' ? (_jsxs("div", { className: "px-1 text-[11px] text-muted-foreground", children: ["Currently ", Math.round(node.position[1] * 100) / 100, " m"] })) : (_jsx(SliderControl, { label: "Y", onChange: (v) => {
185
176
  const pos = [...node.position];
186
177
  pos[1] = v;
187
- handleUpdate({ position: pos });
188
- }, precision: 2, step: 0.05, unit: "m", value: Math.round(node.position[1] * 100) / 100 }), _jsx(SliderControl, { label: "Z", max: 50, min: -50, onChange: (v) => {
178
+ const current = useScene.getState().nodes[node.id];
179
+ handleUpdate({
180
+ position: pos,
181
+ ...(current?.type === 'roof' &&
182
+ current.support?.kind === 'walls' &&
183
+ Math.abs(v - current.position[1]) > 1e-4
184
+ ? { support: { kind: 'level' } }
185
+ : {}),
186
+ });
187
+ }, precision: 2, step: 0.05, unit: "m", value: Math.round(node.position[1] * 100) / 100 })), _jsx(SliderControl, { label: "Z", onChange: (v) => {
189
188
  const pos = [...node.position];
190
189
  pos[2] = v;
191
190
  handleUpdate({ position: pos });
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/roof/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAQzB,eAAO,MAAM,YAAY,GAAI,mBAAmB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAmHjE,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/roof/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAQzB,eAAO,MAAM,YAAY,GAAI,mBAAmB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAkHjE,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,16 @@
1
+ export type RoofFootprintSourceChoice = 'draw' | 'room';
2
+ type RoofFootprintSourceState = {
3
+ source: RoofFootprintSourceChoice;
4
+ setSource: (source: RoofFootprintSourceChoice) => void;
5
+ };
6
+ /**
7
+ * How the user wants the next roof footprint made — draw two corners, or pick
8
+ * a detected room ('walls' is conical-only and forced by
9
+ * `parseRoofFootprintSource`, so it never lives here). Ephemeral UI state
10
+ * owned by the kind, like `roof-placement-mode`: deliberately OUTSIDE
11
+ * `toolDefaults.roof`, which preset seeding nulls on every activation and the
12
+ * tool clears on unmount — both used to wipe the user's choice.
13
+ */
14
+ declare const useRoofFootprintSource: import("zustand").UseBoundStore<import("zustand").StoreApi<RoofFootprintSourceState>>;
15
+ export default useRoofFootprintSource;
16
+ //# sourceMappingURL=roof-footprint-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roof-footprint-source.d.ts","sourceRoot":"","sources":["../../src/roof/roof-footprint-source.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvD,KAAK,wBAAwB,GAAG;IAC9B,MAAM,EAAE,yBAAyB,CAAA;IACjC,SAAS,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAA;CACvD,CAAA;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,sBAAsB,uFAGzB,CAAA;AAEH,eAAe,sBAAsB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { create } from 'zustand';
2
+ /**
3
+ * How the user wants the next roof footprint made — draw two corners, or pick
4
+ * a detected room ('walls' is conical-only and forced by
5
+ * `parseRoofFootprintSource`, so it never lives here). Ephemeral UI state
6
+ * owned by the kind, like `roof-placement-mode`: deliberately OUTSIDE
7
+ * `toolDefaults.roof`, which preset seeding nulls on every activation and the
8
+ * tool clears on unmount — both used to wipe the user's choice.
9
+ */
10
+ const useRoofFootprintSource = create((set) => ({
11
+ source: 'draw',
12
+ setSource: (source) => set({ source }),
13
+ }));
14
+ export default useRoofFootprintSource;
@@ -0,0 +1,25 @@
1
+ import { type AnyNode, type LevelNode, type RoofFootprintTarget, type RoofType, type WallNode } from '@pascal-app/core';
2
+ export type RoofFootprintSource = 'room' | 'walls' | 'draw';
3
+ export declare function isStandardRoofWallEligible(wall: WallNode): boolean;
4
+ export declare function isConicalRoofWallEligible(targetLevelId: LevelNode['id'], wall: WallNode, nodes: Readonly<Record<string, AnyNode>>): boolean;
5
+ export declare function parseRoofFootprintSource(value: unknown, roofType: RoofType): RoofFootprintSource;
6
+ export declare function subscribeToConicalRoofWallClicks(options: {
7
+ footprintSource: RoofFootprintSource;
8
+ currentLevelId: LevelNode['id'] | null;
9
+ getNodes: () => Readonly<Record<string, AnyNode>>;
10
+ onPreview?: (wall: WallNode | null) => void;
11
+ onSelect: (wall: WallNode) => void;
12
+ roofType: RoofType;
13
+ }): () => void;
14
+ export declare function resolveRoofFootprintElevation(targetLevelId: LevelNode['id'], target: RoofFootprintTarget, nodes: Readonly<Record<string, AnyNode>>): number;
15
+ export declare function resolveRoofFootprintWorldElevation(targetLevelId: LevelNode['id'], target: RoofFootprintTarget, nodes: Readonly<Record<string, AnyNode>>): number;
16
+ /**
17
+ * World/building-local Y for a wall-top preview rendered outside a level node.
18
+ *
19
+ * Roof nodes are parented to a level, so their stored position is relative to
20
+ * that level's floor. The conical wall hover ghost is rendered directly in the
21
+ * building group instead, and therefore needs the active level's world base
22
+ * added back after resolving the level-relative placement.
23
+ */
24
+ export declare function resolveRoofWallTopWorldElevation(targetLevelId: LevelNode['id'], wall: WallNode, nodes: Readonly<Record<string, AnyNode>>, elevations?: Map<string, import("@pascal-app/core").LevelElevation>): number;
25
+ //# sourceMappingURL=roof-footprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roof-footprint.d.ts","sourceRoot":"","sources":["../../src/roof/roof-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EAIb,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAI3D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKlE;AAED,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,OAAO,CAMT;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,mBAAmB,CAGhG;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE;IACxD,eAAe,EAAE,mBAAmB,CAAA;IACpC,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtC,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;IAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,QAAQ,CAAA;CACnB,GAAG,MAAM,IAAI,CA0Cb;AAED,wBAAgB,6BAA6B,CAC3C,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,CAUR;AAED,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,CAOR;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,UAAU,yDAAuD,GAChE,MAAM,CAKR"}
@@ -0,0 +1,94 @@
1
+ import { emitter, getLevelBelow, getLevelElevations, isCurvedWall, resolveLevelId, resolveRoofWallTopElevation, } from '@pascal-app/core';
2
+ const ROOF_AXIS_ALIGNMENT_EPSILON = 1e-4;
3
+ export function isStandardRoofWallEligible(wall) {
4
+ if (isCurvedWall(wall))
5
+ return false;
6
+ const deltaX = Math.abs(wall.end[0] - wall.start[0]);
7
+ const deltaZ = Math.abs(wall.end[1] - wall.start[1]);
8
+ return deltaX <= ROOF_AXIS_ALIGNMENT_EPSILON || deltaZ <= ROOF_AXIS_ALIGNMENT_EPSILON;
9
+ }
10
+ export function isConicalRoofWallEligible(targetLevelId, wall, nodes) {
11
+ const completeNodes = nodes;
12
+ const sourceLevelId = resolveLevelId(wall, completeNodes);
13
+ if (!sourceLevelId)
14
+ return false;
15
+ if (sourceLevelId === targetLevelId)
16
+ return true;
17
+ return getLevelBelow(targetLevelId, completeNodes)?.id === sourceLevelId;
18
+ }
19
+ export function parseRoofFootprintSource(value, roofType) {
20
+ if (roofType === 'conical')
21
+ return 'walls';
22
+ return value === 'room' ? 'room' : 'draw';
23
+ }
24
+ export function subscribeToConicalRoofWallClicks(options) {
25
+ if (!(options.roofType === 'conical' && options.footprintSource === 'walls'))
26
+ return () => { };
27
+ let previewedWallId = null;
28
+ const onWallHover = (event) => {
29
+ const wall = isCurvedWall(event.node) &&
30
+ options.currentLevelId &&
31
+ isConicalRoofWallEligible(options.currentLevelId, event.node, options.getNodes())
32
+ ? event.node
33
+ : null;
34
+ const nextId = wall?.id ?? null;
35
+ if (nextId === previewedWallId)
36
+ return;
37
+ previewedWallId = nextId;
38
+ options.onPreview?.(wall);
39
+ };
40
+ const onWallLeave = (event) => {
41
+ if (event.node.id !== previewedWallId)
42
+ return;
43
+ previewedWallId = null;
44
+ options.onPreview?.(null);
45
+ };
46
+ const onWallClick = (event) => {
47
+ if (!isCurvedWall(event.node) ||
48
+ !options.currentLevelId ||
49
+ !isConicalRoofWallEligible(options.currentLevelId, event.node, options.getNodes())) {
50
+ return;
51
+ }
52
+ event.stopPropagation();
53
+ options.onSelect(event.node);
54
+ };
55
+ emitter.on('wall:enter', onWallHover);
56
+ emitter.on('wall:move', onWallHover);
57
+ emitter.on('wall:leave', onWallLeave);
58
+ emitter.on('wall:click', onWallClick);
59
+ return () => {
60
+ emitter.off('wall:enter', onWallHover);
61
+ emitter.off('wall:move', onWallHover);
62
+ emitter.off('wall:leave', onWallLeave);
63
+ emitter.off('wall:click', onWallClick);
64
+ };
65
+ }
66
+ export function resolveRoofFootprintElevation(targetLevelId, target, nodes) {
67
+ const completeNodes = nodes;
68
+ const elevations = getLevelElevations(completeNodes);
69
+ const tops = target.wallIds.flatMap((id) => {
70
+ const wall = nodes[id];
71
+ return wall?.type === 'wall'
72
+ ? [resolveRoofWallTopElevation(targetLevelId, wall, completeNodes, elevations)]
73
+ : [];
74
+ });
75
+ return tops.length ? Math.max(...tops) : 0;
76
+ }
77
+ export function resolveRoofFootprintWorldElevation(targetLevelId, target, nodes) {
78
+ const completeNodes = nodes;
79
+ const elevations = getLevelElevations(completeNodes);
80
+ return ((elevations.get(targetLevelId)?.baseY ?? 0) +
81
+ resolveRoofFootprintElevation(targetLevelId, target, nodes));
82
+ }
83
+ /**
84
+ * World/building-local Y for a wall-top preview rendered outside a level node.
85
+ *
86
+ * Roof nodes are parented to a level, so their stored position is relative to
87
+ * that level's floor. The conical wall hover ghost is rendered directly in the
88
+ * building group instead, and therefore needs the active level's world base
89
+ * added back after resolving the level-relative placement.
90
+ */
91
+ export function resolveRoofWallTopWorldElevation(targetLevelId, wall, nodes, elevations = getLevelElevations(nodes)) {
92
+ return ((elevations.get(targetLevelId)?.baseY ?? 0) +
93
+ resolveRoofWallTopElevation(targetLevelId, wall, nodes, elevations));
94
+ }
@@ -0,0 +1,18 @@
1
+ export type RoofPlacementMode = 'auto' | 'ground' | 'roof';
2
+ type RoofPlacementModeState = {
3
+ conical: boolean;
4
+ mode: RoofPlacementMode;
5
+ cycleMode: () => void;
6
+ setConical: (conical: boolean) => void;
7
+ };
8
+ declare const useRoofPlacementMode: import("zustand").UseBoundStore<import("zustand").StoreApi<RoofPlacementModeState>>;
9
+ export declare const conicalRoofToolHintVisibility: {
10
+ subscribe: (onChange: () => void) => () => void;
11
+ value: () => boolean;
12
+ };
13
+ export declare const standardRoofToolHintVisibility: {
14
+ subscribe: (onChange: () => void) => () => void;
15
+ value: () => boolean;
16
+ };
17
+ export default useRoofPlacementMode;
18
+ //# sourceMappingURL=roof-placement-mode.d.ts.map