@pascal-app/nodes 1.0.0-beta.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +1 -1
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  102. package/dist/cabinet/compartment-card.js +11 -3
  103. package/dist/cabinet/continuous-placement.d.ts +3 -0
  104. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  105. package/dist/cabinet/continuous-placement.js +6 -0
  106. package/dist/cabinet/definition.d.ts.map +1 -1
  107. package/dist/cabinet/definition.js +400 -54
  108. package/dist/cabinet/flame-index.d.ts +3 -0
  109. package/dist/cabinet/flame-index.d.ts.map +1 -0
  110. package/dist/cabinet/flame-index.js +13 -0
  111. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  112. package/dist/cabinet/floorplan-move.js +91 -22
  113. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  114. package/dist/cabinet/geometry/fridge.js +25 -1
  115. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  116. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  117. package/dist/cabinet/geometry/fronts.js +1 -1
  118. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  119. package/dist/cabinet/geometry/run.js +19 -1
  120. package/dist/cabinet/geometry.d.ts.map +1 -1
  121. package/dist/cabinet/geometry.js +63 -1
  122. package/dist/cabinet/index.d.ts +1 -0
  123. package/dist/cabinet/index.d.ts.map +1 -1
  124. package/dist/cabinet/index.js +1 -0
  125. package/dist/cabinet/insertion.d.ts +19 -0
  126. package/dist/cabinet/insertion.d.ts.map +1 -0
  127. package/dist/cabinet/insertion.js +49 -0
  128. package/dist/cabinet/move-frame.d.ts.map +1 -1
  129. package/dist/cabinet/move-frame.js +68 -2
  130. package/dist/cabinet/panel-context.d.ts +7 -0
  131. package/dist/cabinet/panel-context.d.ts.map +1 -0
  132. package/dist/cabinet/panel-context.js +16 -0
  133. package/dist/cabinet/panel-visibility.d.ts +9 -0
  134. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  135. package/dist/cabinet/panel-visibility.js +26 -0
  136. package/dist/cabinet/panel.d.ts.map +1 -1
  137. package/dist/cabinet/panel.js +221 -37
  138. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  139. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  140. package/dist/cabinet/placement-dimensions.js +227 -0
  141. package/dist/cabinet/placement-snap.d.ts +21 -1
  142. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  143. package/dist/cabinet/placement-snap.js +48 -6
  144. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  145. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  146. package/dist/cabinet/preset-width-debt.js +45 -0
  147. package/dist/cabinet/presets.d.ts.map +1 -1
  148. package/dist/cabinet/presets.js +14 -13
  149. package/dist/cabinet/profiles.d.ts +14 -0
  150. package/dist/cabinet/profiles.d.ts.map +1 -0
  151. package/dist/cabinet/profiles.js +30 -0
  152. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  153. package/dist/cabinet/quick-actions.js +8 -24
  154. package/dist/cabinet/reveals.d.ts +37 -0
  155. package/dist/cabinet/reveals.d.ts.map +1 -0
  156. package/dist/cabinet/reveals.js +13 -0
  157. package/dist/cabinet/run-layout.d.ts +90 -4
  158. package/dist/cabinet/run-layout.d.ts.map +1 -1
  159. package/dist/cabinet/run-layout.js +408 -23
  160. package/dist/cabinet/run-ops.d.ts +202 -10
  161. package/dist/cabinet/run-ops.d.ts.map +1 -1
  162. package/dist/cabinet/run-ops.js +520 -33
  163. package/dist/cabinet/run-panel.d.ts +6 -2
  164. package/dist/cabinet/run-panel.d.ts.map +1 -1
  165. package/dist/cabinet/run-panel.js +285 -108
  166. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  167. package/dist/cabinet/stack-transitions.js +35 -24
  168. package/dist/cabinet/stack.d.ts +169 -1
  169. package/dist/cabinet/stack.d.ts.map +1 -1
  170. package/dist/cabinet/stack.js +57 -18
  171. package/dist/cabinet/system.d.ts +2 -0
  172. package/dist/cabinet/system.d.ts.map +1 -1
  173. package/dist/cabinet/system.js +28 -8
  174. package/dist/cabinet/tool.d.ts.map +1 -1
  175. package/dist/cabinet/tool.js +616 -91
  176. package/dist/cabinet/validation.d.ts +27 -0
  177. package/dist/cabinet/validation.d.ts.map +1 -0
  178. package/dist/cabinet/validation.js +56 -0
  179. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  180. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  181. package/dist/cabinet/wall-height-presets.js +15 -0
  182. package/dist/cabinet/wall-snap.d.ts +27 -3
  183. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  184. package/dist/cabinet/wall-snap.js +278 -62
  185. package/dist/cabinet/widths.d.ts +10 -0
  186. package/dist/cabinet/widths.d.ts.map +1 -0
  187. package/dist/cabinet/widths.js +13 -0
  188. package/dist/ceiling/definition.d.ts.map +1 -1
  189. package/dist/ceiling/definition.js +7 -1
  190. package/dist/ceiling/floorplan-affordances.d.ts +8 -8
  191. package/dist/ceiling/materials.d.ts.map +1 -1
  192. package/dist/ceiling/materials.js +0 -1
  193. package/dist/ceiling/panel.d.ts.map +1 -1
  194. package/dist/ceiling/panel.js +8 -2
  195. package/dist/ceiling/parametrics.js +1 -1
  196. package/dist/chimney/definition.js +1 -1
  197. package/dist/chimney/panel.js +1 -1
  198. package/dist/chimney/parametrics.js +3 -3
  199. package/dist/column/definition.d.ts.map +1 -1
  200. package/dist/column/definition.js +22 -4
  201. package/dist/column/panel.d.ts.map +1 -1
  202. package/dist/column/panel.js +37 -7
  203. package/dist/column/parametrics.d.ts.map +1 -1
  204. package/dist/column/parametrics.js +5 -3
  205. package/dist/column/tool.d.ts.map +1 -1
  206. package/dist/column/tool.js +50 -14
  207. package/dist/cupola/definition.d.ts.map +1 -1
  208. package/dist/cupola/definition.js +15 -6
  209. package/dist/cupola/geometry.d.ts +6 -0
  210. package/dist/cupola/geometry.d.ts.map +1 -1
  211. package/dist/cupola/geometry.js +60 -13
  212. package/dist/cupola/paint.d.ts +4 -0
  213. package/dist/cupola/paint.d.ts.map +1 -0
  214. package/dist/cupola/paint.js +39 -0
  215. package/dist/cupola/panel.js +1 -1
  216. package/dist/cupola/parametrics.js +3 -3
  217. package/dist/cupola/renderer.d.ts.map +1 -1
  218. package/dist/cupola/renderer.js +27 -8
  219. package/dist/door/floorplan-move.d.ts.map +1 -1
  220. package/dist/door/floorplan-move.js +1 -1
  221. package/dist/door/move-tool.d.ts.map +1 -1
  222. package/dist/door/move-tool.js +86 -32
  223. package/dist/door/panel.d.ts.map +1 -1
  224. package/dist/door/panel.js +1 -1
  225. package/dist/door/parametrics.js +2 -2
  226. package/dist/door/tool.d.ts.map +1 -1
  227. package/dist/door/tool.js +16 -4
  228. package/dist/dormer/csg-geometry.d.ts +6 -42
  229. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  230. package/dist/dormer/csg-geometry.js +38 -209
  231. package/dist/dormer/definition.d.ts +4 -12
  232. package/dist/dormer/definition.d.ts.map +1 -1
  233. package/dist/dormer/definition.js +18 -193
  234. package/dist/dormer/floorplan.d.ts +3 -3
  235. package/dist/dormer/floorplan.d.ts.map +1 -1
  236. package/dist/dormer/floorplan.js +6 -17
  237. package/dist/dormer/geometry.d.ts +5 -24
  238. package/dist/dormer/geometry.d.ts.map +1 -1
  239. package/dist/dormer/geometry.js +64 -41
  240. package/dist/dormer/index.d.ts +1 -1
  241. package/dist/dormer/index.d.ts.map +1 -1
  242. package/dist/dormer/index.js +1 -1
  243. package/dist/dormer/move-tool.d.ts.map +1 -1
  244. package/dist/dormer/move-tool.js +31 -3
  245. package/dist/dormer/panel-windows-section.d.ts +9 -0
  246. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  247. package/dist/dormer/panel-windows-section.js +7 -0
  248. package/dist/dormer/panel.d.ts.map +1 -1
  249. package/dist/dormer/panel.js +100 -18
  250. package/dist/dormer/parametrics.d.ts.map +1 -1
  251. package/dist/dormer/parametrics.js +8 -77
  252. package/dist/dormer/placement-guides.d.ts.map +1 -1
  253. package/dist/dormer/placement-guides.js +5 -4
  254. package/dist/dormer/preview.d.ts.map +1 -1
  255. package/dist/dormer/preview.js +9 -1
  256. package/dist/dormer/renderer.d.ts.map +1 -1
  257. package/dist/dormer/renderer.js +24 -26
  258. package/dist/dormer/tool.d.ts.map +1 -1
  259. package/dist/dormer/tool.js +3 -1
  260. package/dist/dormer/window-layout.d.ts +15 -0
  261. package/dist/dormer/window-layout.d.ts.map +1 -0
  262. package/dist/dormer/window-layout.js +59 -0
  263. package/dist/downspout/definition.d.ts.map +1 -1
  264. package/dist/downspout/definition.js +17 -4
  265. package/dist/downspout/geometry.d.ts.map +1 -1
  266. package/dist/downspout/geometry.js +10 -0
  267. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  268. package/dist/downspout/inspector-editors.js +9 -1
  269. package/dist/downspout/parametrics.d.ts.map +1 -1
  270. package/dist/downspout/parametrics.js +2 -1
  271. package/dist/downspout/renderer.d.ts.map +1 -1
  272. package/dist/downspout/renderer.js +19 -3
  273. package/dist/downspout/system.d.ts +7 -0
  274. package/dist/downspout/system.d.ts.map +1 -0
  275. package/dist/downspout/system.js +114 -0
  276. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  277. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  278. package/dist/duct-fitting/accessory-geometry.js +47 -0
  279. package/dist/duct-fitting/definition.d.ts.map +1 -1
  280. package/dist/duct-fitting/definition.js +11 -1
  281. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  282. package/dist/duct-fitting/floorplan.js +8 -0
  283. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  284. package/dist/duct-fitting/geometry.js +52 -38
  285. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  286. package/dist/duct-fitting/parametrics.js +78 -15
  287. package/dist/duct-fitting/ports.d.ts +1 -0
  288. package/dist/duct-fitting/ports.d.ts.map +1 -1
  289. package/dist/duct-fitting/ports.js +46 -0
  290. package/dist/duct-fitting/tool.d.ts +19 -0
  291. package/dist/duct-fitting/tool.d.ts.map +1 -1
  292. package/dist/duct-fitting/tool.js +126 -34
  293. package/dist/duct-segment/continuation.d.ts +21 -0
  294. package/dist/duct-segment/continuation.d.ts.map +1 -0
  295. package/dist/duct-segment/continuation.js +167 -0
  296. package/dist/duct-segment/definition.d.ts.map +1 -1
  297. package/dist/duct-segment/definition.js +19 -18
  298. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  299. package/dist/duct-segment/floorplan.js +43 -0
  300. package/dist/duct-segment/geometry.d.ts.map +1 -1
  301. package/dist/duct-segment/geometry.js +3 -0
  302. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  303. package/dist/duct-segment/move-tool.js +33 -6
  304. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  305. package/dist/duct-segment/parametrics.js +45 -1
  306. package/dist/duct-segment/selection.d.ts +3 -4
  307. package/dist/duct-segment/selection.d.ts.map +1 -1
  308. package/dist/duct-segment/selection.js +186 -158
  309. package/dist/duct-segment/tool.d.ts +37 -0
  310. package/dist/duct-segment/tool.d.ts.map +1 -1
  311. package/dist/duct-segment/tool.js +305 -678
  312. package/dist/duct-terminal/parametrics.js +2 -2
  313. package/dist/duct-terminal/tool.d.ts.map +1 -1
  314. package/dist/duct-terminal/tool.js +37 -7
  315. package/dist/elevator/definition.d.ts.map +1 -1
  316. package/dist/elevator/definition.js +2 -0
  317. package/dist/elevator/panel.d.ts.map +1 -1
  318. package/dist/elevator/panel.js +7 -7
  319. package/dist/elevator/system.d.ts.map +1 -1
  320. package/dist/elevator/system.js +10 -1
  321. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  322. package/dist/eyebrow-vent/definition.js +8 -5
  323. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  324. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  325. package/dist/eyebrow-vent/geometry.js +60 -15
  326. package/dist/eyebrow-vent/paint.d.ts +4 -0
  327. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  328. package/dist/eyebrow-vent/paint.js +33 -0
  329. package/dist/eyebrow-vent/panel.js +1 -1
  330. package/dist/eyebrow-vent/parametrics.js +3 -3
  331. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  332. package/dist/eyebrow-vent/renderer.js +27 -8
  333. package/dist/fence/curve-tool.d.ts.map +1 -1
  334. package/dist/fence/curve-tool.js +14 -9
  335. package/dist/fence/definition.d.ts.map +1 -1
  336. package/dist/fence/definition.js +2 -1
  337. package/dist/fence/floorplan-affordances.d.ts +1 -0
  338. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  339. package/dist/fence/floorplan-affordances.js +30 -1
  340. package/dist/fence/floorplan.d.ts.map +1 -1
  341. package/dist/fence/floorplan.js +14 -0
  342. package/dist/fence/move-control-point-tool.d.ts.map +1 -1
  343. package/dist/fence/move-control-point-tool.js +13 -8
  344. package/dist/fence/move-tangent-tool.d.ts.map +1 -1
  345. package/dist/fence/move-tangent-tool.js +13 -8
  346. package/dist/fence/parametrics.js +3 -3
  347. package/dist/fence/tool.d.ts.map +1 -1
  348. package/dist/fence/tool.js +55 -31
  349. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  350. package/dist/gutter/corner-mitre.js +47 -7
  351. package/dist/gutter/definition.d.ts.map +1 -1
  352. package/dist/gutter/definition.js +23 -13
  353. package/dist/gutter/eave-align.d.ts.map +1 -1
  354. package/dist/gutter/eave-align.js +10 -0
  355. package/dist/gutter/eave-snap.d.ts +1 -1
  356. package/dist/gutter/eave-snap.d.ts.map +1 -1
  357. package/dist/gutter/eave-snap.js +10 -23
  358. package/dist/gutter/geometry.d.ts.map +1 -1
  359. package/dist/gutter/geometry.js +126 -8
  360. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  361. package/dist/gutter/outlet-lookup.js +22 -1
  362. package/dist/gutter/paint.d.ts +3 -0
  363. package/dist/gutter/paint.d.ts.map +1 -0
  364. package/dist/gutter/paint.js +6 -0
  365. package/dist/gutter/parametrics.d.ts.map +1 -1
  366. package/dist/gutter/parametrics.js +4 -1
  367. package/dist/gutter/renderer.d.ts.map +1 -1
  368. package/dist/gutter/renderer.js +63 -7
  369. package/dist/gutter/trim-clip.d.ts +3 -0
  370. package/dist/gutter/trim-clip.d.ts.map +1 -0
  371. package/dist/gutter/trim-clip.js +5 -0
  372. package/dist/hvac-equipment/parametrics.js +3 -3
  373. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  374. package/dist/hvac-equipment/tool.js +12 -2
  375. package/dist/index.d.ts +5 -2
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +9 -2
  378. package/dist/item/definition.d.ts.map +1 -1
  379. package/dist/item/definition.js +10 -2
  380. package/dist/item/floorplan-move.d.ts.map +1 -1
  381. package/dist/item/floorplan-move.js +20 -1
  382. package/dist/item/floorplan.d.ts.map +1 -1
  383. package/dist/item/floorplan.js +22 -1
  384. package/dist/item/move-tool.d.ts +28 -1
  385. package/dist/item/move-tool.d.ts.map +1 -1
  386. package/dist/item/move-tool.js +14 -2
  387. package/dist/item/renderer.d.ts.map +1 -1
  388. package/dist/item/renderer.js +16 -6
  389. package/dist/item/system.d.ts +5 -0
  390. package/dist/item/system.d.ts.map +1 -1
  391. package/dist/item/system.js +7 -1
  392. package/dist/lean-to-extension/arc.d.ts +14 -0
  393. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  394. package/dist/lean-to-extension/arc.js +56 -0
  395. package/dist/lean-to-extension/assembly.d.ts +61 -0
  396. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  397. package/dist/lean-to-extension/assembly.js +761 -0
  398. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  399. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  400. package/dist/lean-to-extension/canopy-joint.js +234 -0
  401. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  402. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  403. package/dist/lean-to-extension/conical-host.js +113 -0
  404. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  405. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  406. package/dist/lean-to-extension/corner-joint.js +1202 -0
  407. package/dist/lean-to-extension/definition.d.ts +4 -0
  408. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  409. package/dist/lean-to-extension/definition.js +433 -0
  410. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  411. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  412. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  413. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  414. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  415. package/dist/lean-to-extension/floorplan-move.js +157 -0
  416. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  417. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  418. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  419. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  420. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  421. package/dist/lean-to-extension/floorplan.js +373 -0
  422. package/dist/lean-to-extension/geometry.d.ts +7 -0
  423. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  424. package/dist/lean-to-extension/geometry.js +662 -0
  425. package/dist/lean-to-extension/index.d.ts +8 -0
  426. package/dist/lean-to-extension/index.d.ts.map +1 -0
  427. package/dist/lean-to-extension/index.js +7 -0
  428. package/dist/lean-to-extension/layout.d.ts +108 -0
  429. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  430. package/dist/lean-to-extension/layout.js +477 -0
  431. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  432. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  433. package/dist/lean-to-extension/managed-preview.js +93 -0
  434. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  435. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  436. package/dist/lean-to-extension/move-tool.js +202 -0
  437. package/dist/lean-to-extension/paint.d.ts +2 -0
  438. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  439. package/dist/lean-to-extension/paint.js +16 -0
  440. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  441. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  442. package/dist/lean-to-extension/parametrics.js +570 -0
  443. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  444. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  445. package/dist/lean-to-extension/placement-scope.js +4 -0
  446. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  447. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  448. package/dist/lean-to-extension/placement-validation.js +324 -0
  449. package/dist/lean-to-extension/placement.d.ts +59 -0
  450. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  451. package/dist/lean-to-extension/placement.js +331 -0
  452. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  453. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  454. package/dist/lean-to-extension/plan-footprint.js +27 -0
  455. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  456. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  457. package/dist/lean-to-extension/preview-geometry.js +40 -0
  458. package/dist/lean-to-extension/preview.d.ts +7 -0
  459. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  460. package/dist/lean-to-extension/preview.js +20 -0
  461. package/dist/lean-to-extension/renderer.d.ts +6 -0
  462. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  463. package/dist/lean-to-extension/renderer.js +34 -0
  464. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  465. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  466. package/dist/lean-to-extension/roof-attachment.js +376 -0
  467. package/dist/lean-to-extension/schema.d.ts +2 -0
  468. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  469. package/dist/lean-to-extension/schema.js +1 -0
  470. package/dist/lean-to-extension/slots.d.ts +5 -0
  471. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  472. package/dist/lean-to-extension/slots.js +15 -0
  473. package/dist/lean-to-extension/system.d.ts +7 -0
  474. package/dist/lean-to-extension/system.d.ts.map +1 -0
  475. package/dist/lean-to-extension/system.js +726 -0
  476. package/dist/lean-to-extension/tool.d.ts +3 -0
  477. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  478. package/dist/lean-to-extension/tool.js +580 -0
  479. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  480. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  481. package/dist/lean-to-extension/wall-target.js +29 -0
  482. package/dist/lineset/definition.d.ts.map +1 -1
  483. package/dist/lineset/definition.js +1 -0
  484. package/dist/liquid-line/definition.d.ts.map +1 -1
  485. package/dist/liquid-line/definition.js +1 -0
  486. package/dist/measurement/renderer.d.ts.map +1 -1
  487. package/dist/measurement/renderer.js +6 -5
  488. package/dist/measurement/surface-query.js +5 -5
  489. package/dist/measurement/tool.d.ts.map +1 -1
  490. package/dist/measurement/tool.js +7 -5
  491. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  492. package/dist/pipe-fitting/definition.js +16 -2
  493. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  494. package/dist/pipe-fitting/floorplan.js +4 -0
  495. package/dist/pipe-fitting/geometry.d.ts +3 -5
  496. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  497. package/dist/pipe-fitting/geometry.js +154 -21
  498. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  499. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  500. package/dist/pipe-fitting/inline-insertion.js +96 -0
  501. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  502. package/dist/pipe-fitting/parametrics.js +17 -3
  503. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  504. package/dist/pipe-fitting/ports.js +8 -1
  505. package/dist/pipe-fitting/tool.d.ts +26 -0
  506. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  507. package/dist/pipe-fitting/tool.js +182 -37
  508. package/dist/pipe-segment/continuation.d.ts +22 -0
  509. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  510. package/dist/pipe-segment/continuation.js +146 -0
  511. package/dist/pipe-segment/definition.d.ts.map +1 -1
  512. package/dist/pipe-segment/definition.js +23 -7
  513. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  514. package/dist/pipe-segment/floorplan.js +42 -0
  515. package/dist/pipe-segment/geometry.d.ts +2 -1
  516. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  517. package/dist/pipe-segment/geometry.js +4 -1
  518. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  519. package/dist/pipe-segment/move-tool.js +25 -5
  520. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  521. package/dist/pipe-segment/parametrics.js +45 -0
  522. package/dist/pipe-segment/selection.d.ts +3 -4
  523. package/dist/pipe-segment/selection.d.ts.map +1 -1
  524. package/dist/pipe-segment/selection.js +169 -105
  525. package/dist/pipe-segment/slope.d.ts +5 -0
  526. package/dist/pipe-segment/slope.d.ts.map +1 -0
  527. package/dist/pipe-segment/slope.js +10 -0
  528. package/dist/pipe-segment/tool.d.ts.map +1 -1
  529. package/dist/pipe-segment/tool.js +325 -545
  530. package/dist/pipe-trap/tool.d.ts.map +1 -1
  531. package/dist/pipe-trap/tool.js +15 -2
  532. package/dist/ridge-vent/definition.js +1 -1
  533. package/dist/ridge-vent/panel.d.ts.map +1 -1
  534. package/dist/ridge-vent/panel.js +2 -2
  535. package/dist/ridge-vent/parametrics.js +1 -1
  536. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  537. package/dist/ridge-vent/renderer.js +2 -2
  538. package/dist/roof/conical-roof-placement.d.ts +36 -0
  539. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  540. package/dist/roof/conical-roof-placement.js +134 -0
  541. package/dist/roof/conical-roof.d.ts +3 -0
  542. package/dist/roof/conical-roof.d.ts.map +1 -0
  543. package/dist/roof/conical-roof.js +53 -0
  544. package/dist/roof/definition.d.ts +3 -10
  545. package/dist/roof/definition.d.ts.map +1 -1
  546. package/dist/roof/definition.js +83 -13
  547. package/dist/roof/floorplan.d.ts +3 -10
  548. package/dist/roof/floorplan.d.ts.map +1 -1
  549. package/dist/roof/floorplan.js +139 -165
  550. package/dist/roof/index.d.ts +1 -0
  551. package/dist/roof/index.d.ts.map +1 -1
  552. package/dist/roof/index.js +1 -0
  553. package/dist/roof/panel.d.ts.map +1 -1
  554. package/dist/roof/panel.js +22 -23
  555. package/dist/roof/renderer.d.ts.map +1 -1
  556. package/dist/roof/roof-footprint-source.d.ts +16 -0
  557. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  558. package/dist/roof/roof-footprint-source.js +14 -0
  559. package/dist/roof/roof-footprint.d.ts +25 -0
  560. package/dist/roof/roof-footprint.d.ts.map +1 -0
  561. package/dist/roof/roof-footprint.js +94 -0
  562. package/dist/roof/roof-placement-mode.d.ts +18 -0
  563. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  564. package/dist/roof/roof-placement-mode.js +24 -0
  565. package/dist/roof/tool.d.ts +10 -0
  566. package/dist/roof/tool.d.ts.map +1 -0
  567. package/dist/roof/tool.js +922 -0
  568. package/dist/roof-segment/definition.d.ts.map +1 -1
  569. package/dist/roof-segment/definition.js +52 -8
  570. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  571. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  572. package/dist/roof-segment/floorplan-affordances.js +64 -18
  573. package/dist/roof-segment/floorplan.d.ts +3 -2
  574. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  575. package/dist/roof-segment/floorplan.js +95 -46
  576. package/dist/roof-segment/panel.d.ts.map +1 -1
  577. package/dist/roof-segment/panel.js +122 -27
  578. package/dist/scan/definition.d.ts +2 -3
  579. package/dist/scan/definition.d.ts.map +1 -1
  580. package/dist/scan/definition.js +9 -7
  581. package/dist/scan/parametrics.d.ts.map +1 -1
  582. package/dist/scan/parametrics.js +13 -1
  583. package/dist/scan/renderer.d.ts.map +1 -1
  584. package/dist/scan/renderer.js +8 -2
  585. package/dist/shared/accessory-cursor.d.ts +7 -0
  586. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  587. package/dist/shared/accessory-cursor.js +83 -0
  588. package/dist/shared/accessory-floorplan.d.ts +4 -0
  589. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  590. package/dist/shared/accessory-floorplan.js +51 -0
  591. package/dist/shared/accessory-geometry.d.ts +7 -0
  592. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  593. package/dist/shared/accessory-geometry.js +79 -0
  594. package/dist/shared/accessory-placement.d.ts +10 -0
  595. package/dist/shared/accessory-placement.d.ts.map +1 -0
  596. package/dist/shared/accessory-placement.js +126 -0
  597. package/dist/shared/accessory-snapping.d.ts +5 -0
  598. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  599. package/dist/shared/accessory-snapping.js +40 -0
  600. package/dist/shared/automatic-run-end-cap.d.ts +11 -0
  601. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  602. package/dist/shared/automatic-run-end-cap.js +159 -0
  603. package/dist/shared/block-face-host.d.ts +15 -0
  604. package/dist/shared/block-face-host.d.ts.map +1 -0
  605. package/dist/shared/block-face-host.js +36 -0
  606. package/dist/shared/connection-compatibility.d.ts +8 -0
  607. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  608. package/dist/shared/connection-compatibility.js +28 -0
  609. package/dist/shared/connection-feedback.d.ts +10 -0
  610. package/dist/shared/connection-feedback.d.ts.map +1 -0
  611. package/dist/shared/connection-feedback.js +17 -0
  612. package/dist/shared/distribution-run-contract.d.ts +49 -0
  613. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  614. package/dist/shared/distribution-run-contract.js +30 -0
  615. package/dist/shared/distribution-run-tool.d.ts +107 -0
  616. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  617. package/dist/shared/distribution-run-tool.js +941 -0
  618. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  619. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  620. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  621. package/dist/shared/duct-adapter.d.ts +10 -0
  622. package/dist/shared/duct-adapter.d.ts.map +1 -0
  623. package/dist/shared/duct-adapter.js +43 -0
  624. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  625. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  626. package/dist/shared/elbow-branch-continuation.js +200 -0
  627. package/dist/shared/fitting-clearance.d.ts +5 -0
  628. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  629. package/dist/shared/fitting-clearance.js +11 -0
  630. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  631. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  632. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  633. package/dist/shared/fitting-surface-support.d.ts +5 -0
  634. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  635. package/dist/shared/fitting-surface-support.js +42 -0
  636. package/dist/shared/fitting-tool-options.d.ts +4 -0
  637. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  638. package/dist/shared/fitting-tool-options.js +175 -0
  639. package/dist/shared/floor-placement.d.ts +1 -1
  640. package/dist/shared/floor-placement.d.ts.map +1 -1
  641. package/dist/shared/floor-placement.js +13 -33
  642. package/dist/shared/ghost-materials.d.ts.map +1 -1
  643. package/dist/shared/ghost-materials.js +2 -1
  644. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  645. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  646. package/dist/shared/lean-to-post-omissions.js +51 -0
  647. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  648. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  649. package/dist/shared/mep-fitting-actions.js +16 -0
  650. package/dist/shared/mep-ghost.d.ts.map +1 -1
  651. package/dist/shared/mep-ghost.js +19 -1
  652. package/dist/shared/mep-presets.d.ts +11 -0
  653. package/dist/shared/mep-presets.d.ts.map +1 -0
  654. package/dist/shared/mep-presets.js +34 -0
  655. package/dist/shared/node-batch/candidates.d.ts +29 -0
  656. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  657. package/dist/shared/node-batch/candidates.js +260 -0
  658. package/dist/shared/node-batch/store.d.ts +26 -0
  659. package/dist/shared/node-batch/store.d.ts.map +1 -0
  660. package/dist/shared/node-batch/store.js +319 -0
  661. package/dist/shared/node-batch/system.d.ts +8 -0
  662. package/dist/shared/node-batch/system.d.ts.map +1 -0
  663. package/dist/shared/node-batch/system.js +569 -0
  664. package/dist/shared/node-batch/types.d.ts +99 -0
  665. package/dist/shared/node-batch/types.d.ts.map +1 -0
  666. package/dist/shared/node-batch/types.js +4 -0
  667. package/dist/shared/opening-move-history.d.ts +47 -0
  668. package/dist/shared/opening-move-history.d.ts.map +1 -0
  669. package/dist/shared/opening-move-history.js +18 -0
  670. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  671. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  672. package/dist/shared/opening-move-wall-gate.js +44 -0
  673. package/dist/shared/path-point-affordance.d.ts +2 -2
  674. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  675. package/dist/shared/path-point-affordance.js +30 -6
  676. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  677. package/dist/shared/placeholder-geometry.js +4 -0
  678. package/dist/shared/ports.d.ts +20 -3
  679. package/dist/shared/ports.d.ts.map +1 -1
  680. package/dist/shared/ports.js +148 -7
  681. package/dist/shared/primitive-uv.d.ts +17 -0
  682. package/dist/shared/primitive-uv.d.ts.map +1 -0
  683. package/dist/shared/primitive-uv.js +107 -0
  684. package/dist/shared/reducer-size.d.ts +2 -0
  685. package/dist/shared/reducer-size.d.ts.map +1 -0
  686. package/dist/shared/reducer-size.js +12 -0
  687. package/dist/shared/ridge-snap.js +1 -1
  688. package/dist/shared/roof-surface.d.ts.map +1 -1
  689. package/dist/shared/roof-surface.js +17 -2
  690. package/dist/shared/run-cursor.d.ts +22 -0
  691. package/dist/shared/run-cursor.d.ts.map +1 -0
  692. package/dist/shared/run-cursor.js +19 -0
  693. package/dist/shared/run-direction-feedback.d.ts +20 -0
  694. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  695. package/dist/shared/run-direction-feedback.js +139 -0
  696. package/dist/shared/run-hanger-controls.d.ts +7 -0
  697. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  698. package/dist/shared/run-hanger-controls.js +44 -0
  699. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  700. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  701. package/dist/shared/run-hanger-inspector.js +43 -0
  702. package/dist/shared/run-hanger-mode.d.ts +11 -0
  703. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  704. package/dist/shared/run-hanger-mode.js +32 -0
  705. package/dist/shared/run-hanger-system.d.ts +3 -0
  706. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  707. package/dist/shared/run-hanger-system.js +39 -0
  708. package/dist/shared/run-hangers.d.ts +25 -0
  709. package/dist/shared/run-hangers.d.ts.map +1 -0
  710. package/dist/shared/run-hangers.js +261 -0
  711. package/dist/shared/run-port-snap.d.ts +11 -0
  712. package/dist/shared/run-port-snap.d.ts.map +1 -0
  713. package/dist/shared/run-port-snap.js +19 -0
  714. package/dist/shared/run-screen-direction.d.ts +5 -0
  715. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  716. package/dist/shared/run-screen-direction.js +24 -0
  717. package/dist/shared/selection-handles.d.ts +4 -0
  718. package/dist/shared/selection-handles.d.ts.map +1 -1
  719. package/dist/shared/selection-handles.js +10 -0
  720. package/dist/shared/slot-paint.d.ts +8 -1
  721. package/dist/shared/slot-paint.d.ts.map +1 -1
  722. package/dist/shared/slot-paint.js +120 -27
  723. package/dist/shared/surface-paint.d.ts +1 -2
  724. package/dist/shared/surface-paint.d.ts.map +1 -1
  725. package/dist/shared/surface-paint.js +9 -20
  726. package/dist/shared/system-check-panel.d.ts +6 -0
  727. package/dist/shared/system-check-panel.d.ts.map +1 -0
  728. package/dist/shared/system-check-panel.js +62 -0
  729. package/dist/shared/system-checks.d.ts +9 -0
  730. package/dist/shared/system-checks.d.ts.map +1 -0
  731. package/dist/shared/system-checks.js +131 -0
  732. package/dist/shared/wall-attach-target.d.ts +14 -2
  733. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  734. package/dist/shared/wall-attach-target.js +108 -4
  735. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  736. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  737. package/dist/shared/wall-opening-clearance.js +28 -0
  738. package/dist/shared/wall-run-move.d.ts +17 -0
  739. package/dist/shared/wall-run-move.d.ts.map +1 -0
  740. package/dist/shared/wall-run-move.js +56 -0
  741. package/dist/shelf/parametrics.js +4 -4
  742. package/dist/site/renderer.d.ts.map +1 -1
  743. package/dist/site/renderer.js +40 -28
  744. package/dist/site/terrain-geometry.d.ts +1 -1
  745. package/dist/site/terrain-geometry.d.ts.map +1 -1
  746. package/dist/site/terrain-geometry.js +35 -9
  747. package/dist/site/terrain-mesh.d.ts +5 -0
  748. package/dist/site/terrain-mesh.d.ts.map +1 -1
  749. package/dist/site/terrain-mesh.js +63 -34
  750. package/dist/skylight/definition.js +1 -1
  751. package/dist/skylight/panel.js +1 -1
  752. package/dist/skylight/parametrics.js +2 -2
  753. package/dist/slab/definition.d.ts.map +1 -1
  754. package/dist/slab/definition.js +6 -1
  755. package/dist/slab/dependency-tracker.d.ts +3 -0
  756. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  757. package/dist/slab/dependency-tracker.js +104 -0
  758. package/dist/slab/floorplan-affordances.d.ts +8 -8
  759. package/dist/slab/geometry.d.ts.map +1 -1
  760. package/dist/slab/geometry.js +16 -2
  761. package/dist/slab/panel.d.ts.map +1 -1
  762. package/dist/slab/panel.js +1 -1
  763. package/dist/slab/parametrics.js +1 -1
  764. package/dist/slab/system.d.ts.map +1 -1
  765. package/dist/slab/system.js +8 -64
  766. package/dist/solar-panel/definition.js +1 -1
  767. package/dist/solar-panel/panel.js +1 -1
  768. package/dist/solar-panel/parametrics.js +2 -2
  769. package/dist/stair/panel.d.ts.map +1 -1
  770. package/dist/stair/panel.js +18 -13
  771. package/dist/stair/stair-type.d.ts +18 -0
  772. package/dist/stair/stair-type.d.ts.map +1 -0
  773. package/dist/stair/stair-type.js +25 -0
  774. package/dist/stair-segment/panel.d.ts.map +1 -1
  775. package/dist/stair-segment/panel.js +44 -5
  776. package/dist/turbine-vent/definition.d.ts.map +1 -1
  777. package/dist/turbine-vent/definition.js +8 -5
  778. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  779. package/dist/turbine-vent/geometry.js +48 -18
  780. package/dist/turbine-vent/paint.d.ts +4 -0
  781. package/dist/turbine-vent/paint.d.ts.map +1 -0
  782. package/dist/turbine-vent/paint.js +35 -0
  783. package/dist/turbine-vent/panel.js +1 -1
  784. package/dist/turbine-vent/parametrics.js +2 -2
  785. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  786. package/dist/turbine-vent/renderer.js +31 -9
  787. package/dist/wall/curve-eligibility.d.ts +3 -0
  788. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  789. package/dist/wall/curve-eligibility.js +10 -0
  790. package/dist/wall/curve-tool.d.ts +3 -4
  791. package/dist/wall/curve-tool.d.ts.map +1 -1
  792. package/dist/wall/curve-tool.js +24 -23
  793. package/dist/wall/definition.d.ts +1 -1
  794. package/dist/wall/definition.d.ts.map +1 -1
  795. package/dist/wall/definition.js +36 -13
  796. package/dist/wall/floorplan-affordances.d.ts +1 -0
  797. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  798. package/dist/wall/floorplan-affordances.js +46 -7
  799. package/dist/wall/floorplan-move.d.ts +3 -4
  800. package/dist/wall/floorplan-move.d.ts.map +1 -1
  801. package/dist/wall/floorplan-move.js +122 -9
  802. package/dist/wall/floorplan.d.ts.map +1 -1
  803. package/dist/wall/floorplan.js +19 -23
  804. package/dist/wall/move-shared.d.ts.map +1 -1
  805. package/dist/wall/move-shared.js +10 -7
  806. package/dist/wall/paint.d.ts.map +1 -1
  807. package/dist/wall/paint.js +2 -0
  808. package/dist/wall/panel.d.ts.map +1 -1
  809. package/dist/wall/panel.js +62 -27
  810. package/dist/wall/parametrics.js +2 -2
  811. package/dist/wall/pointer-transparency.d.ts +128 -0
  812. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  813. package/dist/wall/pointer-transparency.js +147 -0
  814. package/dist/wall/renderer.d.ts.map +1 -1
  815. package/dist/wall/renderer.js +65 -8
  816. package/dist/wall/selection-hit-owner.d.ts +53 -0
  817. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  818. package/dist/wall/selection-hit-owner.js +79 -0
  819. package/dist/wall/system.d.ts +5 -0
  820. package/dist/wall/system.d.ts.map +1 -1
  821. package/dist/wall/system.js +71 -26
  822. package/dist/wall/tool.d.ts.map +1 -1
  823. package/dist/wall/tool.js +29 -27
  824. package/dist/wall/treatment-level-data.d.ts +6 -1
  825. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  826. package/dist/wall/treatment-level-data.js +82 -5
  827. package/dist/wall/treatments.d.ts +1 -0
  828. package/dist/wall/treatments.d.ts.map +1 -1
  829. package/dist/wall/treatments.js +5 -0
  830. package/dist/wall/wall-batch-system.d.ts +55 -0
  831. package/dist/wall/wall-batch-system.d.ts.map +1 -0
  832. package/dist/wall/wall-batch-system.js +486 -0
  833. package/dist/wall/wall-batch.d.ts +66 -0
  834. package/dist/wall/wall-batch.d.ts.map +1 -0
  835. package/dist/wall/wall-batch.js +169 -0
  836. package/dist/window/definition.d.ts +2 -1
  837. package/dist/window/definition.d.ts.map +1 -1
  838. package/dist/window/definition.js +51 -24
  839. package/dist/window/floorplan-move.d.ts.map +1 -1
  840. package/dist/window/floorplan-move.js +1 -1
  841. package/dist/window/move-tool.d.ts +7 -5
  842. package/dist/window/move-tool.d.ts.map +1 -1
  843. package/dist/window/move-tool.js +344 -58
  844. package/dist/window/panel.d.ts.map +1 -1
  845. package/dist/window/panel.js +2 -0
  846. package/dist/window/parametrics.js +2 -2
  847. package/dist/window/renderer.d.ts.map +1 -1
  848. package/dist/window/renderer.js +5 -7
  849. package/dist/window/tool.d.ts.map +1 -1
  850. package/dist/window/tool.js +227 -13
  851. package/dist/zone/floorplan-affordances.d.ts +12 -12
  852. package/dist/zone/quantities-panel.d.ts.map +1 -1
  853. package/dist/zone/quantities-panel.js +4 -3
  854. package/package.json +11 -9
  855. package/dist/dormer/panel-window-section.d.ts +0 -14
  856. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  857. package/dist/dormer/panel-window-section.js +0 -59
  858. package/dist/dormer/window-assembly.d.ts +0 -22
  859. package/dist/dormer/window-assembly.d.ts.map +0 -1
  860. package/dist/dormer/window-assembly.js +0 -111
  861. package/dist/dormer/window-frame.d.ts +0 -24
  862. package/dist/dormer/window-frame.d.ts.map +0 -1
  863. package/dist/dormer/window-frame.js +0 -100
@@ -1,23 +1,29 @@
1
- import { getMaxWallCurveOffset, getWallChordFrame, normalizeWallCurveOffset, runAsSingleSceneHistoryStep, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
1
+ import { constrainWallCurveOffsetToAvoidIntersections, getMaxWallCurveOffset, getWallChordFrame, getWallCurveFrameAt, getWallThickness, normalizeWallCurveOffset, runAsSingleSceneHistoryStep, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
2
  import { alignFloorplanDraftPoint, getSegmentGridStep, isAlignmentGuideActive, isAngleSnapActive, isMagneticSnapActive, isSegmentLongEnough, resolveEndpointWallSplit, snapBuildingLocalToWorldGrid, snapScalarToGrid, snapWallDraftPoint, useAlignmentGuides, } from '@pascal-app/editor';
3
+ const MIN_WALL_THICKNESS = 0.05;
3
4
  function pointsEqual(a, b) {
4
5
  return a[0] === b[0] && a[1] === b[1];
5
6
  }
6
- function collectLevelWalls(nodes, excludeWallId) {
7
+ function collectLevelWalls(nodes, parentId, excludeWallId) {
7
8
  const out = [];
8
9
  for (const node of Object.values(nodes)) {
9
- if (node?.type === 'wall' && node.id !== excludeWallId)
10
+ if (node?.type === 'wall' &&
11
+ node.id !== excludeWallId &&
12
+ (node.parentId ?? null) === parentId) {
10
13
  out.push(node);
14
+ }
11
15
  }
12
16
  return out;
13
17
  }
14
- function collectLinkedWalls(nodes, draggedWallId, originalStart, originalEnd) {
18
+ function collectLinkedWalls(nodes, draggedWallId, parentId, originalStart, originalEnd) {
15
19
  const linked = [];
16
20
  for (const node of Object.values(nodes)) {
17
21
  if (node?.type !== 'wall')
18
22
  continue;
19
23
  if (node.id === draggedWallId)
20
24
  continue;
25
+ if ((node.parentId ?? null) !== parentId)
26
+ continue;
21
27
  const wall = node;
22
28
  if (pointsEqual(wall.start, originalStart) ||
23
29
  pointsEqual(wall.start, originalEnd) ||
@@ -65,7 +71,9 @@ export const wallCurveAffordance = {
65
71
  const offsetFromMidpoint = -((x - chord.midpoint.x) * chord.normal.x +
66
72
  (y - chord.midpoint.y) * chord.normal.y);
67
73
  const snappedOffset = snapScalarToGrid(offsetFromMidpoint, snapStep);
68
- const nextCurveOffset = normalizeWallCurveOffset(node, Math.max(-maxOffset, Math.min(maxOffset, snappedOffset)));
74
+ const requestedCurveOffset = normalizeWallCurveOffset(node, Math.max(-maxOffset, Math.min(maxOffset, snappedOffset)));
75
+ const sceneNodes = useScene.getState().nodes;
76
+ const nextCurveOffset = constrainWallCurveOffsetToAvoidIntersections(node, requestedCurveOffset, Object.values(sceneNodes).filter((candidate) => candidate.type === 'wall' && candidate.parentId === node.parentId));
69
77
  lastCurveOffset = nextCurveOffset;
70
78
  // Publish the curve preview as a live override so renderers see
71
79
  // it without zustand churn. Mark the wall dirty so `WallSystem`
@@ -89,13 +97,43 @@ export const wallCurveAffordance = {
89
97
  };
90
98
  },
91
99
  };
100
+ export const wallThicknessAffordance = {
101
+ start({ node, payload, initialPlanPoint }) {
102
+ const { side } = payload;
103
+ const frame = getWallCurveFrameAt(node, 0.5);
104
+ const outwardX = frame.normal.x * side;
105
+ const outwardY = frame.normal.y * side;
106
+ const initialThickness = getWallThickness(node);
107
+ const wallId = node.id;
108
+ let lastThickness = initialThickness;
109
+ return {
110
+ affectedIds: [wallId],
111
+ apply({ planPoint }) {
112
+ const outwardDelta = (planPoint[0] - initialPlanPoint[0]) * outwardX +
113
+ (planPoint[1] - initialPlanPoint[1]) * outwardY;
114
+ const rawThickness = initialThickness + outwardDelta * 2;
115
+ lastThickness = Math.max(MIN_WALL_THICKNESS, snapScalarToGrid(rawThickness, getSegmentGridStep()));
116
+ useLiveNodeOverrides.getState().set(wallId, { thickness: lastThickness });
117
+ useScene.getState().markDirty(wallId);
118
+ },
119
+ canCommit() {
120
+ return true;
121
+ },
122
+ commit() {
123
+ useScene.getState().updateNodes([{ id: wallId, data: { thickness: lastThickness } }]);
124
+ useLiveNodeOverrides.getState().clear(wallId);
125
+ },
126
+ };
127
+ },
128
+ };
92
129
  export const wallMoveEndpointAffordance = {
93
130
  start({ node, payload, nodes }) {
94
131
  const { endpoint } = payload;
95
132
  const fixedPoint = endpoint === 'start' ? [...node.end] : [...node.start];
96
133
  const originalStart = [...node.start];
97
134
  const originalEnd = [...node.end];
98
- const linkedWalls = collectLinkedWalls(nodes, node.id, originalStart, originalEnd);
135
+ const parentId = (node.parentId ?? null);
136
+ const linkedWalls = collectLinkedWalls(nodes, node.id, parentId, originalStart, originalEnd);
99
137
  const affectedIds = [node.id, ...linkedWalls.map((w) => w.id)];
100
138
  const movingOriginal = endpoint === 'start' ? originalStart : originalEnd;
101
139
  // Walls attached to the MOVING corner cascade with the drag, but the snap
@@ -123,7 +161,7 @@ export const wallMoveEndpointAffordance = {
123
161
  // the moving corner are excluded (stale coordinates); under
124
162
  // Alt-detach they stay put, so they rejoin the candidate pool.
125
163
  const sceneNodes = useScene.getState().nodes;
126
- const walls = collectLevelWalls(sceneNodes, node.id);
164
+ const walls = collectLevelWalls(sceneNodes, parentId, node.id);
127
165
  const staleWallIds = modifiers.altKey ? [node.id] : [node.id, ...movingLinkedWallIds];
128
166
  // The grid step follows the active snapping mode (`getSegmentGridStep()`
129
167
  // is 0 outside grid mode), so `'lines' / 'angles' / 'off'` no longer
@@ -153,6 +191,7 @@ export const wallMoveEndpointAffordance = {
153
191
  applySnap: isMagneticSnapActive(),
154
192
  bypass: !isAlignmentGuideActive(),
155
193
  excludeIds: staleWallIds,
194
+ levelId: parentId,
156
195
  });
157
196
  const primaryStart = endpoint === 'start' ? aligned : fixedPoint;
158
197
  const primaryEnd = endpoint === 'end' ? aligned : fixedPoint;
@@ -23,10 +23,9 @@ import { type FloorplanMoveTarget, type WallNode } from '@pascal-app/core';
23
23
  * overrides after the write lands so the system reads from the new
24
24
  * committed scene state.
25
25
  *
26
- * Auto-slab live preview and ghost bridge SVG previews — visible in
27
- * the 3D tool — are deliberately deferred. Slab polygons re-derive on
28
- * commit through the normal scene reactions; bridges appear at commit
29
- * time. Follow-up work to surface them mid-drag is tracked separately.
26
+ * Existing automatic slabs and ceilings receive live polygon overrides during
27
+ * the drag. New surfaces and removals stay deferred until commit because live
28
+ * overrides cannot represent nodes that do not exist in the scene.
30
29
  */
31
30
  export declare const wallFloorplanMoveTarget: FloorplanMoveTarget<WallNode>;
32
31
  //# sourceMappingURL=floorplan-move.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAOxB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,QAAQ,CAiRjE,CAAA"}
1
+ {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,mBAAmB,EAaxB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAqCzB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,QAAQ,CAuYjE,CAAA"}
@@ -1,7 +1,13 @@
1
- import { getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planWallMoveJunctions, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
1
+ import { detectSpacesForLevel, getCeilingClampBound, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, getStoredLevelHeight, planAutoCeilingsForLevel, planAutoSlabsForLevel, planWallMoveJunctions, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
2
  import { getFloorplanWallThickness, getSegmentGridStep, isSegmentLongEnough, snapScalarToGrid, useWallMoveGhosts, } from '@pascal-app/editor';
3
3
  import { useViewer } from '@pascal-app/viewer';
4
4
  import { buildBridgeWallCreates, buildBridgeWallPreviews, getLinkedWallSnapshots, getWallsAfterUpdates, stripWallIsNewMetadata, } from './move-shared';
5
+ function getLevelSlabs(levelId, nodes) {
6
+ return Object.values(nodes).filter((entry) => entry?.type === 'slab' && (entry.parentId ?? null) === levelId);
7
+ }
8
+ function getLevelCeilings(levelId, nodes) {
9
+ return Object.values(nodes).filter((entry) => entry?.type === 'ceiling' && (entry.parentId ?? null) === levelId);
10
+ }
5
11
  /**
6
12
  * 2D floor-plan move handler for wall.
7
13
  *
@@ -26,10 +32,9 @@ import { buildBridgeWallCreates, buildBridgeWallPreviews, getLinkedWallSnapshots
26
32
  * overrides after the write lands so the system reads from the new
27
33
  * committed scene state.
28
34
  *
29
- * Auto-slab live preview and ghost bridge SVG previews — visible in
30
- * the 3D tool — are deliberately deferred. Slab polygons re-derive on
31
- * commit through the normal scene reactions; bridges appear at commit
32
- * time. Follow-up work to surface them mid-drag is tracked separately.
35
+ * Existing automatic slabs and ceilings receive live polygon overrides during
36
+ * the drag. New surfaces and removals stay deferred until commit because live
37
+ * overrides cannot represent nodes that do not exist in the scene.
33
38
  */
34
39
  export const wallFloorplanMoveTarget = ({ node }) => {
35
40
  const wallId = node.id;
@@ -72,8 +77,75 @@ export const wallFloorplanMoveTarget = ({ node }) => {
72
77
  let lastDelta = [0, 0];
73
78
  let lastNextStart = originalStart;
74
79
  let lastNextEnd = originalEnd;
80
+ const levelId = node.parentId ?? null;
81
+ const affectedIds = [wallId, ...linkedOriginals.map((wall) => wall.id)];
82
+ const affectedIdSet = new Set(affectedIds);
83
+ const touchedSurfaceIds = new Set();
84
+ let latestSurfacePlans = null;
85
+ const planSurfaces = (walls) => {
86
+ if (!levelId)
87
+ return null;
88
+ const sceneState = useScene.getState();
89
+ const levelWalls = walls.filter((wall) => (wall.parentId ?? null) === levelId);
90
+ const { roomPolygons } = detectSpacesForLevel(levelId, levelWalls);
91
+ const slabs = planAutoSlabsForLevel(roomPolygons, getLevelSlabs(levelId, sceneState.nodes));
92
+ const levelNode = sceneState.nodes[levelId];
93
+ const ceilings = planAutoCeilingsForLevel(roomPolygons, getLevelCeilings(levelId, sceneState.nodes), {
94
+ storeyHeight: levelNode?.type === 'level' ? getStoredLevelHeight(levelNode) : undefined,
95
+ ceilingClampBound: (polygon) => getCeilingClampBound(levelId, sceneState.nodes, polygon),
96
+ });
97
+ return { slabs, ceilings };
98
+ };
99
+ const publishSurfacePreviews = (walls) => {
100
+ const plans = planSurfaces(walls);
101
+ latestSurfacePlans = plans;
102
+ if (!plans)
103
+ return;
104
+ const entries = [];
105
+ for (const update of plans.slabs.update) {
106
+ if (update.data.polygon !== undefined) {
107
+ entries.push([update.id, { polygon: update.data.polygon }]);
108
+ }
109
+ }
110
+ for (const update of plans.ceilings.update) {
111
+ if (update.data.polygon !== undefined || update.data.height !== undefined) {
112
+ entries.push([update.id, update.data]);
113
+ }
114
+ }
115
+ const nextIds = new Set(entries.map(([id]) => id));
116
+ const overrides = useLiveNodeOverrides.getState();
117
+ const sceneState = useScene.getState();
118
+ for (const id of touchedSurfaceIds) {
119
+ if (nextIds.has(id))
120
+ continue;
121
+ overrides.clear(id);
122
+ sceneState.markDirty(id);
123
+ touchedSurfaceIds.delete(id);
124
+ }
125
+ if (entries.length > 0) {
126
+ overrides.setMany(entries);
127
+ for (const [id] of entries) {
128
+ touchedSurfaceIds.add(id);
129
+ if (!affectedIdSet.has(id)) {
130
+ affectedIdSet.add(id);
131
+ affectedIds.push(id);
132
+ }
133
+ sceneState.markDirty(id);
134
+ }
135
+ }
136
+ };
137
+ const clearSurfacePreviews = () => {
138
+ const overrides = useLiveNodeOverrides.getState();
139
+ const sceneState = useScene.getState();
140
+ for (const id of touchedSurfaceIds) {
141
+ overrides.clear(id);
142
+ sceneState.markDirty(id);
143
+ }
144
+ touchedSurfaceIds.clear();
145
+ latestSurfacePlans = null;
146
+ };
75
147
  const session = {
76
- affectedIds: [wallId, ...linkedOriginals.map((w) => w.id)],
148
+ affectedIds,
77
149
  apply({ planPoint }) {
78
150
  if (!rawAnchor) {
79
151
  rawAnchor = [planPoint[0], planPoint[1]];
@@ -168,6 +240,7 @@ export const wallFloorplanMoveTarget = ({ node }) => {
168
240
  thickness: getFloorplanWallThickness(wall),
169
241
  }));
170
242
  useWallMoveGhosts.getState().setBridges(ghostBridges);
243
+ publishSurfacePreviews([...previewSceneWalls, ...bridgePreviews.map(({ wall }) => wall)]);
171
244
  // `WallSystem` only runs its rebuild pass when `dirtyNodes` is
172
245
  // non-empty. We're not writing to scene any more, but we still
173
246
  // need the system to pick up the live override changes — so
@@ -195,6 +268,7 @@ export const wallFloorplanMoveTarget = ({ node }) => {
195
268
  overrides.clear(wallId);
196
269
  for (const wall of linkedOriginals)
197
270
  overrides.clear(wall.id);
271
+ clearSurfacePreviews();
198
272
  return;
199
273
  }
200
274
  const plan = planWallMoveJunctions(linkedOriginals, originalStart, originalEnd, lastNextStart, lastNextEnd);
@@ -232,10 +306,48 @@ export const wallFloorplanMoveTarget = ({ node }) => {
232
306
  existingWalls,
233
307
  wallCount: Object.values(sceneState.nodes).filter((entry) => entry?.type === 'wall').length,
234
308
  });
309
+ const finalWalls = [
310
+ ...existingWalls,
311
+ ...bridgeCreates.map((entry) => ({ ...entry.node, parentId: entry.parentId ?? null })),
312
+ ];
313
+ const surfacePlans = planSurfaces(finalWalls) ?? latestSurfacePlans;
314
+ const surfaceUpdates = surfacePlans
315
+ ? [
316
+ ...surfacePlans.slabs.update.map((entry) => ({
317
+ id: entry.id,
318
+ data: entry.data,
319
+ })),
320
+ ...surfacePlans.ceilings.update.map((entry) => ({
321
+ id: entry.id,
322
+ data: entry.data,
323
+ })),
324
+ ]
325
+ : [];
326
+ const surfaceCreates = surfacePlans
327
+ ? [
328
+ ...surfacePlans.slabs.create.map((slab) => ({
329
+ node: slab,
330
+ parentId: levelId,
331
+ })),
332
+ ...surfacePlans.ceilings.create.map((ceiling) => ({
333
+ node: ceiling,
334
+ parentId: levelId,
335
+ })),
336
+ ]
337
+ : [];
338
+ const surfaceDeletes = surfacePlans
339
+ ? [
340
+ ...surfacePlans.slabs.delete.map((id) => id),
341
+ ...surfacePlans.ceilings.delete.map((id) => id),
342
+ ]
343
+ : [];
235
344
  sceneState.applyNodeChanges({
236
- update: commitUpdates,
237
- create: bridgeCreates,
238
- delete: Array.from(collapsedLinkedWallIds),
345
+ update: [
346
+ ...commitUpdates,
347
+ ...surfaceUpdates,
348
+ ],
349
+ create: [...bridgeCreates, ...surfaceCreates],
350
+ delete: Array.from(new Set([...collapsedLinkedWallIds, ...surfaceDeletes])),
239
351
  });
240
352
  // Drop the live overrides now that the committed scene state
241
353
  // matches them — leaving them around would keep the system
@@ -246,6 +358,7 @@ export const wallFloorplanMoveTarget = ({ node }) => {
246
358
  overrides.clear(wallId);
247
359
  for (const wall of linkedOriginals)
248
360
  overrides.clear(wall.id);
361
+ clearSurfacePreviews();
249
362
  // Swap ghosts → real walls: the bridges we just created render
250
363
  // through the registry layer, so the dashed previews aren't
251
364
  // needed any more. Clearing here (instead of waiting for the
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAOpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAKL,KAAK,6BAA6B,EACnC,MAAM,2BAA2B,CAAA;AAWlC,QAAA,MAAM,yBAAyB,yDAA0D,CAAA;AAEzF,KAAK,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAexE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,aAAa,CAAA;IAC7B,iCAAiC,EAAE,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAA;CACjG,CAAA;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,sBAAsB,CAqCzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAoMjG"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAOpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAKL,KAAK,6BAA6B,EACnC,MAAM,2BAA2B,CAAA;AAYlC,QAAA,MAAM,yBAAyB,yDAA0D,CAAA;AAEzF,KAAK,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAexE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,aAAa,CAAA;IAC7B,iCAAiC,EAAE,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAA;CACjG,CAAA;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,sBAAsB,CAqCzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAkNjG"}
@@ -2,6 +2,7 @@ import { calculateLevelMiters, getWallCurveFrameAt, getWallCurveLength, getWallM
2
2
  import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
3
3
  import { constructionDimensionStandard } from '../shared/construction-dimension-standards';
4
4
  import { buildCurvedWallConstructionDimensions, buildLevelWallConstructionDimensionPlan, buildWallConstructionDimensions, renderPlannedConstructionDimensions, } from './construction-dimensions';
5
+ import { hasWallCurveBlockingChildren } from './curve-eligibility';
5
6
  // Same constants the legacy `getFloorplanWall` uses (editor/lib/floorplan/walls.ts).
6
7
  // Slightly exaggerates thin walls so the 2D plan stays legible without
7
8
  // drifting from BIM data. Inlined to keep nodes/wall self-contained.
@@ -190,6 +191,20 @@ export function buildWallFloorplan(node, ctx) {
190
191
  affordance: 'move-endpoint',
191
192
  payload: { wallId: node.id, endpoint: 'end' },
192
193
  });
194
+ const thicknessFrame = getWallCurveFrameAt(self, 0.5);
195
+ const halfVisibleThickness = getWallThickness(self) / 2;
196
+ for (const side of [1, -1]) {
197
+ children.push({
198
+ kind: 'endpoint-handle',
199
+ point: [
200
+ thicknessFrame.point.x + thicknessFrame.normal.x * halfVisibleThickness * side,
201
+ thicknessFrame.point.y + thicknessFrame.normal.y * halfVisibleThickness * side,
202
+ ],
203
+ state: 'idle',
204
+ affordance: 'thickness',
205
+ payload: { wallId: node.id, side },
206
+ });
207
+ }
193
208
  // Side move arrows — two directional arrows at the wall midpoint,
194
209
  // pointing outward perpendicular to the wall. Mirrors the 3D
195
210
  // `WallMoveSideHandles` arrows so users can grab the wall body
@@ -217,11 +232,10 @@ export function buildWallFloorplan(node, ctx) {
217
232
  }
218
233
  }
219
234
  // Curve sagitta handle — teal dot at the wall midpoint that
220
- // controls `curveOffset`. Hidden when the wall hosts a door /
221
- // window / wall-attached item: bending the wall would tear those
222
- // children, so the legacy disables the handle in that case (see
223
- // `wallCurveHandles.hasWallChildrenBlockingCurve`).
224
- if (!hasCurveBlockingChildren(ctx.children)) {
235
+ // controls `curveOffset`. Hidden when the wall hosts an opening,
236
+ // lean-to extension, or wall-attached item because bending the host
237
+ // would tear the child geometry away from it.
238
+ if (!hasWallCurveBlockingChildren(ctx.children)) {
225
239
  const handle = getWallMidpointHandlePoint(node);
226
240
  children.push({
227
241
  kind: 'endpoint-handle',
@@ -271,21 +285,3 @@ function wallDimensionDatumPolicy(reference) {
271
285
  return 'wall-face';
272
286
  }
273
287
  }
274
- /**
275
- * Doors, windows, and wall-attached items would tear if the wall bent
276
- * around them, so the curve sagitta handle hides when any of those
277
- * children exist. Mirrors the legacy
278
- * `wallCurveHandles.hasWallChildrenBlockingCurve` check.
279
- */
280
- function hasCurveBlockingChildren(children) {
281
- for (const child of children) {
282
- if (child.type === 'door' || child.type === 'window')
283
- return true;
284
- if (child.type === 'item') {
285
- const attachTo = child.asset?.attachTo;
286
- if (attachTo === 'wall' || attachTo === 'wall-side')
287
- return true;
288
- }
289
- }
290
- return false;
291
- }
@@ -1 +1 @@
1
- {"version":3,"file":"move-shared.d.ts","sourceRoot":"","sources":["../../src/wall/move-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAKd,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAA;AAczB,wBAAgB,SAAS,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,WAE3D;AAMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAQvF;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAA;AAEzC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,aAAa,CAAA;CAC3B,GAAG,kBAAkB,EAAE,CA2CvB;AA0BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,UAiB/C;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACpD,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC,GACzD,QAAQ,EAAE,CASZ;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC1D,SAAS,EAAE,aAAa,CAAA;IACxB,OAAO,EAAE,aAAa,CAAA;IACtB,aAAa,EAAE,QAAQ,EAAE,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAkClD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,aAAa,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC1D,SAAS,EAAE,aAAa,CAAA;IACxB,OAAO,EAAE,aAAa,CAAA;IACtB,aAAa,EAAE,QAAQ,EAAE,CAAA;CAC1B,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAqCrD"}
1
+ {"version":3,"file":"move-shared.d.ts","sourceRoot":"","sources":["../../src/wall/move-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAKd,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAA;AAczB,wBAAgB,SAAS,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,WAE3D;AAMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAQvF;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAA;AAEzC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,aAAa,CAAA;CAC3B,GAAG,kBAAkB,EAAE,CA2CvB;AA4BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,UAiB/C;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACpD,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC,GACzD,QAAQ,EAAE,CASZ;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC1D,SAAS,EAAE,aAAa,CAAA;IACxB,OAAO,EAAE,aAAa,CAAA;IACtB,aAAa,EAAE,QAAQ,EAAE,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAoClD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,aAAa,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC1D,SAAS,EAAE,aAAa,CAAA;IACxB,OAAO,EAAE,aAAa,CAAA;IACtB,aAAa,EAAE,QAAQ,EAAE,CAAA;CAC1B,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAyCrD"}
@@ -61,9 +61,10 @@ export function getLinkedWallSnapshots(args) {
61
61
  }
62
62
  return snapshots;
63
63
  }
64
- function wallSegmentExists(walls, start, end) {
65
- return walls.some((wall) => (samePoint(wall.start, start) && samePoint(wall.end, end)) ||
66
- (samePoint(wall.start, end) && samePoint(wall.end, start)));
64
+ function wallSegmentExists(walls, start, end, parentId) {
65
+ return walls.some((wall) => wall.parentId === parentId &&
66
+ ((samePoint(wall.start, start) && samePoint(wall.end, end)) ||
67
+ (samePoint(wall.start, end) && samePoint(wall.end, start))));
67
68
  }
68
69
  // Resolve a wall slot ref (`library:`/`scene:`) to a swatch colour, or
69
70
  // undefined when the ref is absent / dangling / colourless.
@@ -108,7 +109,7 @@ export function buildBridgeWallCreates(args) {
108
109
  if (!isSegmentLongEnough(plan.originalPoint, nextPoint)) {
109
110
  continue;
110
111
  }
111
- if (wallSegmentExists(wallsForDuplicateCheck, plan.originalPoint, nextPoint)) {
112
+ if (wallSegmentExists(wallsForDuplicateCheck, plan.originalPoint, nextPoint, plan.wall.parentId)) {
112
113
  continue;
113
114
  }
114
115
  const { id: _id, parentId: _parentId, children: _children, ...sourceWall } = plan.wall;
@@ -124,20 +125,22 @@ export function buildBridgeWallCreates(args) {
124
125
  node: bridgeWall,
125
126
  parentId: (plan.wall.parentId ?? undefined),
126
127
  });
127
- wallsForDuplicateCheck.push(bridgeWall);
128
+ wallsForDuplicateCheck.push({ ...bridgeWall, parentId: plan.wall.parentId });
128
129
  }
129
130
  return creates;
130
131
  }
131
132
  export function buildBridgeWallPreviews(args) {
132
133
  const { bridgePlans, nextStart, nextEnd, existingWalls } = args;
133
- const wallsForDuplicateCheck = [...existingWalls];
134
+ const wallsForDuplicateCheck = [
135
+ ...existingWalls,
136
+ ];
134
137
  const previews = [];
135
138
  for (const plan of bridgePlans) {
136
139
  const nextPoint = plan.movedEndpoint === 'start' ? nextStart : nextEnd;
137
140
  if (!isSegmentLongEnough(plan.originalPoint, nextPoint)) {
138
141
  continue;
139
142
  }
140
- if (wallSegmentExists(wallsForDuplicateCheck, plan.originalPoint, nextPoint)) {
143
+ if (wallSegmentExists(wallsForDuplicateCheck, plan.originalPoint, nextPoint, plan.wall.parentId)) {
141
144
  continue;
142
145
  }
143
146
  const { id: _id, children: _children, ...sourceWall } = plan.wall;
@@ -1 +1 @@
1
- {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/wall/paint.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,eAAe,EAOpB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAA2C,KAAK,GAAG,EAAa,MAAM,OAAO,CAAA;AAoDpF;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IACrD,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IAC5D,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,GAAG,MAAM,GAAG,IAAI,CA+DhB;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,eAoCtB,CAAA"}
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/wall/paint.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,eAAe,EAOpB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAA2C,KAAK,GAAG,EAAa,MAAM,OAAO,CAAA;AAqDpF;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IACrD,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IAC5D,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,GAAG,MAAM,GAAG,IAAI,CA+DhB;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,eAoCtB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { getEffectiveWallSurfaceMaterial, getWallBandSlotId, getWallFaceBandConfig, getWallFaceBandForHeight, getWallSurfaceSideFromBandSlot, parseMaterialRef, sceneRegistry, useScene, WALL_SURFACE_SLOT_DEFAULTS, } from '@pascal-app/core';
2
+ import { setSurfaceRaycastLayers } from '@pascal-app/viewer';
2
3
  import { Raycaster } from 'three';
3
4
  import { buildSlotPreviewMaterial, createSlotPaintCapability, previewSlotByUserData, } from '../shared/slot-paint';
4
5
  import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
@@ -20,6 +21,7 @@ const WALL_INDEX_SLOT = new Map(Object.entries(WALL_ARRAY_SLOT_INDEX).map(([slot
20
21
  slotId,
21
22
  ]));
22
23
  const wallSlotRaycaster = new Raycaster();
24
+ setSurfaceRaycastLayers(wallSlotRaycaster.layers);
23
25
  function resolveSideFromMaterialIndex(materialIndex) {
24
26
  const slotId = materialIndex === null ? undefined : WALL_INDEX_SLOT.get(materialIndex);
25
27
  if (slotId)
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"AAoEA,MAAM,CAAC,OAAO,UAAU,SAAS,uCAwRhC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"AA0FA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA8ThC"}
@@ -1,11 +1,28 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { buildWallFaceBandCountPatch, getClampedWallCurveOffset, getMaxWallCurveOffset, getWallCurveLength, getWallFaceBandConfig, normalizeWallCurveOffset, useLiveNodeOverrides, useScene, WALL_CHAIR_RAIL_DEFAULT, WALL_CROWN_DEFAULT, WALL_FACE_BAND_DEFAULT, WALL_SKIRTING_DEFAULT, } from '@pascal-app/core';
4
- import { ActionButton, ActionGroup, curveReshapeScope, getLinearUnitLabel, linearControlValueToMeters, metersToLinearUnit, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useInteractionScope, } from '@pascal-app/editor';
3
+ import { buildWallFaceBandCountPatch, GROUND_SUPPORT_ID, getClampedWallCurveOffset, getMaxWallCurveOffset, getWallCurveLength, getWallFaceBandConfig, normalizeWallCurveOffset, terrainSupportLift, useLiveNodeOverrides, useScene, WALL_CHAIR_RAIL_DEFAULT, WALL_CROWN_DEFAULT, WALL_FACE_BAND_DEFAULT, WALL_SKIRTING_DEFAULT, } from '@pascal-app/core';
4
+ import { ActionButton, ActionGroup, curveReshapeScope, formatLinearMeasurement, getLinearUnitLabel, linearControlValueToMeters, metersToLinearUnit, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useInteractionScope, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Spline } from 'lucide-react';
7
7
  import { useCallback, useMemo, useRef } from 'react';
8
8
  import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
9
+ import { hasWallCurveBlockingChildren } from './curve-eligibility';
10
+ /**
11
+ * Base half of the plane-bound repair: a stamped draft offset goes, and a
12
+ * ground host is dropped unless sculpted terrain actually supports it — a
13
+ * terrain-less ground host (regression-era data) pins the base at the level
14
+ * floor and buries the wall in any later slab.
15
+ */
16
+ function wallBaseRepairPatch(n) {
17
+ const nodes = useScene.getState().nodes;
18
+ const terrainSupported = n.parentId != null && terrainSupportLift(nodes, n.parentId, n.start[0], n.start[1]) != null;
19
+ return {
20
+ supportOffset: undefined,
21
+ ...(n.supportSlabId === GROUND_SUPPORT_ID && !terrainSupported
22
+ ? { supportSlabId: undefined }
23
+ : {}),
24
+ };
25
+ }
9
26
  const WALL_TRIM_PROFILE_OPTIONS = {
10
27
  skirting: [
11
28
  { label: 'Flat', value: 'flat' },
@@ -47,22 +64,14 @@ export default function WallPanel() {
47
64
  return { ...sceneNode, ...liveOverride };
48
65
  }, [sceneNode, liveOverride]);
49
66
  // Boolean selector — re-renders only when this specific wall's child
50
- // composition crosses the "has a door/window/wall-item" threshold.
67
+ // composition crosses the "has an incompatible hosted child" threshold.
51
68
  const hasWallChildrenBlockingCurve = useScene((s) => {
52
69
  if (!node)
53
70
  return false;
54
- return (node.children ?? []).some((childId) => {
71
+ return hasWallCurveBlockingChildren((node.children ?? []).flatMap((childId) => {
55
72
  const child = s.nodes[childId];
56
- if (!child)
57
- return false;
58
- if (child.type === 'door' || child.type === 'window')
59
- return true;
60
- if (child.type === 'item') {
61
- const attachTo = child.asset?.attachTo;
62
- return attachTo === 'wall' || attachTo === 'wall-side';
63
- }
64
- return false;
65
- });
73
+ return child ? [child] : [];
74
+ }));
66
75
  });
67
76
  // Existing plane-bound walls have no stored height. Resolve their current
68
77
  // body height for display and materialize it if the user edits height or
@@ -103,15 +112,37 @@ export default function WallPanel() {
103
112
  ];
104
113
  handleUpdate({ end: newEnd });
105
114
  }, [handleUpdate]);
106
- const handleBaseModeChange = useCallback((mode) => {
115
+ const handleTopModeChange = useCallback((mode) => {
107
116
  const n = nodeRef.current;
108
117
  if (!n)
109
118
  return;
110
- const height = n.height ?? resolveWallOpeningCeiling(n, useScene.getState().nodes);
111
- handleUpdate({
112
- height: Math.max(0.1, height),
113
- fillToTerrain: mode === 'terrain' ? true : undefined,
114
- });
119
+ const isCustom = n.height != null;
120
+ if (mode === 'custom' && !isCustom) {
121
+ // Seed from the current effective height so the geometry doesn't
122
+ // jump at the moment of detaching from the storey plane.
123
+ const seeded = resolveWallOpeningCeiling(n, useScene.getState().nodes);
124
+ handleUpdate({ height: Math.max(0.1, seeded) });
125
+ }
126
+ else if (mode === 'storey' && isCustom) {
127
+ // Absent `height` = plane-bound; the store strips undefined keys.
128
+ handleUpdate({ height: undefined, ...wallBaseRepairPatch(n) });
129
+ }
130
+ }, [handleUpdate]);
131
+ // Terrain infill only extends the bottom; it must never materialize an
132
+ // explicit height, or toggling it would silently detach the wall top from
133
+ // the storey plane. "Auto" is a re-election, so it carries the same base
134
+ // repair as the follows-level toggle — and the control fires on a click of
135
+ // the already-selected segment, so regression-era walls that DISPLAY Auto
136
+ // while secretly ground-pinned heal from a click on Auto itself.
137
+ const handleInfillChange = useCallback((mode) => {
138
+ const n = nodeRef.current;
139
+ if (!n)
140
+ return;
141
+ if (mode === 'terrain') {
142
+ handleUpdate({ fillToTerrain: true });
143
+ return;
144
+ }
145
+ handleUpdate({ fillToTerrain: undefined, ...wallBaseRepairPatch(n) });
115
146
  }, [handleUpdate]);
116
147
  const handleClose = useCallback(() => {
117
148
  setSelection({ selectedIds: [] });
@@ -127,6 +158,7 @@ export default function WallPanel() {
127
158
  return null;
128
159
  const length = getWallCurveLength(node);
129
160
  const followsTerrain = node.fillToTerrain === true;
161
+ const isPlaneBound = node.height == null;
130
162
  const height = node.height ?? resolvedHeightMeters ?? 2.5;
131
163
  const thickness = node.thickness ?? 0.1;
132
164
  const curveOffset = getClampedWallCurveOffset(node);
@@ -142,14 +174,17 @@ export default function WallPanel() {
142
174
  const skirting = { ...WALL_SKIRTING_DEFAULT, ...(node.skirting ?? {}) };
143
175
  const crown = { ...WALL_CROWN_DEFAULT, ...(node.crown ?? {}) };
144
176
  const chairRail = { ...WALL_CHAIR_RAIL_DEFAULT, ...(node.chairRail ?? {}) };
145
- return (_jsxs(PanelWrapper, { icon: "/icons/wall.webp", onClose: handleClose, title: node.name || 'Wall', width: 280, children: [_jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Length", max: metersToLinearUnit(20, unit), min: metersToLinearUnit(0.1, unit), onChange: (value) => handleUpdateLength(linearControlValueToMeters(value, unit, { maxMeters: 20, minMeters: 0.1 })), precision: 2, step: unit === 'imperial' ? 0.1 : 0.01, unit: unitLabel, value: displayLength }), _jsx(SliderControl, { label: "Height", max: metersToLinearUnit(6, unit), min: metersToLinearUnit(0.1, unit), onChange: (v) => handleUpdate({
146
- height: linearControlValueToMeters(v, unit, { maxMeters: 6, minMeters: 0.1 }),
147
- }), precision: 2, step: 0.1, unit: unitLabel, value: Math.round(displayHeight * 100) / 100 }), _jsx("div", { className: "px-1 font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Base" }), _jsx(SegmentedControl, { onChange: handleBaseModeChange, options: [
148
- { label: 'Fixed', value: 'fixed' },
149
- { label: 'Follows level', value: 'terrain' },
150
- ], value: followsTerrain ? 'terrain' : 'fixed' }), followsTerrain && (_jsx("div", { className: "px-1 text-[11px] text-muted-foreground", children: "Extends downward to meet the terrain. Height and top stay unchanged." })), _jsx(SliderControl, { label: "Thickness", max: metersToLinearUnit(1, unit), min: metersToLinearUnit(0.05, unit), onChange: (v) => handleUpdate({
177
+ return (_jsxs(PanelWrapper, { icon: "/icons/wall.webp", onClose: handleClose, title: node.name || 'Wall', width: 280, children: [_jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Length", max: metersToLinearUnit(1000, unit), min: metersToLinearUnit(0.1, unit), onChange: (value) => handleUpdateLength(linearControlValueToMeters(value, unit, { maxMeters: 1000, minMeters: 0.1 })), precision: 2, step: unit === 'imperial' ? 0.1 : 0.01, unit: unitLabel, value: displayLength }), _jsx("div", { className: "px-1 font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Top" }), _jsx(SegmentedControl, { onChange: handleTopModeChange, options: [
178
+ { label: 'Follows level', value: 'storey' },
179
+ { label: 'Custom height', value: 'custom' },
180
+ ], value: isPlaneBound ? 'storey' : 'custom' }), isPlaneBound ? (_jsxs("div", { className: "px-1 text-[11px] text-muted-foreground", children: ["Currently ", formatLinearMeasurement(height, unit)] })) : (_jsx(SliderControl, { label: "Height", max: metersToLinearUnit(1000, unit), min: metersToLinearUnit(0.1, unit), onChange: (v) => handleUpdate({
181
+ height: linearControlValueToMeters(v, unit, { maxMeters: 1000, minMeters: 0.1 }),
182
+ }), precision: 2, step: 0.1, unit: unitLabel, value: Math.round(displayHeight * 100) / 100 })), _jsx("div", { className: "px-1 font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Bottom" }), _jsx(SegmentedControl, { onChange: handleInfillChange, options: [
183
+ { label: 'Auto', value: 'auto' },
184
+ { label: 'Fill to terrain', value: 'terrain' },
185
+ ], value: followsTerrain ? 'terrain' : 'auto' }), followsTerrain && (_jsx("div", { className: "px-1 text-[11px] text-muted-foreground", children: "Extends downward to meet the terrain. Height and top stay unchanged." })), _jsx(SliderControl, { label: "Thickness", max: metersToLinearUnit(1000, unit), min: metersToLinearUnit(0.05, unit), onChange: (v) => handleUpdate({
151
186
  thickness: linearControlValueToMeters(v, unit, {
152
- maxMeters: 1,
187
+ maxMeters: 1000,
153
188
  minMeters: 0.05,
154
189
  }),
155
190
  }), precision: 3, step: 0.01, unit: unitLabel, value: Math.round(displayThickness * 1000) / 1000 }), !hasWallChildrenBlockingCurve && (_jsx(SliderControl, { label: "Curve", max: Math.max(metersToLinearUnit(0.01, unit), displayMaxCurveOffset), min: -Math.max(metersToLinearUnit(0.01, unit), displayMaxCurveOffset), onChange: (v) => handleUpdate({
@@ -15,10 +15,10 @@ export const wallParametrics = {
15
15
  {
16
16
  label: 'Dimensions',
17
17
  fields: [
18
- { key: 'thickness', kind: 'number', unit: 'm', min: 0.05, max: 0.6, step: 0.01 },
18
+ { key: 'thickness', kind: 'number', unit: 'm', min: 0.05, max: 1000, step: 0.01 },
19
19
  // `height` may be absent (plane-bound top); the custom panel owns the
20
20
  // Follows storey / Custom height mode switch, so this is metadata only.
21
- { key: 'height', kind: 'number', unit: 'm', min: 1.5, max: 6, step: 0.05 },
21
+ { key: 'height', kind: 'number', unit: 'm', min: 0.1, max: 1000, step: 0.05 },
22
22
  { key: 'curveOffset', kind: 'number', unit: 'm', min: -3, max: 3, step: 0.05 },
23
23
  ],
24
24
  },