@pascal-app/nodes 0.1.1 → 1.0.0-beta.2

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 (408) hide show
  1. package/README.md +34 -0
  2. package/dist/building/definition.js +1 -1
  3. package/dist/cabinet/definition.d.ts.map +1 -1
  4. package/dist/cabinet/definition.js +809 -72
  5. package/dist/cabinet/geometry.d.ts.map +1 -1
  6. package/dist/cabinet/geometry.js +4 -0
  7. package/dist/cabinet/move-frame.js +3 -3
  8. package/dist/cabinet/panel.d.ts.map +1 -1
  9. package/dist/cabinet/panel.js +1 -0
  10. package/dist/cabinet/placement-snap.d.ts +8 -0
  11. package/dist/cabinet/placement-snap.d.ts.map +1 -0
  12. package/dist/cabinet/placement-snap.js +19 -0
  13. package/dist/cabinet/presets.js +8 -8
  14. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  15. package/dist/cabinet/quick-actions.js +9 -3
  16. package/dist/cabinet/resize-limits.d.ts +11 -0
  17. package/dist/cabinet/resize-limits.d.ts.map +1 -0
  18. package/dist/cabinet/resize-limits.js +22 -0
  19. package/dist/cabinet/run-layout.d.ts +8 -2
  20. package/dist/cabinet/run-layout.d.ts.map +1 -1
  21. package/dist/cabinet/run-layout.js +59 -7
  22. package/dist/cabinet/run-ops.d.ts +44 -3
  23. package/dist/cabinet/run-ops.d.ts.map +1 -1
  24. package/dist/cabinet/run-ops.js +646 -110
  25. package/dist/cabinet/run-panel.d.ts +2 -1
  26. package/dist/cabinet/run-panel.d.ts.map +1 -1
  27. package/dist/cabinet/run-panel.js +38 -4
  28. package/dist/cabinet/stack-transitions.js +4 -4
  29. package/dist/cabinet/tool.d.ts.map +1 -1
  30. package/dist/cabinet/tool.js +95 -17
  31. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  32. package/dist/cabinet/wall-snap.js +2 -6
  33. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  34. package/dist/ceiling/boundary-editor.js +2 -2
  35. package/dist/ceiling/definition.d.ts +1 -1
  36. package/dist/ceiling/definition.d.ts.map +1 -1
  37. package/dist/ceiling/definition.js +36 -5
  38. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  39. package/dist/ceiling/floorplan-move.d.ts +4 -4
  40. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  41. package/dist/ceiling/floorplan-move.js +5 -4
  42. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  43. package/dist/ceiling/hole-editor.js +2 -2
  44. package/dist/ceiling/move-tool.d.ts.map +1 -1
  45. package/dist/ceiling/move-tool.js +4 -3
  46. package/dist/ceiling/panel.d.ts.map +1 -1
  47. package/dist/ceiling/panel.js +65 -3
  48. package/dist/ceiling/renderer.d.ts.map +1 -1
  49. package/dist/ceiling/renderer.js +6 -2
  50. package/dist/ceiling/tool.d.ts.map +1 -1
  51. package/dist/ceiling/tool.js +12 -1
  52. package/dist/chimney/definition.d.ts.map +1 -1
  53. package/dist/chimney/definition.js +1 -0
  54. package/dist/chimney/tool.d.ts.map +1 -1
  55. package/dist/chimney/tool.js +16 -1
  56. package/dist/column/definition.d.ts.map +1 -1
  57. package/dist/column/definition.js +14 -2
  58. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  59. package/dist/column/floorplan-affordances.js +19 -14
  60. package/dist/column/floorplan-move.d.ts.map +1 -1
  61. package/dist/column/floorplan-move.js +7 -2
  62. package/dist/column/floorplan.d.ts +9 -1
  63. package/dist/column/floorplan.d.ts.map +1 -1
  64. package/dist/column/floorplan.js +59 -4
  65. package/dist/column/tool.d.ts.map +1 -1
  66. package/dist/column/tool.js +33 -7
  67. package/dist/construction-dimension/definition.d.ts +4 -0
  68. package/dist/construction-dimension/definition.d.ts.map +1 -0
  69. package/dist/construction-dimension/definition.js +83 -0
  70. package/dist/construction-dimension/drawing-coordination.d.ts +7 -0
  71. package/dist/construction-dimension/drawing-coordination.d.ts.map +1 -0
  72. package/dist/construction-dimension/drawing-coordination.js +54 -0
  73. package/dist/construction-dimension/floorplan-affordances.d.ts +4 -0
  74. package/dist/construction-dimension/floorplan-affordances.d.ts.map +1 -0
  75. package/dist/construction-dimension/floorplan-affordances.js +114 -0
  76. package/dist/construction-dimension/floorplan-tool.d.ts +21 -0
  77. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -0
  78. package/dist/construction-dimension/floorplan-tool.js +557 -0
  79. package/dist/construction-dimension/floorplan.d.ts +3 -0
  80. package/dist/construction-dimension/floorplan.d.ts.map +1 -0
  81. package/dist/construction-dimension/floorplan.js +457 -0
  82. package/dist/construction-dimension/geometry.d.ts +31 -0
  83. package/dist/construction-dimension/geometry.d.ts.map +1 -0
  84. package/dist/construction-dimension/geometry.js +144 -0
  85. package/dist/construction-dimension/index.d.ts +4 -0
  86. package/dist/construction-dimension/index.d.ts.map +1 -0
  87. package/dist/construction-dimension/index.js +3 -0
  88. package/dist/construction-dimension/panel.d.ts +2 -0
  89. package/dist/construction-dimension/panel.d.ts.map +1 -0
  90. package/dist/construction-dimension/panel.js +128 -0
  91. package/dist/construction-dimension/parametrics.d.ts +3 -0
  92. package/dist/construction-dimension/parametrics.d.ts.map +1 -0
  93. package/dist/construction-dimension/parametrics.js +4 -0
  94. package/dist/construction-dimension/schema.d.ts +2 -0
  95. package/dist/construction-dimension/schema.d.ts.map +1 -0
  96. package/dist/construction-dimension/schema.js +1 -0
  97. package/dist/door/contextual-dimensions.d.ts +3 -0
  98. package/dist/door/contextual-dimensions.d.ts.map +1 -0
  99. package/dist/door/contextual-dimensions.js +7 -0
  100. package/dist/door/definition.d.ts.map +1 -1
  101. package/dist/door/definition.js +13 -8
  102. package/dist/door/floorplan-affordances.d.ts +2 -5
  103. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  104. package/dist/door/floorplan-affordances.js +9 -18
  105. package/dist/door/floorplan.d.ts +3 -4
  106. package/dist/door/floorplan.d.ts.map +1 -1
  107. package/dist/door/floorplan.js +88 -6
  108. package/dist/door/move-tool.d.ts.map +1 -1
  109. package/dist/door/move-tool.js +2 -2
  110. package/dist/door/panel.d.ts.map +1 -1
  111. package/dist/door/panel.js +3 -1
  112. package/dist/door/schema.d.ts +1 -1
  113. package/dist/door/schema.d.ts.map +1 -1
  114. package/dist/door/schema.js +1 -1
  115. package/dist/door/tool.d.ts.map +1 -1
  116. package/dist/door/tool.js +63 -6
  117. package/dist/dormer/definition.d.ts.map +1 -1
  118. package/dist/dormer/definition.js +1 -0
  119. package/dist/dormer/tool.d.ts.map +1 -1
  120. package/dist/dormer/tool.js +23 -1
  121. package/dist/duct-segment/tool.d.ts.map +1 -1
  122. package/dist/duct-segment/tool.js +20 -9
  123. package/dist/duct-terminal/tool.d.ts.map +1 -1
  124. package/dist/duct-terminal/tool.js +9 -6
  125. package/dist/elevator/floorplan-affordances.d.ts +2 -6
  126. package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
  127. package/dist/elevator/floorplan-affordances.js +13 -12
  128. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  129. package/dist/fence/actions/move-endpoint.js +29 -1
  130. package/dist/fence/definition.d.ts.map +1 -1
  131. package/dist/fence/definition.js +74 -14
  132. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  133. package/dist/fence/floorplan-affordances.js +48 -11
  134. package/dist/fence/floorplan-move.d.ts.map +1 -1
  135. package/dist/fence/floorplan-move.js +38 -3
  136. package/dist/fence/geometry.d.ts.map +1 -1
  137. package/dist/fence/geometry.js +15 -1
  138. package/dist/fence/lift.d.ts +38 -0
  139. package/dist/fence/lift.d.ts.map +1 -0
  140. package/dist/fence/lift.js +51 -0
  141. package/dist/fence/move-tool.d.ts.map +1 -1
  142. package/dist/fence/move-tool.js +25 -5
  143. package/dist/fence/system.d.ts +3 -0
  144. package/dist/fence/system.d.ts.map +1 -0
  145. package/dist/fence/system.js +46 -0
  146. package/dist/fence/tool.d.ts.map +1 -1
  147. package/dist/fence/tool.js +103 -32
  148. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  149. package/dist/hvac-equipment/tool.js +8 -3
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +6 -0
  153. package/dist/item/definition.d.ts.map +1 -1
  154. package/dist/item/definition.js +7 -1
  155. package/dist/item/floorplan-move.d.ts.map +1 -1
  156. package/dist/item/floorplan-move.js +50 -43
  157. package/dist/item/floorplan.d.ts +1 -0
  158. package/dist/item/floorplan.d.ts.map +1 -1
  159. package/dist/item/floorplan.js +49 -0
  160. package/dist/item/renderer.d.ts +3 -0
  161. package/dist/item/renderer.d.ts.map +1 -1
  162. package/dist/item/renderer.js +96 -8
  163. package/dist/level/definition.d.ts.map +1 -1
  164. package/dist/level/definition.js +7 -3
  165. package/dist/lineset/tool.d.ts.map +1 -1
  166. package/dist/lineset/tool.js +5 -1
  167. package/dist/liquid-line/tool.d.ts.map +1 -1
  168. package/dist/liquid-line/tool.js +7 -1
  169. package/dist/measurement/definition.d.ts.map +1 -1
  170. package/dist/measurement/definition.js +5 -0
  171. package/dist/measurement/floorplan.d.ts.map +1 -1
  172. package/dist/measurement/floorplan.js +11 -10
  173. package/dist/measurement/index.d.ts +1 -1
  174. package/dist/measurement/index.d.ts.map +1 -1
  175. package/dist/measurement/index.js +1 -1
  176. package/dist/measurement/resolve.d.ts +5 -0
  177. package/dist/measurement/resolve.d.ts.map +1 -1
  178. package/dist/measurement/resolve.js +2 -2
  179. package/dist/measurement/surface-query.js +5 -5
  180. package/dist/measurement/tool.d.ts +6 -1
  181. package/dist/measurement/tool.d.ts.map +1 -1
  182. package/dist/measurement/tool.js +7 -11
  183. package/dist/pipe-segment/tool.d.ts.map +1 -1
  184. package/dist/pipe-segment/tool.js +22 -19
  185. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  186. package/dist/roof-segment/floorplan-affordances.js +14 -8
  187. package/dist/shared/construction-dimension-standards.d.ts +34 -0
  188. package/dist/shared/construction-dimension-standards.d.ts.map +1 -0
  189. package/dist/shared/construction-dimension-standards.js +18 -0
  190. package/dist/shared/construction-length.d.ts +10 -0
  191. package/dist/shared/construction-length.d.ts.map +1 -0
  192. package/dist/shared/construction-length.js +57 -0
  193. package/dist/shared/dimension-string.d.ts +20 -0
  194. package/dist/shared/dimension-string.d.ts.map +1 -0
  195. package/dist/shared/dimension-string.js +19 -0
  196. package/dist/shared/draft-axis-guides.d.ts +36 -0
  197. package/dist/shared/draft-axis-guides.d.ts.map +1 -0
  198. package/dist/shared/draft-axis-guides.js +107 -0
  199. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  200. package/dist/shared/move-roof-tool.js +17 -3
  201. package/dist/shared/opening-documentation-fields.d.ts +16 -0
  202. package/dist/shared/opening-documentation-fields.d.ts.map +1 -0
  203. package/dist/shared/opening-documentation-fields.js +54 -0
  204. package/dist/shared/opening-documentation.d.ts +47 -0
  205. package/dist/shared/opening-documentation.d.ts.map +1 -0
  206. package/dist/shared/opening-documentation.js +300 -0
  207. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  208. package/dist/shared/opening-guides-runtime.js +3 -2
  209. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  210. package/dist/shared/opening-placement-dimensions.js +14 -5
  211. package/dist/shared/wall-opening-ceiling.d.ts +30 -0
  212. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -0
  213. package/dist/shared/wall-opening-ceiling.js +29 -0
  214. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  215. package/dist/shelf/floorplan-affordances.js +10 -5
  216. package/dist/shelf/floorplan-move.d.ts +2 -16
  217. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  218. package/dist/shelf/floorplan-move.js +19 -40
  219. package/dist/shelf/tool.d.ts.map +1 -1
  220. package/dist/shelf/tool.js +8 -3
  221. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  222. package/dist/site/recessed-slab-ground-holes.js +1 -4
  223. package/dist/site/renderer.d.ts.map +1 -1
  224. package/dist/site/renderer.js +118 -28
  225. package/dist/site/terrain-drape.d.ts +91 -0
  226. package/dist/site/terrain-drape.d.ts.map +1 -0
  227. package/dist/site/terrain-drape.js +205 -0
  228. package/dist/site/terrain-geometry.d.ts +131 -0
  229. package/dist/site/terrain-geometry.d.ts.map +1 -0
  230. package/dist/site/terrain-geometry.js +259 -0
  231. package/dist/site/terrain-mesh.d.ts +49 -0
  232. package/dist/site/terrain-mesh.d.ts.map +1 -0
  233. package/dist/site/terrain-mesh.js +122 -0
  234. package/dist/site/terrain-renderer.d.ts +28 -0
  235. package/dist/site/terrain-renderer.d.ts.map +1 -0
  236. package/dist/site/terrain-renderer.js +69 -0
  237. package/dist/skylight/definition.d.ts.map +1 -1
  238. package/dist/skylight/definition.js +1 -0
  239. package/dist/skylight/tool.d.ts.map +1 -1
  240. package/dist/skylight/tool.js +16 -1
  241. package/dist/slab/definition.d.ts.map +1 -1
  242. package/dist/slab/definition.js +87 -10
  243. package/dist/slab/elevation-limit.d.ts +43 -0
  244. package/dist/slab/elevation-limit.d.ts.map +1 -0
  245. package/dist/slab/elevation-limit.js +124 -0
  246. package/dist/slab/floorplan-affordances.d.ts +16 -0
  247. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  248. package/dist/slab/geometry.d.ts.map +1 -1
  249. package/dist/slab/geometry.js +98 -5
  250. package/dist/slab/panel.d.ts.map +1 -1
  251. package/dist/slab/panel.js +82 -4
  252. package/dist/slab/parametrics.d.ts +1 -1
  253. package/dist/slab/parametrics.d.ts.map +1 -1
  254. package/dist/slab/parametrics.js +13 -1
  255. package/dist/slab/placement-ownership.d.ts +3 -0
  256. package/dist/slab/placement-ownership.d.ts.map +1 -0
  257. package/dist/slab/placement-ownership.js +3 -0
  258. package/dist/slab/quick-measurement.d.ts.map +1 -1
  259. package/dist/slab/quick-measurement.js +3 -2
  260. package/dist/slab/system.d.ts.map +1 -1
  261. package/dist/slab/system.js +14 -4
  262. package/dist/slab/tool.d.ts.map +1 -1
  263. package/dist/slab/tool.js +81 -23
  264. package/dist/solar-panel/definition.d.ts.map +1 -1
  265. package/dist/solar-panel/definition.js +1 -0
  266. package/dist/solar-panel/tool.d.ts.map +1 -1
  267. package/dist/solar-panel/tool.js +17 -1
  268. package/dist/spawn/definition.d.ts.map +1 -1
  269. package/dist/spawn/definition.js +1 -0
  270. package/dist/spawn/floorplan-affordances.d.ts.map +1 -1
  271. package/dist/spawn/floorplan-affordances.js +7 -4
  272. package/dist/spawn/floorplan-move.d.ts.map +1 -1
  273. package/dist/spawn/floorplan-move.js +8 -6
  274. package/dist/spawn/renderer.d.ts +4 -0
  275. package/dist/spawn/renderer.d.ts.map +1 -1
  276. package/dist/spawn/renderer.js +32 -18
  277. package/dist/spawn/tool.d.ts +2 -2
  278. package/dist/spawn/tool.d.ts.map +1 -1
  279. package/dist/spawn/tool.js +78 -11
  280. package/dist/stair/definition.d.ts.map +1 -1
  281. package/dist/stair/definition.js +15 -7
  282. package/dist/stair/destination.d.ts +16 -0
  283. package/dist/stair/destination.d.ts.map +1 -0
  284. package/dist/stair/destination.js +24 -0
  285. package/dist/stair/documentation.d.ts +8 -0
  286. package/dist/stair/documentation.d.ts.map +1 -0
  287. package/dist/stair/documentation.js +245 -0
  288. package/dist/stair/floor-stack.d.ts.map +1 -1
  289. package/dist/stair/floor-stack.js +38 -0
  290. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  291. package/dist/stair/floorplan-affordances.js +28 -9
  292. package/dist/stair/floorplan-move.d.ts +3 -5
  293. package/dist/stair/floorplan-move.d.ts.map +1 -1
  294. package/dist/stair/floorplan-move.js +14 -16
  295. package/dist/stair/floorplan.d.ts.map +1 -1
  296. package/dist/stair/floorplan.js +27 -14
  297. package/dist/stair/panel.d.ts.map +1 -1
  298. package/dist/stair/panel.js +35 -2
  299. package/dist/stair/renderer.d.ts.map +1 -1
  300. package/dist/stair/renderer.js +4 -3
  301. package/dist/structural-grid/coordination.d.ts +16 -0
  302. package/dist/structural-grid/coordination.d.ts.map +1 -0
  303. package/dist/structural-grid/coordination.js +105 -0
  304. package/dist/structural-grid/definition.d.ts +4 -0
  305. package/dist/structural-grid/definition.d.ts.map +1 -0
  306. package/dist/structural-grid/definition.js +51 -0
  307. package/dist/structural-grid/floorplan-tool.d.ts +16 -0
  308. package/dist/structural-grid/floorplan-tool.d.ts.map +1 -0
  309. package/dist/structural-grid/floorplan-tool.js +183 -0
  310. package/dist/structural-grid/floorplan.d.ts +3 -0
  311. package/dist/structural-grid/floorplan.d.ts.map +1 -0
  312. package/dist/structural-grid/floorplan.js +61 -0
  313. package/dist/structural-grid/index.d.ts +2 -0
  314. package/dist/structural-grid/index.d.ts.map +1 -0
  315. package/dist/structural-grid/index.js +1 -0
  316. package/dist/structural-grid/schema.d.ts +2 -0
  317. package/dist/structural-grid/schema.d.ts.map +1 -0
  318. package/dist/structural-grid/schema.js +1 -0
  319. package/dist/wall/construction-dimensions.d.ts +32 -0
  320. package/dist/wall/construction-dimensions.d.ts.map +1 -0
  321. package/dist/wall/construction-dimensions.js +1031 -0
  322. package/dist/wall/contextual-dimensions.d.ts +13 -0
  323. package/dist/wall/contextual-dimensions.d.ts.map +1 -0
  324. package/dist/wall/contextual-dimensions.js +221 -0
  325. package/dist/wall/definition.d.ts.map +1 -1
  326. package/dist/wall/definition.js +20 -1
  327. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  328. package/dist/wall/floorplan-affordances.js +23 -8
  329. package/dist/wall/floorplan-overrides.d.ts +9 -6
  330. package/dist/wall/floorplan-overrides.d.ts.map +1 -1
  331. package/dist/wall/floorplan-overrides.js +20 -11
  332. package/dist/wall/floorplan.d.ts +12 -3
  333. package/dist/wall/floorplan.d.ts.map +1 -1
  334. package/dist/wall/floorplan.js +121 -79
  335. package/dist/wall/measurement.d.ts.map +1 -1
  336. package/dist/wall/measurement.js +17 -4
  337. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  338. package/dist/wall/move-endpoint-tool.js +74 -27
  339. package/dist/wall/move-shared.d.ts.map +1 -1
  340. package/dist/wall/move-shared.js +3 -2
  341. package/dist/wall/move-tool.d.ts.map +1 -1
  342. package/dist/wall/move-tool.js +15 -3
  343. package/dist/wall/paint.d.ts.map +1 -1
  344. package/dist/wall/paint.js +10 -6
  345. package/dist/wall/panel.d.ts.map +1 -1
  346. package/dist/wall/panel.js +32 -5
  347. package/dist/wall/parametrics.d.ts.map +1 -1
  348. package/dist/wall/parametrics.js +2 -0
  349. package/dist/wall/preview.d.ts +8 -0
  350. package/dist/wall/preview.d.ts.map +1 -0
  351. package/dist/wall/preview.js +39 -0
  352. package/dist/wall/quick-measurement.d.ts.map +1 -1
  353. package/dist/wall/quick-measurement.js +3 -2
  354. package/dist/wall/renderer.d.ts.map +1 -1
  355. package/dist/wall/renderer.js +7 -5
  356. package/dist/wall/system.d.ts +1 -1
  357. package/dist/wall/system.d.ts.map +1 -1
  358. package/dist/wall/system.js +37 -2
  359. package/dist/wall/tool.d.ts.map +1 -1
  360. package/dist/wall/tool.js +148 -96
  361. package/dist/wall/treatment-level-data.d.ts +14 -0
  362. package/dist/wall/treatment-level-data.d.ts.map +1 -0
  363. package/dist/wall/treatment-level-data.js +31 -0
  364. package/dist/wall/treatments.d.ts +8 -2
  365. package/dist/wall/treatments.d.ts.map +1 -1
  366. package/dist/wall/treatments.js +58 -15
  367. package/dist/window/contextual-dimensions.d.ts +3 -0
  368. package/dist/window/contextual-dimensions.d.ts.map +1 -0
  369. package/dist/window/contextual-dimensions.js +7 -0
  370. package/dist/window/definition.d.ts.map +1 -1
  371. package/dist/window/definition.js +15 -10
  372. package/dist/window/floorplan-affordances.d.ts +2 -5
  373. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  374. package/dist/window/floorplan-affordances.js +9 -15
  375. package/dist/window/floorplan-move.d.ts.map +1 -1
  376. package/dist/window/floorplan-move.js +1 -1
  377. package/dist/window/floorplan.d.ts.map +1 -1
  378. package/dist/window/floorplan.js +7 -1
  379. package/dist/window/move-tool.d.ts.map +1 -1
  380. package/dist/window/move-tool.js +3 -3
  381. package/dist/window/panel.d.ts.map +1 -1
  382. package/dist/window/panel.js +4 -1
  383. package/dist/window/schema.d.ts +1 -1
  384. package/dist/window/schema.d.ts.map +1 -1
  385. package/dist/window/schema.js +1 -1
  386. package/dist/window/tool.d.ts.map +1 -1
  387. package/dist/window/tool.js +64 -7
  388. package/dist/window/window-math.d.ts +7 -3
  389. package/dist/window/window-math.d.ts.map +1 -1
  390. package/dist/window/window-math.js +8 -3
  391. package/dist/zone/contextual-dimensions.d.ts +3 -0
  392. package/dist/zone/contextual-dimensions.d.ts.map +1 -0
  393. package/dist/zone/contextual-dimensions.js +43 -0
  394. package/dist/zone/definition.d.ts.map +1 -1
  395. package/dist/zone/definition.js +9 -1
  396. package/dist/zone/floorplan-affordances.d.ts +36 -0
  397. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  398. package/dist/zone/floorplan.d.ts.map +1 -1
  399. package/dist/zone/floorplan.js +59 -3
  400. package/dist/zone/quantities-panel.d.ts.map +1 -1
  401. package/dist/zone/quantities-panel.js +48 -4
  402. package/dist/zone/room-clear-dimensions.d.ts +3 -0
  403. package/dist/zone/room-clear-dimensions.d.ts.map +1 -0
  404. package/dist/zone/room-clear-dimensions.js +406 -0
  405. package/dist/zone/room-documentation.d.ts +11 -0
  406. package/dist/zone/room-documentation.d.ts.map +1 -0
  407. package/dist/zone/room-documentation.js +97 -0
  408. package/package.json +7 -7
package/dist/door/tool.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { DoorNode, emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, } from '@pascal-app/core';
3
- import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, } from '@pascal-app/editor';
2
+ import { DoorNode, emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, WallNode as WallNodeSchema, } from '@pascal-app/core';
3
+ import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, usePlacementPreview, } from '@pascal-app/editor';
4
4
  import { useViewer } from '@pascal-app/viewer';
5
5
  import { useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { BoxGeometry, EdgesGeometry, Vector3 } from 'three';
@@ -53,6 +53,36 @@ const DoorTool = () => {
53
53
  const frameDepthRef = useRef(ghostStub.frameDepth);
54
54
  useEffect(() => {
55
55
  useScene.temporal.getState().pause();
56
+ const ownedPreviewIds = new Set();
57
+ const fallbackPreview = DoorNode.parse({
58
+ position: [0, 0, 0],
59
+ rotation: [0, 0, 0],
60
+ side: 'front',
61
+ });
62
+ const fallbackWallId = WallNodeSchema.parse({
63
+ end: [1, 0],
64
+ start: [0, 0],
65
+ thickness: 0.1,
66
+ }).id;
67
+ const publishPlacementPreview = (node, parentNode) => {
68
+ ownedPreviewIds.add(node.id);
69
+ usePlacementPreview.getState().set(node, parentNode);
70
+ };
71
+ const clearPlacementPreview = () => {
72
+ const current = usePlacementPreview.getState().node;
73
+ if (current && ownedPreviewIds.has(current.id))
74
+ usePlacementPreview.getState().clear();
75
+ };
76
+ const publishDraftPreview = (parentNode) => {
77
+ const draft = draftRef.current;
78
+ if (!draft)
79
+ return;
80
+ const live = useScene.getState().nodes[draft.id];
81
+ if (live?.type !== 'door')
82
+ return;
83
+ draftRef.current = live;
84
+ publishPlacementPreview(live, parentNode);
85
+ };
56
86
  let hostKind = null;
57
87
  // timeStamp of the most recent wall/roof mesh event. A wall/roof hover and
58
88
  // the grid raycast from the SAME pointermove share the source DOM event's
@@ -74,16 +104,20 @@ const DoorTool = () => {
74
104
  const id = getLevelId();
75
105
  return id ? (sceneRegistry.nodes.get(id)?.position.y ?? 0) : 0;
76
106
  };
77
- const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end);
107
+ const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end, wall.curveOffset ?? 0, wall.thickness, wall.supportSlabId);
78
108
  const markHostDirty = (hostId) => {
79
109
  useScene.getState().dirtyNodes.add(hostId);
80
110
  };
81
111
  const destroyDraft = () => {
82
- if (!draftRef.current)
112
+ const draft = draftRef.current;
113
+ if (!draft) {
114
+ clearPlacementPreview();
83
115
  return;
84
- const wallId = draftRef.current.parentId;
85
- useScene.getState().deleteNode(draftRef.current.id);
116
+ }
117
+ const wallId = draft.parentId;
118
+ useScene.getState().deleteNode(draft.id);
86
119
  draftRef.current = null;
120
+ clearPlacementPreview();
87
121
  if (wallId)
88
122
  markHostDirty(wallId);
89
123
  };
@@ -94,6 +128,7 @@ const DoorTool = () => {
94
128
  clearOpeningGuides3D();
95
129
  setFallbackPose(null);
96
130
  useFacingPose.getState().clear();
131
+ clearPlacementPreview();
97
132
  };
98
133
  // Alignment candidates — anchors of every alignable object; refreshed
99
134
  // after each placement. A door aligns by the plan position of its centre.
@@ -131,6 +166,23 @@ const DoorTool = () => {
131
166
  rotationY: sideFlip ? Math.PI : 0,
132
167
  side: sideFlip ? 'back' : 'front',
133
168
  });
169
+ const halfWidth = fallbackPreview.width / 2 + 0.5;
170
+ const wall = WallNodeSchema.parse({
171
+ end: [position[0] + halfWidth, position[2]],
172
+ id: fallbackWallId,
173
+ start: [position[0] - halfWidth, position[2]],
174
+ thickness: 0.1,
175
+ });
176
+ const ghost = DoorNode.parse({
177
+ ...fallbackPreview,
178
+ metadata: { isTransient: true },
179
+ parentId: wall.id,
180
+ position: [halfWidth, fallbackPreview.height / 2, 0],
181
+ rotation: [0, sideFlip ? Math.PI : 0, 0],
182
+ side: sideFlip ? 'back' : 'front',
183
+ wallId: wall.id,
184
+ });
185
+ publishPlacementPreview(ghost, wall);
134
186
  useAlignmentGuides.getState().clear();
135
187
  clearOpeningGuides3D();
136
188
  // Off-host (invalid) floating ghost — no direction triangle.
@@ -202,6 +254,7 @@ const DoorTool = () => {
202
254
  roofFace: undefined,
203
255
  });
204
256
  }
257
+ publishDraftPreview(wall);
205
258
  updateCursor(wallLocalToWorld(wall, clampedX, clampedY, getLevelYOffset(), getSlabElevationForWall(wall)), cursorRotationY, valid, -clampedY);
206
259
  if (draftRef.current) {
207
260
  publishOpeningGuidesForWallEvent({
@@ -224,6 +277,7 @@ const DoorTool = () => {
224
277
  const draft = draftRef.current;
225
278
  if (!draft)
226
279
  return;
280
+ clearPlacementPreview();
227
281
  draftRef.current = null;
228
282
  hostKind = null;
229
283
  useScene.getState().deleteNode(draft.id);
@@ -404,6 +458,7 @@ const DoorTool = () => {
404
458
  useScene.getState().createNode(node, segment.id);
405
459
  draftRef.current = node;
406
460
  }
461
+ publishDraftPreview(segment);
407
462
  // Opening guides are wall-specific; clear them while over a roof face.
408
463
  clearOpeningGuides3D();
409
464
  updateRoofCursor(target, event.node);
@@ -420,6 +475,7 @@ const DoorTool = () => {
420
475
  return;
421
476
  const { segment, face, position } = target;
422
477
  const draft = draftRef.current;
478
+ clearPlacementPreview();
423
479
  draftRef.current = null;
424
480
  hostKind = null;
425
481
  useScene.getState().deleteNode(draft.id);
@@ -524,6 +580,7 @@ const DoorTool = () => {
524
580
  return () => {
525
581
  destroyDraft();
526
582
  hideCursor();
583
+ clearPlacementPreview();
527
584
  useAlignmentGuides.getState().clear();
528
585
  clearOpeningGuides3D();
529
586
  useScene.temporal.getState().resume();
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/dormer/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmarC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAuE9D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/dormer/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmarC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAwE9D,CAAA"}
@@ -472,6 +472,7 @@ export const dormerDefinition = {
472
472
  kind: 'parametric',
473
473
  module: () => import('./renderer'),
474
474
  },
475
+ preview: () => import('./preview'),
475
476
  tool: () => import('./tool'),
476
477
  toolHints: [
477
478
  { key: 'Left click', label: 'Place dormer on roof' },
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/dormer/tool.tsx"],"names":[],"mappings":"AA6BA;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU,mCA8Df,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/dormer/tool.tsx"],"names":[],"mappings":"AA8BA;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU,mCAyFf,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { DormerNode, useScene } from '@pascal-app/core';
4
+ import { usePlacementPreview } from '@pascal-app/editor';
4
5
  import { useViewer } from '@pascal-app/viewer';
5
- import { useMemo } from 'react';
6
+ import { useEffect, useMemo } from 'react';
6
7
  import { RoofAttachmentFallbackPreview } from '../shared/roof-attachment-fallback-preview';
7
8
  import { dormerDefinition } from './definition';
8
9
  import { DormerPlacementGuides } from './placement-guides';
@@ -62,8 +63,29 @@ const DormerTool = () => {
62
63
  state.createNode(dormer, hit.segment.id);
63
64
  state.dirtyNodes.add(hit.segment.id);
64
65
  setSelection({ selectedIds: [dormer.id] });
66
+ usePlacementPreview.getState().clear();
65
67
  },
66
68
  });
69
+ useEffect(() => {
70
+ const placementPreview = usePlacementPreview.getState();
71
+ if (!(hitSegment && hitLocal)) {
72
+ if (placementPreview.node?.id === previewNode.id)
73
+ placementPreview.clear();
74
+ return;
75
+ }
76
+ placementPreview.set(DormerNode.parse({
77
+ ...previewNode,
78
+ parentId: hitSegment.id,
79
+ position: hitLocal,
80
+ roofSegmentId: hitSegment.id,
81
+ rotation: ghostRotation,
82
+ }), hitSegment);
83
+ }, [ghostRotation, hitLocal, hitSegment, previewNode]);
84
+ useEffect(() => () => {
85
+ const placementPreview = usePlacementPreview.getState();
86
+ if (placementPreview.node?.id === previewNode.id)
87
+ placementPreview.clear();
88
+ }, [previewNode.id]);
67
89
  return (_jsxs(_Fragment, { children: [_jsx(RoofAttachmentFallbackPreview, { activeBuildingId: activeBuildingId, ghost: _jsx(DormerPreview, { node: previewNode, invalid: true }), onInvalidTarget: clearPreview }), activeBuildingId && segmentXform && hitLocal && (_jsxs("group", { position: segmentXform.position, quaternion: segmentXform.quaternion, children: [hitSegment && (_jsx(DormerPlacementGuides, { center: hitLocal, depth: previewNode.depth, rotation: ghostRotation, segment: hitSegment, width: previewNode.width })), _jsx("group", { position: hitLocal, children: _jsx("group", { "rotation-y": ghostRotation, children: _jsx(DormerPreview, { node: previewNode }) }) })] }))] }));
68
90
  };
69
91
  export default DormerTool;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-segment/tool.tsx"],"names":[],"mappings":"AA8eA,QAAA,MAAM,eAAe,0CA0jBpB,CAAA;AAmJD,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-segment/tool.tsx"],"names":[],"mappings":"AAgfA,QAAA,MAAM,eAAe,0CAukBpB,CAAA;AAmJD,eAAe,eAAe,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { DuctSegmentNode, emitter, getCeilingAt, getCeilingHeightAt, useScene, } from '@pascal-app/core';
4
- import { CursorSphere, DimensionPill, EDITOR_LAYER, isAngleSnapActive, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, triggerSFX, useEditor, } from '@pascal-app/editor';
3
+ import { DuctSegmentNode, emitter, getCeilingAt, getCeilingHeightAt, resolveCeilingHeight, useScene, } from '@pascal-app/core';
4
+ import { CursorSphere, DimensionPill, EDITOR_LAYER, isAngleSnapActive, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, triggerSFX, useEditor, usePathDraftPreview, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Html } from '@react-three/drei';
7
7
  import { useEffect, useMemo, useRef, useState } from 'react';
@@ -436,6 +436,23 @@ const DuctSegmentTool = () => {
436
436
  // Latest mouse clientY from grid:move; used so the Alt anchor knows where
437
437
  // the cursor was at key-press time.
438
438
  const lastClientYRef = useRef(null);
439
+ const ghostFittings = useMemo(() => {
440
+ const last = draftPoints.at(-1);
441
+ if (!(activeLevelId && last && cursorPos) || altActive)
442
+ return [];
443
+ const fittings = planDuctDraw(last, cursorPos, startPortRef.current, startBodyRef.current, endSnap.port, endSnap.body, profile)?.fittings ?? [];
444
+ return fittings.map((fitting, index) => ({
445
+ ...fitting,
446
+ id: `duct-fitting_live-draft-${index}`,
447
+ parentId: activeLevelId,
448
+ }));
449
+ }, [activeLevelId, altActive, cursorPos, draftPoints, endSnap, profile]);
450
+ useEffect(() => {
451
+ usePathDraftPreview
452
+ .getState()
453
+ .setDraft('duct-segment', draftPoints, cursorPos, profile, ghostFittings);
454
+ }, [cursorPos, draftPoints, ghostFittings, profile]);
455
+ useEffect(() => () => usePathDraftPreview.getState().clear('duct-segment'), []);
439
456
  useEffect(() => {
440
457
  if (!activeLevelId)
441
458
  return;
@@ -787,12 +804,6 @@ const DuctSegmentTool = () => {
787
804
  if (last && cursorPos) {
788
805
  previewSegments.push({ a: last, b: cursorPos });
789
806
  }
790
- // Ghost the auto-inserted fittings (elbow / tee / cross) the next click
791
- // will mint, by running the SAME planner the commit uses against the
792
- // in-flight endpoints. Skipped in Alt-vertical mode (no XZ tap there).
793
- const ghostFittings = last && cursorPos && !altActive
794
- ? (planDuctDraw(last, cursorPos, startPortRef.current, startBodyRef.current, endSnap.port, endSnap.body, profile)?.fittings ?? [])
795
- : [];
796
807
  // Wall-style dimension pill above the cursor: absolute world coords before
797
808
  // the first point, signed per-axis deltas from the last placed point while
798
809
  // a segment is in flight. The actively-driven axis is emphasised — Y in
@@ -885,7 +896,7 @@ function CeilingHighlight({ ceiling }) {
885
896
  }, [ceiling.polygon]);
886
897
  if (!geometry)
887
898
  return null;
888
- const y = ceiling.height ?? 2.5;
899
+ const y = resolveCeilingHeight(ceiling, useScene.getState().nodes);
889
900
  return (_jsxs("group", { position: [0, y, 0], children: [_jsx("mesh", { geometry: geometry, layers: EDITOR_LAYER, renderOrder: 1, children: _jsx("meshBasicMaterial", { color: "#818cf8", depthWrite: false, opacity: 0.15, side: DoubleSide, transparent: true }) }), outline && (_jsxs("line", { children: [_jsx("bufferGeometry", { ref: (g) => {
890
901
  if (g)
891
902
  g.setFromPoints(outline);
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/tool.tsx"],"names":[],"mappings":"AA4IA;;;;;;;;;GASG;AACH,QAAA,MAAM,gBAAgB,0CAuSrB,CAAA;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/tool.tsx"],"names":[],"mappings":"AA6IA;;;;;;;;;GASG;AACH,QAAA,MAAM,gBAAgB,0CAwSrB,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { DuctTerminalNode, emitter, pointInPolygon, resolveLevelId, sceneRegistry, useScene, } from '@pascal-app/core';
3
+ import { DuctTerminalNode, emitter, pointInPolygon, resolveCeilingHeight, resolveLevelId, resolveSupportSlabPatch, sceneRegistry, useScene, } from '@pascal-app/core';
4
4
  import { CursorSphere, getFloorStackPreviewPosition, isGridSnapActive, isMagneticSnapActive, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Html } from '@react-three/drei';
@@ -16,8 +16,6 @@ import { COLLAR_LENGTH, mountQuaternion } from './ports';
16
16
  const PREVIEW_OPACITY = 0.55;
17
17
  /** R/T yaw step — 45°. */
18
18
  const ROTATE_STEP_RAD = Math.PI / 4;
19
- /** Fallback height (meters) for a ceiling node that carries no `height`. */
20
- const DEFAULT_CEILING_HEIGHT = 2.5;
21
19
  /** Snap radius (meters) for mating the collar onto a nearby duct port. */
22
20
  const PORT_SNAP_RADIUS_M = 0.5;
23
21
  const MOUNT_CYCLE = ['floor', 'ceiling', 'wall'];
@@ -177,7 +175,7 @@ const DuctTerminalTool = () => {
177
175
  if (resolveLevelId(node, nodes) !== activeLevelId)
178
176
  continue;
179
177
  const ceiling = node;
180
- const height = ceiling.height ?? DEFAULT_CEILING_HEIGHT;
178
+ const height = resolveCeilingHeight(ceiling, nodes);
181
179
  const hit = hitLocalPlane(nativeEvent, height);
182
180
  if (!hit)
183
181
  continue;
@@ -239,9 +237,14 @@ const DuctTerminalTool = () => {
239
237
  mount: p.mount,
240
238
  position: p.position,
241
239
  rotation: p.yaw,
240
+ parentId: activeLevelId,
242
241
  });
243
- useScene.getState().createNode(terminal, activeLevelId);
244
- useViewer.getState().setSelection({ selectedIds: [terminal.id] });
242
+ const committedTerminal = DuctTerminalNode.parse({
243
+ ...terminal,
244
+ ...resolveSupportSlabPatch(terminal, useScene.getState().nodes),
245
+ });
246
+ useScene.getState().createNode(committedTerminal, activeLevelId);
247
+ useViewer.getState().setSelection({ selectedIds: [committedTerminal.id] });
245
248
  triggerSFX('sfx:item-place');
246
249
  };
247
250
  // ---- Floor / ceiling: own raycast against a horizontal plane ----
@@ -4,18 +4,14 @@ import { type ElevatorNode, type FloorplanAffordance } from '@pascal-app/core';
4
4
  * `linear-resize` handles declared in `definition.ts` — `anchor: 'center'`
5
5
  * means dragging outward on either +X or -X edge grows `width` by 2×
6
6
  * the elevator-local cursor offset while `position` stays put. Same for
7
- * +Z / -Z and `depth`. Writes directly to scene each tick (door pattern);
8
- * the registry dispatcher snapshots / pauses history at start so the
9
- * per-tick writes collapse into one undoable entry on commit.
7
+ * +Z / -Z and `depth`.
10
8
  */
11
9
  export declare const elevatorResizeAffordance: FloorplanAffordance<ElevatorNode>;
12
10
  /**
13
11
  * Elevator rotation drag (floor-plan). Sister to the 3D `arc-resize`
14
12
  * handle declared in `definition.ts`. Same `- delta` sign convention as
15
13
  * the 3D path so dragging the cursor in the same direction in both views
16
- * produces the same rotation. Writes directly to scene during the drag;
17
- * the registry dispatcher captures a snapshot first and re-applies the
18
- * single tracked update on pointer-up.
14
+ * produces the same rotation.
19
15
  */
20
16
  export declare const elevatorRotateAffordance: FloorplanAffordance<ElevatorNode>;
21
17
  //# sourceMappingURL=floorplan-affordances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/elevator/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAA;AAOzB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,CAAC,YAAY,CA4CtE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,CAAC,YAAY,CA8BtE,CAAA"}
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/elevator/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,CAAC,YAAY,CA8CtE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,CAAC,YAAY,CAgCtE,CAAA"}
@@ -1,4 +1,5 @@
1
- import { useScene, } from '@pascal-app/core';
1
+ import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
+ import { isAngleSnapActive } from '@pascal-app/editor';
2
3
  import { rotateAffordanceDelta } from '../shared/rotate-affordance';
3
4
  const MIN_ELEVATOR_DIM = 0.6;
4
5
  /**
@@ -6,9 +7,7 @@ const MIN_ELEVATOR_DIM = 0.6;
6
7
  * `linear-resize` handles declared in `definition.ts` — `anchor: 'center'`
7
8
  * means dragging outward on either +X or -X edge grows `width` by 2×
8
9
  * the elevator-local cursor offset while `position` stays put. Same for
9
- * +Z / -Z and `depth`. Writes directly to scene each tick (door pattern);
10
- * the registry dispatcher snapshots / pauses history at start so the
11
- * per-tick writes collapse into one undoable entry on commit.
10
+ * +Z / -Z and `depth`.
12
11
  */
13
12
  export const elevatorResizeAffordance = {
14
13
  start({ node, payload, initialPlanPoint }) {
@@ -39,14 +38,16 @@ export const elevatorResizeAffordance = {
39
38
  const delta = (currentLocal - initialLocal) * side;
40
39
  const newValue = Math.max(MIN_ELEVATOR_DIM, initialValue + 2 * delta);
41
40
  lastValue = newValue;
42
- useScene
41
+ useLiveNodeOverrides
43
42
  .getState()
44
- .updateNode(elevatorId, axis === 'x' ? { width: newValue } : { depth: newValue });
43
+ .set(elevatorId, axis === 'x' ? { width: newValue } : { depth: newValue });
44
+ useScene.getState().markDirty(elevatorId);
45
45
  },
46
46
  canCommit() {
47
47
  return true;
48
48
  },
49
49
  commit() {
50
+ useLiveNodeOverrides.getState().clear(elevatorId);
50
51
  useScene
51
52
  .getState()
52
53
  .updateNode(elevatorId, axis === 'x' ? { width: lastValue } : { depth: lastValue });
@@ -58,9 +59,7 @@ export const elevatorResizeAffordance = {
58
59
  * Elevator rotation drag (floor-plan). Sister to the 3D `arc-resize`
59
60
  * handle declared in `definition.ts`. Same `- delta` sign convention as
60
61
  * the 3D path so dragging the cursor in the same direction in both views
61
- * produces the same rotation. Writes directly to scene during the drag;
62
- * the registry dispatcher captures a snapshot first and re-applies the
63
- * single tracked update on pointer-up.
62
+ * produces the same rotation.
64
63
  */
65
64
  export const elevatorRotateAffordance = {
66
65
  start({ node, initialPlanPoint }) {
@@ -72,21 +71,23 @@ export const elevatorRotateAffordance = {
72
71
  let lastRotation = initialRotation;
73
72
  return {
74
73
  affectedIds: [elevatorId],
75
- apply({ planPoint, modifiers }) {
74
+ apply({ planPoint }) {
76
75
  const delta = rotateAffordanceDelta({
77
76
  center: [cx, cz],
78
77
  initialAngle,
79
78
  planPoint,
80
- free: modifiers.shiftKey,
79
+ free: !isAngleSnapActive(),
81
80
  });
82
81
  const newRotation = initialRotation - delta;
83
82
  lastRotation = newRotation;
84
- useScene.getState().updateNode(elevatorId, { rotation: newRotation });
83
+ useLiveNodeOverrides.getState().set(elevatorId, { rotation: newRotation });
84
+ useScene.getState().markDirty(elevatorId);
85
85
  },
86
86
  canCommit() {
87
87
  return true;
88
88
  },
89
89
  commit() {
90
+ useLiveNodeOverrides.getState().clear(elevatorId);
90
91
  useScene.getState().updateNode(elevatorId, { rotation: lastRotation });
91
92
  },
92
93
  };
@@ -1 +1 @@
1
- {"version":3,"file":"move-endpoint.d.ts","sourceRoot":"","sources":["../../../src/fence/actions/move-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,SAAS,EAGd,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AA2C3B,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,aAAa,EAAE,cAAc,CAAA;IAC7B,WAAW,EAAE,cAAc,CAAA;IAC3B,mBAAmB,EAAE,cAAc,CAAA;IACnC,UAAU,EAAE,cAAc,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB;4DACwD;IACxD,eAAe,EAAE,eAAe,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,cAAc,CAAA;IAC3B,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAmCD,eAAO,MAAM,2BAA2B,EAAE,UAAU,CAAC,oBAAoB,EAAE,sBAAsB,CAkJ9F,CAAA"}
1
+ {"version":3,"file":"move-endpoint.d.ts","sourceRoot":"","sources":["../../../src/fence/actions/move-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,SAAS,EAId,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AA2C3B,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,aAAa,EAAE,cAAc,CAAA;IAC7B,WAAW,EAAE,cAAc,CAAA;IAC3B,mBAAmB,EAAE,cAAc,CAAA;IACnC,UAAU,EAAE,cAAc,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB;4DACwD;IACxD,eAAe,EAAE,eAAe,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,cAAc,CAAA;IAC3B,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAuDD,eAAO,MAAM,2BAA2B,EAAE,UAAU,CAAC,oBAAoB,EAAE,sBAAsB,CA6J9F,CAAA"}
@@ -1,4 +1,4 @@
1
- import { collectAlignmentAnchors, resolveAlignment, useScene, } from '@pascal-app/core';
1
+ import { collectAlignmentAnchors, resolveAlignment, resolveFenceSupportSlabPatch, useScene, } from '@pascal-app/core';
2
2
  import { isAlignmentGuideActive, isAngleSnapActive, isMagneticSnapActive, isSegmentLongEnough, snapFenceDraftPoint, useAlignmentGuides, } from '@pascal-app/editor';
3
3
  /**
4
4
  * Phase 5 Stage D — move-fence-endpoint drag affordance.
@@ -55,6 +55,23 @@ function snapshotLinked(fenceId, parentId, linkedPoint) {
55
55
  }
56
56
  return out;
57
57
  }
58
+ /**
59
+ * Re-elect the slab lift host for the given fences from their CURRENT
60
+ * store state (call after the endpoint writes). Only writes when the host
61
+ * actually changes, so unaffected drags stay patch-free.
62
+ */
63
+ function applyFenceSupportPatches(ids, scene) {
64
+ const nodes = useScene.getState().nodes;
65
+ for (const id of ids) {
66
+ const fence = nodes[id];
67
+ if (fence?.type !== 'fence')
68
+ continue;
69
+ const patch = resolveFenceSupportSlabPatch(fence, nodes);
70
+ if (patch.supportSlabId !== fence.supportSlabId) {
71
+ scene.update(id, patch);
72
+ }
73
+ }
74
+ }
58
75
  function linkedCascade(linked, origin, next) {
59
76
  return linked.map((l) => ({
60
77
  id: l.id,
@@ -164,6 +181,10 @@ export const moveFenceEndpointDragAction = {
164
181
  });
165
182
  dirty.push(linked.id);
166
183
  }
184
+ // Re-elect the lift host live: a fence dragged onto / off an elevated
185
+ // deck rises or drops with the pointer instead of waiting for commit
186
+ // (fences run no per-frame election — `supportSlabId` IS the lift).
187
+ applyFenceSupportPatches(dirty, scene);
167
188
  return dirty;
168
189
  },
169
190
  commit: (draft, ctx, scene) => {
@@ -183,14 +204,21 @@ export const moveFenceEndpointDragAction = {
183
204
  scene.restoreAll();
184
205
  scene.resumeHistory();
185
206
  scene.update(ctx.fenceId, { start: draft.start, end: draft.end });
207
+ const patched = [ctx.fenceId];
186
208
  if (!draft.detached) {
187
209
  for (const linked of draft.linkedUpdates) {
188
210
  scene.update(linked.id, {
189
211
  start: linked.start,
190
212
  end: linked.end,
191
213
  });
214
+ patched.push(linked.id);
192
215
  }
193
216
  }
217
+ // The restoreAll above reverted any live host patch — re-run the
218
+ // election against the final endpoints so the committed fence stands
219
+ // on (or leaves) its deck. Uncapped: an endpoint drag has no commit
220
+ // pointer ray worth trusting, matching the wall move commits.
221
+ applyFenceSupportPatches(patched, scene);
194
222
  return true;
195
223
  },
196
224
  cancel: (_ctx, _scene) => {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/fence/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAYzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA2KpC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CAoH5D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/fence/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AAkBzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAgPpC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CAyH5D,CAAA"}