@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,8 +1,8 @@
1
- import { calculateLevelMiters, getWallPlanFootprint, resolveLevelId, selectionProxyIdFromMetadata, } from '@pascal-app/core';
1
+ import { CABINET_METRIC_DEFAULTS, calculateLevelMiters, cloneNodesInto, getWallPlanFootprint, nodeRegistry, resolveLevelId, selectionProxyIdFromMetadata, } from '@pascal-app/core';
2
2
  import { MAX_CABINET_WIDTH, MIN_CABINET_WIDTH } from './resize-limits';
3
- import { moduleMaxX, moduleMinX, planToRunLocal, runLocalToPlan, runLocalXExtent, sideInsertX, sortRunModules, } from './run-layout';
3
+ import { moduleMaxX, moduleMinX, planRunModuleInsertion, planRunModuleWidthEqualization, planToRunLocal, runLocalToPlan, runLocalXExtent, runWallConstraints, sideInsertX, sortRunModules, } from './run-layout';
4
4
  import { CabinetModuleNode as CabinetModuleNodeSchema, CabinetNode as CabinetNodeSchema, } from './schema';
5
- import { backAnchoredModuleZ, hoodCompartmentHeight, newCabinetCompartment, stackForCabinet, } from './stack';
5
+ import { backAnchoredModuleZ, DEFAULT_CEILING_HEIGHT, defaultCabinetStack, hoodCompartmentHeight, newCabinetCompartment, stackForCabinet, } from './stack';
6
6
  /**
7
7
  * Kind-owned cabinet run mutations, shared by the properties panel, the
8
8
  * quick-action menu, and the placement tool. Everything routes through
@@ -13,10 +13,10 @@ import { backAnchoredModuleZ, hoodCompartmentHeight, newCabinetCompartment, stac
13
13
  */
14
14
  export const CABINET_BASE_WIDTH = 0.5;
15
15
  export const CABINET_WALL_DEPTH = 0.32;
16
- export const CABINET_BASE_DEPTH = 0.5;
17
- export const CABINET_WALL_CARCASS_HEIGHT = 0.72;
18
- export const CABINET_TALL_DEPTH = 0.58;
19
- export const CABINET_TALL_PLINTH_HEIGHT = 0.1;
16
+ export const CABINET_BASE_DEPTH = CABINET_METRIC_DEFAULTS.depth;
17
+ export const CABINET_WALL_CARCASS_HEIGHT = CABINET_METRIC_DEFAULTS.carcassHeight;
18
+ export const CABINET_TALL_DEPTH = CABINET_METRIC_DEFAULTS.depth;
19
+ export const CABINET_TALL_PLINTH_HEIGHT = CABINET_METRIC_DEFAULTS.plinthHeight;
20
20
  export const CABINET_TALL_CARCASS_HEIGHT = 2.07;
21
21
  export const CABINET_EDGE_EPSILON = 1e-4;
22
22
  const MIN_CORNER_CONNECTED_WIDTH = 0.3;
@@ -201,6 +201,10 @@ export function totalCabinetHeight(node) {
201
201
  node.carcassHeight +
202
202
  (node.withCountertop ? node.countertopThickness : 0));
203
203
  }
204
+ export function cabinetModuleTotalHeight(node) {
205
+ return (totalCabinetHeight(node) +
206
+ (node.topFinish === 'top-cabinet' || node.topFinish === 'trim' ? node.topFinishHeight : 0));
207
+ }
204
208
  /** Y where a wall cabinet's bottom lands so its top aligns with a tall unit's top. */
205
209
  export function wallBottomHeightForTallAlignment() {
206
210
  return (totalCabinetHeight({
@@ -211,6 +215,49 @@ export function wallBottomHeightForTallAlignment() {
211
215
  countertopThickness: 0,
212
216
  }) - CABINET_WALL_CARCASS_HEIGHT);
213
217
  }
218
+ /** Resolve the remaining vertical space above a wall/tall module. */
219
+ function cabinetCeilingContext(node, nodes) {
220
+ let worldY = node.position[1];
221
+ let current = node;
222
+ const visited = new Set();
223
+ let level;
224
+ while (current.parentId) {
225
+ const currentId = current.id;
226
+ if (visited.has(currentId))
227
+ break;
228
+ visited.add(currentId);
229
+ const parent = nodes[current.parentId];
230
+ if (!parent)
231
+ break;
232
+ if (parent.type === 'level') {
233
+ level = parent;
234
+ break;
235
+ }
236
+ if (parent.type !== 'cabinet' && parent.type !== 'cabinet-module')
237
+ break;
238
+ worldY += parent.position[1];
239
+ current = parent;
240
+ }
241
+ const ceilingHeight = level?.type === 'level' && typeof level.height === 'number'
242
+ ? level.height
243
+ : DEFAULT_CEILING_HEIGHT;
244
+ return { ceilingHeight, worldY };
245
+ }
246
+ /** Resolve the remaining vertical space above a wall/tall module. */
247
+ export function cabinetCeilingGap(node, nodes) {
248
+ const { ceilingHeight, worldY } = cabinetCeilingContext(node, nodes);
249
+ const currentTop = worldY + node.carcassHeight + (node.withCountertop ? node.countertopThickness : 0);
250
+ return Math.min(1.2, Math.max(0, ceilingHeight - currentTop));
251
+ }
252
+ /** Resolve how far a module's carcass and top finish extend above the ceiling. */
253
+ export function cabinetModuleCeilingOverflow(node, nodes) {
254
+ const { ceilingHeight, worldY } = cabinetCeilingContext(node, nodes);
255
+ const currentTop = worldY +
256
+ node.carcassHeight +
257
+ (node.withCountertop ? node.countertopThickness : 0) +
258
+ (node.topFinish === 'top-cabinet' || node.topFinish === 'trim' ? node.topFinishHeight : 0);
259
+ return Math.max(0, currentTop - ceilingHeight);
260
+ }
214
261
  /** Local Z offset that makes a shallower wall cabinet's back flush with its deeper base. */
215
262
  export function backAlignZ(baseDepth, wallDepth) {
216
263
  return -(baseDepth - wallDepth) / 2;
@@ -223,6 +270,44 @@ export function wallChildOf(module, nodes) {
223
270
  }
224
271
  return null;
225
272
  }
273
+ export function nestedCornerRunPositionOverrides(module, nextPosition, nodes) {
274
+ const dx = nextPosition[0] - module.position[0];
275
+ const dy = nextPosition[1] - module.position[1];
276
+ const dz = nextPosition[2] - module.position[2];
277
+ if (Math.abs(dx) <= CABINET_EDGE_EPSILON &&
278
+ Math.abs(dy) <= CABINET_EDGE_EPSILON &&
279
+ Math.abs(dz) <= CABINET_EDGE_EPSILON) {
280
+ return [];
281
+ }
282
+ const cos = Math.cos(module.rotation);
283
+ const sin = Math.sin(module.rotation);
284
+ return Object.values(nodes).flatMap((node) => {
285
+ if (node?.type !== 'cabinet' || node.parentId !== module.id)
286
+ return [];
287
+ const link = cornerDerivedRunLink(node.metadata);
288
+ if (link?.role !== 'bridge' && link?.role !== 'wall-leg')
289
+ return [];
290
+ return [
291
+ [
292
+ node.id,
293
+ {
294
+ position: [
295
+ node.position[0] - (dx * cos - dz * sin),
296
+ node.position[1] - dy,
297
+ node.position[2] - (dx * sin + dz * cos),
298
+ ],
299
+ },
300
+ ],
301
+ ];
302
+ });
303
+ }
304
+ export function applyCabinetModuleFrontPatch({ module, patch, sceneApi, }) {
305
+ sceneApi.update(module.id, patch);
306
+ const wallChild = wallChildOf(module, sceneApi.nodes());
307
+ if (wallChild) {
308
+ sceneApi.update(wallChild.id, patch);
309
+ }
310
+ }
226
311
  export function resolveCabinetType(module, run) {
227
312
  if (module.cabinetType)
228
313
  return module.cabinetType;
@@ -233,6 +318,212 @@ export function cabinetModulesForRun(run, nodes) {
233
318
  .map((id) => nodes[id])
234
319
  .filter((child) => child?.type === 'cabinet-module');
235
320
  }
321
+ const EQUALIZABLE_CABINET_COMPARTMENTS = new Set(['shelf', 'drawer', 'door']);
322
+ export function cabinetModuleCanEqualizeWidth(module, run) {
323
+ return (module.moduleKind !== 'corner-filler' &&
324
+ resolveCabinetType(module, run) === 'base' &&
325
+ stackForCabinet(module).every((compartment) => EQUALIZABLE_CABINET_COMPARTMENTS.has(compartment.type)));
326
+ }
327
+ export function cabinetRunWidthEqualizationPlan(run, nodes) {
328
+ const modules = cabinetModulesForRun(run, nodes);
329
+ const equalizedIds = new Set(modules
330
+ .filter((module) => cabinetModuleCanEqualizeWidth(module, run))
331
+ .map((module) => module.id));
332
+ const minimumWidthById = new Map(modules
333
+ .filter((module) => equalizedIds.has(module.id))
334
+ .map((module) => [
335
+ module.id,
336
+ cornerSourceLink(module.metadata) ? MIN_TRIMMED_CORNER_CONNECTED_WIDTH : MIN_CABINET_WIDTH,
337
+ ]));
338
+ const maximumWidthById = new Map(modules
339
+ .filter((module) => equalizedIds.has(module.id))
340
+ .map((module) => [module.id, MAX_CABINET_WIDTH]));
341
+ return planRunModuleWidthEqualization({
342
+ modules,
343
+ equalizedIds,
344
+ minimumWidthById,
345
+ maximumWidthById,
346
+ });
347
+ }
348
+ export function equalizeCabinetRunWidths({ run, sceneApi, }) {
349
+ const liveRun = sceneApi.get(run.id);
350
+ if (!liveRun)
351
+ return false;
352
+ const previousModules = cabinetModulesForRun(liveRun, sceneApi.nodes());
353
+ const plan = cabinetRunWidthEqualizationPlan(liveRun, sceneApi.nodes());
354
+ if (!plan.ok || !plan.changed)
355
+ return false;
356
+ sceneApi.pauseHistory();
357
+ try {
358
+ for (const planned of plan.modules) {
359
+ const module = sceneApi.get(planned.id);
360
+ if (!module || module.parentId !== liveRun.id)
361
+ throw new Error('Cabinet run changed');
362
+ const nextPosition = [
363
+ planned.position[0],
364
+ module.position[1],
365
+ planned.position[2],
366
+ ];
367
+ const nestedCornerOverrides = nestedCornerRunPositionOverrides(module, nextPosition, sceneApi.nodes());
368
+ sceneApi.update(module.id, {
369
+ position: nextPosition,
370
+ width: planned.width,
371
+ });
372
+ for (const [id, override] of nestedCornerOverrides)
373
+ sceneApi.update(id, override);
374
+ const wallChild = wallChildOf(module, sceneApi.nodes());
375
+ if (wallChild) {
376
+ sceneApi.update(wallChild.id, {
377
+ position: [0, wallChild.position[1], backAlignZ(module.depth, wallChild.depth)],
378
+ width: planned.width,
379
+ });
380
+ }
381
+ }
382
+ syncCornerRunsFromRunSources({
383
+ baseLayout: 'width-only',
384
+ previousModules,
385
+ run: sceneApi.get(liveRun.id) ?? liveRun,
386
+ sceneApi,
387
+ });
388
+ bumpCabinetRunLayoutRevision(sceneApi, liveRun);
389
+ sceneApi.resumeHistory();
390
+ return true;
391
+ }
392
+ catch {
393
+ sceneApi.restoreAll();
394
+ sceneApi.resumeHistory();
395
+ return false;
396
+ }
397
+ }
398
+ export function cabinetRunArrayPlan(run, nodes, options) {
399
+ if (!options.sourceModuleId)
400
+ return { ok: false, reason: 'no-source' };
401
+ if (!Number.isInteger(options.copyCount) ||
402
+ options.copyCount < 1 ||
403
+ options.copyCount > 20 ||
404
+ !Number.isFinite(options.spacing) ||
405
+ options.spacing < 0 ||
406
+ options.spacing > 2) {
407
+ return { ok: false, reason: 'invalid-options' };
408
+ }
409
+ const modules = cabinetModulesForRun(run, nodes);
410
+ const source = modules.find((module) => module.id === options.sourceModuleId);
411
+ if (!source || source.moduleKind === 'corner-filler') {
412
+ return { ok: false, reason: 'no-source' };
413
+ }
414
+ const direction = options.direction === 'left' ? -1 : 1;
415
+ const step = source.width + options.spacing;
416
+ const positions = Array.from({ length: options.copyCount }, (_, index) => [
417
+ source.position[0] + direction * step * (index + 1),
418
+ source.position[1],
419
+ source.position[2],
420
+ ]);
421
+ const epsilon = CABINET_EDGE_EPSILON;
422
+ for (const position of positions) {
423
+ const minX = position[0] - source.width / 2;
424
+ const maxX = position[0] + source.width / 2;
425
+ const overlaps = modules.some((module) => {
426
+ if (module.id === source.id)
427
+ return false;
428
+ return moduleMinX(module) < maxX - epsilon && moduleMaxX(module) > minX + epsilon;
429
+ });
430
+ if (overlaps)
431
+ return { ok: false, reason: 'no-space' };
432
+ }
433
+ const constraints = runWallConstraints(run, modules, nodes);
434
+ const currentMinX = Math.min(...modules.map(moduleMinX));
435
+ const currentMaxX = Math.max(...modules.map(moduleMaxX));
436
+ const plannedMinX = Math.min(currentMinX, ...positions.map((position) => position[0] - source.width / 2));
437
+ const plannedMaxX = Math.max(currentMaxX, ...positions.map((position) => position[0] + source.width / 2));
438
+ if ((constraints.left.constrained &&
439
+ currentMinX - plannedMinX > constraints.left.slack + epsilon) ||
440
+ (constraints.right.constrained && plannedMaxX - currentMaxX > constraints.right.slack + epsilon)) {
441
+ return { ok: false, reason: 'no-space' };
442
+ }
443
+ return { ok: true, sourceModuleId: source.id, positions };
444
+ }
445
+ function cleanCabinetArrayMetadata(metadata) {
446
+ const { cabinetCornerDerivedRun: _derived, cabinetCornerSourceLink: _source, isNew: _isNew, nodeSelectionProxyId: _proxy, ...rest } = cabinetMetadataRecord(metadata);
447
+ return rest;
448
+ }
449
+ function cabinetArrayCloneNodes(source, position, sceneApi) {
450
+ const subtree = sceneApi.getSubtree(source.id);
451
+ if (!subtree)
452
+ return null;
453
+ const duplicable = nodeRegistry.get(source.type)?.capabilities?.duplicable;
454
+ const prepared = duplicable && typeof duplicable === 'object' && duplicable.prepareSubtreeClone
455
+ ? duplicable.prepareSubtreeClone({
456
+ root: subtree.root,
457
+ descendants: subtree.descendants,
458
+ rootId: source.id,
459
+ rootPatch: { position },
460
+ nodes: sceneApi.nodes(),
461
+ })
462
+ : null;
463
+ const root = {
464
+ ...(prepared?.root ?? subtree.root),
465
+ metadata: cleanCabinetArrayMetadata((prepared?.root ?? subtree.root).metadata),
466
+ };
467
+ root.position = position;
468
+ const descendants = (prepared?.descendants ?? subtree.descendants).map((node) => ({
469
+ ...node,
470
+ metadata: cleanCabinetArrayMetadata(node.metadata),
471
+ }));
472
+ return cloneNodesInto([root, ...descendants], {
473
+ parentId: source.parentId,
474
+ rootId: source.id,
475
+ position,
476
+ }).nodes;
477
+ }
478
+ export function duplicateCabinetModuleAlongRun({ run, sceneApi, sourceModuleId, copyCount, spacing, direction, }) {
479
+ const liveRun = sceneApi.get(run.id);
480
+ if (!liveRun)
481
+ return null;
482
+ const plan = cabinetRunArrayPlan(liveRun, sceneApi.nodes(), {
483
+ copyCount,
484
+ direction,
485
+ sourceModuleId,
486
+ spacing,
487
+ });
488
+ if (!plan.ok)
489
+ return null;
490
+ const source = sceneApi.get(plan.sourceModuleId);
491
+ if (!source)
492
+ return null;
493
+ const clonedNodes = [];
494
+ const clonedRootIds = [];
495
+ for (const position of plan.positions) {
496
+ const clone = cabinetArrayCloneNodes(source, position, sceneApi);
497
+ if (!clone || clone.length === 0)
498
+ return null;
499
+ clonedRootIds.push(clone[0].id);
500
+ clonedNodes.push(...clone);
501
+ }
502
+ sceneApi.pauseHistory();
503
+ try {
504
+ const createMany = sceneApi.createMany;
505
+ const clonedRootIdSet = new Set(clonedRootIds);
506
+ if (createMany) {
507
+ createMany(clonedNodes.map((node) => clonedRootIdSet.has(node.id)
508
+ ? { node, parentId: liveRun.id }
509
+ : { node }));
510
+ }
511
+ else {
512
+ for (const node of clonedNodes) {
513
+ const isRoot = clonedRootIdSet.has(node.id);
514
+ sceneApi.upsert(node, isRoot ? liveRun.id : undefined);
515
+ }
516
+ }
517
+ bumpCabinetRunLayoutRevision(sceneApi, liveRun);
518
+ sceneApi.resumeHistory();
519
+ return clonedRootIds;
520
+ }
521
+ catch {
522
+ sceneApi.restoreAll();
523
+ sceneApi.resumeHistory();
524
+ return null;
525
+ }
526
+ }
236
527
  export function backAlignedRunDepthOverrides(run, nodes, depth) {
237
528
  const modules = cabinetModulesForRun(run, nodes);
238
529
  if (modules.length === 0)
@@ -475,9 +766,40 @@ export function cornerSourceWidthOverridesForDerivedDepth(run, nodes, depth) {
475
766
  export function cornerSourceModulesForRun(run, nodes) {
476
767
  return cabinetModulesForRun(run, nodes).filter((module) => cornerSourceLink(module.metadata) != null);
477
768
  }
769
+ export function cornerPinnedEndsForRun(modules) {
770
+ if (modules.length === 0)
771
+ return {};
772
+ const sorted = sortRunModules(modules);
773
+ const leftEdge = moduleMinX(sorted[0]);
774
+ const rightEdge = moduleMaxX(sorted.at(-1));
775
+ const pinned = {};
776
+ for (const module of sorted) {
777
+ const side = cornerSourceLink(module.metadata)?.side;
778
+ if (side === 'left' && Math.abs(moduleMinX(module) - leftEdge) <= CABINET_EDGE_EPSILON) {
779
+ pinned.left = true;
780
+ }
781
+ if (side === 'right' && Math.abs(moduleMaxX(module) - rightEdge) <= CABINET_EDGE_EPSILON) {
782
+ pinned.right = true;
783
+ }
784
+ }
785
+ return pinned;
786
+ }
478
787
  function doorStack(shelfCount) {
479
788
  return [{ ...newCabinetCompartment('door'), shelfCount }];
480
789
  }
790
+ function cloneCabinetStack(module) {
791
+ return stackForCabinet(module).map((compartment) => ({
792
+ ...compartment,
793
+ id: newCabinetCompartment(compartment.type).id,
794
+ }));
795
+ }
796
+ const STORAGE_COMPARTMENT_TYPES = new Set(['shelf', 'drawer', 'door']);
797
+ function sideAdditionStack(module) {
798
+ const stack = stackForCabinet(module);
799
+ return stack.every((compartment) => STORAGE_COMPARTMENT_TYPES.has(compartment.type))
800
+ ? cloneCabinetStack(module)
801
+ : defaultCabinetStack(module);
802
+ }
481
803
  function cloneWallCabinetStack(sourceWallTop, shelfCount) {
482
804
  if (!sourceWallTop)
483
805
  return doorStack(shelfCount);
@@ -711,9 +1033,18 @@ function resolveWallLimitedWidth({ backLeft, desiredWidth, depth, leadingOffset,
711
1033
  position: [backLeft[0], 0, backLeft[1]],
712
1034
  rotation,
713
1035
  };
1036
+ const runAxis = [Math.cos(rotation), -Math.sin(rotation)];
714
1037
  const miterData = calculateLevelMiters(walls);
715
1038
  let blockingDistance = Number.POSITIVE_INFINITY;
716
1039
  for (const wall of walls) {
1040
+ const wallDx = wall.end[0] - wall.start[0];
1041
+ const wallDz = wall.end[1] - wall.start[1];
1042
+ const wallLength = Math.hypot(wallDx, wallDz);
1043
+ if (wallLength <= WALL_CLEARANCE_EPSILON)
1044
+ continue;
1045
+ const axisDot = (wallDx * runAxis[0] + wallDz * runAxis[1]) / wallLength;
1046
+ if (Math.abs(axisDot) > 0.2)
1047
+ continue;
717
1048
  const footprint = getWallPlanFootprint(wall, miterData);
718
1049
  if (footprint.length < 3)
719
1050
  continue;
@@ -842,9 +1173,15 @@ function computeCornerRunLayout({ module, run, nodes, side, turnSide = side, sou
842
1173
  const corner = runLocalToPlan(runWorld, [cornerX, 0, backZ]);
843
1174
  const sourceAxis = [Math.cos(runWorld.rotation), -Math.sin(runWorld.rotation)];
844
1175
  const sign = side === 'right' ? 1 : -1;
1176
+ const sourceWallConstraint = runWallConstraints(run, modules, nodes, {
1177
+ widthGrowth: baseLegDepth,
1178
+ })[side];
1179
+ const sideWallInset = turnSide === side && sourceWallConstraint.constrained
1180
+ ? Math.max(0, baseLegDepth - sourceWallConstraint.slack)
1181
+ : 0;
845
1182
  const shiftedCorner = [
846
- corner[0] + sign * baseLegDepth * sourceAxis[0],
847
- corner[2] + sign * baseLegDepth * sourceAxis[1],
1183
+ corner[0] + sign * (baseLegDepth - sideWallInset) * sourceAxis[0],
1184
+ corner[2] + sign * (baseLegDepth - sideWallInset) * sourceAxis[1],
848
1185
  ];
849
1186
  const legRotation = turnSide === 'right' ? runWorld.rotation - Math.PI / 2 : runWorld.rotation + Math.PI / 2;
850
1187
  const legAxis = [Math.cos(legRotation), -Math.sin(legRotation)];
@@ -1085,6 +1422,11 @@ function upsertCabinetRunWithModules({ depth, modulePatches, name, parentId, pos
1085
1422
  countertopOverhang: runTier === 'base' ? sourceRun.countertopOverhang : 0,
1086
1423
  showPlinth: false,
1087
1424
  withCountertop: false,
1425
+ frontGap: sourceRun.frontGap,
1426
+ frontStyle: sourceRun.frontStyle,
1427
+ frontOverlay: sourceRun.frontOverlay,
1428
+ handleStyle: sourceRun.handleStyle,
1429
+ handlePosition: sourceRun.handlePosition,
1088
1430
  moduleKind: patch.moduleKind ?? 'standard',
1089
1431
  ...(patch.openSide ? { openSide: patch.openSide } : {}),
1090
1432
  ...(patch.cornerShelf ? { cornerShelf: true } : {}),
@@ -1228,12 +1570,42 @@ function syncDerivedCornerRun({ baseLayout, role, run, sourceModule, sourceRun,
1228
1570
  ? Math.min(...modules.map((entry) => entry.position[0] - entry.width / 2))
1229
1571
  : Math.max(...modules.map((entry) => entry.position[0] + entry.width / 2)) - nextTotalWidth;
1230
1572
  let cursor = fixedEdge;
1573
+ const nextPositions = currentWidths.map((width) => {
1574
+ const positionX = cursor + width / 2;
1575
+ cursor += width;
1576
+ return positionX;
1577
+ });
1578
+ const fillerName = role === 'base-leg' ? 'Corner Filler' : 'Corner Wall Filler';
1579
+ const anchorModuleIndex = modules.findIndex((entry) => entry.name === fillerName);
1580
+ const anchorModule = modules[anchorModuleIndex];
1581
+ const canonicalAnchorIndex = anchorModule ? fullNames.indexOf(anchorModule.name) : -1;
1582
+ if (anchorModule && canonicalAnchorIndex >= 0) {
1583
+ const rotation = layout.legRotation;
1584
+ const layoutRunPosition = role === 'base-leg' ? layout.baseRunPosition : layout.wallRunPosition;
1585
+ const anchorWorldPosition = runLocalToPlan({ position: layoutRunPosition, rotation }, [
1586
+ fullCenters[canonicalAnchorIndex] ?? 0,
1587
+ 0,
1588
+ 0,
1589
+ ]);
1590
+ const runWorldPosition = runLocalToPlan({ position: anchorWorldPosition, rotation }, [
1591
+ -(nextPositions[anchorModuleIndex] ?? 0),
1592
+ 0,
1593
+ -anchorModule.position[2],
1594
+ ]);
1595
+ const frameParent = cabinetFrameParent(run, sceneApi.nodes()) ?? sourceRun;
1596
+ const runPosition = worldToCabinetLocalPosition(frameParent, sceneApi.nodes(), runWorldPosition);
1597
+ const localRotation = worldToCabinetLocalRotation(frameParent, sceneApi.nodes(), rotation);
1598
+ const positionChanged = runPosition.some((value, index) => Math.abs(value - run.position[index]) > CABINET_EDGE_EPSILON);
1599
+ if (positionChanged ||
1600
+ Math.abs(angleDelta(localRotation, run.rotation)) > CABINET_EDGE_EPSILON) {
1601
+ sceneApi.update(run.id, { position: runPosition, rotation: localRotation });
1602
+ }
1603
+ }
1231
1604
  modules.forEach((entry, index) => {
1232
1605
  const spec = currentSpecs[index];
1233
1606
  if (!spec)
1234
1607
  return;
1235
- const positionX = cursor + spec.width / 2;
1236
- cursor += spec.width;
1608
+ const positionX = nextPositions[index] ?? entry.position[0];
1237
1609
  sceneApi.update(entry.id, {
1238
1610
  width: spec.width,
1239
1611
  position: [positionX, entry.position[1], entry.position[2]],
@@ -1333,8 +1705,6 @@ function syncDerivedCornerRun({ baseLayout, role, run, sourceModule, sourceRun,
1333
1705
  0,
1334
1706
  0,
1335
1707
  ]);
1336
- // Place relative to the derived run's ACTUAL parent frame — source run for
1337
- // new scenes, source module for legacy scenes that nested legs under it.
1338
1708
  const frameParent = cabinetFrameParent(run, sceneApi.nodes()) ?? sourceRun;
1339
1709
  const runPosition = worldToCabinetLocalPosition(frameParent, sceneApi.nodes(), runWorldPosition);
1340
1710
  const localRotation = worldToCabinetLocalRotation(frameParent, sceneApi.nodes(), rotation);
@@ -1379,7 +1749,9 @@ function syncDerivedCornerRun({ baseLayout, role, run, sourceModule, sourceRun,
1379
1749
  frontOverlay: sourceRun.frontOverlay,
1380
1750
  handleStyle: sourceRun.handleStyle,
1381
1751
  handlePosition: sourceRun.handlePosition,
1382
- stack: doorStack(layout.connectedShelfCount),
1752
+ stack: role === 'base-leg' && entry.name === 'Base Cabinet'
1753
+ ? cloneCabinetStack(sourceModule)
1754
+ : doorStack(layout.connectedShelfCount),
1383
1755
  metadata: entry.metadata,
1384
1756
  });
1385
1757
  });
@@ -1399,10 +1771,29 @@ function syncDerivedCornerRun({ baseLayout, role, run, sourceModule, sourceRun,
1399
1771
  }
1400
1772
  bumpCabinetRunLayoutRevision(sceneApi, sceneApi.get(run.id) ?? run);
1401
1773
  }
1402
- export function syncCornerRunsFromSourceModule({ baseLayout = 'full', module, run, sceneApi, }) {
1774
+ export function syncCornerRunsFromSourceModule({ baseLayout = 'full', module, previousModule, run, sceneApi, }) {
1403
1775
  const link = cornerSourceLink(module.metadata);
1404
1776
  if (!link)
1405
1777
  return;
1778
+ if (previousModule) {
1779
+ const previousEdge = link.side === 'left' ? moduleMinX(previousModule) : moduleMaxX(previousModule);
1780
+ const nextEdge = link.side === 'left' ? moduleMinX(module) : moduleMaxX(module);
1781
+ const edgeShift = nextEdge - previousEdge;
1782
+ if (Math.abs(edgeShift) > CABINET_EDGE_EPSILON) {
1783
+ for (const runId of link.linkedRunIds) {
1784
+ const linkedRun = sceneApi.get(runId);
1785
+ if (linkedRun?.type !== 'cabinet' || linkedRun.parentId !== run.id)
1786
+ continue;
1787
+ sceneApi.update(linkedRun.id, {
1788
+ position: [
1789
+ linkedRun.position[0] + edgeShift,
1790
+ linkedRun.position[1],
1791
+ linkedRun.position[2],
1792
+ ],
1793
+ });
1794
+ }
1795
+ }
1796
+ }
1406
1797
  for (const runId of link.linkedRunIds) {
1407
1798
  const linkedRun = sceneApi.get(runId);
1408
1799
  if (linkedRun?.type !== 'cabinet')
@@ -1422,11 +1813,35 @@ export function syncCornerRunsFromSourceModule({ baseLayout = 'full', module, ru
1422
1813
  });
1423
1814
  }
1424
1815
  }
1425
- export function syncCornerRunsFromRunSources({ baseLayout = 'full', run, sceneApi, }) {
1816
+ export function syncCornerRunsFromRunSources({ baseLayout = 'full', previousModules = [], run, sceneApi, }) {
1426
1817
  const effectiveBaseLayout = baseLayout === 'width-only' && !cornerDerivedRunLink(run.metadata)
1427
1818
  ? 'preserve-connected-widths'
1428
1819
  : baseLayout;
1820
+ const previousModulesById = new Map(previousModules.map((module) => [module.id, module]));
1429
1821
  for (const sourceModule of cornerSourceModulesForRun(run, sceneApi.nodes())) {
1822
+ const previousModule = previousModulesById.get(sourceModule.id);
1823
+ const sourceLink = previousModule ? cornerSourceLink(sourceModule.metadata) : null;
1824
+ if (previousModule && sourceLink) {
1825
+ const previousEdge = sourceLink.side === 'left' ? moduleMinX(previousModule) : moduleMaxX(previousModule);
1826
+ const nextEdge = sourceLink.side === 'left' ? moduleMinX(sourceModule) : moduleMaxX(sourceModule);
1827
+ const edgeShift = nextEdge - previousEdge;
1828
+ if (Math.abs(edgeShift) > CABINET_EDGE_EPSILON) {
1829
+ // Move the direct leg first so it stays attached even when a wall makes
1830
+ // the canonical corner re-layout reject the otherwise valid live shape.
1831
+ for (const linkedRunId of sourceLink.linkedRunIds) {
1832
+ const linkedRun = sceneApi.get(linkedRunId);
1833
+ if (linkedRun?.type !== 'cabinet' || linkedRun.parentId !== run.id)
1834
+ continue;
1835
+ sceneApi.update(linkedRun.id, {
1836
+ position: [
1837
+ linkedRun.position[0] + edgeShift,
1838
+ linkedRun.position[1],
1839
+ linkedRun.position[2],
1840
+ ],
1841
+ });
1842
+ }
1843
+ }
1844
+ }
1430
1845
  syncCornerRunsFromSourceModule({
1431
1846
  baseLayout: effectiveBaseLayout,
1432
1847
  module: sourceModule,
@@ -1435,7 +1850,7 @@ export function syncCornerRunsFromRunSources({ baseLayout = 'full', run, sceneAp
1435
1850
  });
1436
1851
  }
1437
1852
  }
1438
- export function previewCornerRunsFromRunSources({ baseLayout = 'full', initialOverrides = [], run, sceneApi, }) {
1853
+ export function previewCornerRunsFromRunSources({ baseLayout = 'full', initialOverrides = [], previousModules = [], run, sceneApi, }) {
1439
1854
  const overrides = new Map();
1440
1855
  for (const [id, patch] of initialOverrides) {
1441
1856
  overrides.set(id, { ...(overrides.get(id) ?? {}), ...patch });
@@ -1458,29 +1873,41 @@ export function previewCornerRunsFromRunSources({ baseLayout = 'full', initialOv
1458
1873
  },
1459
1874
  markDirty: () => { },
1460
1875
  };
1461
- syncCornerRunsFromRunSources({ baseLayout, run, sceneApi: previewSceneApi });
1876
+ syncCornerRunsFromRunSources({
1877
+ baseLayout,
1878
+ previousModules,
1879
+ run,
1880
+ sceneApi: previewSceneApi,
1881
+ });
1462
1882
  return [...overrides];
1463
1883
  }
1464
1884
  /**
1465
1885
  * Insert a new base module flush against the anchor's side (or the run's
1466
- * outer edge with no anchor). Gap-checked — returns null when a flush
1467
- * neighbor leaves no room for a standard-width unit.
1886
+ * outer edge with no anchor). A full run is reflowed when the anchor has a
1887
+ * flush neighbor, subject to wall and filler capacity.
1468
1888
  */
1469
1889
  export function planCabinetModuleSideAddition({ anchorModule, nodes, run, side, }) {
1470
1890
  const modules = cabinetModulesForRun(run, nodes);
1471
- const x = sideInsertX({
1891
+ const directX = sideInsertX({
1472
1892
  anchorModule,
1473
1893
  modules,
1474
1894
  side,
1475
1895
  width: CABINET_BASE_WIDTH,
1476
1896
  epsilon: CABINET_EDGE_EPSILON,
1477
1897
  });
1898
+ const x = directX ??
1899
+ (anchorModule
1900
+ ? side === 'left'
1901
+ ? moduleMinX(anchorModule) - CABINET_BASE_WIDTH / 2
1902
+ : moduleMaxX(anchorModule) + CABINET_BASE_WIDTH / 2
1903
+ : null);
1478
1904
  if (x == null)
1479
1905
  return null;
1480
1906
  const sortedModules = sortRunModules(modules);
1481
1907
  const depthSource = anchorModule ?? (side === 'left' ? sortedModules[0] : sortedModules.at(-1)) ?? null;
1482
1908
  const depth = depthSource?.depth ?? run.depth;
1483
1909
  const z = depthSource ? backAnchoredModuleZ(depthSource.position[2], depthSource.depth, depth) : 0;
1910
+ const structureSource = anchorModule ?? depthSource;
1484
1911
  const width = resolveSideAddedModuleWidth({
1485
1912
  centerX: x,
1486
1913
  centerZ: z,
@@ -1493,7 +1920,7 @@ export function planCabinetModuleSideAddition({ anchorModule, nodes, run, side,
1493
1920
  });
1494
1921
  if (width < MIN_CORNER_CONNECTED_WIDTH - WALL_CLEARANCE_EPSILON)
1495
1922
  return null;
1496
- return CabinetModuleNodeSchema.parse({
1923
+ const module = CabinetModuleNodeSchema.parse({
1497
1924
  name: `Base Cabinet ${modules.length + 1}`,
1498
1925
  parentId: run.id,
1499
1926
  position: [
@@ -1510,20 +1937,82 @@ export function planCabinetModuleSideAddition({ anchorModule, nodes, run, side,
1510
1937
  countertopOverhang: run.countertopOverhang,
1511
1938
  showPlinth: false,
1512
1939
  withCountertop: false,
1940
+ frontGap: structureSource?.frontGap ?? run.frontGap,
1941
+ frontStyle: structureSource?.frontStyle ?? run.frontStyle,
1942
+ frontOverlay: structureSource?.frontOverlay ?? run.frontOverlay,
1943
+ handleStyle: structureSource?.handleStyle ?? run.handleStyle,
1944
+ handlePosition: structureSource?.handlePosition ?? run.handlePosition,
1945
+ ...(structureSource ? { stack: sideAdditionStack(structureSource) } : {}),
1513
1946
  });
1947
+ if (directX == null && anchorModule) {
1948
+ const insertionPlan = planRunModuleInsertion({
1949
+ modules,
1950
+ insertion: {
1951
+ id: module.id,
1952
+ position: module.position,
1953
+ width: module.width,
1954
+ },
1955
+ wallConstraints: runWallConstraints(run, modules, nodes),
1956
+ fillerIds: new Set(modules
1957
+ .filter((candidate) => candidate.moduleKind === 'corner-filler')
1958
+ .map((candidate) => candidate.id)),
1959
+ preserveEnds: cornerPinnedEndsForRun(modules),
1960
+ });
1961
+ if (!insertionPlan.ok)
1962
+ return null;
1963
+ }
1964
+ return module;
1514
1965
  }
1515
1966
  export function addCabinetModuleSide({ anchorModule, run, sceneApi, side, }) {
1967
+ const nodes = sceneApi.nodes();
1968
+ const modules = cabinetModulesForRun(run, nodes);
1969
+ const directX = sideInsertX({
1970
+ anchorModule,
1971
+ modules,
1972
+ side,
1973
+ width: CABINET_BASE_WIDTH,
1974
+ epsilon: CABINET_EDGE_EPSILON,
1975
+ });
1516
1976
  const module = planCabinetModuleSideAddition({
1517
1977
  anchorModule,
1518
- nodes: sceneApi.nodes(),
1978
+ nodes,
1519
1979
  run,
1520
1980
  side,
1521
1981
  });
1522
1982
  if (!module)
1523
1983
  return null;
1524
- sceneApi.upsert(module, run.id);
1984
+ let committedModule = module;
1985
+ if (directX == null && anchorModule) {
1986
+ const result = planRunModuleInsertion({
1987
+ modules,
1988
+ insertion: {
1989
+ id: module.id,
1990
+ position: module.position,
1991
+ width: module.width,
1992
+ },
1993
+ wallConstraints: runWallConstraints(run, modules, nodes),
1994
+ fillerIds: new Set(modules
1995
+ .filter((candidate) => candidate.moduleKind === 'corner-filler')
1996
+ .map((candidate) => candidate.id)),
1997
+ preserveEnds: cornerPinnedEndsForRun(modules),
1998
+ });
1999
+ if (!result.ok)
2000
+ return null;
2001
+ for (const planned of result.modules) {
2002
+ sceneApi.update(planned.id, {
2003
+ position: planned.position,
2004
+ width: planned.width,
2005
+ });
2006
+ }
2007
+ committedModule = CabinetModuleNodeSchema.parse({
2008
+ ...module,
2009
+ position: result.inserted.position,
2010
+ width: result.inserted.width,
2011
+ });
2012
+ }
2013
+ sceneApi.upsert(committedModule, run.id);
1525
2014
  bumpCabinetRunLayoutRevision(sceneApi, run);
1526
- return module.id;
2015
+ return committedModule.id;
1527
2016
  }
1528
2017
  /**
1529
2018
  * Spawn an L corner off one open end of a base run: a perpendicular base leg
@@ -1589,8 +2078,6 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1589
2078
  const existingWallTop = sourceWallChildId
1590
2079
  ? (sceneApi.get(sourceWallChildId) ?? null)
1591
2080
  : wallChildOf(sourceModule, sceneApi.nodes());
1592
- // Legs are siblings of the source module under the SOURCE RUN — the run is
1593
- // the modular cabinet group; the clicked module must not become a container.
1594
2081
  const baseLocalPosition = worldToCabinetLocalPosition(sourceRun, sceneApi.nodes(), baseRunPosition);
1595
2082
  const baseLocalRotation = worldToCabinetLocalRotation(sourceRun, sceneApi.nodes(), legRotation);
1596
2083
  const baseModules = endSide === 'right'
@@ -1607,7 +2094,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1607
2094
  name: 'Base Cabinet',
1608
2095
  width: connectedWidth,
1609
2096
  openSide: 'left',
1610
- stack: doorStack(connectedShelfCount),
2097
+ stack: cloneCabinetStack(sourceModule),
1611
2098
  },
1612
2099
  ]
1613
2100
  : [
@@ -1615,7 +2102,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1615
2102
  name: 'Base Cabinet',
1616
2103
  width: connectedWidth,
1617
2104
  openSide: 'right',
1618
- stack: doorStack(connectedShelfCount),
2105
+ stack: cloneCabinetStack(sourceModule),
1619
2106
  },
1620
2107
  {
1621
2108
  name: 'Corner Filler',
@@ -1639,7 +2126,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1639
2126
  });
1640
2127
  const selectionRootId = cornerSelectionRootId(sourceRun, baseLeg.runId);
1641
2128
  const linkedRunIds = [baseLeg.runId];
1642
- const baseLegLiveMetadata = sceneApi.get(baseLeg.runId)?.metadata ?? null;
2129
+ const baseLegLiveMetadata = sceneApi.get(baseLeg.runId)?.metadata ?? {};
1643
2130
  const baseLegMetadata = cabinetMetadataRecord(baseLegLiveMetadata);
1644
2131
  sceneApi.update(baseLeg.runId, {
1645
2132
  metadata: {
@@ -1696,7 +2183,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1696
2183
  sourceRun,
1697
2184
  });
1698
2185
  linkedRunIds.push(bridgeRun.runId);
1699
- const bridgeRunLiveMetadata = sceneApi.get(bridgeRun.runId)?.metadata ?? null;
2186
+ const bridgeRunLiveMetadata = sceneApi.get(bridgeRun.runId)?.metadata ?? {};
1700
2187
  const bridgeRunMetadata = cabinetMetadataRecord(bridgeRunLiveMetadata);
1701
2188
  sceneApi.update(bridgeRun.runId, {
1702
2189
  metadata: {
@@ -1740,7 +2227,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1740
2227
  sourceRun,
1741
2228
  });
1742
2229
  linkedRunIds.push(wallFillerRun.runId);
1743
- const wallFillerRunLiveMetadata = sceneApi.get(wallFillerRun.runId)?.metadata ?? null;
2230
+ const wallFillerRunLiveMetadata = sceneApi.get(wallFillerRun.runId)?.metadata ?? {};
1744
2231
  const wallFillerRunMetadata = cabinetMetadataRecord(wallFillerRunLiveMetadata);
1745
2232
  sceneApi.update(wallFillerRun.runId, {
1746
2233
  metadata: {
@@ -1774,7 +2261,7 @@ export function addCornerRun({ module, run, sceneApi, side, }) {
1774
2261
  setCabinetSelectionProxy(sceneApi, wallChildId, selectionRootId);
1775
2262
  }
1776
2263
  }
1777
- const liveSourceMetadata = sceneApi.get(sourceModule.id)?.metadata ?? null;
2264
+ const liveSourceMetadata = sceneApi.get(sourceModule.id)?.metadata ?? {};
1778
2265
  const sourceMetadata = cabinetMetadataRecord(liveSourceMetadata);
1779
2266
  const existingSourceLink = cornerSourceLink(liveSourceMetadata);
1780
2267
  sceneApi.update(sourceModule.id, {