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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +4 -4
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/appliance-layout.d.ts +26 -0
  102. package/dist/cabinet/appliance-layout.d.ts.map +1 -0
  103. package/dist/cabinet/appliance-layout.js +52 -0
  104. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  105. package/dist/cabinet/compartment-card.js +11 -3
  106. package/dist/cabinet/continuous-placement.d.ts +3 -0
  107. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  108. package/dist/cabinet/continuous-placement.js +6 -0
  109. package/dist/cabinet/countertop-layout.d.ts +173 -0
  110. package/dist/cabinet/countertop-layout.d.ts.map +1 -0
  111. package/dist/cabinet/countertop-layout.js +80 -0
  112. package/dist/cabinet/definition.d.ts.map +1 -1
  113. package/dist/cabinet/definition.js +414 -61
  114. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  115. package/dist/cabinet/floorplan-move.js +91 -22
  116. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
  117. package/dist/cabinet/geometry/cooktop.js +2 -2
  118. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  119. package/dist/cabinet/geometry/fridge.js +25 -1
  120. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  121. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  122. package/dist/cabinet/geometry/fronts.js +1 -1
  123. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  124. package/dist/cabinet/geometry/run.js +28 -71
  125. package/dist/cabinet/geometry/sink.d.ts +2 -12
  126. package/dist/cabinet/geometry/sink.d.ts.map +1 -1
  127. package/dist/cabinet/geometry/sink.js +8 -39
  128. package/dist/cabinet/geometry.d.ts.map +1 -1
  129. package/dist/cabinet/geometry.js +63 -1
  130. package/dist/cabinet/hosted-resize.d.ts +8 -0
  131. package/dist/cabinet/hosted-resize.d.ts.map +1 -0
  132. package/dist/cabinet/hosted-resize.js +158 -0
  133. package/dist/cabinet/index.d.ts +1 -0
  134. package/dist/cabinet/index.d.ts.map +1 -1
  135. package/dist/cabinet/index.js +1 -0
  136. package/dist/cabinet/insertion.d.ts +19 -0
  137. package/dist/cabinet/insertion.d.ts.map +1 -0
  138. package/dist/cabinet/insertion.js +49 -0
  139. package/dist/cabinet/move-frame.d.ts.map +1 -1
  140. package/dist/cabinet/move-frame.js +68 -2
  141. package/dist/cabinet/panel-context.d.ts +7 -0
  142. package/dist/cabinet/panel-context.d.ts.map +1 -0
  143. package/dist/cabinet/panel-context.js +16 -0
  144. package/dist/cabinet/panel-visibility.d.ts +9 -0
  145. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  146. package/dist/cabinet/panel-visibility.js +26 -0
  147. package/dist/cabinet/panel.d.ts.map +1 -1
  148. package/dist/cabinet/panel.js +221 -37
  149. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  150. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  151. package/dist/cabinet/placement-dimensions.js +227 -0
  152. package/dist/cabinet/placement-snap.d.ts +21 -1
  153. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  154. package/dist/cabinet/placement-snap.js +48 -6
  155. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  156. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  157. package/dist/cabinet/preset-width-debt.js +45 -0
  158. package/dist/cabinet/presets.d.ts.map +1 -1
  159. package/dist/cabinet/presets.js +14 -13
  160. package/dist/cabinet/profiles.d.ts +14 -0
  161. package/dist/cabinet/profiles.d.ts.map +1 -0
  162. package/dist/cabinet/profiles.js +30 -0
  163. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  164. package/dist/cabinet/quick-actions.js +8 -24
  165. package/dist/cabinet/reveals.d.ts +37 -0
  166. package/dist/cabinet/reveals.d.ts.map +1 -0
  167. package/dist/cabinet/reveals.js +13 -0
  168. package/dist/cabinet/run-layout.d.ts +98 -5
  169. package/dist/cabinet/run-layout.d.ts.map +1 -1
  170. package/dist/cabinet/run-layout.js +430 -37
  171. package/dist/cabinet/run-ops.d.ts +204 -12
  172. package/dist/cabinet/run-ops.d.ts.map +1 -1
  173. package/dist/cabinet/run-ops.js +523 -36
  174. package/dist/cabinet/run-panel.d.ts +6 -2
  175. package/dist/cabinet/run-panel.d.ts.map +1 -1
  176. package/dist/cabinet/run-panel.js +294 -108
  177. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  178. package/dist/cabinet/stack-transitions.js +35 -24
  179. package/dist/cabinet/stack.d.ts +169 -1
  180. package/dist/cabinet/stack.d.ts.map +1 -1
  181. package/dist/cabinet/stack.js +57 -18
  182. package/dist/cabinet/surfaces.d.ts +4 -0
  183. package/dist/cabinet/surfaces.d.ts.map +1 -0
  184. package/dist/cabinet/surfaces.js +101 -0
  185. package/dist/cabinet/tool.d.ts.map +1 -1
  186. package/dist/cabinet/tool.js +615 -91
  187. package/dist/cabinet/tree-structure.d.ts.map +1 -1
  188. package/dist/cabinet/tree-structure.js +10 -9
  189. package/dist/cabinet/validation.d.ts +27 -0
  190. package/dist/cabinet/validation.d.ts.map +1 -0
  191. package/dist/cabinet/validation.js +56 -0
  192. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  193. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  194. package/dist/cabinet/wall-height-presets.js +15 -0
  195. package/dist/cabinet/wall-snap.d.ts +27 -3
  196. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  197. package/dist/cabinet/wall-snap.js +278 -62
  198. package/dist/cabinet/widths.d.ts +10 -0
  199. package/dist/cabinet/widths.d.ts.map +1 -0
  200. package/dist/cabinet/widths.js +13 -0
  201. package/dist/ceiling/definition.d.ts.map +1 -1
  202. package/dist/ceiling/definition.js +8 -2
  203. package/dist/ceiling/floorplan-affordances.d.ts +12 -12
  204. package/dist/ceiling/materials.d.ts.map +1 -1
  205. package/dist/ceiling/materials.js +0 -1
  206. package/dist/ceiling/panel.js +1 -1
  207. package/dist/ceiling/parametrics.js +1 -1
  208. package/dist/chimney/definition.js +1 -1
  209. package/dist/chimney/panel.js +9 -9
  210. package/dist/chimney/parametrics.js +3 -3
  211. package/dist/column/definition.d.ts.map +1 -1
  212. package/dist/column/definition.js +22 -4
  213. package/dist/column/panel.d.ts.map +1 -1
  214. package/dist/column/panel.js +37 -7
  215. package/dist/column/parametrics.d.ts.map +1 -1
  216. package/dist/column/parametrics.js +5 -3
  217. package/dist/column/tool.d.ts.map +1 -1
  218. package/dist/column/tool.js +50 -14
  219. package/dist/cupola/definition.d.ts.map +1 -1
  220. package/dist/cupola/definition.js +15 -6
  221. package/dist/cupola/geometry.d.ts +6 -0
  222. package/dist/cupola/geometry.d.ts.map +1 -1
  223. package/dist/cupola/geometry.js +60 -13
  224. package/dist/cupola/paint.d.ts +4 -0
  225. package/dist/cupola/paint.d.ts.map +1 -0
  226. package/dist/cupola/paint.js +39 -0
  227. package/dist/cupola/panel.js +1 -1
  228. package/dist/cupola/parametrics.js +3 -3
  229. package/dist/cupola/renderer.d.ts.map +1 -1
  230. package/dist/cupola/renderer.js +27 -8
  231. package/dist/door/floorplan-move.d.ts.map +1 -1
  232. package/dist/door/floorplan-move.js +1 -1
  233. package/dist/door/move-tool.d.ts.map +1 -1
  234. package/dist/door/move-tool.js +86 -32
  235. package/dist/door/panel.d.ts.map +1 -1
  236. package/dist/door/panel.js +12 -12
  237. package/dist/door/parametrics.js +2 -2
  238. package/dist/door/tool.d.ts.map +1 -1
  239. package/dist/door/tool.js +16 -4
  240. package/dist/dormer/csg-geometry.d.ts +6 -42
  241. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  242. package/dist/dormer/csg-geometry.js +38 -209
  243. package/dist/dormer/definition.d.ts +4 -12
  244. package/dist/dormer/definition.d.ts.map +1 -1
  245. package/dist/dormer/definition.js +18 -193
  246. package/dist/dormer/floorplan.d.ts +3 -3
  247. package/dist/dormer/floorplan.d.ts.map +1 -1
  248. package/dist/dormer/floorplan.js +6 -17
  249. package/dist/dormer/geometry.d.ts +5 -24
  250. package/dist/dormer/geometry.d.ts.map +1 -1
  251. package/dist/dormer/geometry.js +64 -41
  252. package/dist/dormer/index.d.ts +1 -1
  253. package/dist/dormer/index.d.ts.map +1 -1
  254. package/dist/dormer/index.js +1 -1
  255. package/dist/dormer/move-tool.d.ts.map +1 -1
  256. package/dist/dormer/move-tool.js +31 -3
  257. package/dist/dormer/panel-position-section.js +2 -2
  258. package/dist/dormer/panel-windows-section.d.ts +9 -0
  259. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  260. package/dist/dormer/panel-windows-section.js +7 -0
  261. package/dist/dormer/panel.d.ts.map +1 -1
  262. package/dist/dormer/panel.js +100 -18
  263. package/dist/dormer/parametrics.d.ts.map +1 -1
  264. package/dist/dormer/parametrics.js +8 -77
  265. package/dist/dormer/preview.d.ts.map +1 -1
  266. package/dist/dormer/preview.js +9 -1
  267. package/dist/dormer/renderer.d.ts.map +1 -1
  268. package/dist/dormer/renderer.js +24 -26
  269. package/dist/dormer/tool.d.ts.map +1 -1
  270. package/dist/dormer/tool.js +3 -1
  271. package/dist/dormer/window-layout.d.ts +15 -0
  272. package/dist/dormer/window-layout.d.ts.map +1 -0
  273. package/dist/dormer/window-layout.js +59 -0
  274. package/dist/downspout/definition.d.ts.map +1 -1
  275. package/dist/downspout/definition.js +17 -4
  276. package/dist/downspout/geometry.d.ts.map +1 -1
  277. package/dist/downspout/geometry.js +10 -0
  278. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  279. package/dist/downspout/inspector-editors.js +9 -1
  280. package/dist/downspout/parametrics.d.ts.map +1 -1
  281. package/dist/downspout/parametrics.js +2 -1
  282. package/dist/downspout/renderer.d.ts.map +1 -1
  283. package/dist/downspout/renderer.js +19 -3
  284. package/dist/downspout/system.d.ts +7 -0
  285. package/dist/downspout/system.d.ts.map +1 -0
  286. package/dist/downspout/system.js +114 -0
  287. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  288. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  289. package/dist/duct-fitting/accessory-geometry.js +47 -0
  290. package/dist/duct-fitting/definition.d.ts.map +1 -1
  291. package/dist/duct-fitting/definition.js +11 -1
  292. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  293. package/dist/duct-fitting/floorplan.js +8 -0
  294. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  295. package/dist/duct-fitting/geometry.js +52 -38
  296. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  297. package/dist/duct-fitting/parametrics.js +78 -15
  298. package/dist/duct-fitting/ports.d.ts +1 -0
  299. package/dist/duct-fitting/ports.d.ts.map +1 -1
  300. package/dist/duct-fitting/ports.js +46 -0
  301. package/dist/duct-fitting/tool.d.ts +19 -0
  302. package/dist/duct-fitting/tool.d.ts.map +1 -1
  303. package/dist/duct-fitting/tool.js +126 -34
  304. package/dist/duct-segment/continuation.d.ts +21 -0
  305. package/dist/duct-segment/continuation.d.ts.map +1 -0
  306. package/dist/duct-segment/continuation.js +167 -0
  307. package/dist/duct-segment/definition.d.ts.map +1 -1
  308. package/dist/duct-segment/definition.js +19 -18
  309. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  310. package/dist/duct-segment/floorplan.js +43 -0
  311. package/dist/duct-segment/geometry.d.ts.map +1 -1
  312. package/dist/duct-segment/geometry.js +3 -0
  313. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  314. package/dist/duct-segment/move-tool.js +33 -6
  315. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  316. package/dist/duct-segment/parametrics.js +49 -1
  317. package/dist/duct-segment/selection.d.ts +3 -4
  318. package/dist/duct-segment/selection.d.ts.map +1 -1
  319. package/dist/duct-segment/selection.js +186 -158
  320. package/dist/duct-segment/tool.d.ts +38 -0
  321. package/dist/duct-segment/tool.d.ts.map +1 -1
  322. package/dist/duct-segment/tool.js +306 -677
  323. package/dist/duct-terminal/parametrics.js +2 -2
  324. package/dist/duct-terminal/tool.d.ts.map +1 -1
  325. package/dist/duct-terminal/tool.js +37 -7
  326. package/dist/elevator/panel.d.ts.map +1 -1
  327. package/dist/elevator/panel.js +7 -7
  328. package/dist/elevator/system.d.ts.map +1 -1
  329. package/dist/elevator/system.js +10 -1
  330. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  331. package/dist/eyebrow-vent/definition.js +8 -5
  332. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  333. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  334. package/dist/eyebrow-vent/geometry.js +60 -15
  335. package/dist/eyebrow-vent/paint.d.ts +4 -0
  336. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  337. package/dist/eyebrow-vent/paint.js +33 -0
  338. package/dist/eyebrow-vent/panel.js +1 -1
  339. package/dist/eyebrow-vent/parametrics.js +3 -3
  340. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  341. package/dist/eyebrow-vent/renderer.js +27 -8
  342. package/dist/fence/definition.d.ts.map +1 -1
  343. package/dist/fence/definition.js +2 -1
  344. package/dist/fence/floorplan-affordances.d.ts +1 -0
  345. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  346. package/dist/fence/floorplan-affordances.js +30 -1
  347. package/dist/fence/floorplan.d.ts.map +1 -1
  348. package/dist/fence/floorplan.js +14 -0
  349. package/dist/fence/inspector-editors.js +1 -1
  350. package/dist/fence/parametrics.js +3 -3
  351. package/dist/fence/tool.d.ts.map +1 -1
  352. package/dist/fence/tool.js +47 -20
  353. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  354. package/dist/gutter/corner-mitre.js +47 -7
  355. package/dist/gutter/definition.d.ts.map +1 -1
  356. package/dist/gutter/definition.js +23 -13
  357. package/dist/gutter/eave-align.d.ts.map +1 -1
  358. package/dist/gutter/eave-align.js +10 -0
  359. package/dist/gutter/eave-snap.d.ts +1 -1
  360. package/dist/gutter/eave-snap.d.ts.map +1 -1
  361. package/dist/gutter/eave-snap.js +10 -23
  362. package/dist/gutter/geometry.d.ts.map +1 -1
  363. package/dist/gutter/geometry.js +126 -8
  364. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  365. package/dist/gutter/outlet-lookup.js +22 -1
  366. package/dist/gutter/paint.d.ts +3 -0
  367. package/dist/gutter/paint.d.ts.map +1 -0
  368. package/dist/gutter/paint.js +6 -0
  369. package/dist/gutter/parametrics.d.ts.map +1 -1
  370. package/dist/gutter/parametrics.js +4 -1
  371. package/dist/gutter/renderer.d.ts.map +1 -1
  372. package/dist/gutter/renderer.js +63 -7
  373. package/dist/gutter/trim-clip.d.ts +3 -0
  374. package/dist/gutter/trim-clip.d.ts.map +1 -0
  375. package/dist/gutter/trim-clip.js +5 -0
  376. package/dist/hvac-equipment/parametrics.js +3 -3
  377. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  378. package/dist/hvac-equipment/tool.js +12 -2
  379. package/dist/imported-mesh/definition.d.ts +5 -0
  380. package/dist/imported-mesh/definition.d.ts.map +1 -0
  381. package/dist/imported-mesh/definition.js +38 -0
  382. package/dist/imported-mesh/floorplan.d.ts +4 -0
  383. package/dist/imported-mesh/floorplan.d.ts.map +1 -0
  384. package/dist/imported-mesh/floorplan.js +34 -0
  385. package/dist/imported-mesh/geometry.d.ts +5 -0
  386. package/dist/imported-mesh/geometry.d.ts.map +1 -0
  387. package/dist/imported-mesh/geometry.js +34 -0
  388. package/dist/imported-mesh/index.d.ts +4 -0
  389. package/dist/imported-mesh/index.d.ts.map +1 -0
  390. package/dist/imported-mesh/index.js +3 -0
  391. package/dist/imported-mesh/schema.d.ts +2 -0
  392. package/dist/imported-mesh/schema.d.ts.map +1 -0
  393. package/dist/imported-mesh/schema.js +1 -0
  394. package/dist/index.d.ts +7 -2
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +17 -2
  397. package/dist/item/definition.d.ts.map +1 -1
  398. package/dist/item/definition.js +10 -2
  399. package/dist/item/floorplan-move.d.ts +9 -1
  400. package/dist/item/floorplan-move.d.ts.map +1 -1
  401. package/dist/item/floorplan-move.js +74 -2
  402. package/dist/item/floorplan.d.ts.map +1 -1
  403. package/dist/item/floorplan.js +33 -1
  404. package/dist/item/move-tool.d.ts +28 -1
  405. package/dist/item/move-tool.d.ts.map +1 -1
  406. package/dist/item/move-tool.js +15 -3
  407. package/dist/item/panel.js +1 -1
  408. package/dist/item/renderer.d.ts.map +1 -1
  409. package/dist/item/renderer.js +16 -6
  410. package/dist/item/system.d.ts +5 -0
  411. package/dist/item/system.d.ts.map +1 -1
  412. package/dist/item/system.js +7 -1
  413. package/dist/lean-to-extension/arc.d.ts +14 -0
  414. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  415. package/dist/lean-to-extension/arc.js +56 -0
  416. package/dist/lean-to-extension/assembly.d.ts +61 -0
  417. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  418. package/dist/lean-to-extension/assembly.js +761 -0
  419. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  420. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  421. package/dist/lean-to-extension/canopy-joint.js +234 -0
  422. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  423. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  424. package/dist/lean-to-extension/conical-host.js +113 -0
  425. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  426. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  427. package/dist/lean-to-extension/corner-joint.js +1202 -0
  428. package/dist/lean-to-extension/definition.d.ts +4 -0
  429. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  430. package/dist/lean-to-extension/definition.js +433 -0
  431. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  432. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  433. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  434. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  435. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  436. package/dist/lean-to-extension/floorplan-move.js +157 -0
  437. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  438. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  439. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  440. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  441. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  442. package/dist/lean-to-extension/floorplan.js +373 -0
  443. package/dist/lean-to-extension/geometry.d.ts +7 -0
  444. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  445. package/dist/lean-to-extension/geometry.js +662 -0
  446. package/dist/lean-to-extension/index.d.ts +8 -0
  447. package/dist/lean-to-extension/index.d.ts.map +1 -0
  448. package/dist/lean-to-extension/index.js +7 -0
  449. package/dist/lean-to-extension/layout.d.ts +108 -0
  450. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  451. package/dist/lean-to-extension/layout.js +477 -0
  452. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  453. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  454. package/dist/lean-to-extension/managed-preview.js +93 -0
  455. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  456. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  457. package/dist/lean-to-extension/move-tool.js +202 -0
  458. package/dist/lean-to-extension/paint.d.ts +2 -0
  459. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  460. package/dist/lean-to-extension/paint.js +16 -0
  461. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  462. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  463. package/dist/lean-to-extension/parametrics.js +570 -0
  464. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  465. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  466. package/dist/lean-to-extension/placement-scope.js +4 -0
  467. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  468. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  469. package/dist/lean-to-extension/placement-validation.js +324 -0
  470. package/dist/lean-to-extension/placement.d.ts +59 -0
  471. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  472. package/dist/lean-to-extension/placement.js +331 -0
  473. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  474. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  475. package/dist/lean-to-extension/plan-footprint.js +27 -0
  476. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  477. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  478. package/dist/lean-to-extension/preview-geometry.js +40 -0
  479. package/dist/lean-to-extension/preview.d.ts +7 -0
  480. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  481. package/dist/lean-to-extension/preview.js +20 -0
  482. package/dist/lean-to-extension/renderer.d.ts +6 -0
  483. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  484. package/dist/lean-to-extension/renderer.js +34 -0
  485. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  486. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  487. package/dist/lean-to-extension/roof-attachment.js +376 -0
  488. package/dist/lean-to-extension/schema.d.ts +2 -0
  489. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  490. package/dist/lean-to-extension/schema.js +1 -0
  491. package/dist/lean-to-extension/slots.d.ts +5 -0
  492. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  493. package/dist/lean-to-extension/slots.js +15 -0
  494. package/dist/lean-to-extension/system.d.ts +7 -0
  495. package/dist/lean-to-extension/system.d.ts.map +1 -0
  496. package/dist/lean-to-extension/system.js +726 -0
  497. package/dist/lean-to-extension/tool.d.ts +3 -0
  498. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  499. package/dist/lean-to-extension/tool.js +580 -0
  500. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  501. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  502. package/dist/lean-to-extension/wall-target.js +29 -0
  503. package/dist/lineset/definition.d.ts.map +1 -1
  504. package/dist/lineset/definition.js +1 -0
  505. package/dist/liquid-line/definition.d.ts.map +1 -1
  506. package/dist/liquid-line/definition.js +1 -0
  507. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  508. package/dist/pipe-fitting/definition.js +16 -2
  509. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  510. package/dist/pipe-fitting/floorplan.js +4 -0
  511. package/dist/pipe-fitting/geometry.d.ts +3 -5
  512. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  513. package/dist/pipe-fitting/geometry.js +154 -21
  514. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  515. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  516. package/dist/pipe-fitting/inline-insertion.js +96 -0
  517. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  518. package/dist/pipe-fitting/parametrics.js +17 -3
  519. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  520. package/dist/pipe-fitting/ports.js +8 -1
  521. package/dist/pipe-fitting/tool.d.ts +26 -0
  522. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  523. package/dist/pipe-fitting/tool.js +182 -37
  524. package/dist/pipe-segment/continuation.d.ts +22 -0
  525. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  526. package/dist/pipe-segment/continuation.js +146 -0
  527. package/dist/pipe-segment/definition.d.ts.map +1 -1
  528. package/dist/pipe-segment/definition.js +23 -7
  529. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  530. package/dist/pipe-segment/floorplan.js +42 -0
  531. package/dist/pipe-segment/geometry.d.ts +2 -1
  532. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  533. package/dist/pipe-segment/geometry.js +4 -1
  534. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  535. package/dist/pipe-segment/move-tool.js +25 -5
  536. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  537. package/dist/pipe-segment/parametrics.js +49 -0
  538. package/dist/pipe-segment/selection.d.ts +3 -4
  539. package/dist/pipe-segment/selection.d.ts.map +1 -1
  540. package/dist/pipe-segment/selection.js +169 -105
  541. package/dist/pipe-segment/slope.d.ts +5 -0
  542. package/dist/pipe-segment/slope.d.ts.map +1 -0
  543. package/dist/pipe-segment/slope.js +10 -0
  544. package/dist/pipe-segment/tool.d.ts.map +1 -1
  545. package/dist/pipe-segment/tool.js +325 -545
  546. package/dist/pipe-trap/tool.d.ts.map +1 -1
  547. package/dist/pipe-trap/tool.js +15 -2
  548. package/dist/procedural-item/definition.d.ts +4 -0
  549. package/dist/procedural-item/definition.d.ts.map +1 -0
  550. package/dist/procedural-item/definition.js +254 -0
  551. package/dist/procedural-item/geometry.d.ts +31 -0
  552. package/dist/procedural-item/geometry.d.ts.map +1 -0
  553. package/dist/procedural-item/geometry.js +88 -0
  554. package/dist/procedural-item/index.d.ts +3 -0
  555. package/dist/procedural-item/index.d.ts.map +1 -0
  556. package/dist/procedural-item/index.js +2 -0
  557. package/dist/procedural-item/move-session.d.ts +15 -0
  558. package/dist/procedural-item/move-session.d.ts.map +1 -0
  559. package/dist/procedural-item/move-session.js +197 -0
  560. package/dist/procedural-item/move-tool.d.ts +5 -0
  561. package/dist/procedural-item/move-tool.d.ts.map +1 -0
  562. package/dist/procedural-item/move-tool.js +193 -0
  563. package/dist/procedural-item/renderer.d.ts +5 -0
  564. package/dist/procedural-item/renderer.d.ts.map +1 -0
  565. package/dist/procedural-item/renderer.js +66 -0
  566. package/dist/ridge-vent/definition.js +1 -1
  567. package/dist/ridge-vent/panel.d.ts.map +1 -1
  568. package/dist/ridge-vent/panel.js +4 -4
  569. package/dist/ridge-vent/parametrics.js +1 -1
  570. package/dist/roof/conical-roof-placement.d.ts +36 -0
  571. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  572. package/dist/roof/conical-roof-placement.js +134 -0
  573. package/dist/roof/conical-roof.d.ts +3 -0
  574. package/dist/roof/conical-roof.d.ts.map +1 -0
  575. package/dist/roof/conical-roof.js +53 -0
  576. package/dist/roof/definition.d.ts +3 -10
  577. package/dist/roof/definition.d.ts.map +1 -1
  578. package/dist/roof/definition.js +83 -13
  579. package/dist/roof/floorplan.d.ts +3 -10
  580. package/dist/roof/floorplan.d.ts.map +1 -1
  581. package/dist/roof/floorplan.js +139 -165
  582. package/dist/roof/index.d.ts +1 -0
  583. package/dist/roof/index.d.ts.map +1 -1
  584. package/dist/roof/index.js +1 -0
  585. package/dist/roof/panel.d.ts.map +1 -1
  586. package/dist/roof/panel.js +26 -25
  587. package/dist/roof/renderer.d.ts.map +1 -1
  588. package/dist/roof/roof-footprint-source.d.ts +16 -0
  589. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  590. package/dist/roof/roof-footprint-source.js +14 -0
  591. package/dist/roof/roof-footprint.d.ts +25 -0
  592. package/dist/roof/roof-footprint.d.ts.map +1 -0
  593. package/dist/roof/roof-footprint.js +94 -0
  594. package/dist/roof/roof-placement-mode.d.ts +18 -0
  595. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  596. package/dist/roof/roof-placement-mode.js +24 -0
  597. package/dist/roof/tool.d.ts +10 -0
  598. package/dist/roof/tool.d.ts.map +1 -0
  599. package/dist/roof/tool.js +922 -0
  600. package/dist/roof-segment/definition.d.ts.map +1 -1
  601. package/dist/roof-segment/definition.js +52 -8
  602. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  603. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  604. package/dist/roof-segment/floorplan-affordances.js +64 -18
  605. package/dist/roof-segment/floorplan.d.ts +3 -2
  606. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  607. package/dist/roof-segment/floorplan.js +95 -46
  608. package/dist/roof-segment/panel.d.ts.map +1 -1
  609. package/dist/roof-segment/panel.js +122 -27
  610. package/dist/scan/definition.d.ts +2 -3
  611. package/dist/scan/definition.d.ts.map +1 -1
  612. package/dist/scan/definition.js +9 -7
  613. package/dist/scan/parametrics.d.ts.map +1 -1
  614. package/dist/scan/parametrics.js +13 -1
  615. package/dist/scan/renderer.d.ts.map +1 -1
  616. package/dist/scan/renderer.js +8 -2
  617. package/dist/shared/accessory-cursor.d.ts +7 -0
  618. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  619. package/dist/shared/accessory-cursor.js +83 -0
  620. package/dist/shared/accessory-floorplan.d.ts +4 -0
  621. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  622. package/dist/shared/accessory-floorplan.js +51 -0
  623. package/dist/shared/accessory-geometry.d.ts +7 -0
  624. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  625. package/dist/shared/accessory-geometry.js +79 -0
  626. package/dist/shared/accessory-placement.d.ts +10 -0
  627. package/dist/shared/accessory-placement.d.ts.map +1 -0
  628. package/dist/shared/accessory-placement.js +126 -0
  629. package/dist/shared/accessory-snapping.d.ts +5 -0
  630. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  631. package/dist/shared/accessory-snapping.js +40 -0
  632. package/dist/shared/automatic-run-end-cap.d.ts +12 -0
  633. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  634. package/dist/shared/automatic-run-end-cap.js +169 -0
  635. package/dist/shared/block-face-host.d.ts +15 -0
  636. package/dist/shared/block-face-host.d.ts.map +1 -0
  637. package/dist/shared/block-face-host.js +36 -0
  638. package/dist/shared/connection-compatibility.d.ts +8 -0
  639. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  640. package/dist/shared/connection-compatibility.js +28 -0
  641. package/dist/shared/connection-feedback.d.ts +10 -0
  642. package/dist/shared/connection-feedback.d.ts.map +1 -0
  643. package/dist/shared/connection-feedback.js +17 -0
  644. package/dist/shared/distribution-run-contract.d.ts +49 -0
  645. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  646. package/dist/shared/distribution-run-contract.js +30 -0
  647. package/dist/shared/distribution-run-tool.d.ts +117 -0
  648. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  649. package/dist/shared/distribution-run-tool.js +986 -0
  650. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  651. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  652. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  653. package/dist/shared/duct-adapter.d.ts +10 -0
  654. package/dist/shared/duct-adapter.d.ts.map +1 -0
  655. package/dist/shared/duct-adapter.js +43 -0
  656. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  657. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  658. package/dist/shared/elbow-branch-continuation.js +200 -0
  659. package/dist/shared/fitting-clearance.d.ts +5 -0
  660. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  661. package/dist/shared/fitting-clearance.js +11 -0
  662. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  663. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  664. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  665. package/dist/shared/fitting-surface-support.d.ts +5 -0
  666. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  667. package/dist/shared/fitting-surface-support.js +42 -0
  668. package/dist/shared/fitting-tool-options.d.ts +4 -0
  669. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  670. package/dist/shared/fitting-tool-options.js +175 -0
  671. package/dist/shared/floor-placement.d.ts +1 -1
  672. package/dist/shared/floor-placement.d.ts.map +1 -1
  673. package/dist/shared/floor-placement.js +13 -33
  674. package/dist/shared/ghost-materials.d.ts.map +1 -1
  675. package/dist/shared/ghost-materials.js +2 -1
  676. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  677. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  678. package/dist/shared/lean-to-post-omissions.js +51 -0
  679. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  680. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  681. package/dist/shared/mep-fitting-actions.js +16 -0
  682. package/dist/shared/mep-presets.d.ts +11 -0
  683. package/dist/shared/mep-presets.d.ts.map +1 -0
  684. package/dist/shared/mep-presets.js +34 -0
  685. package/dist/shared/node-batch/candidates.d.ts +29 -0
  686. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  687. package/dist/shared/node-batch/candidates.js +260 -0
  688. package/dist/shared/node-batch/store.d.ts +26 -0
  689. package/dist/shared/node-batch/store.d.ts.map +1 -0
  690. package/dist/shared/node-batch/store.js +319 -0
  691. package/dist/shared/node-batch/system.d.ts +8 -0
  692. package/dist/shared/node-batch/system.d.ts.map +1 -0
  693. package/dist/shared/node-batch/system.js +569 -0
  694. package/dist/shared/node-batch/types.d.ts +99 -0
  695. package/dist/shared/node-batch/types.d.ts.map +1 -0
  696. package/dist/shared/node-batch/types.js +4 -0
  697. package/dist/shared/opening-move-history.d.ts +47 -0
  698. package/dist/shared/opening-move-history.d.ts.map +1 -0
  699. package/dist/shared/opening-move-history.js +18 -0
  700. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  701. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  702. package/dist/shared/opening-move-wall-gate.js +44 -0
  703. package/dist/shared/panel-fields.d.ts +15 -0
  704. package/dist/shared/panel-fields.d.ts.map +1 -0
  705. package/dist/shared/panel-fields.js +31 -0
  706. package/dist/shared/path-point-affordance.d.ts +2 -2
  707. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  708. package/dist/shared/path-point-affordance.js +30 -6
  709. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  710. package/dist/shared/placeholder-geometry.js +4 -0
  711. package/dist/shared/ports.d.ts +20 -3
  712. package/dist/shared/ports.d.ts.map +1 -1
  713. package/dist/shared/ports.js +148 -7
  714. package/dist/shared/primitive-uv.d.ts +17 -0
  715. package/dist/shared/primitive-uv.d.ts.map +1 -0
  716. package/dist/shared/primitive-uv.js +107 -0
  717. package/dist/shared/reducer-size.d.ts +2 -0
  718. package/dist/shared/reducer-size.d.ts.map +1 -0
  719. package/dist/shared/reducer-size.js +12 -0
  720. package/dist/shared/resting-surface-plan.d.ts +3 -0
  721. package/dist/shared/resting-surface-plan.d.ts.map +1 -0
  722. package/dist/shared/resting-surface-plan.js +28 -0
  723. package/dist/shared/ridge-snap.js +1 -1
  724. package/dist/shared/roof-surface.d.ts.map +1 -1
  725. package/dist/shared/roof-surface.js +17 -2
  726. package/dist/shared/run-cursor.d.ts +22 -0
  727. package/dist/shared/run-cursor.d.ts.map +1 -0
  728. package/dist/shared/run-cursor.js +19 -0
  729. package/dist/shared/run-direction-feedback.d.ts +20 -0
  730. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  731. package/dist/shared/run-direction-feedback.js +139 -0
  732. package/dist/shared/run-hanger-controls.d.ts +7 -0
  733. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  734. package/dist/shared/run-hanger-controls.js +44 -0
  735. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  736. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  737. package/dist/shared/run-hanger-inspector.js +43 -0
  738. package/dist/shared/run-hanger-mode.d.ts +11 -0
  739. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  740. package/dist/shared/run-hanger-mode.js +32 -0
  741. package/dist/shared/run-hanger-system.d.ts +3 -0
  742. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  743. package/dist/shared/run-hanger-system.js +39 -0
  744. package/dist/shared/run-hangers.d.ts +25 -0
  745. package/dist/shared/run-hangers.d.ts.map +1 -0
  746. package/dist/shared/run-hangers.js +261 -0
  747. package/dist/shared/run-port-snap.d.ts +11 -0
  748. package/dist/shared/run-port-snap.d.ts.map +1 -0
  749. package/dist/shared/run-port-snap.js +19 -0
  750. package/dist/shared/run-screen-direction.d.ts +5 -0
  751. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  752. package/dist/shared/run-screen-direction.js +24 -0
  753. package/dist/shared/selection-handles.d.ts +4 -0
  754. package/dist/shared/selection-handles.d.ts.map +1 -1
  755. package/dist/shared/selection-handles.js +10 -0
  756. package/dist/shared/slot-paint.d.ts +8 -1
  757. package/dist/shared/slot-paint.d.ts.map +1 -1
  758. package/dist/shared/slot-paint.js +120 -27
  759. package/dist/shared/surface-paint.d.ts +1 -2
  760. package/dist/shared/surface-paint.d.ts.map +1 -1
  761. package/dist/shared/surface-paint.js +9 -20
  762. package/dist/shared/system-check-panel.d.ts +6 -0
  763. package/dist/shared/system-check-panel.d.ts.map +1 -0
  764. package/dist/shared/system-check-panel.js +62 -0
  765. package/dist/shared/system-checks.d.ts +9 -0
  766. package/dist/shared/system-checks.d.ts.map +1 -0
  767. package/dist/shared/system-checks.js +131 -0
  768. package/dist/shared/wall-attach-target.d.ts +14 -2
  769. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  770. package/dist/shared/wall-attach-target.js +108 -4
  771. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  772. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  773. package/dist/shared/wall-opening-clearance.js +28 -0
  774. package/dist/shared/wall-run-move.d.ts +17 -0
  775. package/dist/shared/wall-run-move.d.ts.map +1 -0
  776. package/dist/shared/wall-run-move.js +56 -0
  777. package/dist/shelf/definition.d.ts.map +1 -1
  778. package/dist/shelf/definition.js +2 -1
  779. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  780. package/dist/shelf/floorplan-affordances.js +5 -3
  781. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  782. package/dist/shelf/floorplan-move.js +3 -2
  783. package/dist/shelf/geometry.d.ts.map +1 -1
  784. package/dist/shelf/geometry.js +2 -10
  785. package/dist/shelf/parametrics.js +4 -4
  786. package/dist/site/renderer.d.ts.map +1 -1
  787. package/dist/site/renderer.js +40 -28
  788. package/dist/site/terrain-geometry.d.ts +1 -1
  789. package/dist/site/terrain-geometry.d.ts.map +1 -1
  790. package/dist/site/terrain-geometry.js +35 -9
  791. package/dist/site/terrain-mesh.d.ts +5 -0
  792. package/dist/site/terrain-mesh.d.ts.map +1 -1
  793. package/dist/site/terrain-mesh.js +63 -34
  794. package/dist/skylight/definition.js +1 -1
  795. package/dist/skylight/panel.js +6 -6
  796. package/dist/skylight/parametrics.js +2 -2
  797. package/dist/slab/definition.d.ts.map +1 -1
  798. package/dist/slab/definition.js +6 -1
  799. package/dist/slab/dependency-tracker.d.ts +3 -0
  800. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  801. package/dist/slab/dependency-tracker.js +104 -0
  802. package/dist/slab/floorplan-affordances.d.ts +8 -8
  803. package/dist/slab/geometry.d.ts.map +1 -1
  804. package/dist/slab/geometry.js +16 -2
  805. package/dist/slab/panel.js +1 -1
  806. package/dist/slab/parametrics.js +1 -1
  807. package/dist/slab/system.d.ts.map +1 -1
  808. package/dist/slab/system.js +8 -64
  809. package/dist/solar-panel/definition.js +1 -1
  810. package/dist/solar-panel/panel.js +2 -2
  811. package/dist/solar-panel/parametrics.js +2 -2
  812. package/dist/spawn/panel.js +1 -1
  813. package/dist/stair/panel.d.ts.map +1 -1
  814. package/dist/stair/panel.js +23 -16
  815. package/dist/stair/stair-type.d.ts +18 -0
  816. package/dist/stair/stair-type.d.ts.map +1 -0
  817. package/dist/stair/stair-type.js +25 -0
  818. package/dist/stair-segment/panel.d.ts.map +1 -1
  819. package/dist/stair-segment/panel.js +45 -6
  820. package/dist/turbine-vent/definition.d.ts.map +1 -1
  821. package/dist/turbine-vent/definition.js +8 -5
  822. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  823. package/dist/turbine-vent/geometry.js +48 -18
  824. package/dist/turbine-vent/paint.d.ts +4 -0
  825. package/dist/turbine-vent/paint.d.ts.map +1 -0
  826. package/dist/turbine-vent/paint.js +35 -0
  827. package/dist/turbine-vent/panel.js +1 -1
  828. package/dist/turbine-vent/parametrics.js +2 -2
  829. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  830. package/dist/turbine-vent/renderer.js +31 -9
  831. package/dist/unit/definition.d.ts +10 -0
  832. package/dist/unit/definition.d.ts.map +1 -0
  833. package/dist/unit/definition.js +38 -0
  834. package/dist/unit/index.d.ts +2 -0
  835. package/dist/unit/index.d.ts.map +1 -0
  836. package/dist/unit/index.js +1 -0
  837. package/dist/unit/parametrics.d.ts +3 -0
  838. package/dist/unit/parametrics.d.ts.map +1 -0
  839. package/dist/unit/parametrics.js +4 -0
  840. package/dist/unit/schema.d.ts +2 -0
  841. package/dist/unit/schema.d.ts.map +1 -0
  842. package/dist/unit/schema.js +1 -0
  843. package/dist/unit/unit-panel.d.ts +5 -0
  844. package/dist/unit/unit-panel.d.ts.map +1 -0
  845. package/dist/unit/unit-panel.js +61 -0
  846. package/dist/wall/curve-eligibility.d.ts +3 -0
  847. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  848. package/dist/wall/curve-eligibility.js +10 -0
  849. package/dist/wall/curve-tool.d.ts.map +1 -1
  850. package/dist/wall/curve-tool.js +8 -11
  851. package/dist/wall/definition.d.ts +1 -1
  852. package/dist/wall/definition.d.ts.map +1 -1
  853. package/dist/wall/definition.js +36 -13
  854. package/dist/wall/floorplan-affordances.d.ts +1 -0
  855. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  856. package/dist/wall/floorplan-affordances.js +46 -7
  857. package/dist/wall/floorplan-move.d.ts +3 -4
  858. package/dist/wall/floorplan-move.d.ts.map +1 -1
  859. package/dist/wall/floorplan-move.js +122 -9
  860. package/dist/wall/floorplan.d.ts.map +1 -1
  861. package/dist/wall/floorplan.js +19 -23
  862. package/dist/wall/move-shared.d.ts.map +1 -1
  863. package/dist/wall/move-shared.js +10 -7
  864. package/dist/wall/paint.d.ts.map +1 -1
  865. package/dist/wall/paint.js +2 -0
  866. package/dist/wall/panel.d.ts.map +1 -1
  867. package/dist/wall/panel.js +10 -17
  868. package/dist/wall/parametrics.js +2 -2
  869. package/dist/wall/pointer-transparency.d.ts +128 -0
  870. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  871. package/dist/wall/pointer-transparency.js +147 -0
  872. package/dist/wall/renderer.d.ts.map +1 -1
  873. package/dist/wall/renderer.js +65 -8
  874. package/dist/wall/selection-hit-owner.d.ts +53 -0
  875. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  876. package/dist/wall/selection-hit-owner.js +79 -0
  877. package/dist/wall/system.d.ts +2 -0
  878. package/dist/wall/system.d.ts.map +1 -1
  879. package/dist/wall/system.js +66 -25
  880. package/dist/wall/tool.d.ts.map +1 -1
  881. package/dist/wall/tool.js +5 -0
  882. package/dist/wall/treatment-level-data.d.ts +6 -1
  883. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  884. package/dist/wall/treatment-level-data.js +82 -5
  885. package/dist/wall/treatments.d.ts +1 -0
  886. package/dist/wall/treatments.d.ts.map +1 -1
  887. package/dist/wall/treatments.js +5 -0
  888. package/dist/wall/wall-batch-system.d.ts +38 -6
  889. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  890. package/dist/wall/wall-batch-system.js +122 -25
  891. package/dist/wall/wall-batch.js +2 -2
  892. package/dist/window/definition.d.ts +2 -1
  893. package/dist/window/definition.d.ts.map +1 -1
  894. package/dist/window/definition.js +51 -24
  895. package/dist/window/floorplan-move.d.ts.map +1 -1
  896. package/dist/window/floorplan-move.js +1 -1
  897. package/dist/window/move-tool.d.ts +7 -5
  898. package/dist/window/move-tool.d.ts.map +1 -1
  899. package/dist/window/move-tool.js +344 -58
  900. package/dist/window/panel.d.ts.map +1 -1
  901. package/dist/window/panel.js +8 -6
  902. package/dist/window/parametrics.js +2 -2
  903. package/dist/window/renderer.d.ts.map +1 -1
  904. package/dist/window/renderer.js +5 -7
  905. package/dist/window/tool.d.ts.map +1 -1
  906. package/dist/window/tool.js +227 -13
  907. package/dist/zone/definition.d.ts.map +1 -1
  908. package/dist/zone/definition.js +7 -1
  909. package/dist/zone/floorplan-affordances.d.ts +12 -12
  910. package/dist/zone/floorplan.d.ts +1 -3
  911. package/dist/zone/floorplan.d.ts.map +1 -1
  912. package/dist/zone/floorplan.js +43 -28
  913. package/dist/zone/quantities-panel.d.ts.map +1 -1
  914. package/dist/zone/quantities-panel.js +33 -29
  915. package/dist/zone/renderer.d.ts.map +1 -1
  916. package/dist/zone/renderer.js +20 -6
  917. package/dist/zone/unit-membership.d.ts +12 -0
  918. package/dist/zone/unit-membership.d.ts.map +1 -0
  919. package/dist/zone/unit-membership.js +22 -0
  920. package/package.json +16 -8
  921. package/dist/dormer/panel-window-section.d.ts +0 -14
  922. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  923. package/dist/dormer/panel-window-section.js +0 -59
  924. package/dist/dormer/window-assembly.d.ts +0 -22
  925. package/dist/dormer/window-assembly.d.ts.map +0 -1
  926. package/dist/dormer/window-assembly.js +0 -111
  927. package/dist/dormer/window-frame.d.ts +0 -24
  928. package/dist/dormer/window-frame.d.ts.map +0 -1
  929. package/dist/dormer/window-frame.js +0 -100
@@ -0,0 +1,47 @@
1
+ /**
2
+ * One-undo-entry-per-gesture history session for the door / window MOVE
3
+ * tools (the E5 drag-commit contract: mid-drag writes none, drop writes
4
+ * exactly one, undo restores the exact pre-drag state).
5
+ *
6
+ * The tools previously called `useScene.temporal.getState().pause()` /
7
+ * `.resume()` RAW. That pause is invisible to the refcounted
8
+ * `getSceneHistoryPauseDepth()` every cooperating system checks, which
9
+ * broke the gesture's atomicity two ways:
10
+ *
11
+ * 1. zundo reads `isTracking` AFTER the store's subscribers run for a
12
+ * write. A subscriber that takes a balanced
13
+ * `pauseSceneHistory`/`resumeSceneHistory` pair during a mid-drag
14
+ * write (the space-detection sync does exactly this when a reparent
15
+ * touches a wall's `children`) sees depth 0 → its resume re-enables
16
+ * tracking — and the mid-drag write that TRIGGERED it, plus every
17
+ * write after, lands in `pastStates`. That is night-6's door-drag
18
+ * undo defect: a scene commit fired the moment the drag armed, and a
19
+ * completed drag left multiple undo entries, none of them the
20
+ * baseline (door isTransient/invisible, parented to the level, an
21
+ * orphan opening at the drop spot...).
22
+ * 2. Systems that stand down during interactions gate on
23
+ * `getSceneHistoryPauseDepth() > 0`; a raw pause never registered, so
24
+ * they kept reconciling against half-written mid-drag states.
25
+ *
26
+ * This session holds a refcounted LEASE (`acquireSceneHistoryPause`)
27
+ * instead. While it is held the depth is ≥ 1, so cooperating systems both
28
+ * see the interaction and — crucially — can no longer zero the refcount
29
+ * and resume tracking out from under the gesture. `commitStep` opens the
30
+ * one deliberate tracking window for the drop write; `end` releases the
31
+ * lease (idempotent, safe to call from both cancel and effect cleanup).
32
+ */
33
+ export type OpeningMoveHistorySession = {
34
+ /**
35
+ * Run the gesture's single committing write with history tracking live:
36
+ * releases the lease for exactly this call, then re-acquires it so any
37
+ * teardown writes that follow (tool unmount, selection churn) stay out
38
+ * of history. The caller restores the node to its exact pre-drag state
39
+ * (still paused) right BEFORE this, so the one entry zundo records has
40
+ * the true baseline as its past state.
41
+ */
42
+ commitStep<T>(write: () => T): T;
43
+ /** Release the gesture's history pause. Idempotent. */
44
+ end(): void;
45
+ };
46
+ export declare const beginOpeningMoveHistorySession: () => OpeningMoveHistorySession;
47
+ //# sourceMappingURL=opening-move-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-move-history.d.ts","sourceRoot":"","sources":["../../src/shared/opening-move-history.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;;;;;OAOG;IACH,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAChC,uDAAuD;IACvD,GAAG,IAAI,IAAI,CAAA;CACZ,CAAA;AAED,eAAO,MAAM,8BAA8B,QAAO,yBAejD,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { acquireSceneHistoryPause, useScene } from '@pascal-app/core';
2
+ export const beginOpeningMoveHistorySession = () => {
3
+ let release = acquireSceneHistoryPause(useScene);
4
+ return {
5
+ commitStep(write) {
6
+ release();
7
+ try {
8
+ return write();
9
+ }
10
+ finally {
11
+ release = acquireSceneHistoryPause(useScene);
12
+ }
13
+ },
14
+ end() {
15
+ release();
16
+ },
17
+ };
18
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Hidden-wall gate for the door / window MOVE tools.
3
+ *
4
+ * #689's hidden-wall pointer hold keeps EVERY hidden wall a ray target while
5
+ * an opening tool is active — that fixed the drag detaching into the floor
6
+ * free-follow (red world-axis ghost) when the node's own wall is hidden in
7
+ * X-ray. But nearest-hit-wins over-corrected the MOVE tools: a hidden wall
8
+ * INTERPOSED between the camera and the dragged opening's own wall caught
9
+ * the `wall:move` stream, so the drag silently rode a wall the user cannot
10
+ * see and the commit RE-PARENTED the opening onto it (night-6 QA: a window
11
+ * moved along its z=0 wall landed on an invisible wall at z=-2.5).
12
+ *
13
+ * Rule — while MOVING an existing opening, a wall event may drive the drag
14
+ * only when:
15
+ * - the event's wall is one of the node's OWN walls (the wall it was
16
+ * grabbed from, or the host it legitimately re-parented to mid-drag),
17
+ * hidden or not — an X-ray drag along its own hidden wall keeps working
18
+ * exactly as #689 intended; or
19
+ * - the event's wall is VISIBLE — cross-wall re-parenting stays possible,
20
+ * but only onto a target the user can actually see.
21
+ *
22
+ * Ignored events must NOT stop propagation: R3F then continues down the
23
+ * intersection list, so the ray falls through the interposed hidden wall to
24
+ * the node's own wall behind it and the drag keeps riding the wall the user
25
+ * is reasoning about. If the ray misses the own wall entirely the existing
26
+ * off-wall handling (floor free-follow) takes over unchanged.
27
+ *
28
+ * PLACE (fresh door/window, incl. `metadata.isNew` duplicates) keeps the
29
+ * all-walls behavior — placing onto any wall, hidden ones included, is the
30
+ * intended X-ray experience; the tools skip this gate for those.
31
+ *
32
+ * Pure so the truth table is testable without an R3F rig (mirrors
33
+ * `wallPointerEventsSuppressed`); the tools supply live values per event.
34
+ */
35
+ export declare const shouldIgnoreWallEventForOpeningMove: ({ eventWallId, eventWallHidden, ownWallIds, }: {
36
+ /** The wall that emitted the `wall:enter` / `wall:move` / `wall:click`. */
37
+ eventWallId: string;
38
+ /** Live hide state of that wall (the wall-mode pass, see `isWallMeshHidden`). */
39
+ eventWallHidden: boolean;
40
+ /**
41
+ * Walls the moving node may ride even while hidden: the wall it was
42
+ * grabbed from and its current mid-drag host. Non-wall entries (a level id
43
+ * during free-follow, a roof segment, `null`) simply never match.
44
+ */
45
+ ownWallIds: ReadonlyArray<string | null | undefined>;
46
+ }) => boolean;
47
+ /**
48
+ * Live hide state of a wall's registered mesh. `WallCutout` stamps
49
+ * `userData.wallHidden` on the wall's scene-registry mesh every pass (X-ray
50
+ * 'down' mode, cutaway-hidden faces, auto-mode interior partitions); the
51
+ * wall renderer's pointer gate reads the same stamp. Unregistered walls
52
+ * (not mounted yet) count as visible — there is nothing to fall through to.
53
+ */
54
+ export declare const isWallMeshHidden: (wallId: string) => boolean;
55
+ //# sourceMappingURL=opening-move-wall-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-move-wall-gate.d.ts","sourceRoot":"","sources":["../../src/shared/opening-move-wall-gate.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,mCAAmC,GAAI,+CAIjD;IACD,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAA;IACnB,iFAAiF;IACjF,eAAe,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;CACrD,KAAG,OAA+D,CAAA;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,OAC2B,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { sceneRegistry } from '@pascal-app/core';
2
+ /**
3
+ * Hidden-wall gate for the door / window MOVE tools.
4
+ *
5
+ * #689's hidden-wall pointer hold keeps EVERY hidden wall a ray target while
6
+ * an opening tool is active — that fixed the drag detaching into the floor
7
+ * free-follow (red world-axis ghost) when the node's own wall is hidden in
8
+ * X-ray. But nearest-hit-wins over-corrected the MOVE tools: a hidden wall
9
+ * INTERPOSED between the camera and the dragged opening's own wall caught
10
+ * the `wall:move` stream, so the drag silently rode a wall the user cannot
11
+ * see and the commit RE-PARENTED the opening onto it (night-6 QA: a window
12
+ * moved along its z=0 wall landed on an invisible wall at z=-2.5).
13
+ *
14
+ * Rule — while MOVING an existing opening, a wall event may drive the drag
15
+ * only when:
16
+ * - the event's wall is one of the node's OWN walls (the wall it was
17
+ * grabbed from, or the host it legitimately re-parented to mid-drag),
18
+ * hidden or not — an X-ray drag along its own hidden wall keeps working
19
+ * exactly as #689 intended; or
20
+ * - the event's wall is VISIBLE — cross-wall re-parenting stays possible,
21
+ * but only onto a target the user can actually see.
22
+ *
23
+ * Ignored events must NOT stop propagation: R3F then continues down the
24
+ * intersection list, so the ray falls through the interposed hidden wall to
25
+ * the node's own wall behind it and the drag keeps riding the wall the user
26
+ * is reasoning about. If the ray misses the own wall entirely the existing
27
+ * off-wall handling (floor free-follow) takes over unchanged.
28
+ *
29
+ * PLACE (fresh door/window, incl. `metadata.isNew` duplicates) keeps the
30
+ * all-walls behavior — placing onto any wall, hidden ones included, is the
31
+ * intended X-ray experience; the tools skip this gate for those.
32
+ *
33
+ * Pure so the truth table is testable without an R3F rig (mirrors
34
+ * `wallPointerEventsSuppressed`); the tools supply live values per event.
35
+ */
36
+ export const shouldIgnoreWallEventForOpeningMove = ({ eventWallId, eventWallHidden, ownWallIds, }) => eventWallHidden && !ownWallIds.includes(eventWallId);
37
+ /**
38
+ * Live hide state of a wall's registered mesh. `WallCutout` stamps
39
+ * `userData.wallHidden` on the wall's scene-registry mesh every pass (X-ray
40
+ * 'down' mode, cutaway-hidden faces, auto-mode interior partitions); the
41
+ * wall renderer's pointer gate reads the same stamp. Unregistered walls
42
+ * (not mounted yet) count as visible — there is nothing to fall through to.
43
+ */
44
+ export const isWallMeshHidden = (wallId) => sceneRegistry.nodes.get(wallId)?.userData?.wallHidden === true;
@@ -0,0 +1,15 @@
1
+ export declare function PanelTextField({ label, onCommit, value, }: {
2
+ label: string;
3
+ onCommit: (value: string) => void;
4
+ value: string;
5
+ }): import("react").JSX.Element;
6
+ export declare function PanelSelect({ label, onChange, options, value, }: {
7
+ label: string;
8
+ onChange: (value: string) => void;
9
+ options: ReadonlyArray<{
10
+ label: string;
11
+ value: string;
12
+ }>;
13
+ value: string;
14
+ }): import("react").JSX.Element;
15
+ //# sourceMappingURL=panel-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-fields.d.ts","sourceRoot":"","sources":["../../src/shared/panel-fields.tsx"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;CACd,+BAoCA;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,KAAK,EAAE,MAAM,CAAA;CACd,+BAiBA"}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from 'react';
4
+ export function PanelTextField({ label, onCommit, value, }) {
5
+ const [draft, setDraft] = useState(value);
6
+ const cancelRef = useRef(false);
7
+ useEffect(() => setDraft(value), [value]);
8
+ const commit = () => {
9
+ if (cancelRef.current) {
10
+ cancelRef.current = false;
11
+ setDraft(value);
12
+ return;
13
+ }
14
+ const next = draft.trim();
15
+ if (next !== value)
16
+ onCommit(next);
17
+ else
18
+ setDraft(value);
19
+ };
20
+ return (_jsxs("label", { className: "flex h-10 items-center gap-3 rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm", children: [_jsx("span", { className: "shrink-0 text-muted-foreground", children: label }), _jsx("input", { className: "min-w-0 flex-1 bg-transparent text-right text-foreground outline-none selection:bg-primary/30", onBlur: commit, onChange: (event) => setDraft(event.target.value), onKeyDown: (event) => {
21
+ if (event.key === 'Enter')
22
+ event.currentTarget.blur();
23
+ if (event.key === 'Escape') {
24
+ cancelRef.current = true;
25
+ event.currentTarget.blur();
26
+ }
27
+ }, type: "text", value: draft })] }));
28
+ }
29
+ export function PanelSelect({ label, onChange, options, value, }) {
30
+ return (_jsxs("label", { className: "flex h-10 items-center justify-between gap-3 rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: label }), _jsx("select", { className: "min-w-0 rounded-md border border-border/50 bg-[#232325] px-2 py-1 text-foreground text-xs outline-none", onChange: (event) => onChange(event.target.value), value: value, children: options.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) })] }));
31
+ }
@@ -3,8 +3,8 @@ import { type AnyNodeId, type FloorplanAffordance } from '@pascal-app/core';
3
3
  * Shared "drag a path point" floor-plan affordance for polyline
4
4
  * distribution kinds (duct-segment / pipe-segment / lineset). It is the
5
5
  * 2D counterpart of their 3D `affordanceTools.selection` handles: one
6
- * draggable handle per path vertex, moved freely on the plan (XZ) with
7
- * grid snap (Shift bypasses). The vertex's Y (elevation / slope) is held
6
+ * draggable handle per path vertex, moved freely on the plan (XZ) using
7
+ * the active snapping mode. The vertex's Y (elevation / slope) is held
8
8
  * fixed — plan editing never changes height.
9
9
  *
10
10
  * Like the 3D handles, dragging a vertex that sits on a fitting carries the
@@ -1 +1 @@
1
- {"version":3,"file":"path-point-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/path-point-affordance.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,mBAAmB,EAKzB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAA;AAE3E,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,SAAS,GAAG;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,EACnF,IAAI,EAAE,MAAM,GACX,mBAAmB,CAAC,CAAC,CAAC,CAqGxB"}
1
+ {"version":3,"file":"path-point-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/path-point-affordance.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,mBAAmB,EAKzB,MAAM,kBAAkB,CAAA;AASzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAA;AAE3E,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,SAAS,GAAG;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,EACnF,IAAI,EAAE,MAAM,GACX,mBAAmB,CAAC,CAAC,CAAC,CAgIxB"}
@@ -1,5 +1,6 @@
1
1
  import { analyzePortConnectivity, resolveConnectivityUpdates, useScene, } from '@pascal-app/core';
2
- import { snapPointToGrid } from '@pascal-app/editor';
2
+ import { isGridSnapActive, snapPointToGrid } from '@pascal-app/editor';
3
+ import { planRunEndCapFollowUpdates } from './automatic-run-end-cap';
3
4
  import { detectFittingEndpoint, planFittingEndpointReaim, } from './fitting-endpoint-reaim';
4
5
  export function createPathPointMoveAffordance(kind) {
5
6
  const inert = {
@@ -30,7 +31,7 @@ export function createPathPointMoveAffordance(kind) {
30
31
  const fittingEndpoint = isEndpoint
31
32
  ? detectFittingEndpoint(kind, initialPath, pointIndex, nodes)
32
33
  : null;
33
- const connectivity = isEndpoint && !fittingEndpoint
34
+ const connectivity = isEndpoint
34
35
  ? analyzePortConnectivity(node, nodes)
35
36
  : null;
36
37
  // Report every node the drag may write so the dispatcher snapshots them
@@ -40,6 +41,16 @@ export function createPathPointMoveAffordance(kind) {
40
41
  ...(fittingEndpoint ? [fittingEndpoint.fitting.id] : []),
41
42
  ...(connectivity?.connections.map((c) => c.nodeId) ?? []),
42
43
  ];
44
+ const endCapUpdates = (nextPath) => {
45
+ if ((kind !== 'duct-segment' && kind !== 'pipe-segment') || !isEndpoint)
46
+ return [];
47
+ const preview = {
48
+ ...node,
49
+ path: nextPath,
50
+ };
51
+ const endpoint = pointIndex === 0 ? 'start' : 'end';
52
+ return planRunEndCapFollowUpdates(node, preview, endpoint, nodes);
53
+ };
43
54
  const followUpdates = (nextPath) => {
44
55
  if (!connectivity)
45
56
  return [];
@@ -47,14 +58,17 @@ export function createPathPointMoveAffordance(kind) {
47
58
  ...node,
48
59
  path: nextPath,
49
60
  };
50
- return resolveConnectivityUpdates(connectivity, preview).filter((u) => useScene.getState().nodes[u.id]);
61
+ const updates = resolveConnectivityUpdates(connectivity, preview).filter((u) => useScene.getState().nodes[u.id]);
62
+ const capUpdates = endCapUpdates(nextPath);
63
+ const capIds = new Set(capUpdates.map((update) => update.id));
64
+ return [...updates.filter((update) => !capIds.has(update.id)), ...capUpdates];
51
65
  };
52
66
  return {
53
67
  affectedIds,
54
68
  apply({ planPoint, modifiers }) {
55
69
  // Plan coords map x→world X, y→world Z.
56
70
  const raw = [planPoint[0], planPoint[1]];
57
- const [sx, sz] = modifiers.shiftKey ? raw : snapPointToGrid(raw);
71
+ const [sx, sz] = isGridSnapActive() ? snapPointToGrid(raw) : raw;
58
72
  const dragged = [sx, y, sz];
59
73
  // Alt = detach: break the joint for this drag — the elbow does NOT
60
74
  // re-aim and mated fittings / runs do NOT follow; the vertex moves
@@ -68,17 +82,27 @@ export function createPathPointMoveAffordance(kind) {
68
82
  if (!plan)
69
83
  return;
70
84
  useScene.getState().updateNodes([
71
- { id: node.id, data: { path: plan.path } },
85
+ {
86
+ id: node.id,
87
+ data: { path: plan.path, wallAttachment: undefined },
88
+ },
72
89
  {
73
90
  id: plan.fittingUpdate.id,
74
91
  data: plan.fittingUpdate.data,
75
92
  },
93
+ ...endCapUpdates(plan.path).map((update) => ({
94
+ id: update.id,
95
+ data: update.data,
96
+ })),
76
97
  ]);
77
98
  return;
78
99
  }
79
100
  const nextPath = initialPath.map((p, i) => (i === pointIndex ? dragged : p));
80
101
  useScene.getState().updateNodes([
81
- { id: node.id, data: { path: nextPath } },
102
+ {
103
+ id: node.id,
104
+ data: { path: nextPath, wallAttachment: undefined },
105
+ },
82
106
  ...(detached ? [] : followUpdates(nextPath)).map((u) => ({
83
107
  id: u.id,
84
108
  data: u.data,
@@ -1 +1 @@
1
- {"version":3,"file":"placeholder-geometry.d.ts","sourceRoot":"","sources":["../../src/shared/placeholder-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,OAAO,CAAA;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,SAAI,GAAG,cAAc,CAUxE"}
1
+ {"version":3,"file":"placeholder-geometry.d.ts","sourceRoot":"","sources":["../../src/shared/placeholder-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,OAAO,CAAA;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,SAAI,GAAG,cAAc,CAcxE"}
@@ -20,6 +20,10 @@ import { BufferGeometry, Float32BufferAttribute } from 'three';
20
20
  */
21
21
  export function createPlaceholderGeometry(groupCount = 0) {
22
22
  const geometry = new BufferGeometry();
23
+ // Owning systems (and the wall self-heal sweep in
24
+ // viewer/systems/wall/wall-placeholder-sweep.ts) can tell "never built"
25
+ // from "built" without guessing off vertex counts.
26
+ geometry.userData.placeholder = true;
23
27
  geometry.setAttribute('position', new Float32BufferAttribute(new Float32Array(9), 3));
24
28
  geometry.setAttribute('normal', new Float32BufferAttribute(new Float32Array(9), 3));
25
29
  geometry.setAttribute('uv', new Float32BufferAttribute(new Float32Array(6), 2));
@@ -1,4 +1,5 @@
1
- import { type AnyNodeId, type NodePort } from '@pascal-app/core';
1
+ import { type AnyNode, type AnyNodeId, type NodePort } from '@pascal-app/core';
2
+ import type { RunSurfaceTarget } from './distribution-run-contract';
2
3
  /** A port plus the scene node that owns it. */
3
4
  export type ScenePort = NodePort & {
4
5
  nodeId: AnyNodeId;
@@ -19,6 +20,7 @@ export declare const REFRIGERANT_PORT_SYSTEMS: readonly ["refrigerant"];
19
20
  * A port with no `system` matches any filter.
20
21
  */
21
22
  export type PortFilter = {
23
+ levelId?: AnyNodeId;
22
24
  excludeNodeId?: AnyNodeId;
23
25
  systems?: readonly string[];
24
26
  };
@@ -27,7 +29,7 @@ export type PortFilter = {
27
29
  * `def.ports`. Positions are level-local meters (the kind applies its own
28
30
  * transform inside `def.ports`).
29
31
  */
30
- export declare function collectScenePorts(filter?: PortFilter): ScenePort[];
32
+ export declare function collectScenePorts(filter?: PortFilter, sceneNodes?: Readonly<Record<AnyNodeId, AnyNode>>): ScenePort[];
31
33
  /**
32
34
  * Nearest port within `radius` of `point` on the XZ plane. Y is ignored —
33
35
  * grid events ride the floor plane while ports usually hang at duct
@@ -35,6 +37,8 @@ export declare function collectScenePorts(filter?: PortFilter): ScenePort[];
35
37
  * unreachable. The snap adopts the port's full 3D position.
36
38
  */
37
39
  export declare function findNearestPortXZ(point: readonly [number, number, number], ports: ScenePort[], radius: number): ScenePort | null;
40
+ /** Nearest port using true 3D distance. Use this while drafting on a wall. */
41
+ export declare function findNearestPort3D(point: readonly [number, number, number], ports: ScenePort[], radius: number, surface?: RunSurfaceTarget | null): ScenePort | null;
38
42
  /** Closest-point hit on a duct run's centerline (not its end ports). */
39
43
  export type RunBodyHit = {
40
44
  nodeId: AnyNodeId;
@@ -54,7 +58,14 @@ export type RunBodyHit = {
54
58
  export declare function findNearestRunBodyXZ(point: readonly [number, number, number], radius: number, filter?: {
55
59
  excludeNodeId?: AnyNodeId;
56
60
  kinds?: readonly string[];
57
- }): RunBodyHit | null;
61
+ levelId?: AnyNodeId;
62
+ }, sceneNodes?: Readonly<Record<AnyNodeId, AnyNode>>): RunBodyHit | null;
63
+ /** Nearest run centerline point using true 3D distance, including risers. */
64
+ export declare function findNearestRunBody3D(point: readonly [number, number, number], radius: number, filter?: {
65
+ excludeNodeId?: AnyNodeId;
66
+ kinds?: readonly string[];
67
+ levelId?: AnyNodeId;
68
+ }, surface?: RunSurfaceTarget | null, sceneNodes?: Readonly<Record<AnyNodeId, AnyNode>>): RunBodyHit | null;
58
69
  /**
59
70
  * Where a drawn segment `start`→`end` crosses straight THROUGH an
60
71
  * existing run's centerline in XZ — the four-way (cross) case, as
@@ -72,4 +83,10 @@ export declare function findRunBodyCrossingXZ(start: readonly [number, number, n
72
83
  excludeNodeId?: AnyNodeId;
73
84
  kinds?: readonly string[];
74
85
  }): RunBodyHit | null;
86
+ /** Surface-local crossing for wall drafting. Intersects projected U/V lines
87
+ * and ignores runs that are not coplanar with the selected wall. */
88
+ export declare function findRunBodyCrossingSurface(start: readonly [number, number, number], end: readonly [number, number, number], endMargin: number, surface: RunSurfaceTarget, filter?: {
89
+ excludeNodeId?: AnyNodeId;
90
+ kinds?: readonly string[];
91
+ }): RunBodyHit | null;
75
92
  //# sourceMappingURL=ports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/shared/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAA0B,MAAM,kBAAkB,CAAA;AAExF,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAExD,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,+BAAgC,CAAA;AAC9D,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,4BAA6B,CAAA;AAC1D,4DAA4D;AAC5D,eAAO,MAAM,wBAAwB,0BAA2B,CAAA;AAEhE;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,UAAe,GAAG,SAAS,EAAE,CActE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CAalB;AAID,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,SAAS,CAAA;IACjB,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,GAAG,IAAI,CAoCnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,GAAG,IAAI,CAgDnB"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/shared/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAExD,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,+BAAgC,CAAA;AAC9D,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,4BAA6B,CAAA;AAC1D,4DAA4D;AAC5D,eAAO,MAAM,wBAAwB,0BAA2B,CAAA;AAEhE;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,UAAe,EACvB,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAChD,SAAS,EAAE,CAoBb;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CAalB;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAChC,SAAS,GAAG,IAAI,CAqBlB;AAID,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,SAAS,CAAA;IACjB,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAO,EAC1F,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAChD,UAAU,GAAG,IAAI,CAqCnB;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAO,EAC1F,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACjC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAChD,UAAU,GAAG,IAAI,CAiDnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,GAAG,IAAI,CAgDnB;AAED;oEACoE;AACpE,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,EACzB,MAAM,GAAE;IAAE,aAAa,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACpE,UAAU,GAAG,IAAI,CAoEnB"}
@@ -1,4 +1,4 @@
1
- import { nodeRegistry, useScene } from '@pascal-app/core';
1
+ import { findLevelAncestorId, nodeRegistry, useScene, } from '@pascal-app/core';
2
2
  /** Air-loop port systems — what duct runs and fittings snap to. */
3
3
  export const DUCT_PORT_SYSTEMS = ['supply', 'return'];
4
4
  /** DWV port systems — what drain / waste / vent pipe runs snap to. */
@@ -10,12 +10,15 @@ export const REFRIGERANT_PORT_SYSTEMS = ['refrigerant'];
10
10
  * `def.ports`. Positions are level-local meters (the kind applies its own
11
11
  * transform inside `def.ports`).
12
12
  */
13
- export function collectScenePorts(filter = {}) {
14
- const { excludeNodeId, systems } = filter;
15
- const { nodes } = useScene.getState();
13
+ export function collectScenePorts(filter = {}, sceneNodes) {
14
+ const { excludeNodeId, systems, levelId } = filter;
15
+ const nodes = sceneNodes ?? useScene.getState().nodes;
16
16
  const result = [];
17
17
  for (const node of Object.values(nodes)) {
18
- if (!node || node.id === excludeNodeId)
18
+ if (!node ||
19
+ node.visible === false ||
20
+ node.id === excludeNodeId ||
21
+ (levelId && findLevelAncestorId(node.id, nodes) !== levelId))
19
22
  continue;
20
23
  const ports = nodeRegistry.get(node.type)?.ports?.(node);
21
24
  if (!ports)
@@ -48,6 +51,29 @@ export function findNearestPortXZ(point, ports, radius) {
48
51
  }
49
52
  return best;
50
53
  }
54
+ /** Nearest port using true 3D distance. Use this while drafting on a wall. */
55
+ export function findNearestPort3D(point, ports, radius, surface) {
56
+ let best = null;
57
+ let bestDistSq = radius * radius;
58
+ for (const port of ports) {
59
+ if (surface?.kind === 'wall') {
60
+ const planeDistance = (port.position[0] - surface.frame.origin[0]) * surface.frame.normal[0] +
61
+ (port.position[1] - surface.frame.origin[1]) * surface.frame.normal[1] +
62
+ (port.position[2] - surface.frame.origin[2]) * surface.frame.normal[2];
63
+ if (Math.abs(planeDistance) > radius)
64
+ continue;
65
+ }
66
+ const dx = port.position[0] - point[0];
67
+ const dy = port.position[1] - point[1];
68
+ const dz = port.position[2] - point[2];
69
+ const distSq = dx * dx + dy * dy + dz * dz;
70
+ if (distSq <= bestDistSq) {
71
+ bestDistSq = distSq;
72
+ best = port;
73
+ }
74
+ }
75
+ return best;
76
+ }
51
77
  /**
52
78
  * Nearest point on any duct-segment CENTERLINE within `radius` of `point`
53
79
  * on the XZ plane — how a branch taps the side of a trunk. Same XZ-only
@@ -56,14 +82,16 @@ export function findNearestPortXZ(point, ports, radius) {
56
82
  * position. Vertical risers project to a point in XZ and are skipped —
57
83
  * tapping those isn't meaningful.
58
84
  */
59
- export function findNearestRunBodyXZ(point, radius, filter = {}) {
85
+ export function findNearestRunBodyXZ(point, radius, filter = {}, sceneNodes) {
60
86
  const kinds = filter.kinds ?? ['duct-segment'];
61
- const { nodes } = useScene.getState();
87
+ const nodes = sceneNodes ?? useScene.getState().nodes;
62
88
  let best = null;
63
89
  let bestDistSq = radius * radius;
64
90
  for (const node of Object.values(nodes)) {
65
91
  if (!node || !kinds.includes(node.type) || node.id === filter.excludeNodeId)
66
92
  continue;
93
+ if (filter.levelId && findLevelAncestorId(node.id, nodes) !== filter.levelId)
94
+ continue;
67
95
  const path = node.path;
68
96
  if (!path)
69
97
  continue;
@@ -93,6 +121,55 @@ export function findNearestRunBodyXZ(point, radius, filter = {}) {
93
121
  }
94
122
  return best;
95
123
  }
124
+ /** Nearest run centerline point using true 3D distance, including risers. */
125
+ export function findNearestRunBody3D(point, radius, filter = {}, surface, sceneNodes) {
126
+ const kinds = filter.kinds ?? ['duct-segment'];
127
+ const nodes = sceneNodes ?? useScene.getState().nodes;
128
+ let best = null;
129
+ let bestDistSq = radius * radius;
130
+ for (const node of Object.values(nodes)) {
131
+ if (!node || !kinds.includes(node.type) || node.id === filter.excludeNodeId)
132
+ continue;
133
+ if (filter.levelId && findLevelAncestorId(node.id, nodes) !== filter.levelId)
134
+ continue;
135
+ if (node.visible === false)
136
+ continue;
137
+ const path = node.path;
138
+ if (!path)
139
+ continue;
140
+ for (let i = 0; i < path.length - 1; i++) {
141
+ const a = path[i];
142
+ const b = path[i + 1];
143
+ if (surface?.kind === 'wall') {
144
+ const aPlane = (a[0] - surface.frame.origin[0]) * surface.frame.normal[0] +
145
+ (a[1] - surface.frame.origin[1]) * surface.frame.normal[1] +
146
+ (a[2] - surface.frame.origin[2]) * surface.frame.normal[2];
147
+ const bPlane = (b[0] - surface.frame.origin[0]) * surface.frame.normal[0] +
148
+ (b[1] - surface.frame.origin[1]) * surface.frame.normal[1] +
149
+ (b[2] - surface.frame.origin[2]) * surface.frame.normal[2];
150
+ if (Math.abs(aPlane) > radius && Math.abs(bPlane) > radius)
151
+ continue;
152
+ }
153
+ const abx = b[0] - a[0];
154
+ const aby = b[1] - a[1];
155
+ const abz = b[2] - a[2];
156
+ const lenSq = abx * abx + aby * aby + abz * abz;
157
+ if (lenSq < 1e-8)
158
+ continue;
159
+ const t = Math.min(1, Math.max(0, ((point[0] - a[0]) * abx + (point[1] - a[1]) * aby + (point[2] - a[2]) * abz) / lenSq));
160
+ const hit = [a[0] + abx * t, a[1] + aby * t, a[2] + abz * t];
161
+ const dx = point[0] - hit[0];
162
+ const dy = point[1] - hit[1];
163
+ const dz = point[2] - hit[2];
164
+ const distSq = dx * dx + dy * dy + dz * dz;
165
+ if (distSq <= bestDistSq) {
166
+ bestDistSq = distSq;
167
+ best = { nodeId: node.id, segmentIndex: i, point: hit };
168
+ }
169
+ }
170
+ }
171
+ return best;
172
+ }
96
173
  /**
97
174
  * Where a drawn segment `start`→`end` crosses straight THROUGH an
98
175
  * existing run's centerline in XZ — the four-way (cross) case, as
@@ -162,3 +239,67 @@ export function findRunBodyCrossingXZ(start, end, endMargin, filter = {}) {
162
239
  }
163
240
  return best;
164
241
  }
242
+ /** Surface-local crossing for wall drafting. Intersects projected U/V lines
243
+ * and ignores runs that are not coplanar with the selected wall. */
244
+ export function findRunBodyCrossingSurface(start, end, endMargin, surface, filter = {}) {
245
+ const project = (p) => {
246
+ const d = [
247
+ p[0] - surface.frame.origin[0],
248
+ p[1] - surface.frame.origin[1],
249
+ p[2] - surface.frame.origin[2],
250
+ ];
251
+ return [
252
+ d[0] * surface.frame.tangent[0] +
253
+ d[1] * surface.frame.tangent[1] +
254
+ d[2] * surface.frame.tangent[2],
255
+ d[0] * surface.frame.bitangent[0] +
256
+ d[1] * surface.frame.bitangent[1] +
257
+ d[2] * surface.frame.bitangent[2],
258
+ d[0] * surface.frame.normal[0] +
259
+ d[1] * surface.frame.normal[1] +
260
+ d[2] * surface.frame.normal[2],
261
+ ];
262
+ };
263
+ const s0 = project(start), s1 = project(end);
264
+ const dx = s1[0] - s0[0], dy = s1[1] - s0[1];
265
+ const drawnLen = Math.hypot(dx, dy);
266
+ if (drawnLen < 1e-8)
267
+ return null;
268
+ const drawnPad = Math.min(0.45, endMargin / drawnLen);
269
+ const kinds = filter.kinds ?? ['duct-segment'];
270
+ const { nodes } = useScene.getState();
271
+ let best = null;
272
+ let bestScore = Number.POSITIVE_INFINITY;
273
+ for (const node of Object.values(nodes)) {
274
+ if (!node ||
275
+ node.visible === false ||
276
+ node.parentId !== surface.levelId ||
277
+ !kinds.includes(node.type) ||
278
+ node.id === filter.excludeNodeId)
279
+ continue;
280
+ const path = node.path;
281
+ if (!path)
282
+ continue;
283
+ for (let i = 0; i < path.length - 1; i++) {
284
+ const a = path[i], b = path[i + 1], pa = project(a), pb = project(b);
285
+ const ex = pb[0] - pa[0], ey = pb[1] - pa[1], runLen = Math.hypot(ex, ey);
286
+ const denom = dx * ey - dy * ex;
287
+ if (runLen < 1e-8 || Math.abs(denom) < 1e-9)
288
+ continue;
289
+ const wx = pa[0] - s0[0], wy = pa[1] - s0[1];
290
+ const s = (wx * ey - wy * ex) / denom, t = (wx * dy - wy * dx) / denom;
291
+ if (Math.abs(pa[2] + t * (pb[2] - pa[2]) - (s0[2] + s * (s1[2] - s0[2]))) > 0.01)
292
+ continue;
293
+ const runPad = Math.min(0.45, endMargin / runLen);
294
+ if (s <= drawnPad || s >= 1 - drawnPad || t <= runPad || t >= 1 - runPad || s >= bestScore)
295
+ continue;
296
+ bestScore = s;
297
+ best = {
298
+ nodeId: node.id,
299
+ segmentIndex: i,
300
+ point: [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t],
301
+ };
302
+ }
303
+ }
304
+ return best;
305
+ }
@@ -0,0 +1,17 @@
1
+ import * as THREE from 'three';
2
+ export type MetricUv = readonly [number, number];
3
+ type Point3 = readonly [number, number, number] | number[];
4
+ /** Return cumulative metre distances along a sampled open or closed profile. */
5
+ export declare function cumulativeProfileDistances(points: readonly Point3[]): number[];
6
+ /** Project a flat polygon into metre-scaled UV coordinates without shearing trapezoids. */
7
+ export declare function planarMetricUvs(points: readonly Point3[], normal: Point3, uOffset?: number, vOffset?: number): MetricUv[];
8
+ /** Reuse the authored unwrap for AO and light maps, which read texture channel 2. */
9
+ export declare function copyUvToSecondaryChannel(geometry: THREE.BufferGeometry): void;
10
+ /** Apply metre-scaled planar UVs to a non-indexed, axis-aligned primitive. */
11
+ export declare function applyPlanarWorldUvs(geometry: THREE.BufferGeometry): void;
12
+ /** Scale cylinder/cone side UVs by circumference and height; caps use XZ metres. */
13
+ export declare function applyCylinderWorldUvs(geometry: THREE.BufferGeometry, radius: number, height: number): void;
14
+ /** Scale a sphere's equirectangular UVs to its circumference and pole distance. */
15
+ export declare function applySphereWorldUvs(geometry: THREE.BufferGeometry, radius: number): void;
16
+ export {};
17
+ //# sourceMappingURL=primitive-uv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive-uv.d.ts","sourceRoot":"","sources":["../../src/shared/primitive-uv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEhD,KAAK,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;AAE1D,gFAAgF;AAChF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAe9E;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,OAAO,SAAI,EACX,OAAO,SAAI,GACV,QAAQ,EAAE,CA6BZ;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CAG7E;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CA4BxE;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CAkBN;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQxF"}