@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
@@ -0,0 +1,25 @@
1
+ import { type AnyNode, type AnyNodeId, type DuctSegmentNode, type FloorplanGeometry, type GeometryContext, type PipeSegmentNode } from '@pascal-app/core';
2
+ import { ExtrudeGeometry, Group, Vector3 } from 'three';
3
+ export type SupportedRun = DuctSegmentNode | PipeSegmentNode;
4
+ export type RunHanger = {
5
+ center: Vector3;
6
+ anchor: Vector3;
7
+ direction: Vector3;
8
+ hostId: AnyNodeId;
9
+ };
10
+ export declare function hangerSceneNodes(ctx?: GeometryContext): Record<AnyNodeId, AnyNode>;
11
+ export type RunHangerSlot = {
12
+ id: string;
13
+ segmentIndex: number;
14
+ fraction: number;
15
+ center: Vector3;
16
+ skipped: boolean;
17
+ hanger: RunHanger | null;
18
+ };
19
+ export declare function planRunHangerSlots(run: SupportedRun, nodes: Record<AnyNodeId, AnyNode>): RunHangerSlot[];
20
+ export declare function planRunHangers(run: SupportedRun, nodes: Record<AnyNodeId, AnyNode>): RunHanger[];
21
+ export declare function buildHangerBandGeometry(run: SupportedRun): ExtrudeGeometry;
22
+ export declare function hangerSupportLines(run: SupportedRun, hanger: RunHanger): [Vector3, Vector3][];
23
+ export declare function buildRunHangers(run: SupportedRun, ctx?: GeometryContext): Group;
24
+ export declare function runHangerFloorplan(run: SupportedRun, ctx: GeometryContext): FloorplanGeometry[];
25
+ //# sourceMappingURL=run-hangers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-hangers.d.ts","sourceRoot":"","sources":["../../src/shared/run-hangers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAKpB,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,eAAe,EACf,KAAK,EAOL,OAAO,EACR,MAAM,OAAO,CAAA;AAId,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAEnG,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAqBlF;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAChC,aAAa,EAAE,CA4EjB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAEhG;AA0CD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,GAAG,eAAe,CAQ1E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CA+B7F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,KAAK,CAsC/E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,EAAE,CAqC/F"}
@@ -0,0 +1,261 @@
1
+ import { getWallBaseElevationForNodes, getWallCurveFrameAt, getWallEffectiveHeightForNodes, getWallThickness, pointInPolygon, resolveCeilingHeight, } from '@pascal-app/core';
2
+ import { BoxGeometry, CylinderGeometry, ExtrudeGeometry, Group, Matrix4, Mesh, MeshStandardMaterial, Path, Shape, Vector2, Vector3, } from 'three';
3
+ import { rectSectionAxes } from '../duct-segment/geometry';
4
+ import { hasWallChildOverlap, resolveWallAttachmentAtPlanPoint } from './wall-attach-target';
5
+ export function hangerSceneNodes(ctx) {
6
+ if (ctx?.sceneNodes)
7
+ return ctx.sceneNodes;
8
+ const nodes = {};
9
+ let root = ctx?.parent;
10
+ while (root?.parentId) {
11
+ const parent = ctx?.resolve(root.parentId);
12
+ if (!parent || parent.id === root.id)
13
+ break;
14
+ root = parent;
15
+ }
16
+ const visit = (node) => {
17
+ if (nodes[node.id])
18
+ return;
19
+ nodes[node.id] = node;
20
+ if ('children' in node && Array.isArray(node.children)) {
21
+ for (const id of node.children) {
22
+ const child = ctx?.resolve(id);
23
+ if (child)
24
+ visit(child);
25
+ }
26
+ }
27
+ };
28
+ if (root)
29
+ visit(root);
30
+ return nodes;
31
+ }
32
+ export function planRunHangerSlots(run, nodes) {
33
+ if (!run.autoHangers || !run.parentId)
34
+ return [];
35
+ const spacing = run.hangerSpacing ?? 1.5;
36
+ const reach = run.hangerMaxReach ?? 2;
37
+ if (!(Number.isFinite(spacing) && spacing > 0 && Number.isFinite(reach) && reach > 0))
38
+ return [];
39
+ const hosts = Object.values(nodes).filter((n) => n.parentId === run.parentId && (n.type === 'wall' || n.type === 'ceiling'));
40
+ const result = [];
41
+ for (let i = 1; i < run.path.length; i++) {
42
+ const start = new Vector3(...run.path[i - 1]);
43
+ const delta = new Vector3(...run.path[i]).sub(start);
44
+ const length = delta.length();
45
+ if (length < 0.05)
46
+ continue;
47
+ const direction = delta.clone().normalize();
48
+ const count = Math.max(1, Math.ceil(length / spacing));
49
+ for (let j = 0; j < count; j++) {
50
+ const id = `${i - 1}:${j}`;
51
+ const override = run.hangerOverrides?.[id];
52
+ const fraction = override?.fraction ?? (j + 0.5) / count;
53
+ const center = start.clone().addScaledVector(delta, fraction);
54
+ let best = null;
55
+ let distance = reach;
56
+ for (const host of hosts) {
57
+ if (override?.skipped || (override?.hostId && override.hostId !== host.id))
58
+ continue;
59
+ let anchor;
60
+ if (host.type === 'ceiling') {
61
+ if (!pointInPolygon(center.x, center.z, host.polygon) ||
62
+ host.holes.some((h) => pointInPolygon(center.x, center.z, h)))
63
+ continue;
64
+ const height = resolveCeilingHeight(host, nodes);
65
+ if (height < center.y)
66
+ continue;
67
+ anchor = new Vector3(center.x, height, center.z);
68
+ }
69
+ else if (host.type === 'wall') {
70
+ const thickness = getWallThickness(host);
71
+ const hit = resolveWallAttachmentAtPlanPoint(host, [center.x, center.z], reach + thickness);
72
+ if (!hit)
73
+ continue;
74
+ const base = getWallBaseElevationForNodes(host, nodes);
75
+ const top = base + getWallEffectiveHeightForNodes(host, nodes);
76
+ if (center.y < base || center.y > top)
77
+ continue;
78
+ if (hasWallChildOverlap(host.id, nodes, hit.localX, center.y - base, 0.08, 0.08))
79
+ continue;
80
+ const frame = getWallCurveFrameAt(host, hit.localX / hit.wallLength);
81
+ const side = hit.perpDistance >= 0 ? 1 : -1;
82
+ anchor = new Vector3(frame.point.x - (hit.dirY * side * thickness) / 2, center.y, frame.point.y + (hit.dirX * side * thickness) / 2);
83
+ if (Math.abs(hit.perpDistance) < thickness / 2 - 0.001)
84
+ continue;
85
+ }
86
+ else
87
+ continue;
88
+ const d = anchor.distanceTo(center);
89
+ // A support along the run would overlap its body instead of holding it.
90
+ if (d < 1e-6 || Math.abs(anchor.clone().sub(center).normalize().dot(direction)) > 0.95)
91
+ continue;
92
+ if (d <= distance) {
93
+ best = { center, anchor, direction, hostId: host.id };
94
+ distance = d;
95
+ }
96
+ }
97
+ result.push({
98
+ id,
99
+ segmentIndex: i - 1,
100
+ fraction,
101
+ center,
102
+ skipped: !!override?.skipped,
103
+ hanger: best,
104
+ });
105
+ }
106
+ }
107
+ return result;
108
+ }
109
+ export function planRunHangers(run, nodes) {
110
+ return planRunHangerSlots(run, nodes).flatMap((slot) => (slot.hanger ? [slot.hanger] : []));
111
+ }
112
+ const BAND_THICKNESS = 0.006;
113
+ const BAND_WIDTH = 0.025;
114
+ const BAND_CLEARANCE = 0.002;
115
+ function hangerProfile(run) {
116
+ const insulation = run.type === 'duct-segment' && run.insulated && run.insulationR > 0
117
+ ? (0.5 + run.insulationR * 0.3125) * 0.0254
118
+ : 0;
119
+ const round = run.type === 'pipe-segment' || run.shape === 'round';
120
+ const shape = round ? 'round' : run.shape;
121
+ const w = ((round ? run.diameter : run.width) * 0.0254) / 2 + insulation + BAND_CLEARANCE;
122
+ const h = ((round ? run.diameter : run.height) * 0.0254) / 2 + insulation + BAND_CLEARANCE;
123
+ return { shape, w, h };
124
+ }
125
+ function profileContour(run, offset) {
126
+ const { shape, w, h } = hangerProfile(run);
127
+ if (shape === 'rect') {
128
+ return [
129
+ new Vector2(-w - offset, -h - offset),
130
+ new Vector2(w + offset, -h - offset),
131
+ new Vector2(w + offset, h + offset),
132
+ new Vector2(-w - offset, h + offset),
133
+ ];
134
+ }
135
+ const radius = Math.min(w, h) + offset;
136
+ const straight = Math.abs(w - h);
137
+ const points = [];
138
+ for (const half of [0, 1]) {
139
+ for (let i = 0; i <= 32; i++) {
140
+ const angle = -Math.PI / 2 + half * Math.PI + (i * Math.PI) / 32;
141
+ const major = Math.cos(angle) * radius + (half === 0 ? straight : -straight);
142
+ const minor = Math.sin(angle) * radius;
143
+ points.push(w >= h ? new Vector2(major, minor) : new Vector2(-minor, major));
144
+ }
145
+ }
146
+ return points;
147
+ }
148
+ export function buildHangerBandGeometry(run) {
149
+ // One annular extrusion shares the corner vertices, so the inside and
150
+ // outside edges meet at the same miter without overlapping end caps.
151
+ const shape = new Shape(profileContour(run, BAND_THICKNESS));
152
+ shape.holes.push(new Path(profileContour(run, 0).reverse()));
153
+ const geometry = new ExtrudeGeometry(shape, { depth: BAND_WIDTH, bevelEnabled: false, steps: 1 });
154
+ geometry.translate(0, 0, -BAND_WIDTH / 2);
155
+ return geometry;
156
+ }
157
+ export function hangerSupportLines(run, hanger) {
158
+ const { center, anchor, direction } = hanger;
159
+ const towardHost = anchor.clone().sub(center).normalize();
160
+ const { width, height } = rectSectionAxes(direction, run.type === 'duct-segment' ? run.roll : 0);
161
+ const { shape, w, h } = hangerProfile(run);
162
+ const contact = (axis) => {
163
+ const x = axis.dot(width);
164
+ const y = axis.dot(height);
165
+ if (shape === 'rect') {
166
+ return width
167
+ .clone()
168
+ .multiplyScalar(Math.abs(x) < 1e-8 ? 0 : Math.sign(x) * (w + BAND_THICKNESS / 2))
169
+ .addScaledVector(height, Math.abs(y) < 1e-8 ? 0 : Math.sign(y) * (h + BAND_THICKNESS / 2));
170
+ }
171
+ const radius = Math.min(w, h) + BAND_THICKNESS / 2;
172
+ const length = Math.hypot(x, y);
173
+ return width
174
+ .clone()
175
+ .multiplyScalar((x / length) * radius + (w > h ? Math.sign(x) * (w - h) : 0))
176
+ .addScaledVector(height, (y / length) * radius + (h > w ? Math.sign(y) * (h - w) : 0));
177
+ };
178
+ if (run.hangerStyle !== 'double')
179
+ return [[center.clone().add(contact(towardHost)), anchor]];
180
+ const side = new Vector3().crossVectors(direction, towardHost).normalize();
181
+ return [-1, 1].map((sign) => {
182
+ const offset = contact(side.clone().multiplyScalar(sign));
183
+ const from = center.clone().add(offset);
184
+ // Project each connection onto the host plane instead of translating
185
+ // the anchor toward/away from it when the duct cross-section is rolled.
186
+ const to = from.clone().addScaledVector(towardHost, anchor.clone().sub(from).dot(towardHost));
187
+ return [from, to];
188
+ });
189
+ }
190
+ export function buildRunHangers(run, ctx) {
191
+ const group = new Group();
192
+ group.name = 'auto-hangers';
193
+ if (!run.autoHangers)
194
+ return group;
195
+ const hangers = planRunHangers(run, hangerSceneNodes(ctx));
196
+ if (!hangers.length)
197
+ return group;
198
+ const material = new MeshStandardMaterial({ color: '#92989e', metalness: 0.75, roughness: 0.4 });
199
+ const rod = (a, b, radius = 0.006) => {
200
+ const delta = b.clone().sub(a);
201
+ if (delta.length() < 1e-6)
202
+ return;
203
+ const mesh = new Mesh(new CylinderGeometry(radius, radius, delta.length(), 8), material);
204
+ mesh.position.copy(a).add(b).multiplyScalar(0.5);
205
+ mesh.quaternion.setFromUnitVectors(new Vector3(0, 1, 0), delta.normalize());
206
+ group.add(mesh);
207
+ };
208
+ for (const hanger of hangers) {
209
+ const { center, anchor, direction } = hanger;
210
+ const { width, height } = rectSectionAxes(direction, run.type === 'duct-segment' ? run.roll : 0);
211
+ const band = new Mesh(buildHangerBandGeometry(run), material);
212
+ band.name = 'hanger-band';
213
+ band.position.copy(center);
214
+ band.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(width, height, direction.clone().negate()));
215
+ group.add(band);
216
+ const lines = hangerSupportLines(run, hanger);
217
+ for (const [from, to] of lines) {
218
+ rod(from, to);
219
+ const plate = new Mesh(new BoxGeometry(0.08, 0.08, 0.008), material);
220
+ plate.position.copy(to);
221
+ plate.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), anchor.clone().sub(center).normalize());
222
+ group.add(plate);
223
+ }
224
+ }
225
+ return group;
226
+ }
227
+ export function runHangerFloorplan(run, ctx) {
228
+ if (!run.autoHangers)
229
+ return [];
230
+ return planRunHangers(run, hangerSceneNodes(ctx)).flatMap((hanger) => {
231
+ const { center, direction } = hanger;
232
+ const side = new Vector3(-direction.z, 0, direction.x)
233
+ .normalize()
234
+ .multiplyScalar(((run.type === 'duct-segment' && run.shape !== 'round' ? run.width : run.diameter) *
235
+ 0.0254) /
236
+ 2 +
237
+ 0.04);
238
+ return [
239
+ {
240
+ kind: 'polyline',
241
+ points: [
242
+ [center.x - side.x, center.z - side.z],
243
+ [center.x + side.x, center.z + side.z],
244
+ ],
245
+ stroke: '#92989e',
246
+ strokeWidth: 2,
247
+ vectorEffect: 'non-scaling-stroke',
248
+ },
249
+ ...hangerSupportLines(run, hanger).map(([from, to]) => ({
250
+ kind: 'polyline',
251
+ points: [
252
+ [from.x, from.z],
253
+ [to.x, to.z],
254
+ ],
255
+ stroke: '#92989e',
256
+ strokeWidth: 2,
257
+ vectorEffect: 'non-scaling-stroke',
258
+ })),
259
+ ];
260
+ });
261
+ }
@@ -0,0 +1,11 @@
1
+ import type { ScenePort } from './ports';
2
+ export type PortScreenPoint = {
3
+ x: number;
4
+ y: number;
5
+ depth: number;
6
+ };
7
+ export declare function findScreenPort(ports: readonly ScenePort[], pointer: readonly [number, number], project: (point: ScenePort['position']) => PortScreenPoint | null, source: Pick<ScenePort, 'nodeId' | 'id'> | null, radius?: number): {
8
+ port: ScenePort;
9
+ screen: PortScreenPoint;
10
+ } | null;
11
+ //# sourceMappingURL=run-port-snap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-port-snap.d.ts","sourceRoot":"","sources":["../../src/shared/run-port-snap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,eAAe,GAAG,IAAI,EACjE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,EAC/C,MAAM,SAAK,GACV;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAcrD"}
@@ -0,0 +1,19 @@
1
+ export function findScreenPort(ports, pointer, project, source, radius = 16) {
2
+ let best = null;
3
+ let distance = radius;
4
+ for (const port of ports) {
5
+ if (source?.nodeId === port.nodeId && source.id === port.id)
6
+ continue;
7
+ const screen = project(port.position);
8
+ if (!screen)
9
+ continue;
10
+ const nextDistance = Math.hypot(screen.x - pointer[0], screen.y - pointer[1]);
11
+ if (!Number.isFinite(nextDistance) || nextDistance > distance)
12
+ continue;
13
+ if (best && nextDistance === distance && screen.depth >= best.screen.depth)
14
+ continue;
15
+ best = { port, screen };
16
+ distance = nextDistance;
17
+ }
18
+ return best;
19
+ }
@@ -0,0 +1,5 @@
1
+ type Point2 = readonly [number, number];
2
+ export declare function screenDirectionScore(origin: Point2, tip: Point2, pointer: Point2): number;
3
+ export declare function chooseScreenDirection(scores: readonly number[], previous: number): number;
4
+ export {};
5
+ //# sourceMappingURL=run-screen-direction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-screen-direction.d.ts","sourceRoot":"","sources":["../../src/shared/run-screen-direction.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEvC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAYzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAazF"}
@@ -0,0 +1,24 @@
1
+ export function screenDirectionScore(origin, tip, pointer) {
2
+ const dx = tip[0] - origin[0], dy = tip[1] - origin[1];
3
+ const length = Math.hypot(dx, dy);
4
+ if (length < 2)
5
+ return Infinity;
6
+ const px = pointer[0] - origin[0], py = pointer[1] - origin[1];
7
+ const distance = Math.hypot(px, py);
8
+ if (px * dx + py * dy <= 0 || distance < 4)
9
+ return Infinity;
10
+ return (Math.hypot(px / distance - dx / length, py / distance - dy / length) * Math.min(distance, 100));
11
+ }
12
+ export function chooseScreenDirection(scores, previous) {
13
+ let best = -1;
14
+ for (let i = 0; i < scores.length; i++) {
15
+ if (Number.isFinite(scores[i]) && (best < 0 || scores[i] < scores[best]))
16
+ best = i;
17
+ }
18
+ if (best >= 0 &&
19
+ previous >= 0 &&
20
+ Number.isFinite(scores[previous]) &&
21
+ scores[previous] <= scores[best] + 4)
22
+ return previous;
23
+ return best;
24
+ }
@@ -47,5 +47,9 @@ export declare function RotateArc({ position, rotation, cursor, onPointerDown, }
47
47
  cursor?: Cursor;
48
48
  onPointerDown: (e: ThreeEvent<PointerEvent>) => void;
49
49
  }): import("react").JSX.Element;
50
+ export declare function ContinuePlusHandle({ position, onActivate, }: {
51
+ position: Point;
52
+ onActivate: () => void;
53
+ }): import("react").JSX.Element;
50
54
  export {};
51
55
  //# sourceMappingURL=selection-handles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selection-handles.d.ts","sourceRoot":"","sources":["../../src/shared/selection-handles.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAKpD,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AASrC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAa,EACb,MAAe,GAChB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;IACrD,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,+BAoBA;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAa,EACb,QAAQ,EACR,MAAe,EACf,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CACrD,+BA0BA;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,MAAe,EACf,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CACrD,+BAkBA"}
1
+ {"version":3,"file":"selection-handles.d.ts","sourceRoot":"","sources":["../../src/shared/selection-handles.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAKpD,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AASrC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAa,EACb,MAAe,GAChB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;IACrD,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,+BAoBA;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAa,EACb,QAAQ,EACR,MAAe,EACf,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CACrD,+BA0BA;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,MAAe,EACf,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CACrD,+BAkBA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,KAAK,CAAA;IACf,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB,+BAmBA"}
@@ -72,3 +72,13 @@ export function RotateArc({ position, rotation, cursor = 'grab', onPointerDown,
72
72
  onPointerDown(event);
73
73
  }, placement: { position, rotation, baseScale }, shape: "curved-arrow" }));
74
74
  }
75
+ export function ContinuePlusHandle({ position, onActivate, }) {
76
+ const [hovered, setHovered] = useState(false);
77
+ const { camera } = useThree();
78
+ const zoom = camera instanceof OrthographicCamera ? 1 / camera.zoom : 1;
79
+ const baseScale = zoom * ARROW_SCALE;
80
+ return (_jsx(HandleArrow, { cursor: "grab", hover: hovered, hoverScale: 1.15, onHoverChange: setHovered, onPointerDown: (event) => {
81
+ consumeHandlePress(event);
82
+ onActivate();
83
+ }, placement: { position, rotation: [-Math.PI / 2, 0, 0], baseScale }, shape: "plus" }));
84
+ }
@@ -1,5 +1,12 @@
1
- import { type AnyNode, type MaterialSchema, type MaterialTarget, type PaintCapability, type PaintPreviewArgs, type PaintResolveArgs } from '@pascal-app/core';
1
+ import { type AnyNode, type MaterialSchema, type MaterialTarget, type PaintCapability, type PaintPreviewArgs, type PaintResolveArgs, type SceneMaterial, type SceneMaterialId } from '@pascal-app/core';
2
2
  import { type Material } from 'three';
3
+ export declare function isSlotPaintPreviewActive(nodeId: string): boolean;
4
+ export declare function subscribeSlotPaintPreviews(listener: (nodeId: string) => void): () => void;
5
+ export type SlotPaintMaterialResolution = {
6
+ ref: string | undefined;
7
+ newSceneMaterial: SceneMaterial | null;
8
+ };
9
+ export declare function resolveSlotPaintMaterialRef(materials: Record<SceneMaterialId, SceneMaterial>, material: MaterialSchema | undefined, materialPreset: string | undefined): SlotPaintMaterialResolution | null;
3
10
  /** Preview material for a slot paint — mirrors the commit's resolution. */
4
11
  export declare function buildSlotPreviewMaterial(material: MaterialSchema | undefined, materialPreset: string | undefined): Material | null;
5
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"slot-paint.d.ts","sourceRoot":"","sources":["../../src/shared/slot-paint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAGZ,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAOtB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,KAAK,QAAQ,EAAuC,MAAM,OAAO,CAAA;AAkH1E,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,QAAQ,GAAG,IAAI,CAYjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAuB/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAqBjF;AAKD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAW5E;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,2EAA2E;IAC3E,WAAW,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,GAAG,IAAI,CAAA;IACtD,iEAAiE;IACjE,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7D;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,KACT;QAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,IAAI,CAAA;IACxF,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAyBlF"}
1
+ {"version":3,"file":"slot-paint.d.ts","sourceRoot":"","sources":["../../src/shared/slot-paint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAGZ,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAClB,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAA;AAQzB,OAAO,EAAE,KAAK,QAAQ,EAAuC,MAAM,OAAO,CAAA;AAsB1E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAKzF;AA4DD,MAAM,MAAM,2BAA2B,GAAG;IACxC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,gBAAgB,EAAE,aAAa,GAAG,IAAI,CAAA;CACvC,CAAA;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,EACjD,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,2BAA2B,GAAG,IAAI,CAmBpC;AA2CD,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,QAAQ,GAAG,IAAI,CAYjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CA4B/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CA0BjF;AAMD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAW5E;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,2EAA2E;IAC3E,WAAW,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,GAAG,IAAI,CAAA;IACtD,iEAAiE;IACjE,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7D;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,KACT;QAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,IAAI,CAAA;IACxF,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAmDlF"}
@@ -1,6 +1,58 @@
1
1
  import { generateSceneMaterialId, parseMaterialRef, sceneRegistry, toSceneMaterialRef, useScene, } from '@pascal-app/core';
2
- import { createMaterial, createMaterialFromPresetRef, useViewer } from '@pascal-app/viewer';
2
+ import { createMaterial, createMaterialFromPresetRef, registerMaterialCacheCleanup, setSurfaceRaycastLayers, useViewer, } from '@pascal-app/viewer';
3
3
  import { Raycaster } from 'three';
4
+ /**
5
+ * Shared paint capability for procedural kinds on the unified slot model
6
+ * (`node.slots: Record<slotId, MaterialRef>` + the shared scene-material
7
+ * palette) — the same data shape items derive from their GLB and the shelf
8
+ * declares via `capabilities.slots`. `surface-paint.ts` configures this helper
9
+ * for kinds whose entire rendered subtree is one paintable surface.
10
+ *
11
+ * The commit / resolve / effective-material logic is identical across kinds;
12
+ * only the slot-resolution from a pointer hit and the mesh preview differ, so
13
+ * those are injected per kind.
14
+ */
15
+ let materialCacheGeneration = 0;
16
+ registerMaterialCacheCleanup(() => {
17
+ materialCacheGeneration++;
18
+ });
19
+ const previewCounts = new Map();
20
+ const previewListeners = new Set();
21
+ export function isSlotPaintPreviewActive(nodeId) {
22
+ return previewCounts.has(nodeId);
23
+ }
24
+ export function subscribeSlotPaintPreviews(listener) {
25
+ previewListeners.add(listener);
26
+ return () => {
27
+ previewListeners.delete(listener);
28
+ };
29
+ }
30
+ function beginSlotPaintPreview(nodeId) {
31
+ const count = previewCounts.get(nodeId) ?? 0;
32
+ previewCounts.set(nodeId, count + 1);
33
+ try {
34
+ if (count === 0)
35
+ for (const listener of previewListeners)
36
+ listener(nodeId);
37
+ }
38
+ catch (error) {
39
+ if (count === 0)
40
+ previewCounts.delete(nodeId);
41
+ else
42
+ previewCounts.set(nodeId, count);
43
+ throw error;
44
+ }
45
+ return () => {
46
+ const remaining = (previewCounts.get(nodeId) ?? 1) - 1;
47
+ if (remaining > 0)
48
+ previewCounts.set(nodeId, remaining);
49
+ else {
50
+ previewCounts.delete(nodeId);
51
+ for (const listener of previewListeners)
52
+ listener(nodeId);
53
+ }
54
+ };
55
+ }
4
56
  function deepEqual(a, b) {
5
57
  if (Object.is(a, b))
6
58
  return true;
@@ -41,36 +93,35 @@ function findMatchingSceneMaterial(materials, material) {
41
93
  }
42
94
  return null;
43
95
  }
96
+ export function resolveSlotPaintMaterialRef(materials, material, materialPreset) {
97
+ if (material === undefined && materialPreset === undefined) {
98
+ return { ref: undefined, newSceneMaterial: null };
99
+ }
100
+ if (materialPreset)
101
+ return { ref: materialPreset, newSceneMaterial: null };
102
+ if (!material)
103
+ return null;
104
+ const existing = findMatchingSceneMaterial(materials, material);
105
+ if (existing)
106
+ return { ref: toSceneMaterialRef(existing.id), newSceneMaterial: null };
107
+ const id = generateSceneMaterialId();
108
+ return {
109
+ ref: toSceneMaterialRef(id),
110
+ newSceneMaterial: {
111
+ id,
112
+ name: `Material ${Object.keys(materials).length + 1}`,
113
+ material,
114
+ },
115
+ };
116
+ }
44
117
  function commitSlotPaint(node, role, material, materialPreset) {
45
118
  const nodeId = node.id;
46
119
  const state = useScene.getState();
47
120
  const currentNode = state.nodes[nodeId] ?? node;
48
- let ref;
49
- let newSceneMaterial = null;
50
- if (material === undefined && materialPreset === undefined) {
51
- ref = undefined;
52
- }
53
- else if (materialPreset) {
54
- ref = materialPreset;
55
- }
56
- else if (material) {
57
- const existing = findMatchingSceneMaterial(state.materials, material);
58
- if (existing) {
59
- ref = toSceneMaterialRef(existing.id);
60
- }
61
- else {
62
- const id = generateSceneMaterialId();
63
- newSceneMaterial = {
64
- id,
65
- name: `Material ${Object.keys(state.materials).length + 1}`,
66
- material,
67
- };
68
- ref = toSceneMaterialRef(id);
69
- }
70
- }
71
- else {
121
+ const resolution = resolveSlotPaintMaterialRef(state.materials, material, materialPreset);
122
+ if (!resolution)
72
123
  return;
73
- }
124
+ const { ref, newSceneMaterial } = resolution;
74
125
  const nextSlots = { ...(currentNode.slots ?? {}) };
75
126
  if (ref)
76
127
  nextSlots[role] = ref;
@@ -126,6 +177,7 @@ export function previewGeometrySlot(args) {
126
177
  const preview = buildSlotPreviewMaterial(material, materialPreset);
127
178
  if (!preview)
128
179
  return () => { };
180
+ const generation = materialCacheGeneration;
129
181
  const restores = [];
130
182
  root.traverse((object) => {
131
183
  const mesh = object;
@@ -145,6 +197,10 @@ export function previewGeometrySlot(args) {
145
197
  if (restores.length === 0)
146
198
  return null;
147
199
  return () => {
200
+ if (generation !== materialCacheGeneration) {
201
+ useScene.getState().markDirty(args.node.id);
202
+ return;
203
+ }
148
204
  for (let index = restores.length - 1; index >= 0; index -= 1)
149
205
  restores[index]?.();
150
206
  };
@@ -159,6 +215,7 @@ export function previewSlotByUserData(args) {
159
215
  const preview = buildSlotPreviewMaterial(material, materialPreset);
160
216
  if (!preview)
161
217
  return () => { };
218
+ const generation = materialCacheGeneration;
162
219
  const restores = [];
163
220
  root.traverse((object) => {
164
221
  const mesh = object;
@@ -175,12 +232,17 @@ export function previewSlotByUserData(args) {
175
232
  if (restores.length === 0)
176
233
  return null;
177
234
  return () => {
235
+ if (generation !== materialCacheGeneration) {
236
+ useScene.getState().markDirty(args.node.id);
237
+ return;
238
+ }
178
239
  for (let index = restores.length - 1; index >= 0; index -= 1)
179
240
  restores[index]?.();
180
241
  };
181
242
  }
182
243
  // Reused across calls — set from the pointer ray each time.
183
244
  const subtreeRaycaster = new Raycaster();
245
+ setSurfaceRaycastLayers(subtreeRaycaster.layers);
184
246
  /**
185
247
  * Resolve the slot for a kind whose paint hit lands on a proud opening proxy
186
248
  * (door/window: a 1m-deep invisible cutout that wins the scene raycast over the
@@ -218,7 +280,38 @@ export function createSlotPaintCapability(config) {
218
280
  return { slots };
219
281
  },
220
282
  commit: ({ node, role, material, materialPreset }) => commitSlotPaint(node, role, material, materialPreset),
221
- applyPreview: config.applyPreview,
283
+ applyPreview: (args) => {
284
+ // Release before swapping materials, including each room/all-matching target.
285
+ const end = beginSlotPaintPreview(args.node.id);
286
+ let restore;
287
+ try {
288
+ restore = config.applyPreview(args);
289
+ }
290
+ catch (error) {
291
+ end();
292
+ throw error;
293
+ }
294
+ if (!restore) {
295
+ end();
296
+ return null;
297
+ }
298
+ let ended = false;
299
+ const finish = (committed) => {
300
+ if (ended)
301
+ return;
302
+ ended = true;
303
+ try {
304
+ if (committed)
305
+ useScene.getState().markDirty(args.node.id);
306
+ else
307
+ restore();
308
+ }
309
+ finally {
310
+ end();
311
+ }
312
+ };
313
+ return Object.assign(() => finish(false), { commit: () => finish(true) });
314
+ },
222
315
  getEffectiveMaterial: ({ node, role }) => {
223
316
  const ref = node.slots?.[role];
224
317
  const parsed = parseMaterialRef(ref);
@@ -1,3 +1,2 @@
1
- import type { PaintCapability } from '@pascal-app/core';
2
- export declare const surfacePaintCapability: PaintCapability;
1
+ export declare const surfacePaintCapability: import("@pascal-app/core").PaintCapability;
3
2
  //# sourceMappingURL=surface-paint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-paint.d.ts","sourceRoot":"","sources":["../../src/shared/surface-paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,eAAe,EAAE,MAAM,kBAAkB,CAAA;AA0BhF,eAAO,MAAM,sBAAsB,EAAE,eA4BpC,CAAA"}
1
+ {"version":3,"file":"surface-paint.d.ts","sourceRoot":"","sources":["../../src/shared/surface-paint.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,4CAwBjC,CAAA"}