@pascal-app/nodes 1.0.0-beta.5 → 1.0.1

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 (929) 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 +4 -4
  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/appliance-layout.d.ts +26 -0
  102. package/dist/cabinet/appliance-layout.d.ts.map +1 -0
  103. package/dist/cabinet/appliance-layout.js +52 -0
  104. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  105. package/dist/cabinet/compartment-card.js +11 -3
  106. package/dist/cabinet/continuous-placement.d.ts +3 -0
  107. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  108. package/dist/cabinet/continuous-placement.js +6 -0
  109. package/dist/cabinet/countertop-layout.d.ts +173 -0
  110. package/dist/cabinet/countertop-layout.d.ts.map +1 -0
  111. package/dist/cabinet/countertop-layout.js +80 -0
  112. package/dist/cabinet/definition.d.ts.map +1 -1
  113. package/dist/cabinet/definition.js +414 -61
  114. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  115. package/dist/cabinet/floorplan-move.js +91 -22
  116. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
  117. package/dist/cabinet/geometry/cooktop.js +2 -2
  118. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  119. package/dist/cabinet/geometry/fridge.js +25 -1
  120. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  121. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  122. package/dist/cabinet/geometry/fronts.js +1 -1
  123. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  124. package/dist/cabinet/geometry/run.js +28 -71
  125. package/dist/cabinet/geometry/sink.d.ts +2 -12
  126. package/dist/cabinet/geometry/sink.d.ts.map +1 -1
  127. package/dist/cabinet/geometry/sink.js +8 -39
  128. package/dist/cabinet/geometry.d.ts.map +1 -1
  129. package/dist/cabinet/geometry.js +63 -1
  130. package/dist/cabinet/hosted-resize.d.ts +8 -0
  131. package/dist/cabinet/hosted-resize.d.ts.map +1 -0
  132. package/dist/cabinet/hosted-resize.js +158 -0
  133. package/dist/cabinet/index.d.ts +1 -0
  134. package/dist/cabinet/index.d.ts.map +1 -1
  135. package/dist/cabinet/index.js +1 -0
  136. package/dist/cabinet/insertion.d.ts +19 -0
  137. package/dist/cabinet/insertion.d.ts.map +1 -0
  138. package/dist/cabinet/insertion.js +49 -0
  139. package/dist/cabinet/move-frame.d.ts.map +1 -1
  140. package/dist/cabinet/move-frame.js +68 -2
  141. package/dist/cabinet/panel-context.d.ts +7 -0
  142. package/dist/cabinet/panel-context.d.ts.map +1 -0
  143. package/dist/cabinet/panel-context.js +16 -0
  144. package/dist/cabinet/panel-visibility.d.ts +9 -0
  145. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  146. package/dist/cabinet/panel-visibility.js +26 -0
  147. package/dist/cabinet/panel.d.ts.map +1 -1
  148. package/dist/cabinet/panel.js +221 -37
  149. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  150. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  151. package/dist/cabinet/placement-dimensions.js +227 -0
  152. package/dist/cabinet/placement-snap.d.ts +21 -1
  153. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  154. package/dist/cabinet/placement-snap.js +48 -6
  155. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  156. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  157. package/dist/cabinet/preset-width-debt.js +45 -0
  158. package/dist/cabinet/presets.d.ts.map +1 -1
  159. package/dist/cabinet/presets.js +14 -13
  160. package/dist/cabinet/profiles.d.ts +14 -0
  161. package/dist/cabinet/profiles.d.ts.map +1 -0
  162. package/dist/cabinet/profiles.js +30 -0
  163. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  164. package/dist/cabinet/quick-actions.js +8 -24
  165. package/dist/cabinet/reveals.d.ts +37 -0
  166. package/dist/cabinet/reveals.d.ts.map +1 -0
  167. package/dist/cabinet/reveals.js +13 -0
  168. package/dist/cabinet/run-layout.d.ts +98 -5
  169. package/dist/cabinet/run-layout.d.ts.map +1 -1
  170. package/dist/cabinet/run-layout.js +430 -37
  171. package/dist/cabinet/run-ops.d.ts +204 -12
  172. package/dist/cabinet/run-ops.d.ts.map +1 -1
  173. package/dist/cabinet/run-ops.js +523 -36
  174. package/dist/cabinet/run-panel.d.ts +6 -2
  175. package/dist/cabinet/run-panel.d.ts.map +1 -1
  176. package/dist/cabinet/run-panel.js +294 -108
  177. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  178. package/dist/cabinet/stack-transitions.js +35 -24
  179. package/dist/cabinet/stack.d.ts +169 -1
  180. package/dist/cabinet/stack.d.ts.map +1 -1
  181. package/dist/cabinet/stack.js +57 -18
  182. package/dist/cabinet/surfaces.d.ts +4 -0
  183. package/dist/cabinet/surfaces.d.ts.map +1 -0
  184. package/dist/cabinet/surfaces.js +101 -0
  185. package/dist/cabinet/tool.d.ts.map +1 -1
  186. package/dist/cabinet/tool.js +615 -91
  187. package/dist/cabinet/tree-structure.d.ts.map +1 -1
  188. package/dist/cabinet/tree-structure.js +10 -9
  189. package/dist/cabinet/validation.d.ts +27 -0
  190. package/dist/cabinet/validation.d.ts.map +1 -0
  191. package/dist/cabinet/validation.js +56 -0
  192. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  193. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  194. package/dist/cabinet/wall-height-presets.js +15 -0
  195. package/dist/cabinet/wall-snap.d.ts +27 -3
  196. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  197. package/dist/cabinet/wall-snap.js +278 -62
  198. package/dist/cabinet/widths.d.ts +10 -0
  199. package/dist/cabinet/widths.d.ts.map +1 -0
  200. package/dist/cabinet/widths.js +13 -0
  201. package/dist/ceiling/definition.d.ts.map +1 -1
  202. package/dist/ceiling/definition.js +8 -2
  203. package/dist/ceiling/floorplan-affordances.d.ts +12 -12
  204. package/dist/ceiling/materials.d.ts.map +1 -1
  205. package/dist/ceiling/materials.js +0 -1
  206. package/dist/ceiling/panel.js +1 -1
  207. package/dist/ceiling/parametrics.js +1 -1
  208. package/dist/chimney/definition.js +1 -1
  209. package/dist/chimney/panel.js +9 -9
  210. package/dist/chimney/parametrics.js +3 -3
  211. package/dist/column/definition.d.ts.map +1 -1
  212. package/dist/column/definition.js +22 -4
  213. package/dist/column/panel.d.ts.map +1 -1
  214. package/dist/column/panel.js +37 -7
  215. package/dist/column/parametrics.d.ts.map +1 -1
  216. package/dist/column/parametrics.js +5 -3
  217. package/dist/column/tool.d.ts.map +1 -1
  218. package/dist/column/tool.js +50 -14
  219. package/dist/cupola/definition.d.ts.map +1 -1
  220. package/dist/cupola/definition.js +15 -6
  221. package/dist/cupola/geometry.d.ts +6 -0
  222. package/dist/cupola/geometry.d.ts.map +1 -1
  223. package/dist/cupola/geometry.js +60 -13
  224. package/dist/cupola/paint.d.ts +4 -0
  225. package/dist/cupola/paint.d.ts.map +1 -0
  226. package/dist/cupola/paint.js +39 -0
  227. package/dist/cupola/panel.js +1 -1
  228. package/dist/cupola/parametrics.js +3 -3
  229. package/dist/cupola/renderer.d.ts.map +1 -1
  230. package/dist/cupola/renderer.js +27 -8
  231. package/dist/door/floorplan-move.d.ts.map +1 -1
  232. package/dist/door/floorplan-move.js +1 -1
  233. package/dist/door/move-tool.d.ts.map +1 -1
  234. package/dist/door/move-tool.js +86 -32
  235. package/dist/door/panel.d.ts.map +1 -1
  236. package/dist/door/panel.js +12 -12
  237. package/dist/door/parametrics.js +2 -2
  238. package/dist/door/tool.d.ts.map +1 -1
  239. package/dist/door/tool.js +16 -4
  240. package/dist/dormer/csg-geometry.d.ts +6 -42
  241. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  242. package/dist/dormer/csg-geometry.js +38 -209
  243. package/dist/dormer/definition.d.ts +4 -12
  244. package/dist/dormer/definition.d.ts.map +1 -1
  245. package/dist/dormer/definition.js +18 -193
  246. package/dist/dormer/floorplan.d.ts +3 -3
  247. package/dist/dormer/floorplan.d.ts.map +1 -1
  248. package/dist/dormer/floorplan.js +6 -17
  249. package/dist/dormer/geometry.d.ts +5 -24
  250. package/dist/dormer/geometry.d.ts.map +1 -1
  251. package/dist/dormer/geometry.js +64 -41
  252. package/dist/dormer/index.d.ts +1 -1
  253. package/dist/dormer/index.d.ts.map +1 -1
  254. package/dist/dormer/index.js +1 -1
  255. package/dist/dormer/move-tool.d.ts.map +1 -1
  256. package/dist/dormer/move-tool.js +31 -3
  257. package/dist/dormer/panel-position-section.js +2 -2
  258. package/dist/dormer/panel-windows-section.d.ts +9 -0
  259. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  260. package/dist/dormer/panel-windows-section.js +7 -0
  261. package/dist/dormer/panel.d.ts.map +1 -1
  262. package/dist/dormer/panel.js +100 -18
  263. package/dist/dormer/parametrics.d.ts.map +1 -1
  264. package/dist/dormer/parametrics.js +8 -77
  265. package/dist/dormer/preview.d.ts.map +1 -1
  266. package/dist/dormer/preview.js +9 -1
  267. package/dist/dormer/renderer.d.ts.map +1 -1
  268. package/dist/dormer/renderer.js +24 -26
  269. package/dist/dormer/tool.d.ts.map +1 -1
  270. package/dist/dormer/tool.js +3 -1
  271. package/dist/dormer/window-layout.d.ts +15 -0
  272. package/dist/dormer/window-layout.d.ts.map +1 -0
  273. package/dist/dormer/window-layout.js +59 -0
  274. package/dist/downspout/definition.d.ts.map +1 -1
  275. package/dist/downspout/definition.js +17 -4
  276. package/dist/downspout/geometry.d.ts.map +1 -1
  277. package/dist/downspout/geometry.js +10 -0
  278. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  279. package/dist/downspout/inspector-editors.js +9 -1
  280. package/dist/downspout/parametrics.d.ts.map +1 -1
  281. package/dist/downspout/parametrics.js +2 -1
  282. package/dist/downspout/renderer.d.ts.map +1 -1
  283. package/dist/downspout/renderer.js +19 -3
  284. package/dist/downspout/system.d.ts +7 -0
  285. package/dist/downspout/system.d.ts.map +1 -0
  286. package/dist/downspout/system.js +114 -0
  287. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  288. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  289. package/dist/duct-fitting/accessory-geometry.js +47 -0
  290. package/dist/duct-fitting/definition.d.ts.map +1 -1
  291. package/dist/duct-fitting/definition.js +11 -1
  292. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  293. package/dist/duct-fitting/floorplan.js +8 -0
  294. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  295. package/dist/duct-fitting/geometry.js +52 -38
  296. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  297. package/dist/duct-fitting/parametrics.js +78 -15
  298. package/dist/duct-fitting/ports.d.ts +1 -0
  299. package/dist/duct-fitting/ports.d.ts.map +1 -1
  300. package/dist/duct-fitting/ports.js +46 -0
  301. package/dist/duct-fitting/tool.d.ts +19 -0
  302. package/dist/duct-fitting/tool.d.ts.map +1 -1
  303. package/dist/duct-fitting/tool.js +126 -34
  304. package/dist/duct-segment/continuation.d.ts +21 -0
  305. package/dist/duct-segment/continuation.d.ts.map +1 -0
  306. package/dist/duct-segment/continuation.js +167 -0
  307. package/dist/duct-segment/definition.d.ts.map +1 -1
  308. package/dist/duct-segment/definition.js +19 -18
  309. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  310. package/dist/duct-segment/floorplan.js +43 -0
  311. package/dist/duct-segment/geometry.d.ts.map +1 -1
  312. package/dist/duct-segment/geometry.js +3 -0
  313. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  314. package/dist/duct-segment/move-tool.js +33 -6
  315. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  316. package/dist/duct-segment/parametrics.js +49 -1
  317. package/dist/duct-segment/selection.d.ts +3 -4
  318. package/dist/duct-segment/selection.d.ts.map +1 -1
  319. package/dist/duct-segment/selection.js +186 -158
  320. package/dist/duct-segment/tool.d.ts +38 -0
  321. package/dist/duct-segment/tool.d.ts.map +1 -1
  322. package/dist/duct-segment/tool.js +306 -677
  323. package/dist/duct-terminal/parametrics.js +2 -2
  324. package/dist/duct-terminal/tool.d.ts.map +1 -1
  325. package/dist/duct-terminal/tool.js +37 -7
  326. package/dist/elevator/panel.d.ts.map +1 -1
  327. package/dist/elevator/panel.js +7 -7
  328. package/dist/elevator/system.d.ts.map +1 -1
  329. package/dist/elevator/system.js +10 -1
  330. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  331. package/dist/eyebrow-vent/definition.js +8 -5
  332. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  333. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  334. package/dist/eyebrow-vent/geometry.js +60 -15
  335. package/dist/eyebrow-vent/paint.d.ts +4 -0
  336. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  337. package/dist/eyebrow-vent/paint.js +33 -0
  338. package/dist/eyebrow-vent/panel.js +1 -1
  339. package/dist/eyebrow-vent/parametrics.js +3 -3
  340. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  341. package/dist/eyebrow-vent/renderer.js +27 -8
  342. package/dist/fence/definition.d.ts.map +1 -1
  343. package/dist/fence/definition.js +2 -1
  344. package/dist/fence/floorplan-affordances.d.ts +1 -0
  345. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  346. package/dist/fence/floorplan-affordances.js +30 -1
  347. package/dist/fence/floorplan.d.ts.map +1 -1
  348. package/dist/fence/floorplan.js +14 -0
  349. package/dist/fence/inspector-editors.js +1 -1
  350. package/dist/fence/parametrics.js +3 -3
  351. package/dist/fence/tool.d.ts.map +1 -1
  352. package/dist/fence/tool.js +47 -20
  353. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  354. package/dist/gutter/corner-mitre.js +47 -7
  355. package/dist/gutter/definition.d.ts.map +1 -1
  356. package/dist/gutter/definition.js +23 -13
  357. package/dist/gutter/eave-align.d.ts.map +1 -1
  358. package/dist/gutter/eave-align.js +10 -0
  359. package/dist/gutter/eave-snap.d.ts +1 -1
  360. package/dist/gutter/eave-snap.d.ts.map +1 -1
  361. package/dist/gutter/eave-snap.js +10 -23
  362. package/dist/gutter/geometry.d.ts.map +1 -1
  363. package/dist/gutter/geometry.js +126 -8
  364. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  365. package/dist/gutter/outlet-lookup.js +22 -1
  366. package/dist/gutter/paint.d.ts +3 -0
  367. package/dist/gutter/paint.d.ts.map +1 -0
  368. package/dist/gutter/paint.js +6 -0
  369. package/dist/gutter/parametrics.d.ts.map +1 -1
  370. package/dist/gutter/parametrics.js +4 -1
  371. package/dist/gutter/renderer.d.ts.map +1 -1
  372. package/dist/gutter/renderer.js +63 -7
  373. package/dist/gutter/trim-clip.d.ts +3 -0
  374. package/dist/gutter/trim-clip.d.ts.map +1 -0
  375. package/dist/gutter/trim-clip.js +5 -0
  376. package/dist/hvac-equipment/parametrics.js +3 -3
  377. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  378. package/dist/hvac-equipment/tool.js +12 -2
  379. package/dist/imported-mesh/definition.d.ts +5 -0
  380. package/dist/imported-mesh/definition.d.ts.map +1 -0
  381. package/dist/imported-mesh/definition.js +38 -0
  382. package/dist/imported-mesh/floorplan.d.ts +4 -0
  383. package/dist/imported-mesh/floorplan.d.ts.map +1 -0
  384. package/dist/imported-mesh/floorplan.js +34 -0
  385. package/dist/imported-mesh/geometry.d.ts +5 -0
  386. package/dist/imported-mesh/geometry.d.ts.map +1 -0
  387. package/dist/imported-mesh/geometry.js +34 -0
  388. package/dist/imported-mesh/index.d.ts +4 -0
  389. package/dist/imported-mesh/index.d.ts.map +1 -0
  390. package/dist/imported-mesh/index.js +3 -0
  391. package/dist/imported-mesh/schema.d.ts +2 -0
  392. package/dist/imported-mesh/schema.d.ts.map +1 -0
  393. package/dist/imported-mesh/schema.js +1 -0
  394. package/dist/index.d.ts +7 -2
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +17 -2
  397. package/dist/item/definition.d.ts.map +1 -1
  398. package/dist/item/definition.js +10 -2
  399. package/dist/item/floorplan-move.d.ts +9 -1
  400. package/dist/item/floorplan-move.d.ts.map +1 -1
  401. package/dist/item/floorplan-move.js +74 -2
  402. package/dist/item/floorplan.d.ts.map +1 -1
  403. package/dist/item/floorplan.js +33 -1
  404. package/dist/item/move-tool.d.ts +28 -1
  405. package/dist/item/move-tool.d.ts.map +1 -1
  406. package/dist/item/move-tool.js +15 -3
  407. package/dist/item/panel.js +1 -1
  408. package/dist/item/renderer.d.ts.map +1 -1
  409. package/dist/item/renderer.js +16 -6
  410. package/dist/item/system.d.ts +5 -0
  411. package/dist/item/system.d.ts.map +1 -1
  412. package/dist/item/system.js +7 -1
  413. package/dist/lean-to-extension/arc.d.ts +14 -0
  414. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  415. package/dist/lean-to-extension/arc.js +56 -0
  416. package/dist/lean-to-extension/assembly.d.ts +61 -0
  417. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  418. package/dist/lean-to-extension/assembly.js +761 -0
  419. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  420. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  421. package/dist/lean-to-extension/canopy-joint.js +234 -0
  422. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  423. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  424. package/dist/lean-to-extension/conical-host.js +113 -0
  425. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  426. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  427. package/dist/lean-to-extension/corner-joint.js +1202 -0
  428. package/dist/lean-to-extension/definition.d.ts +4 -0
  429. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  430. package/dist/lean-to-extension/definition.js +433 -0
  431. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  432. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  433. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  434. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  435. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  436. package/dist/lean-to-extension/floorplan-move.js +157 -0
  437. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  438. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  439. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  440. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  441. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  442. package/dist/lean-to-extension/floorplan.js +373 -0
  443. package/dist/lean-to-extension/geometry.d.ts +7 -0
  444. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  445. package/dist/lean-to-extension/geometry.js +662 -0
  446. package/dist/lean-to-extension/index.d.ts +8 -0
  447. package/dist/lean-to-extension/index.d.ts.map +1 -0
  448. package/dist/lean-to-extension/index.js +7 -0
  449. package/dist/lean-to-extension/layout.d.ts +108 -0
  450. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  451. package/dist/lean-to-extension/layout.js +477 -0
  452. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  453. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  454. package/dist/lean-to-extension/managed-preview.js +93 -0
  455. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  456. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  457. package/dist/lean-to-extension/move-tool.js +202 -0
  458. package/dist/lean-to-extension/paint.d.ts +2 -0
  459. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  460. package/dist/lean-to-extension/paint.js +16 -0
  461. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  462. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  463. package/dist/lean-to-extension/parametrics.js +570 -0
  464. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  465. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  466. package/dist/lean-to-extension/placement-scope.js +4 -0
  467. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  468. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  469. package/dist/lean-to-extension/placement-validation.js +324 -0
  470. package/dist/lean-to-extension/placement.d.ts +59 -0
  471. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  472. package/dist/lean-to-extension/placement.js +331 -0
  473. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  474. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  475. package/dist/lean-to-extension/plan-footprint.js +27 -0
  476. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  477. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  478. package/dist/lean-to-extension/preview-geometry.js +40 -0
  479. package/dist/lean-to-extension/preview.d.ts +7 -0
  480. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  481. package/dist/lean-to-extension/preview.js +20 -0
  482. package/dist/lean-to-extension/renderer.d.ts +6 -0
  483. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  484. package/dist/lean-to-extension/renderer.js +34 -0
  485. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  486. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  487. package/dist/lean-to-extension/roof-attachment.js +376 -0
  488. package/dist/lean-to-extension/schema.d.ts +2 -0
  489. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  490. package/dist/lean-to-extension/schema.js +1 -0
  491. package/dist/lean-to-extension/slots.d.ts +5 -0
  492. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  493. package/dist/lean-to-extension/slots.js +15 -0
  494. package/dist/lean-to-extension/system.d.ts +7 -0
  495. package/dist/lean-to-extension/system.d.ts.map +1 -0
  496. package/dist/lean-to-extension/system.js +726 -0
  497. package/dist/lean-to-extension/tool.d.ts +3 -0
  498. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  499. package/dist/lean-to-extension/tool.js +580 -0
  500. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  501. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  502. package/dist/lean-to-extension/wall-target.js +29 -0
  503. package/dist/lineset/definition.d.ts.map +1 -1
  504. package/dist/lineset/definition.js +1 -0
  505. package/dist/liquid-line/definition.d.ts.map +1 -1
  506. package/dist/liquid-line/definition.js +1 -0
  507. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  508. package/dist/pipe-fitting/definition.js +16 -2
  509. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  510. package/dist/pipe-fitting/floorplan.js +4 -0
  511. package/dist/pipe-fitting/geometry.d.ts +3 -5
  512. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  513. package/dist/pipe-fitting/geometry.js +154 -21
  514. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  515. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  516. package/dist/pipe-fitting/inline-insertion.js +96 -0
  517. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  518. package/dist/pipe-fitting/parametrics.js +17 -3
  519. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  520. package/dist/pipe-fitting/ports.js +8 -1
  521. package/dist/pipe-fitting/tool.d.ts +26 -0
  522. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  523. package/dist/pipe-fitting/tool.js +182 -37
  524. package/dist/pipe-segment/continuation.d.ts +22 -0
  525. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  526. package/dist/pipe-segment/continuation.js +146 -0
  527. package/dist/pipe-segment/definition.d.ts.map +1 -1
  528. package/dist/pipe-segment/definition.js +23 -7
  529. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  530. package/dist/pipe-segment/floorplan.js +42 -0
  531. package/dist/pipe-segment/geometry.d.ts +2 -1
  532. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  533. package/dist/pipe-segment/geometry.js +4 -1
  534. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  535. package/dist/pipe-segment/move-tool.js +25 -5
  536. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  537. package/dist/pipe-segment/parametrics.js +49 -0
  538. package/dist/pipe-segment/selection.d.ts +3 -4
  539. package/dist/pipe-segment/selection.d.ts.map +1 -1
  540. package/dist/pipe-segment/selection.js +169 -105
  541. package/dist/pipe-segment/slope.d.ts +5 -0
  542. package/dist/pipe-segment/slope.d.ts.map +1 -0
  543. package/dist/pipe-segment/slope.js +10 -0
  544. package/dist/pipe-segment/tool.d.ts.map +1 -1
  545. package/dist/pipe-segment/tool.js +325 -545
  546. package/dist/pipe-trap/tool.d.ts.map +1 -1
  547. package/dist/pipe-trap/tool.js +15 -2
  548. package/dist/procedural-item/definition.d.ts +4 -0
  549. package/dist/procedural-item/definition.d.ts.map +1 -0
  550. package/dist/procedural-item/definition.js +254 -0
  551. package/dist/procedural-item/geometry.d.ts +31 -0
  552. package/dist/procedural-item/geometry.d.ts.map +1 -0
  553. package/dist/procedural-item/geometry.js +88 -0
  554. package/dist/procedural-item/index.d.ts +3 -0
  555. package/dist/procedural-item/index.d.ts.map +1 -0
  556. package/dist/procedural-item/index.js +2 -0
  557. package/dist/procedural-item/move-session.d.ts +15 -0
  558. package/dist/procedural-item/move-session.d.ts.map +1 -0
  559. package/dist/procedural-item/move-session.js +197 -0
  560. package/dist/procedural-item/move-tool.d.ts +5 -0
  561. package/dist/procedural-item/move-tool.d.ts.map +1 -0
  562. package/dist/procedural-item/move-tool.js +193 -0
  563. package/dist/procedural-item/renderer.d.ts +5 -0
  564. package/dist/procedural-item/renderer.d.ts.map +1 -0
  565. package/dist/procedural-item/renderer.js +66 -0
  566. package/dist/ridge-vent/definition.js +1 -1
  567. package/dist/ridge-vent/panel.d.ts.map +1 -1
  568. package/dist/ridge-vent/panel.js +4 -4
  569. package/dist/ridge-vent/parametrics.js +1 -1
  570. package/dist/roof/conical-roof-placement.d.ts +36 -0
  571. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  572. package/dist/roof/conical-roof-placement.js +134 -0
  573. package/dist/roof/conical-roof.d.ts +3 -0
  574. package/dist/roof/conical-roof.d.ts.map +1 -0
  575. package/dist/roof/conical-roof.js +53 -0
  576. package/dist/roof/definition.d.ts +3 -10
  577. package/dist/roof/definition.d.ts.map +1 -1
  578. package/dist/roof/definition.js +83 -13
  579. package/dist/roof/floorplan.d.ts +3 -10
  580. package/dist/roof/floorplan.d.ts.map +1 -1
  581. package/dist/roof/floorplan.js +139 -165
  582. package/dist/roof/index.d.ts +1 -0
  583. package/dist/roof/index.d.ts.map +1 -1
  584. package/dist/roof/index.js +1 -0
  585. package/dist/roof/panel.d.ts.map +1 -1
  586. package/dist/roof/panel.js +26 -25
  587. package/dist/roof/renderer.d.ts.map +1 -1
  588. package/dist/roof/roof-footprint-source.d.ts +16 -0
  589. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  590. package/dist/roof/roof-footprint-source.js +14 -0
  591. package/dist/roof/roof-footprint.d.ts +25 -0
  592. package/dist/roof/roof-footprint.d.ts.map +1 -0
  593. package/dist/roof/roof-footprint.js +94 -0
  594. package/dist/roof/roof-placement-mode.d.ts +18 -0
  595. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  596. package/dist/roof/roof-placement-mode.js +24 -0
  597. package/dist/roof/tool.d.ts +10 -0
  598. package/dist/roof/tool.d.ts.map +1 -0
  599. package/dist/roof/tool.js +922 -0
  600. package/dist/roof-segment/definition.d.ts.map +1 -1
  601. package/dist/roof-segment/definition.js +52 -8
  602. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  603. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  604. package/dist/roof-segment/floorplan-affordances.js +64 -18
  605. package/dist/roof-segment/floorplan.d.ts +3 -2
  606. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  607. package/dist/roof-segment/floorplan.js +95 -46
  608. package/dist/roof-segment/panel.d.ts.map +1 -1
  609. package/dist/roof-segment/panel.js +122 -27
  610. package/dist/scan/definition.d.ts +2 -3
  611. package/dist/scan/definition.d.ts.map +1 -1
  612. package/dist/scan/definition.js +9 -7
  613. package/dist/scan/parametrics.d.ts.map +1 -1
  614. package/dist/scan/parametrics.js +13 -1
  615. package/dist/scan/renderer.d.ts.map +1 -1
  616. package/dist/scan/renderer.js +8 -2
  617. package/dist/shared/accessory-cursor.d.ts +7 -0
  618. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  619. package/dist/shared/accessory-cursor.js +83 -0
  620. package/dist/shared/accessory-floorplan.d.ts +4 -0
  621. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  622. package/dist/shared/accessory-floorplan.js +51 -0
  623. package/dist/shared/accessory-geometry.d.ts +7 -0
  624. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  625. package/dist/shared/accessory-geometry.js +79 -0
  626. package/dist/shared/accessory-placement.d.ts +10 -0
  627. package/dist/shared/accessory-placement.d.ts.map +1 -0
  628. package/dist/shared/accessory-placement.js +126 -0
  629. package/dist/shared/accessory-snapping.d.ts +5 -0
  630. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  631. package/dist/shared/accessory-snapping.js +40 -0
  632. package/dist/shared/automatic-run-end-cap.d.ts +12 -0
  633. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  634. package/dist/shared/automatic-run-end-cap.js +169 -0
  635. package/dist/shared/block-face-host.d.ts +15 -0
  636. package/dist/shared/block-face-host.d.ts.map +1 -0
  637. package/dist/shared/block-face-host.js +36 -0
  638. package/dist/shared/connection-compatibility.d.ts +8 -0
  639. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  640. package/dist/shared/connection-compatibility.js +28 -0
  641. package/dist/shared/connection-feedback.d.ts +10 -0
  642. package/dist/shared/connection-feedback.d.ts.map +1 -0
  643. package/dist/shared/connection-feedback.js +17 -0
  644. package/dist/shared/distribution-run-contract.d.ts +49 -0
  645. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  646. package/dist/shared/distribution-run-contract.js +30 -0
  647. package/dist/shared/distribution-run-tool.d.ts +117 -0
  648. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  649. package/dist/shared/distribution-run-tool.js +986 -0
  650. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  651. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  652. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  653. package/dist/shared/duct-adapter.d.ts +10 -0
  654. package/dist/shared/duct-adapter.d.ts.map +1 -0
  655. package/dist/shared/duct-adapter.js +43 -0
  656. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  657. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  658. package/dist/shared/elbow-branch-continuation.js +200 -0
  659. package/dist/shared/fitting-clearance.d.ts +5 -0
  660. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  661. package/dist/shared/fitting-clearance.js +11 -0
  662. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  663. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  664. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  665. package/dist/shared/fitting-surface-support.d.ts +5 -0
  666. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  667. package/dist/shared/fitting-surface-support.js +42 -0
  668. package/dist/shared/fitting-tool-options.d.ts +4 -0
  669. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  670. package/dist/shared/fitting-tool-options.js +175 -0
  671. package/dist/shared/floor-placement.d.ts +1 -1
  672. package/dist/shared/floor-placement.d.ts.map +1 -1
  673. package/dist/shared/floor-placement.js +13 -33
  674. package/dist/shared/ghost-materials.d.ts.map +1 -1
  675. package/dist/shared/ghost-materials.js +2 -1
  676. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  677. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  678. package/dist/shared/lean-to-post-omissions.js +51 -0
  679. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  680. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  681. package/dist/shared/mep-fitting-actions.js +16 -0
  682. package/dist/shared/mep-presets.d.ts +11 -0
  683. package/dist/shared/mep-presets.d.ts.map +1 -0
  684. package/dist/shared/mep-presets.js +34 -0
  685. package/dist/shared/node-batch/candidates.d.ts +29 -0
  686. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  687. package/dist/shared/node-batch/candidates.js +260 -0
  688. package/dist/shared/node-batch/store.d.ts +26 -0
  689. package/dist/shared/node-batch/store.d.ts.map +1 -0
  690. package/dist/shared/node-batch/store.js +319 -0
  691. package/dist/shared/node-batch/system.d.ts +8 -0
  692. package/dist/shared/node-batch/system.d.ts.map +1 -0
  693. package/dist/shared/node-batch/system.js +569 -0
  694. package/dist/shared/node-batch/types.d.ts +99 -0
  695. package/dist/shared/node-batch/types.d.ts.map +1 -0
  696. package/dist/shared/node-batch/types.js +4 -0
  697. package/dist/shared/opening-move-history.d.ts +47 -0
  698. package/dist/shared/opening-move-history.d.ts.map +1 -0
  699. package/dist/shared/opening-move-history.js +18 -0
  700. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  701. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  702. package/dist/shared/opening-move-wall-gate.js +44 -0
  703. package/dist/shared/panel-fields.d.ts +15 -0
  704. package/dist/shared/panel-fields.d.ts.map +1 -0
  705. package/dist/shared/panel-fields.js +31 -0
  706. package/dist/shared/path-point-affordance.d.ts +2 -2
  707. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  708. package/dist/shared/path-point-affordance.js +30 -6
  709. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  710. package/dist/shared/placeholder-geometry.js +4 -0
  711. package/dist/shared/ports.d.ts +20 -3
  712. package/dist/shared/ports.d.ts.map +1 -1
  713. package/dist/shared/ports.js +148 -7
  714. package/dist/shared/primitive-uv.d.ts +17 -0
  715. package/dist/shared/primitive-uv.d.ts.map +1 -0
  716. package/dist/shared/primitive-uv.js +107 -0
  717. package/dist/shared/reducer-size.d.ts +2 -0
  718. package/dist/shared/reducer-size.d.ts.map +1 -0
  719. package/dist/shared/reducer-size.js +12 -0
  720. package/dist/shared/resting-surface-plan.d.ts +3 -0
  721. package/dist/shared/resting-surface-plan.d.ts.map +1 -0
  722. package/dist/shared/resting-surface-plan.js +28 -0
  723. package/dist/shared/ridge-snap.js +1 -1
  724. package/dist/shared/roof-surface.d.ts.map +1 -1
  725. package/dist/shared/roof-surface.js +17 -2
  726. package/dist/shared/run-cursor.d.ts +22 -0
  727. package/dist/shared/run-cursor.d.ts.map +1 -0
  728. package/dist/shared/run-cursor.js +19 -0
  729. package/dist/shared/run-direction-feedback.d.ts +20 -0
  730. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  731. package/dist/shared/run-direction-feedback.js +139 -0
  732. package/dist/shared/run-hanger-controls.d.ts +7 -0
  733. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  734. package/dist/shared/run-hanger-controls.js +44 -0
  735. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  736. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  737. package/dist/shared/run-hanger-inspector.js +43 -0
  738. package/dist/shared/run-hanger-mode.d.ts +11 -0
  739. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  740. package/dist/shared/run-hanger-mode.js +32 -0
  741. package/dist/shared/run-hanger-system.d.ts +3 -0
  742. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  743. package/dist/shared/run-hanger-system.js +39 -0
  744. package/dist/shared/run-hangers.d.ts +25 -0
  745. package/dist/shared/run-hangers.d.ts.map +1 -0
  746. package/dist/shared/run-hangers.js +261 -0
  747. package/dist/shared/run-port-snap.d.ts +11 -0
  748. package/dist/shared/run-port-snap.d.ts.map +1 -0
  749. package/dist/shared/run-port-snap.js +19 -0
  750. package/dist/shared/run-screen-direction.d.ts +5 -0
  751. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  752. package/dist/shared/run-screen-direction.js +24 -0
  753. package/dist/shared/selection-handles.d.ts +4 -0
  754. package/dist/shared/selection-handles.d.ts.map +1 -1
  755. package/dist/shared/selection-handles.js +10 -0
  756. package/dist/shared/slot-paint.d.ts +8 -1
  757. package/dist/shared/slot-paint.d.ts.map +1 -1
  758. package/dist/shared/slot-paint.js +120 -27
  759. package/dist/shared/surface-paint.d.ts +1 -2
  760. package/dist/shared/surface-paint.d.ts.map +1 -1
  761. package/dist/shared/surface-paint.js +9 -20
  762. package/dist/shared/system-check-panel.d.ts +6 -0
  763. package/dist/shared/system-check-panel.d.ts.map +1 -0
  764. package/dist/shared/system-check-panel.js +62 -0
  765. package/dist/shared/system-checks.d.ts +9 -0
  766. package/dist/shared/system-checks.d.ts.map +1 -0
  767. package/dist/shared/system-checks.js +131 -0
  768. package/dist/shared/wall-attach-target.d.ts +14 -2
  769. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  770. package/dist/shared/wall-attach-target.js +108 -4
  771. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  772. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  773. package/dist/shared/wall-opening-clearance.js +28 -0
  774. package/dist/shared/wall-run-move.d.ts +17 -0
  775. package/dist/shared/wall-run-move.d.ts.map +1 -0
  776. package/dist/shared/wall-run-move.js +56 -0
  777. package/dist/shelf/definition.d.ts.map +1 -1
  778. package/dist/shelf/definition.js +2 -1
  779. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  780. package/dist/shelf/floorplan-affordances.js +5 -3
  781. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  782. package/dist/shelf/floorplan-move.js +3 -2
  783. package/dist/shelf/geometry.d.ts.map +1 -1
  784. package/dist/shelf/geometry.js +2 -10
  785. package/dist/shelf/parametrics.js +4 -4
  786. package/dist/site/renderer.d.ts.map +1 -1
  787. package/dist/site/renderer.js +40 -28
  788. package/dist/site/terrain-geometry.d.ts +1 -1
  789. package/dist/site/terrain-geometry.d.ts.map +1 -1
  790. package/dist/site/terrain-geometry.js +35 -9
  791. package/dist/site/terrain-mesh.d.ts +5 -0
  792. package/dist/site/terrain-mesh.d.ts.map +1 -1
  793. package/dist/site/terrain-mesh.js +63 -34
  794. package/dist/skylight/definition.js +1 -1
  795. package/dist/skylight/panel.js +6 -6
  796. package/dist/skylight/parametrics.js +2 -2
  797. package/dist/slab/definition.d.ts.map +1 -1
  798. package/dist/slab/definition.js +6 -1
  799. package/dist/slab/dependency-tracker.d.ts +3 -0
  800. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  801. package/dist/slab/dependency-tracker.js +104 -0
  802. package/dist/slab/floorplan-affordances.d.ts +8 -8
  803. package/dist/slab/geometry.d.ts.map +1 -1
  804. package/dist/slab/geometry.js +16 -2
  805. package/dist/slab/panel.js +1 -1
  806. package/dist/slab/parametrics.js +1 -1
  807. package/dist/slab/system.d.ts.map +1 -1
  808. package/dist/slab/system.js +8 -64
  809. package/dist/solar-panel/definition.js +1 -1
  810. package/dist/solar-panel/panel.js +2 -2
  811. package/dist/solar-panel/parametrics.js +2 -2
  812. package/dist/spawn/panel.js +1 -1
  813. package/dist/stair/panel.d.ts.map +1 -1
  814. package/dist/stair/panel.js +23 -16
  815. package/dist/stair/stair-type.d.ts +18 -0
  816. package/dist/stair/stair-type.d.ts.map +1 -0
  817. package/dist/stair/stair-type.js +25 -0
  818. package/dist/stair-segment/panel.d.ts.map +1 -1
  819. package/dist/stair-segment/panel.js +45 -6
  820. package/dist/turbine-vent/definition.d.ts.map +1 -1
  821. package/dist/turbine-vent/definition.js +8 -5
  822. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  823. package/dist/turbine-vent/geometry.js +48 -18
  824. package/dist/turbine-vent/paint.d.ts +4 -0
  825. package/dist/turbine-vent/paint.d.ts.map +1 -0
  826. package/dist/turbine-vent/paint.js +35 -0
  827. package/dist/turbine-vent/panel.js +1 -1
  828. package/dist/turbine-vent/parametrics.js +2 -2
  829. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  830. package/dist/turbine-vent/renderer.js +31 -9
  831. package/dist/unit/definition.d.ts +10 -0
  832. package/dist/unit/definition.d.ts.map +1 -0
  833. package/dist/unit/definition.js +38 -0
  834. package/dist/unit/index.d.ts +2 -0
  835. package/dist/unit/index.d.ts.map +1 -0
  836. package/dist/unit/index.js +1 -0
  837. package/dist/unit/parametrics.d.ts +3 -0
  838. package/dist/unit/parametrics.d.ts.map +1 -0
  839. package/dist/unit/parametrics.js +4 -0
  840. package/dist/unit/schema.d.ts +2 -0
  841. package/dist/unit/schema.d.ts.map +1 -0
  842. package/dist/unit/schema.js +1 -0
  843. package/dist/unit/unit-panel.d.ts +5 -0
  844. package/dist/unit/unit-panel.d.ts.map +1 -0
  845. package/dist/unit/unit-panel.js +61 -0
  846. package/dist/wall/curve-eligibility.d.ts +3 -0
  847. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  848. package/dist/wall/curve-eligibility.js +10 -0
  849. package/dist/wall/curve-tool.d.ts.map +1 -1
  850. package/dist/wall/curve-tool.js +8 -11
  851. package/dist/wall/definition.d.ts +1 -1
  852. package/dist/wall/definition.d.ts.map +1 -1
  853. package/dist/wall/definition.js +36 -13
  854. package/dist/wall/floorplan-affordances.d.ts +1 -0
  855. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  856. package/dist/wall/floorplan-affordances.js +46 -7
  857. package/dist/wall/floorplan-move.d.ts +3 -4
  858. package/dist/wall/floorplan-move.d.ts.map +1 -1
  859. package/dist/wall/floorplan-move.js +122 -9
  860. package/dist/wall/floorplan.d.ts.map +1 -1
  861. package/dist/wall/floorplan.js +19 -23
  862. package/dist/wall/move-shared.d.ts.map +1 -1
  863. package/dist/wall/move-shared.js +10 -7
  864. package/dist/wall/paint.d.ts.map +1 -1
  865. package/dist/wall/paint.js +2 -0
  866. package/dist/wall/panel.d.ts.map +1 -1
  867. package/dist/wall/panel.js +10 -17
  868. package/dist/wall/parametrics.js +2 -2
  869. package/dist/wall/pointer-transparency.d.ts +128 -0
  870. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  871. package/dist/wall/pointer-transparency.js +147 -0
  872. package/dist/wall/renderer.d.ts.map +1 -1
  873. package/dist/wall/renderer.js +65 -8
  874. package/dist/wall/selection-hit-owner.d.ts +53 -0
  875. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  876. package/dist/wall/selection-hit-owner.js +79 -0
  877. package/dist/wall/system.d.ts +2 -0
  878. package/dist/wall/system.d.ts.map +1 -1
  879. package/dist/wall/system.js +66 -25
  880. package/dist/wall/tool.d.ts.map +1 -1
  881. package/dist/wall/tool.js +5 -0
  882. package/dist/wall/treatment-level-data.d.ts +6 -1
  883. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  884. package/dist/wall/treatment-level-data.js +82 -5
  885. package/dist/wall/treatments.d.ts +1 -0
  886. package/dist/wall/treatments.d.ts.map +1 -1
  887. package/dist/wall/treatments.js +5 -0
  888. package/dist/wall/wall-batch-system.d.ts +38 -6
  889. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  890. package/dist/wall/wall-batch-system.js +122 -25
  891. package/dist/wall/wall-batch.js +2 -2
  892. package/dist/window/definition.d.ts +2 -1
  893. package/dist/window/definition.d.ts.map +1 -1
  894. package/dist/window/definition.js +51 -24
  895. package/dist/window/floorplan-move.d.ts.map +1 -1
  896. package/dist/window/floorplan-move.js +1 -1
  897. package/dist/window/move-tool.d.ts +7 -5
  898. package/dist/window/move-tool.d.ts.map +1 -1
  899. package/dist/window/move-tool.js +344 -58
  900. package/dist/window/panel.d.ts.map +1 -1
  901. package/dist/window/panel.js +8 -6
  902. package/dist/window/parametrics.js +2 -2
  903. package/dist/window/renderer.d.ts.map +1 -1
  904. package/dist/window/renderer.js +5 -7
  905. package/dist/window/tool.d.ts.map +1 -1
  906. package/dist/window/tool.js +227 -13
  907. package/dist/zone/definition.d.ts.map +1 -1
  908. package/dist/zone/definition.js +7 -1
  909. package/dist/zone/floorplan-affordances.d.ts +12 -12
  910. package/dist/zone/floorplan.d.ts +1 -3
  911. package/dist/zone/floorplan.d.ts.map +1 -1
  912. package/dist/zone/floorplan.js +43 -28
  913. package/dist/zone/quantities-panel.d.ts.map +1 -1
  914. package/dist/zone/quantities-panel.js +33 -29
  915. package/dist/zone/renderer.d.ts.map +1 -1
  916. package/dist/zone/renderer.js +20 -6
  917. package/dist/zone/unit-membership.d.ts +12 -0
  918. package/dist/zone/unit-membership.d.ts.map +1 -0
  919. package/dist/zone/unit-membership.js +22 -0
  920. package/package.json +16 -8
  921. package/dist/dormer/panel-window-section.d.ts +0 -14
  922. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  923. package/dist/dormer/panel-window-section.js +0 -59
  924. package/dist/dormer/window-assembly.d.ts +0 -22
  925. package/dist/dormer/window-assembly.d.ts.map +0 -1
  926. package/dist/dormer/window-assembly.js +0 -111
  927. package/dist/dormer/window-frame.d.ts +0 -24
  928. package/dist/dormer/window-frame.d.ts.map +0 -1
  929. package/dist/dormer/window-frame.js +0 -100
@@ -1,24 +1,30 @@
1
- import { findLevelAncestorId, selectionProxyIdFromMetadata } from '@pascal-app/core';
1
+ import { CABINET_METRIC_DEFAULTS, findLevelAncestorId, selectionProxyIdFromMetadata, } from '@pascal-app/core';
2
+ import { findWallOpeningConflicts } from '../shared/wall-opening-clearance';
2
3
  import { bakeCabinetAnimationClip } from './animation';
3
4
  import { buildCabinetFloorplan, buildCabinetModuleFloorplan } from './floorplan';
4
5
  import { cabinetModuleFloorplanMoveTarget } from './floorplan-move';
5
6
  import { cabinetFloorplanSiblingOverrides } from './floorplan-overrides';
6
7
  import { buildCabinetGeometry } from './geometry';
8
+ import { withCabinetHostedChildren } from './hosted-resize';
7
9
  import { toggleCabinetOperationState } from './interaction';
8
10
  import { cabinetModuleParentFrame } from './move-frame';
9
11
  import { cabinetPaint } from './paint';
12
+ import { cabinetModuleUsesFixedApplianceWidth } from './panel-visibility';
10
13
  import { cabinetModuleParametrics, cabinetParametrics } from './parametrics';
14
+ import { resolveCabinetGridPosition } from './placement-snap';
11
15
  import useCabinetPlacementType from './placement-type';
16
+ import { metadataForSelectedWidth, metadataWithPresetWidthDebt } from './preset-width-debt';
12
17
  import { cabinetQuickActions } from './quick-actions';
13
18
  import { cabinetConnectedDepthBounds, cabinetResizeUpperBound, MAX_CABINET_DEPTH, MAX_CABINET_WIDTH, MIN_CABINET_DEPTH, MIN_CABINET_WIDTH, } from './resize-limits';
14
- import { moduleSideOpen, sortRunModules } from './run-layout';
15
- import { backAlignedRunDepthOverrides, backAlignZ, buildWallCornerDepthIndex, bumpCabinetRunLayoutRevision, cabinetMetadataRecord, cabinetModulesForRun, totalCabinetHeight as cabinetTotalHeight, cornerSourceWidthOverridesForDerivedDepth, previewCornerRunsFromRunSources, resolveCabinetType, runModuleBaseY, syncCornerRunsFromRunSources, syncCornerRunsFromSourceModule, wallChildOf, wallCornerWidthOverridesForDepthTargets, } from './run-ops';
19
+ import { moduleSideOpen, reflowRunModules as reflowCabinetRunModules, runWallConstraints, sortRunModules, } from './run-layout';
20
+ import { backAlignedRunDepthOverrides, backAlignZ, buildWallCornerDepthIndex, bumpCabinetRunLayoutRevision, cabinetMetadataRecord, cabinetModulesForRun, cabinetModuleTotalHeight, totalCabinetHeight as cabinetTotalHeight, cornerSourceWidthOverridesForDerivedDepth, nestedCornerRunPositionOverrides, previewCornerRunsFromRunSources, resolveCabinetType, runModuleBaseY, syncCornerRunsFromRunSources, syncCornerRunsFromSourceModule, wallChildOf, wallCornerWidthOverridesForDepthTargets, } from './run-ops';
16
21
  import { cabinetSceneAction } from './scene-action';
17
22
  import { CabinetModuleNode, CabinetNode } from './schema';
18
23
  import { cabinetSlots } from './slots';
19
24
  import { backAnchoredModuleZ, isHoodCompartmentType, minCabinetCarcassHeightForStack, stackForCabinet, } from './stack';
25
+ import { cabinetSurfaceProvider } from './surfaces';
20
26
  import { cabinetFloorplanAffectedIds, cabinetTreeChildIds, cabinetTreeHidden, cabinetTreeLabel, } from './tree-structure';
21
- import { resolveCabinetModuleWallSnapLocal, resolveCabinetRunWallSnap } from './wall-snap';
27
+ import { findClosestCabinetWallInPlan, resolveCabinetModuleWallSnapLocal, resolveCabinetRunWallSnap, resolveCabinetWallFaceOffset, } from './wall-snap';
22
28
  function isCabinetDuplicableNode(node) {
23
29
  return ((node?.type === 'cabinet' || node?.type === 'cabinet-module') &&
24
30
  Array.isArray(node.position) &&
@@ -95,7 +101,7 @@ function appendCabinetFloorPlacedFootprints(run, nodes, parentPosition, parentRo
95
101
  ];
96
102
  footprints.push({
97
103
  position: modulePosition,
98
- dimensions: [module.width, cabinetTotalHeight(module), module.depth],
104
+ dimensions: [module.width, cabinetModuleTotalHeight(module), module.depth],
99
105
  rotation: [0, runRotation + module.rotation, 0],
100
106
  });
101
107
  }
@@ -128,6 +134,43 @@ export function cabinetFloorPlacedFootprints(node, nodes) {
128
134
  appendCabinetFloorPlacedFootprints(node, nodes, [0, 0, 0], 0, footprints);
129
135
  return footprints;
130
136
  }
137
+ function cabinetRunOverlapsWallOpening({ levelId, node, nodes, position, rotation, }) {
138
+ const parentLevelId = (levelId ??
139
+ findLevelAncestorId(node.id, nodes));
140
+ if (!parentLevelId)
141
+ return false;
142
+ const candidate = { ...node, position: [...position], rotation };
143
+ return cabinetFloorPlacedFootprints(candidate, nodes).some((footprint) => {
144
+ if (!footprint.position)
145
+ return false;
146
+ const hit = findClosestCabinetWallInPlan({
147
+ excludeIds: [],
148
+ nodes: nodes,
149
+ parentLevelId,
150
+ planPoint: [footprint.position[0], footprint.position[2]],
151
+ yaw: footprint.rotation[1],
152
+ });
153
+ if (!hit)
154
+ return false;
155
+ const normalScale = hit.side === 'front' ? 1 : -1;
156
+ const expectedPerp = resolveCabinetWallFaceOffset({
157
+ hit,
158
+ nodes: nodes,
159
+ parentLevelId,
160
+ }) +
161
+ normalScale * (footprint.dimensions[2] / 2);
162
+ if (Math.abs(hit.perpDistance - expectedPerp) > 0.12)
163
+ return false;
164
+ return (findWallOpeningConflicts({
165
+ bottom: footprint.position[1],
166
+ height: footprint.dimensions[1],
167
+ localX: hit.localX,
168
+ nodes,
169
+ wall: hit.wall,
170
+ width: footprint.dimensions[0],
171
+ }).length > 0);
172
+ });
173
+ }
131
174
  const SIDE_HANDLE_OFFSET = 0.18;
132
175
  const HEIGHT_HANDLE_OFFSET = 0.22;
133
176
  const ROTATE_CORNER_OFFSET = 0.32;
@@ -135,6 +178,7 @@ const ROTATE_RING_OFFSET = 0.04;
135
178
  const MIN_CABINET_CARCASS_HEIGHT = 0.4;
136
179
  const CABINET_ADJACENCY_EPSILON = 1e-4;
137
180
  const CABINET_DEPTH_SNAP_THRESHOLD = 0.02;
181
+ const CABINET_WIDTH_SNAP_THRESHOLD = 0.08;
138
182
  function isCabinetModule(node) {
139
183
  return node?.type === 'cabinet-module';
140
184
  }
@@ -146,18 +190,32 @@ function hasCabinetParentId(node) {
146
190
  return (typeof parentId === 'string' &&
147
191
  (parentId.startsWith('cabinet_') || parentId.startsWith('cabinet-module_')));
148
192
  }
149
- function resolveCabinetGroupMoveSnap({ candidatePosition, levelId, movingIds, node, nodes, }) {
193
+ function resolveCabinetGroupMoveSnap({ candidatePosition, candidateRotation, levelId, movingIds, node, nodes, }) {
150
194
  if (node.type !== 'cabinet' || !levelId)
151
195
  return null;
152
196
  return resolveCabinetRunWallSnap({
153
197
  cabinet: node,
154
198
  candidatePosition,
199
+ candidateRotation,
155
200
  excludeIds: movingIds,
156
201
  gridStep: 0,
157
202
  nodes: nodes,
158
203
  parentLevelId: levelId,
159
204
  });
160
205
  }
206
+ function resolveCabinetMoveGridSnap({ candidatePosition, candidateRotation, gridStep, node, nodes, }) {
207
+ if (!isCabinetRun(node))
208
+ return candidatePosition;
209
+ const bounds = cabinetLocalBounds(node, nodes);
210
+ const snapped = resolveCabinetGridPosition({
211
+ raw: candidatePosition,
212
+ dimensions: bounds.size,
213
+ footprintOffset: [bounds.center[0], bounds.center[2]],
214
+ yaw: candidateRotation,
215
+ step: gridStep,
216
+ });
217
+ return [snapped[0], candidatePosition[1], snapped[2]];
218
+ }
161
219
  /**
162
220
  * Wall snap for a single dragged module. `parentFrame` kinds exchange
163
221
  * `candidatePosition` in the run's LOCAL frame with the move tool (it
@@ -173,7 +231,7 @@ function resolveCabinetModuleGroupMoveSnap({ candidatePosition, levelId, movingI
173
231
  const parentLevelId = (levelId ?? run.parentId ?? null);
174
232
  if (!parentLevelId)
175
233
  return null;
176
- return resolveCabinetModuleWallSnapLocal({
234
+ const position = resolveCabinetModuleWallSnapLocal({
177
235
  candidateLocal: candidatePosition,
178
236
  excludeIds: movingIds,
179
237
  module: node,
@@ -181,6 +239,7 @@ function resolveCabinetModuleGroupMoveSnap({ candidatePosition, levelId, movingI
181
239
  parentLevelId,
182
240
  run,
183
241
  });
242
+ return position ? { position } : null;
184
243
  }
185
244
  function cabinetLayoutRevision(metadata) {
186
245
  return cabinetMetadataRecord(metadata).cabinetLayoutRevision ?? null;
@@ -277,7 +336,7 @@ export function cabinetRunNeighborSignature(run) {
277
336
  run.carcassHeight,
278
337
  run.runTier,
279
338
  run.countertopOverhang,
280
- run.children ?? [],
339
+ (run.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_')),
281
340
  cabinetLayoutRevision(run.metadata),
282
341
  ]);
283
342
  }
@@ -288,7 +347,7 @@ function includeCabinetModuleBounds(module, nodes, origin, bounds) {
288
347
  bounds.minX = Math.min(bounds.minX, x - module.width / 2);
289
348
  bounds.maxX = Math.max(bounds.maxX, x + module.width / 2);
290
349
  bounds.minY = Math.min(bounds.minY, y - (module.showPlinth ? module.plinthHeight : 0));
291
- bounds.maxY = Math.max(bounds.maxY, y + module.carcassHeight + (module.withCountertop ? module.countertopThickness : 0));
350
+ bounds.maxY = Math.max(bounds.maxY, y + cabinetModuleTotalHeight(module));
292
351
  bounds.minZ = Math.min(bounds.minZ, z - module.depth / 2);
293
352
  bounds.maxZ = Math.max(bounds.maxZ, z + module.depth / 2);
294
353
  for (const childId of module.children ?? []) {
@@ -327,7 +386,7 @@ function cabinetLocalBounds(node, nodes) {
327
386
  minX: -node.width / 2,
328
387
  maxX: node.width / 2,
329
388
  minY: 0,
330
- maxY: cabinetTotalHeight(node),
389
+ maxY: node.type === 'cabinet-module' ? cabinetModuleTotalHeight(node) : cabinetTotalHeight(node),
331
390
  minZ: -node.depth / 2,
332
391
  maxZ: node.depth / 2,
333
392
  };
@@ -343,7 +402,7 @@ function cabinetLocalBounds(node, nodes) {
343
402
  for (const module of modules) {
344
403
  includeCabinetModuleBounds(module, nodes, [0, 0, 0], bounds);
345
404
  }
346
- bounds.maxY += node.withCountertop ? node.countertopThickness : 0;
405
+ bounds.maxY = Math.max(bounds.maxY, cabinetTotalHeight(node));
347
406
  // A seating back overhang (unlike the small front/side overhang) is
348
407
  // deep enough to matter for selection and collision.
349
408
  if (node.withCountertop && node.barLedge?.edge !== 'back') {
@@ -609,7 +668,12 @@ function parentRunGeometryPreviewOverride(node, sceneApi) {
609
668
  if (!isCabinetModule(node) || !node.parentId)
610
669
  return null;
611
670
  const parent = sceneApi.get(node.parentId);
612
- return isCabinetRun(parent) ? [parent.id, {}] : null;
671
+ if (isCabinetRun(parent))
672
+ return [parent.id, {}];
673
+ if (!isCabinetModule(parent) || wallChildOf(parent, sceneApi.nodes())?.id !== node.id)
674
+ return null;
675
+ const run = parent.parentId ? sceneApi.get(parent.parentId) : undefined;
676
+ return isCabinetRun(run) ? [run.id, {}] : null;
613
677
  }
614
678
  function sharedDepthBounds(referenceDepth, targets, nodes) {
615
679
  const depthOwners = targets.flatMap((target) => {
@@ -745,6 +809,7 @@ function commitModuleResize(module, patch, sceneApi) {
745
809
  return;
746
810
  }
747
811
  if (typeof patch.width === 'number') {
812
+ const previousModule = module;
748
813
  sceneApi.update(module.id, patch);
749
814
  if (resolveCabinetType(module, parentRun) === 'base') {
750
815
  const wallChild = wallChildOf(module, sceneApi.nodes());
@@ -753,6 +818,12 @@ function commitModuleResize(module, patch, sceneApi) {
753
818
  }
754
819
  }
755
820
  bumpCabinetRunLayoutRevision(sceneApi, parentRun);
821
+ syncCornerRunsFromSourceModule({
822
+ module: sceneApi.get(module.id) ?? module,
823
+ previousModule,
824
+ run: sceneApi.get(parentRun.id) ?? parentRun,
825
+ sceneApi,
826
+ });
756
827
  return;
757
828
  }
758
829
  const modulePatch = { ...patch };
@@ -781,6 +852,7 @@ function commitModuleResize(module, patch, sceneApi) {
781
852
  }
782
853
  syncCornerRunsFromSourceModule({
783
854
  module: sceneApi.get(module.id) ?? module,
855
+ previousModule: module,
784
856
  run: sceneApi.get(parentRun.id) ?? parentRun,
785
857
  sceneApi,
786
858
  });
@@ -807,6 +879,156 @@ function commitCabinetResize(node, patch, sceneApi) {
807
879
  }
808
880
  sceneApi.update(node.id, patch);
809
881
  }
882
+ function cabinetManualWidthContext(node, sceneApi) {
883
+ const parent = node.parentId ? sceneApi.get(node.parentId) : undefined;
884
+ if (isCabinetRun(parent)) {
885
+ return { run: parent, selected: node, modules: cabinetModulesForRun(parent, sceneApi.nodes()) };
886
+ }
887
+ if (!isCabinetModule(parent))
888
+ return null;
889
+ const run = parent.parentId ? sceneApi.get(parent.parentId) : undefined;
890
+ if (!isCabinetRun(run) || wallChildOf(parent, sceneApi.nodes())?.id !== node.id)
891
+ return null;
892
+ return { run, selected: parent, modules: cabinetModulesForRun(run, sceneApi.nodes()) };
893
+ }
894
+ function cabinetWidthIsNestedModule(node, sceneApi) {
895
+ const context = cabinetManualWidthContext(node, sceneApi);
896
+ return context !== null && context.selected.id !== node.id;
897
+ }
898
+ function snapCabinetWidth(node, width, side, sceneApi) {
899
+ const context = cabinetManualWidthContext(node, sceneApi);
900
+ if (!context)
901
+ return width;
902
+ const sorted = sortRunModules(context.modules);
903
+ const selected = context.selected;
904
+ const selectedIndex = sorted.findIndex((module) => module.id === selected.id);
905
+ const neighborHost = sorted[side === 'right' ? selectedIndex + 1 : selectedIndex - 1];
906
+ if (!neighborHost)
907
+ return width;
908
+ const nested = selected.id !== node.id;
909
+ const snapTarget = nested ? wallChildOf(neighborHost, sceneApi.nodes()) : neighborHost;
910
+ if (!snapTarget)
911
+ return width;
912
+ const selectedCenter = nested
913
+ ? cabinetModuleRunLocalCenterX(node, sceneApi)
914
+ : selected.position[0];
915
+ const targetCenter = nested
916
+ ? cabinetModuleRunLocalCenterX(snapTarget, sceneApi)
917
+ : snapTarget.position[0];
918
+ if (selectedCenter === null || targetCenter === null)
919
+ return width;
920
+ const selectedEdge = selectedCenter + (side === 'right' ? node.width / 2 : -node.width / 2);
921
+ const neighborEdge = targetCenter + (side === 'right' ? -snapTarget.width / 2 : snapTarget.width / 2);
922
+ const gap = side === 'right' ? neighborEdge - selectedEdge : selectedEdge - neighborEdge;
923
+ if (gap <= CABINET_ADJACENCY_EPSILON)
924
+ return width;
925
+ const targetWidth = node.width + gap - (nested ? 0 : cabinetWallWidthGap(node, side, sceneApi));
926
+ return targetWidth > node.width && Math.abs(width - targetWidth) <= CABINET_WIDTH_SNAP_THRESHOLD
927
+ ? targetWidth
928
+ : width;
929
+ }
930
+ function cabinetIndependentWidthPatch(node, width, side, sceneApi) {
931
+ const sign = side === 'right' ? 1 : -1;
932
+ const gap = cabinetWallWidthGap(node, side, sceneApi);
933
+ const effectiveWidth = width + gap;
934
+ return {
935
+ width: effectiveWidth,
936
+ position: [
937
+ node.position[0] + (sign * (effectiveWidth - node.width)) / 2,
938
+ node.position[1],
939
+ node.position[2],
940
+ ],
941
+ };
942
+ }
943
+ function cabinetIndependentWidthPreviewOverrides(node, width, side, sceneApi) {
944
+ const overrides = [];
945
+ overrides.push([
946
+ node.id,
947
+ cabinetIndependentWidthPatch(node, width, side, sceneApi),
948
+ ]);
949
+ const parentRunOverride = parentRunGeometryPreviewOverride(node, sceneApi);
950
+ if (parentRunOverride)
951
+ overrides.push(parentRunOverride);
952
+ const gap = cabinetWallWidthGap(node, side, sceneApi);
953
+ const selectedWallOverride = wallCabinetWidthOverride(node, width + gap, sceneApi);
954
+ if (selectedWallOverride)
955
+ overrides.push(selectedWallOverride);
956
+ return overrides;
957
+ }
958
+ function previewCabinetCornerWidthOverrides(node, initialOverrides, sceneApi) {
959
+ const parent = node.parentId
960
+ ? sceneApi.get(node.parentId)
961
+ : undefined;
962
+ if (!parent || !isCabinetRun(parent))
963
+ return initialOverrides;
964
+ return previewCornerRunsFromRunSources({
965
+ baseLayout: 'width-only',
966
+ initialOverrides,
967
+ previousModules: cabinetModulesForRun(parent, sceneApi.nodes()),
968
+ run: parent,
969
+ sceneApi,
970
+ });
971
+ }
972
+ function cabinetManualWidthReflow(node, width, side, sceneApi) {
973
+ const context = cabinetManualWidthContext(node, sceneApi);
974
+ if (!context)
975
+ return null;
976
+ const wallGap = cabinetWallWidthGap(node, side, sceneApi);
977
+ const selectedWidth = width + wallGap;
978
+ const runConstraints = runWallConstraints(context.run, context.modules, sceneApi.nodes(), { widthGrowth: Math.max(0, selectedWidth - context.selected.width) });
979
+ const draggedEnd = side === 'right' ? runConstraints.right : runConstraints.left;
980
+ const clampedSelectedWidth = selectedWidth > context.selected.width && draggedEnd.constrained
981
+ ? Math.min(selectedWidth, context.selected.width + draggedEnd.slack)
982
+ : selectedWidth;
983
+ const reflowed = reflowCabinetRunModules(context.modules, context.selected.id, clampedSelectedWidth, {
984
+ resizeSide: side,
985
+ consumeAdjacentGap: true,
986
+ eligibleDonorIds: new Set(),
987
+ maximumWidth: MAX_CABINET_WIDTH,
988
+ });
989
+ return reflowed.length > 0 ? { ...context, reflowed, wallGap } : null;
990
+ }
991
+ function commitCabinetManualWidth(node, width, side, sceneApi) {
992
+ const reflow = cabinetManualWidthReflow(node, width, side, sceneApi);
993
+ if (!reflow)
994
+ return;
995
+ const reflowById = new Map(reflow.reflowed.map((entry) => [entry.id, entry]));
996
+ for (const module of reflow.modules) {
997
+ const next = reflowById.get(module.id);
998
+ if (!next)
999
+ continue;
1000
+ const isSelected = module.id === reflow.selected.id;
1001
+ const modulePatch = {
1002
+ width: next.width,
1003
+ position: next.position,
1004
+ };
1005
+ if (isSelected) {
1006
+ modulePatch.metadata = metadataForSelectedWidth(module, next.width);
1007
+ }
1008
+ else if (Math.abs(next.width - module.width) > 1e-4) {
1009
+ modulePatch.metadata = metadataWithPresetWidthDebt(module, reflow.selected.id, next.width - module.width);
1010
+ }
1011
+ const nestedCornerOverrides = nestedCornerRunPositionOverrides(module, next.position, sceneApi.nodes());
1012
+ sceneApi.update(module.id, modulePatch);
1013
+ for (const [id, override] of nestedCornerOverrides) {
1014
+ sceneApi.update(id, override);
1015
+ }
1016
+ const wallChild = wallChildOf(module, sceneApi.nodes());
1017
+ if (wallChild) {
1018
+ sceneApi.update(wallChild.id, {
1019
+ width: next.width,
1020
+ position: [0, wallChild.position[1], backAlignZ(module.depth, wallChild.depth)],
1021
+ });
1022
+ }
1023
+ }
1024
+ syncCornerRunsFromRunSources({
1025
+ baseLayout: 'width-only',
1026
+ previousModules: reflow.modules,
1027
+ run: sceneApi.get(reflow.run.id) ?? reflow.run,
1028
+ sceneApi,
1029
+ });
1030
+ bumpCabinetRunLayoutRevision(sceneApi, reflow.run);
1031
+ }
810
1032
  function cabinetWidthHandle(side) {
811
1033
  const sign = side === 'right' ? 1 : -1;
812
1034
  return {
@@ -816,26 +1038,40 @@ function cabinetWidthHandle(side) {
816
1038
  min: (node, sceneApi) => {
817
1039
  if (!isCabinetModule(node))
818
1040
  return MIN_CABINET_WIDTH;
819
- const gap = cabinetWallWidthGap(node, side, sceneApi);
820
- const connected = cabinetWidthConnectedNeighbor(node, side, sceneApi);
821
- if (!connected || isCabinetWidthFiller(connected))
822
- return MIN_CABINET_WIDTH - gap;
823
- const connectedMax = cabinetResizeUpperBound(connected.width, MAX_CABINET_WIDTH);
824
- return Math.max(MIN_CABINET_WIDTH - gap, node.width - (connectedMax - connected.width));
1041
+ const gap = cabinetWidthIsNestedModule(node, sceneApi)
1042
+ ? 0
1043
+ : cabinetWallWidthGap(node, side, sceneApi);
1044
+ return MIN_CABINET_WIDTH - gap;
825
1045
  },
826
1046
  max: (node, sceneApi) => {
827
1047
  const ownMax = cabinetResizeUpperBound(node.width, MAX_CABINET_WIDTH);
828
1048
  if (!isCabinetModule(node))
829
1049
  return ownMax;
830
- const gap = cabinetWallWidthGap(node, side, sceneApi);
831
- const connected = cabinetWidthConnectedNeighbor(node, side, sceneApi);
832
- if (!connected || isCabinetWidthFiller(connected))
833
- return ownMax - gap;
834
- return Math.min(ownMax - gap, node.width + connected.width - MIN_CABINET_WIDTH);
1050
+ const gap = cabinetWidthIsNestedModule(node, sceneApi)
1051
+ ? 0
1052
+ : cabinetWallWidthGap(node, side, sceneApi);
1053
+ return ownMax - gap;
835
1054
  },
1055
+ magneticSnap: (node, width, sceneApi) => isCabinetModule(node) ? snapCabinetWidth(node, width, side, sceneApi) : width,
836
1056
  currentValue: (node) => node.width,
837
- apply: (node, width, sceneApi) => {
838
- const gap = isCabinetModule(node) ? cabinetWallWidthGap(node, side, sceneApi) : 0;
1057
+ apply: (node, width, sceneApi, modifiers) => {
1058
+ if (isCabinetModule(node) && modifiers?.altKey) {
1059
+ return cabinetIndependentWidthPatch(node, width, side, sceneApi);
1060
+ }
1061
+ if (isCabinetModule(node) &&
1062
+ cabinetManualWidthContext(node, sceneApi) &&
1063
+ !cabinetWidthIsNestedModule(node, sceneApi)) {
1064
+ const reflow = cabinetManualWidthReflow(node, width, side, sceneApi);
1065
+ if (reflow) {
1066
+ const selected = reflow.reflowed.find((entry) => entry.id === reflow.selected.id);
1067
+ if (selected)
1068
+ return { width: selected.width, position: selected.position };
1069
+ }
1070
+ return { width: node.width, position: node.position };
1071
+ }
1072
+ const gap = isCabinetModule(node) && !cabinetWidthIsNestedModule(node, sceneApi)
1073
+ ? cabinetWallWidthGap(node, side, sceneApi)
1074
+ : 0;
839
1075
  const effectiveWidth = width + gap;
840
1076
  return {
841
1077
  width: effectiveWidth,
@@ -846,14 +1082,67 @@ function cabinetWidthHandle(side) {
846
1082
  ],
847
1083
  };
848
1084
  },
849
- previewOverrides: (node, width, sceneApi) => {
1085
+ previewOverrides: (node, width, sceneApi, modifiers) => {
850
1086
  if (!isCabinetModule(node))
851
1087
  return [];
1088
+ if (modifiers?.altKey) {
1089
+ return previewCabinetCornerWidthOverrides(node, cabinetIndependentWidthPreviewOverrides(node, width, side, sceneApi), sceneApi);
1090
+ }
1091
+ if (cabinetWidthIsNestedModule(node, sceneApi)) {
1092
+ const parentRunOverride = parentRunGeometryPreviewOverride(node, sceneApi);
1093
+ return parentRunOverride ? [parentRunOverride] : [];
1094
+ }
1095
+ const reflow = cabinetManualWidthReflow(node, width, side, sceneApi);
1096
+ if (reflow) {
1097
+ const overrides = [];
1098
+ const parentRunOverride = parentRunGeometryPreviewOverride(node, sceneApi);
1099
+ if (parentRunOverride)
1100
+ overrides.push(parentRunOverride);
1101
+ for (const entry of reflow.reflowed) {
1102
+ const module = reflow.modules.find((candidate) => candidate.id === entry.id);
1103
+ if (!module)
1104
+ continue;
1105
+ overrides.push([
1106
+ module.id,
1107
+ { width: entry.width, position: entry.position },
1108
+ ]);
1109
+ overrides.push(...nestedCornerRunPositionOverrides(module, entry.position, sceneApi.nodes()));
1110
+ const wallChild = wallChildOf(module, sceneApi.nodes());
1111
+ if (wallChild) {
1112
+ overrides.push([
1113
+ wallChild.id,
1114
+ {
1115
+ width: entry.width,
1116
+ position: [0, wallChild.position[1], backAlignZ(module.depth, wallChild.depth)],
1117
+ },
1118
+ ]);
1119
+ }
1120
+ }
1121
+ return previewCabinetCornerWidthOverrides(node, overrides, sceneApi);
1122
+ }
1123
+ if (cabinetManualWidthContext(node, sceneApi)) {
1124
+ const parentRunOverride = parentRunGeometryPreviewOverride(node, sceneApi);
1125
+ return parentRunOverride ? [parentRunOverride] : [];
1126
+ }
852
1127
  const overrides = [];
853
1128
  const parentRunOverride = parentRunGeometryPreviewOverride(node, sceneApi);
854
1129
  if (parentRunOverride)
855
1130
  overrides.push(parentRunOverride);
856
1131
  const gap = cabinetWallWidthGap(node, side, sceneApi);
1132
+ const effectiveWidth = width + gap;
1133
+ const selectedPosition = [
1134
+ node.position[0] + (sign * (effectiveWidth - node.width)) / 2,
1135
+ node.position[1],
1136
+ node.position[2],
1137
+ ];
1138
+ overrides.push([
1139
+ node.id,
1140
+ {
1141
+ width: effectiveWidth,
1142
+ position: selectedPosition,
1143
+ },
1144
+ ]);
1145
+ overrides.push(...nestedCornerRunPositionOverrides(node, selectedPosition, sceneApi.nodes()));
857
1146
  const selectedWallOverride = wallCabinetWidthOverride(node, width + gap, sceneApi);
858
1147
  if (selectedWallOverride)
859
1148
  overrides.push(selectedWallOverride);
@@ -863,19 +1152,45 @@ function cabinetWidthHandle(side) {
863
1152
  connectedResize.module.id,
864
1153
  connectedResize.patch,
865
1154
  ]);
1155
+ overrides.push(...nestedCornerRunPositionOverrides(connectedResize.module, connectedResize.patch.position, sceneApi.nodes()));
866
1156
  const connectedWallOverride = wallCabinetWidthOverride(connectedResize.module, connectedResize.patch.width, sceneApi);
867
1157
  if (connectedWallOverride)
868
1158
  overrides.push(connectedWallOverride);
869
1159
  }
870
- return overrides;
1160
+ return previewCabinetCornerWidthOverrides(node, overrides, sceneApi);
871
1161
  },
872
- commit: (node, patch, sceneApi) => {
1162
+ commit: (node, patch, sceneApi, modifiers) => {
1163
+ if (isCabinetModule(node) && typeof patch.width === 'number' && modifiers?.altKey) {
1164
+ commitCabinetResize(node, {
1165
+ ...patch,
1166
+ metadata: metadataForSelectedWidth(node, patch.width, patch.metadata),
1167
+ }, sceneApi);
1168
+ return;
1169
+ }
1170
+ if (isCabinetModule(node) && typeof patch.width === 'number') {
1171
+ if (cabinetWidthIsNestedModule(node, sceneApi)) {
1172
+ commitCabinetResize(node, patch, sceneApi);
1173
+ return;
1174
+ }
1175
+ commitCabinetManualWidth(node, patch.width - cabinetWallWidthGap(node, side, sceneApi), side, sceneApi);
1176
+ return;
1177
+ }
873
1178
  const connectedResize = isCabinetModule(node) && typeof patch.width === 'number'
874
1179
  ? connectedCabinetWidthResize(node, side, patch.width - node.width - cabinetWallWidthGap(node, side, sceneApi), sceneApi)
875
1180
  : null;
876
- commitCabinetResize(node, patch, sceneApi);
1181
+ const selectedPatch = isCabinetModule(node) && typeof patch.width === 'number'
1182
+ ? {
1183
+ ...patch,
1184
+ metadata: metadataForSelectedWidth(node, patch.width, patch.metadata),
1185
+ }
1186
+ : patch;
1187
+ commitCabinetResize(node, selectedPatch, sceneApi);
877
1188
  if (connectedResize) {
878
- commitCabinetResize(connectedResize.module, connectedResize.patch, sceneApi);
1189
+ const widthDelta = connectedResize.patch.width - connectedResize.module.width;
1190
+ commitCabinetResize(connectedResize.module, {
1191
+ ...connectedResize.patch,
1192
+ metadata: metadataWithPresetWidthDebt(connectedResize.module, node.id, widthDelta),
1193
+ }, sceneApi);
879
1194
  }
880
1195
  },
881
1196
  visible: (node, sceneApi) => !isCabinetModule(node) || cabinetModuleSideOpen(node, side, sceneApi),
@@ -1332,7 +1647,11 @@ function cabinetHeightHandle() {
1332
1647
  apply: (_node, carcassHeight) => ({ carcassHeight }),
1333
1648
  commit: commitCabinetResize,
1334
1649
  placement: {
1335
- position: (node) => [0, cabinetTotalHeight(node) + HEIGHT_HANDLE_OFFSET, 0],
1650
+ position: (node, sceneApi) => [
1651
+ 0,
1652
+ cabinetLocalBounds(node, sceneApi.nodes()).maxY + HEIGHT_HANDLE_OFFSET,
1653
+ 0,
1654
+ ],
1336
1655
  },
1337
1656
  };
1338
1657
  }
@@ -1381,7 +1700,8 @@ function cabinetRotateHandle() {
1381
1700
  };
1382
1701
  }
1383
1702
  function cabinetHandles(node, sceneApi) {
1384
- if ((node.children ?? []).length > 0) {
1703
+ const structuralChildren = (node.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'));
1704
+ if (structuralChildren.length > 0) {
1385
1705
  const connectedRuns = sceneApi && node.runTier === 'base' ? connectedBaseRuns(node, sceneApi) : [];
1386
1706
  const depthHandles = sceneApi
1387
1707
  ? connectedRuns.map((run) => cabinetConnectedRunDepthHandle(node, run, sceneApi))
@@ -1398,7 +1718,7 @@ function cabinetHandles(node, sceneApi) {
1398
1718
  cabinetHeightHandle(),
1399
1719
  cabinetRotateHandle(),
1400
1720
  ];
1401
- if ((node.children ?? []).length === 0) {
1721
+ if (structuralChildren.length === 0) {
1402
1722
  handles.unshift(cabinetWidthHandle('left'), cabinetWidthHandle('right'));
1403
1723
  }
1404
1724
  return handles;
@@ -1407,25 +1727,40 @@ function isHoodOnlyCabinet(node) {
1407
1727
  const stack = stackForCabinet(node);
1408
1728
  return stack.length > 0 && stack.every((compartment) => isHoodCompartmentType(compartment.type));
1409
1729
  }
1730
+ function cabinetModuleHeightHandleVisible(node, sceneApi) {
1731
+ const parent = node.parentId ? sceneApi.get(node.parentId) : undefined;
1732
+ if (isCabinetRun(parent)) {
1733
+ return parent.runTier === 'wall' || resolveCabinetType(node, parent) === 'tall';
1734
+ }
1735
+ return isCabinetModule(parent) && wallChildOf(parent, sceneApi.nodes())?.id === node.id;
1736
+ }
1410
1737
  function cabinetModuleHandles() {
1411
1738
  return [
1412
1739
  {
1413
1740
  ...cabinetWidthHandle('left'),
1414
- visible: (node, sceneApi) => !isCabinetWidthFiller(node) && !cabinetModuleSideHasCornerFiller(node, 'left', sceneApi),
1741
+ visible: (node, sceneApi) => !isCabinetWidthFiller(node) &&
1742
+ !cabinetModuleUsesFixedApplianceWidth(node) &&
1743
+ !cabinetModuleSideHasCornerFiller(node, 'left', sceneApi),
1415
1744
  },
1416
1745
  {
1417
1746
  ...cabinetWidthHandle('right'),
1418
- visible: (node, sceneApi) => !isCabinetWidthFiller(node) && !cabinetModuleSideHasCornerFiller(node, 'right', sceneApi),
1747
+ visible: (node, sceneApi) => !isCabinetWidthFiller(node) &&
1748
+ !cabinetModuleUsesFixedApplianceWidth(node) &&
1749
+ !cabinetModuleSideHasCornerFiller(node, 'right', sceneApi),
1419
1750
  },
1420
1751
  {
1421
1752
  ...cabinetDepthHandle(),
1422
1753
  visible: (node) => !isCabinetWidthFiller(node),
1423
1754
  },
1755
+ {
1756
+ ...cabinetHeightHandle(),
1757
+ visible: cabinetModuleHeightHandleVisible,
1758
+ },
1424
1759
  ];
1425
1760
  }
1426
1761
  export const cabinetDefinition = {
1427
1762
  kind: 'cabinet',
1428
- schemaVersion: 7,
1763
+ schemaVersion: 8,
1429
1764
  schema: CabinetNode,
1430
1765
  category: 'furnish',
1431
1766
  surfaceRole: 'joinery',
@@ -1441,20 +1776,22 @@ export const cabinetDefinition = {
1441
1776
  runTier: 'base',
1442
1777
  children: [],
1443
1778
  width: 0.5,
1444
- depth: 0.5,
1445
- carcassHeight: 0.72,
1779
+ depth: CABINET_METRIC_DEFAULTS.depth,
1780
+ carcassHeight: CABINET_METRIC_DEFAULTS.carcassHeight,
1446
1781
  operationState: 0,
1447
- plinthHeight: 0.1,
1782
+ plinthHeight: CABINET_METRIC_DEFAULTS.plinthHeight,
1448
1783
  toeKickDepth: 0.075,
1449
1784
  boardThickness: 0.018,
1450
- countertopThickness: 0.02,
1785
+ countertopThickness: CABINET_METRIC_DEFAULTS.countertopThickness,
1451
1786
  countertopOverhang: 0.02,
1452
1787
  countertopBackOverhang: 0,
1453
1788
  withFinishedBack: false,
1454
1789
  withWaterfall: false,
1790
+ withFinishedEnds: false,
1455
1791
  frontThickness: 0.018,
1456
1792
  frontGap: 0.003,
1457
1793
  frontStyle: 'slab',
1794
+ panelReady: false,
1458
1795
  handleStyle: 'bar',
1459
1796
  handlePosition: 'auto',
1460
1797
  frontOverlay: 'full',
@@ -1467,8 +1804,18 @@ export const cabinetDefinition = {
1467
1804
  selectable: { hitVolume: 'bbox' },
1468
1805
  movable: {
1469
1806
  axes: ['x', 'z'],
1807
+ directDrag: true,
1470
1808
  gridSnap: true,
1471
- groupMoveSnap: resolveCabinetGroupMoveSnap,
1809
+ gridSnapPosition: resolveCabinetMoveGridSnap,
1810
+ groupMoveSnapPose: resolveCabinetGroupMoveSnap,
1811
+ isValidPosition: ({ node, position, rotation, levelId, nodes }) => node.type !== 'cabinet' ||
1812
+ !cabinetRunOverlapsWallOpening({
1813
+ levelId,
1814
+ node: node,
1815
+ nodes: nodes,
1816
+ position,
1817
+ rotation,
1818
+ }),
1472
1819
  override: ({ node }) => selectionProxyIdFromMetadata(node.metadata)
1473
1820
  ? { axes: [], gridSnap: false }
1474
1821
  : null,
@@ -1477,11 +1824,9 @@ export const cabinetDefinition = {
1477
1824
  duplicable: { subtree: true, prepareSubtreeClone: prepareCabinetSubtreeClone },
1478
1825
  deletable: true,
1479
1826
  surfaces: {
1827
+ hosting: cabinetSurfaceProvider,
1480
1828
  top: {
1481
- height: (node) => {
1482
- const n = node;
1483
- return n.plinthHeight + n.carcassHeight + (n.withCountertop ? n.countertopThickness : 0);
1484
- },
1829
+ height: (node, context) => cabinetLocalBounds(node, context.nodes).maxY,
1485
1830
  },
1486
1831
  },
1487
1832
  floorPlaced: {
@@ -1504,10 +1849,10 @@ export const cabinetDefinition = {
1504
1849
  // Dirty-cascade: a dirtied run re-marks its hosted modules so their
1505
1850
  // composite geometry re-flows with the run (see `cascadeDirty`).
1506
1851
  relations: {
1507
- hosts: ['cabinet-module'],
1852
+ hosts: ['cabinet', 'cabinet-module', 'item', 'procedural-item'],
1508
1853
  },
1509
1854
  parametrics: cabinetParametrics,
1510
- handles: cabinetHandles,
1855
+ handles: (node, sceneApi) => cabinetHandles(node, sceneApi).map(withCabinetHostedChildren),
1511
1856
  geometry: buildCabinetGeometry,
1512
1857
  exportAnimation: ({ node, object }) => bakeCabinetAnimationClip(node, object),
1513
1858
  system: {
@@ -1516,6 +1861,7 @@ export const cabinetDefinition = {
1516
1861
  },
1517
1862
  // `operationState` is deliberately absent — door/drawer poses are applied
1518
1863
  // per-frame by the cabinet animation system, not by geometry rebuilds.
1864
+ geometryChildTypes: ['cabinet', 'cabinet-module'],
1519
1865
  geometryKey: (n) => JSON.stringify([
1520
1866
  n.width,
1521
1867
  n.depth,
@@ -1529,10 +1875,12 @@ export const cabinetDefinition = {
1529
1875
  n.countertopBackOverhang,
1530
1876
  n.withFinishedBack,
1531
1877
  n.withWaterfall,
1878
+ n.withFinishedEnds,
1532
1879
  JSON.stringify(n.barLedge ?? null),
1533
1880
  n.frontThickness,
1534
1881
  n.frontGap,
1535
1882
  n.frontStyle,
1883
+ n.panelReady,
1536
1884
  n.handleStyle,
1537
1885
  n.handlePosition,
1538
1886
  n.frontOverlay,
@@ -1547,7 +1895,7 @@ export const cabinetDefinition = {
1547
1895
  // overhang re-trims against the neighbor's new spans (the neighbor's
1548
1896
  // own fields never appear in this key).
1549
1897
  JSON.stringify(cabinetAdjacencyRevision(n.metadata)),
1550
- JSON.stringify(n.children ?? []),
1898
+ JSON.stringify((n.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'))),
1551
1899
  JSON.stringify(n.stack ?? null),
1552
1900
  ]),
1553
1901
  floorplan: buildCabinetFloorplan,
@@ -1601,7 +1949,7 @@ export const cabinetDefinition = {
1601
1949
  };
1602
1950
  export const cabinetModuleDefinition = {
1603
1951
  kind: 'cabinet-module',
1604
- schemaVersion: 4,
1952
+ schemaVersion: 5,
1605
1953
  schema: CabinetModuleNode,
1606
1954
  category: 'furnish',
1607
1955
  surfaceRole: 'joinery',
@@ -1617,8 +1965,8 @@ export const cabinetModuleDefinition = {
1617
1965
  children: [],
1618
1966
  cabinetType: 'base',
1619
1967
  width: 0.5,
1620
- depth: 0.5,
1621
- carcassHeight: 0.72,
1968
+ depth: CABINET_METRIC_DEFAULTS.depth,
1969
+ carcassHeight: CABINET_METRIC_DEFAULTS.carcassHeight,
1622
1970
  operationState: 0,
1623
1971
  plinthHeight: 0,
1624
1972
  toeKickDepth: 0.075,
@@ -1632,7 +1980,11 @@ export const cabinetModuleDefinition = {
1632
1980
  moduleKind: 'standard',
1633
1981
  openSide: undefined,
1634
1982
  cornerShelf: false,
1983
+ topFinish: 'none',
1984
+ topFinishHeight: CabinetModuleNode.parse({}).topFinishHeight,
1985
+ topFinishDepth: 0.32,
1635
1986
  frontStyle: 'slab',
1987
+ panelReady: false,
1636
1988
  handleStyle: 'bar',
1637
1989
  handlePosition: 'auto',
1638
1990
  frontOverlay: 'full',
@@ -1645,9 +1997,10 @@ export const cabinetModuleDefinition = {
1645
1997
  selectable: { hitVolume: 'bbox' },
1646
1998
  movable: {
1647
1999
  axes: ['x', 'z'],
2000
+ directDrag: true,
1648
2001
  gridSnap: true,
1649
2002
  parentFrame: cabinetModuleParentFrame,
1650
- groupMoveSnap: resolveCabinetModuleGroupMoveSnap,
2003
+ groupMoveSnapPose: resolveCabinetModuleGroupMoveSnap,
1651
2004
  override: ({ node }) => selectionProxyIdFromMetadata(node.metadata)
1652
2005
  ? { axes: [], gridSnap: false }
1653
2006
  : null,
@@ -1660,13 +2013,7 @@ export const cabinetModuleDefinition = {
1660
2013
  footprint: (node) => {
1661
2014
  const n = node;
1662
2015
  return {
1663
- dimensions: [
1664
- n.width,
1665
- (n.showPlinth ? n.plinthHeight : 0) +
1666
- n.carcassHeight +
1667
- (n.withCountertop ? n.countertopThickness : 0),
1668
- n.depth,
1669
- ],
2016
+ dimensions: [n.width, cabinetModuleTotalHeight(n), n.depth],
1670
2017
  rotation: [0, n.rotation, 0],
1671
2018
  };
1672
2019
  },
@@ -1680,11 +2027,13 @@ export const cabinetModuleDefinition = {
1680
2027
  sceneAction: cabinetSceneAction,
1681
2028
  slots: () => cabinetSlots(),
1682
2029
  },
2030
+ relations: { hosts: ['cabinet', 'cabinet-module', 'item', 'procedural-item'] },
1683
2031
  parametrics: cabinetModuleParametrics,
1684
- handles: cabinetModuleHandles,
2032
+ handles: () => cabinetModuleHandles().map(withCabinetHostedChildren),
1685
2033
  geometry: buildCabinetGeometry,
1686
2034
  exportAnimation: ({ node, object }) => bakeCabinetAnimationClip(node, object),
1687
2035
  // `operationState` is deliberately absent — see cabinetDefinition.geometryKey.
2036
+ geometryChildTypes: ['cabinet', 'cabinet-module'],
1688
2037
  geometryKey: (n) => JSON.stringify([
1689
2038
  n.cabinetType,
1690
2039
  n.moduleKind,
@@ -1699,6 +2048,7 @@ export const cabinetModuleDefinition = {
1699
2048
  n.frontThickness,
1700
2049
  n.frontGap,
1701
2050
  n.frontStyle,
2051
+ n.panelReady,
1702
2052
  n.handleStyle,
1703
2053
  n.handlePosition,
1704
2054
  n.frontOverlay,
@@ -1707,10 +2057,13 @@ export const cabinetModuleDefinition = {
1707
2057
  n.withCountertop,
1708
2058
  n.openSide ?? null,
1709
2059
  n.cornerShelf ?? false,
2060
+ n.topFinish,
2061
+ n.topFinishHeight,
2062
+ n.topFinishDepth,
1710
2063
  JSON.stringify(n.material ?? null),
1711
2064
  JSON.stringify(n.materialPreset ?? null),
1712
2065
  JSON.stringify(n.slots ?? null),
1713
- JSON.stringify(n.children ?? []),
2066
+ JSON.stringify((n.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'))),
1714
2067
  JSON.stringify(n.stack ?? null),
1715
2068
  ]),
1716
2069
  floorplan: buildCabinetModuleFloorplan,